Skip to content

Commit

Permalink
allow admins to select the columns on the users page
Browse files Browse the repository at this point in the history
  • Loading branch information
bdzim committed Jun 10, 2015
1 parent 5cb28f2 commit e5196d5
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ <h1 class="page-header">
{% if saved %}
<p id="saved">Changes saved successfully!</p>
{% endif %}
{% if error %}
<div class="error-alert">
<p>{{ error }}</p>
</div>
{% endif %}
{% if new_user.errors %}
<div class="error-alert">
<p>{{ new_user.errors|length }} errors have been detected. Please see below for more information.</p>
Expand All @@ -36,77 +41,74 @@ <h1 class="page-header">
<form action="{% url 'blue_mgnt:users' %}" method="POST">
{% csrf_token %}
{{ delete_user_formset.management_form }}
{{ tmp_user_formset.management_form }}
{{ user_formset.management_form }}
<table class="widget-table">
<thead>
<th>&nbsp;</th>
{% if not features.email_as_username %}
<th>Username</th>
{% endif %}
<th>Full Name</th>
<th>Email</th>
<th>Group</th>
<th>Storage Size</th>
{% for column in user_columns %}
<th>{{ column.header }}</th>
{% endfor %}
<th>User Detail</th>
<th>
Delete?
<input id="sel_all" type="checkbox">
</th>
</thead>
<tbody>
{% for curr_user, delete_form in users_and_delete %}
{% for user_row in user_rows %}
<tr>
{% for hidden in delete_form.hidden_fields %}
{% for hidden in user_row.delete_form.hidden_fields %}
{{ hidden }}
{% endfor %}
<td>
<i class="ss-icon edit-status">
{% if curr_user.is_local_user %}
{% if user_row.is_local_user %}
&#x270E;
{% else %}
&#xE071;
{% endif %}
</i>
</td>
{% if not features.email_as_username %}
<td>{{ curr_user.username }}</td>
{% endif %}

<td>
{{ curr_user.name }}
</td>
<td><a href="mailto:{{ curr_user.email }}">
{{ curr_user.email }}
</a></td>
{% if curr_user.is_local_user %}
{% for hidden in curr_user.form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in curr_user.form.visible_fields %}
<td>
{% if field.errors %}
{% for error in field.errors %}
<span class="error-highlight">
{{ field }}
<span class="error-tag">{{ error }}</span>
</span>
{% endfor %}
{% for value, type in user_row.selected_columns %}
{% if type == 'bytes' %}
<td style="text-align: center">{{ value|sofilesizeformat }}</td>
{% elif type == 'email' %}
<td><a href="mailto:{{ value }}">
{{ value }}
</a></td>
{% elif type == 'group' %}
{% if user_row.is_local_user %}
{% for hidden in user_row.form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in user_row.form.visible_fields %}
<td>
{% if field.errors %}
{% for error in field.errors %}
<span class="error-highlight">
{{ field }}
<span class="error-tag">{{ error }}</span>
</span>
{% endfor %}
{% else %}
{{ field }}
{% endif %}
</td>
{% endfor %}
{% else %}
{{ field }}
<td>{{ value }}</td>
{% endif %}
</td>
{% endfor %}
{% else %}
<td>{{ curr_user.group_name }}</td>
{% endif %}
<td style="text-align: center">{{ curr_user.bytes_stored|sofilesizeformat }}</td>
{% else %}
<td>{{ value }}</td>
{% endif %}
{% endfor %}
<td style="text-align: center">
<a href="{% url 'blue_mgnt:user_detail' curr_user.email %}">Detail</a>
<a href="{% url 'blue_mgnt:user_detail' user_row.email %}">Detail</a>
</td>
{{ curr_user.gigs_stored }}
{% if not curr_user.enabled or curr_user.is_local_user and perms.blue_mgnt.can_manage_users %}
{{ user_row.gigs_stored }}
{% if not user_row.enabled or user_row.is_local_user and perms.blue_mgnt.can_manage_users %}
<td style="text-align:center">
<span class="del_box">{{ delete_form.DELETE }}</span>
<span class="del_box">{{ user_row.delete_form.DELETE }}</span>
{% else %}
<td style="text-align:center">
<span class="delete-fill ss-icon">&#x1F6AB;</span>
Expand Down
170 changes: 109 additions & 61 deletions django/apps/blue_management/blue_mgnt/views/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from base64 import b32encode
import csv
import re
from collections import namedtuple

from views import enterprise_required, log_admin_action
from views import Pagination
Expand Down Expand Up @@ -57,6 +58,22 @@ class UserForm(forms.Form):
orig_email = forms.CharField(widget=forms.HiddenInput)
return UserForm


def get_base_user_form_set(api):
class BaseUserFormSet(forms.formsets.BaseFormSet):
def clean(self):
if any(self.errors):
return
for x in range(0, self.total_form_count()):
form = self.forms[x]
data = dict(group_id=form.cleaned_data['group_id'], )
if request.user.has_perm('blue_mgnt.can_manage_users'):
log_admin_action(request,
'edit user %s ' % form.cleaned_data['orig_email'] + \
'with data: %s' % data)
api.edit_user(form.cleaned_data['orig_email'], data)
return BaseUserFormSet

def get_user_csv_form(api):
class UserCSVForm(forms.Form):
csv_file = forms.FileField(label='User CSV')
Expand Down Expand Up @@ -249,10 +266,68 @@ def is_local_user(config, group_id):
def get_login_link(username):
return reverse('blue_mgnt:escrow_login', args=[username])

UserColumn = namedtuple('UserColumn', [
'name',
'header',
'type',
])

USER_COLUMNS = [
UserColumn('username', 'Username', 'text'),
UserColumn('name', 'Name', 'text'),
UserColumn('email', 'Email', 'email'),
UserColumn('share_id', 'Share ID', 'text'),
UserColumn('promo', 'Promo', 'text'),
UserColumn('creation_time', 'Creation Time', 'timestamp'),
UserColumn('last_login', 'Last Login', 'timestamp'),
UserColumn('bytes_stored', 'Storage Size', 'bytes'),
UserColumn('storage_bytes', 'Max Storage Size', 'bytes'),
UserColumn('bonus_bytes', 'Bonus GB', 'bytes'),
UserColumn('plan_id', 'Plan', 'plan'),
UserColumn('group_id', 'Group', 'group'),
UserColumn('enabled', 'Enabled', 'text'),
]

def get_user_columns(columns):
user_columns = []
for column in columns:
found = False
for user_column in USER_COLUMNS:
if column == user_column.name:
user_columns.append(user_column)
found = True
if not found:
return user_columns, '"%s" is not a valid column' % column
return user_columns, False

def get_user_rows(all_users, delete_user_formset, user_formset,
config, user_columns, groups):
index = 0
for user, delete in zip(all_users, delete_user_formset):
user_row = {
'selected_columns': [],
'email': user['email'],
'is_local_user': is_local_user(config, user['group_id']),
'delete_form': delete,
'enabled': user['enabled']
}
for column in user_columns:
if column.name == 'group_id':
if user_row['is_local_user']:
user_row['form'] = user_formset[index]
index += 1

value = user[column.name]
if column.type == 'timestamp':
value = datetime.datetime.fromtimestamp(value) if value else None
if column.type == 'group':
value = get_group_name(groups, value)
user_row['selected_columns'].append((value, column.type))
yield user_row

@enterprise_required
def users(request, api, account_info, config, username, saved=False):
show_disabled = int(request.GET.get('show_disabled', 1))
search_back = request.GET.get('search_back', '')
groups = api.list_groups()
features = api.enterprise_features()
search = request.GET.get('search', '')
Expand All @@ -261,69 +336,46 @@ def users(request, api, account_info, config, username, saved=False):
api.get_user_count(),
request.GET.get('page'),
)
if not search:
search = request.POST.get('search', '')

UserCSVForm = get_new_user_csv_form(api, groups, account_info, config, request)
NewUserForm = get_new_user_form(api, features, account_info, config, local_groups, groups, request)

class BaseUserFormSet(forms.formsets.BaseFormSet):
def clean(self):
if any(self.errors):
return
for x in range(0, self.total_form_count()):
form = self.forms[x]
data = dict(group_id=form.cleaned_data['group_id'], )
if request.user.has_perm('blue_mgnt.can_manage_users'):
log_admin_action(request,
'edit user %s ' % form.cleaned_data['orig_email'] + \
'with data: %s' % data)
api.edit_user(form.cleaned_data['orig_email'], data)

if features['email_as_username']:
default_columns = 'name,email,group_id,bytes_stored'
else:
default_columns = 'username,name,email,group_id,bytes_stored'
columns = [x.strip() for x in request.GET.get('columns', default_columns).split(',')]
user_columns, error = get_user_columns(columns)

TmpUserForm = get_user_form(local_groups)
TmpUserFormSet = formset_factory(TmpUserForm, extra=0, formset=BaseUserFormSet)
UserCSVForm = get_new_user_csv_form(api, groups, account_info, config, request)
NewUserForm = get_new_user_form(api, features, account_info,
config, local_groups, groups, request)
BaseUserFormSet = get_base_user_form_set(api)
UserForm = get_user_form(local_groups)
UserFormSet = formset_factory(UserForm, extra=0, formset=BaseUserFormSet)
DeleteUserFormSet = formset_factory(DeleteUserForm, extra=0, can_delete=True)
if search_back == '1':
search = ''
all_users = api.list_users(pagination.per_page, pagination.query_offset)
elif search:

if search:
all_users = api.search_users(search, pagination.per_page, pagination.query_offset)
else:
all_users = api.list_users(pagination.per_page, pagination.query_offset)

if not show_disabled:
all_users = [x for x in all_users if x['enabled']]

all_users.sort(key=lambda x: x['creation_time'], reverse=True)

def _user_to_dict(x):
return dict(username=x['username'],
email=x['email'],
orig_email=x['email'],
user_detail=x['email'],
name=x['name'],
bytes_stored=x['bytes_stored'],
#gigs_stored=round(x['bytes_stored'] / (10.0 ** 9), 2),
creation_time=datetime.datetime.fromtimestamp(x['creation_time']),
last_login=datetime.datetime.fromtimestamp(x['last_login']) if x['last_login'] else None,
group_id=x['group_id'] if 'group_id' in x else '',
escrow_login=x['username'],
enabled=x['enabled'],
login_link=get_login_link(x['username']),
is_local_user=is_local_user(config, x['group_id']),
group_name=get_group_name(groups, x['group_id']),
)
users = map(_user_to_dict, all_users)
users = [dict(orig_email=x['email'],
group_id=x['group_id'],
is_local_user=is_local_user(config, x['group_id']),
) for x in all_users]
local_users = [user for user in users if user['is_local_user']]
for x, local_user in enumerate(local_users):
local_user['index'] = x

tmp_user_formset = TmpUserFormSet(initial=local_users, prefix='tmp_user')
user_formset = UserFormSet(initial=local_users, prefix='tmp_user')
delete_user_formset = DeleteUserFormSet(initial=users, prefix='delete_user')
user_csv = UserCSVForm()
new_user = NewUserForm()

user_rows = get_user_rows(all_users, delete_user_formset,
user_formset, config,
user_columns, groups
)

if request.method == 'POST':
if request.POST.get('form', '') == 'csv':
user_csv = UserCSVForm(request.POST, request.FILES)
Expand All @@ -334,39 +386,35 @@ def _user_to_dict(x):
if new_user.is_valid():
return redirect('blue_mgnt:users_saved')
else:
tmp_user_formset = TmpUserFormSet(request.POST, prefix='tmp_user')
user_formset = UserFormSet(request.POST, prefix='tmp_user')
delete_user_formset = DeleteUserFormSet(request.POST, prefix='delete_user')
if (request.user.has_perm('blue_mgnt.can_manage_users')
and tmp_user_formset.is_valid()
and user_formset.is_valid()
and delete_user_formset.is_valid()):
for form in delete_user_formset.deleted_forms:
orig_email = form.cleaned_data['orig_email']
api.delete_user(orig_email)
log_admin_action(request, 'delete user "%s"' % orig_email)
return redirect(reverse('blue_mgnt:users_saved') + '?search=%s' % search)

index = 0
for user in users:
if user['is_local_user']:
user['form'] = tmp_user_formset[index]
index += 1

return render_to_response('index.html', dict(
return render_to_response('users.html', dict(
error=error,
user_columns=user_columns,
user=request.user,
config=config,
new_user=new_user,
username=username,
tmp_user_formset=tmp_user_formset,
user_formset=user_formset,
delete_user_formset=delete_user_formset,
user_csv=user_csv,
features=api.enterprise_features(),
features=features,
saved=saved,
account_info=account_info,
show_disabled=show_disabled,
search=search,
search_back=search_back,
users_and_delete=zip(users, delete_user_formset),
user_rows=user_rows,
pagination=pagination,
columns=columns,
),
RequestContext(request))

Expand Down
Loading

0 comments on commit e5196d5

Please sign in to comment.