user can be added to group and team from user page
This commit is contained in:
parent
30d8b7bd85
commit
f0c6691df2
10 changed files with 298 additions and 55 deletions
|
@ -9,7 +9,7 @@ __all__ = ['UserForm', 'GroupForm', 'TeamForm']
|
||||||
|
|
||||||
UserForm = modelform_factory(User,
|
UserForm = modelform_factory(User,
|
||||||
fields=['username', 'first_name',
|
fields=['username', 'first_name',
|
||||||
'last_name', 'password', 'email', 'is_superuser'],
|
'last_name', 'email', 'is_superuser'],
|
||||||
widgets={'password': PasswordInput})
|
widgets={'password': PasswordInput})
|
||||||
GroupForm = modelform_factory(Group,
|
GroupForm = modelform_factory(Group,
|
||||||
fields=['name'])
|
fields=['name'])
|
||||||
|
|
|
@ -8,19 +8,23 @@ $('a[role="remove"]').on("click", function () {
|
||||||
a.html('removing...');
|
a.html('removing...');
|
||||||
$.ajax(href)
|
$.ajax(href)
|
||||||
.done(function(data, textStatus) {
|
.done(function(data, textStatus) {
|
||||||
a.parents('li').remove();
|
if (data) {
|
||||||
var counter = $('#' + type + '-counter');
|
a.parents('span').html(data);
|
||||||
var empty = $('#' + type + '-empty');
|
|
||||||
var count = parseInt(counter.html());
|
|
||||||
count--;
|
|
||||||
counter.html(count);
|
|
||||||
if (count < 0) {
|
|
||||||
// should not happen
|
|
||||||
window.location.reload();
|
|
||||||
} else if (count == 0) {
|
|
||||||
empty.removeClass('hidden');
|
|
||||||
} else {
|
} else {
|
||||||
empty.addClass('hidden');
|
a.parents('li').remove();
|
||||||
|
var counter = $('#' + type + '-counter');
|
||||||
|
var empty = $('#' + type + '-empty');
|
||||||
|
var count = parseInt(counter.html());
|
||||||
|
count--;
|
||||||
|
counter.html(count);
|
||||||
|
if (count < 0) {
|
||||||
|
// should not happen
|
||||||
|
window.location.reload();
|
||||||
|
} else if (count == 0) {
|
||||||
|
empty.removeClass('hidden');
|
||||||
|
} else {
|
||||||
|
empty.addClass('hidden');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.fail(function () {
|
.fail(function () {
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
/* This script switch the visible add form when we
|
/* This script switch the visible add form when we
|
||||||
* change between user and group tab on team page. */
|
* change between user and group tab on team page. */
|
||||||
$('a[data-toggle="tab"]').on("show.bs.tab", function () {
|
$('a[data-toggle="tab"]').on("show.bs.tab", function () {
|
||||||
var tab = $(this).data('tab');
|
var tab = $(this).data('showtab');
|
||||||
var hiddentab;
|
var hiddentab = $(this).data('hidetab');
|
||||||
if (tab == 'user') {
|
|
||||||
hiddentab = 'group';
|
|
||||||
} else {
|
|
||||||
hiddentab = 'user';
|
|
||||||
}
|
|
||||||
$('#add-' + hiddentab + '-form').addClass('hidden');
|
$('#add-' + hiddentab + '-form').addClass('hidden');
|
||||||
$('#add-' + tab + '-form').removeClass('hidden');
|
$('#add-' + tab + '-form').removeClass('hidden');
|
||||||
});
|
});
|
|
@ -7,10 +7,15 @@ urlpatterns = [
|
||||||
# Users
|
# Users
|
||||||
url(r'^admin/users/$', 'accounts.views.user_list', name='list-user'),
|
url(r'^admin/users/$', 'accounts.views.user_list', name='list-user'),
|
||||||
url(r'^admin/users/add/$', 'accounts.views.user_edit', name='add-user'),
|
url(r'^admin/users/add/$', 'accounts.views.user_edit', name='add-user'),
|
||||||
|
url(r'^admin/users/(?P<user>[0-9]+)/$', 'accounts.views.user_details', name='show-user'),
|
||||||
url(r'^admin/users/(?P<user>[0-9]+)/edit/$', 'accounts.views.user_edit', name='edit-user'),
|
url(r'^admin/users/(?P<user>[0-9]+)/edit/$', 'accounts.views.user_edit', name='edit-user'),
|
||||||
url(r'^admin/users/(?P<user>[0-9]+)/delete/$', 'accounts.views.user_delete', name='delete-user'),
|
url(r'^admin/users/(?P<user>[0-9]+)/delete/$', 'accounts.views.user_delete', name='delete-user'),
|
||||||
url(r'^admin/users/(?P<user>[0-9]+)/activate/$', 'accounts.views.user_activate', name='activate-user'),
|
url(r'^admin/users/(?P<user>[0-9]+)/activate/$', 'accounts.views.user_activate', name='activate-user'),
|
||||||
url(r'^admin/users/(?P<user>[0-9]+)/disable/$', 'accounts.views.user_disable', name='disable-user'),
|
url(r'^admin/users/(?P<user>[0-9]+)/disable/$', 'accounts.views.user_disable', name='disable-user'),
|
||||||
|
url(r'^admin/users/(?P<user>[0-9]+)/add-group/$', 'accounts.views.user_add_group', name='add-group-to-user'),
|
||||||
|
url(r'^admin/users/(?P<user>[0-9]+)/remove-group/(?P<group>[0-9]+)/$', 'accounts.views.user_remove_group', name='remove-group-from-user'),
|
||||||
|
url(r'^admin/users/(?P<user>[0-9]+)/add-team/$', 'accounts.views.user_add_team', name='add-team-to-user'),
|
||||||
|
url(r'^admin/users/(?P<user>[0-9]+)/remove-team/(?P<team>[0-9]+)/$', 'accounts.views.user_remove_team', name='remove-team-from-user'),
|
||||||
# Groups
|
# Groups
|
||||||
url(r'^admin/groups/$', 'accounts.views.group_list', name='list-group'),
|
url(r'^admin/groups/$', 'accounts.views.group_list', name='list-group'),
|
||||||
url(r'^admin/groups/add/$', 'accounts.views.group_edit', name='add-group'),
|
url(r'^admin/groups/add/$', 'accounts.views.group_edit', name='add-group'),
|
||||||
|
|
|
@ -33,6 +33,16 @@ def user_list(request):
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@project_perm_required('manage_user')
|
||||||
|
def user_details(request, user):
|
||||||
|
tab = request.session.pop('user-tab', 'group')
|
||||||
|
return render(request, 'accounts/user_details.html', {
|
||||||
|
'user': get_object_or_404(User, id=user),
|
||||||
|
'directteams': Team.objects.filter(users__id=user),
|
||||||
|
'tab': tab,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
@project_perm_required('manage_user')
|
@project_perm_required('manage_user')
|
||||||
def user_edit(request, user=None):
|
def user_edit(request, user=None):
|
||||||
|
|
||||||
|
@ -41,12 +51,12 @@ def user_edit(request, user=None):
|
||||||
|
|
||||||
form = UserForm(request.POST or None, instance=user)
|
form = UserForm(request.POST or None, instance=user)
|
||||||
if request.method == 'POST' and form.is_valid():
|
if request.method == 'POST' and form.is_valid():
|
||||||
form.save()
|
user = form.save()
|
||||||
if user:
|
if user:
|
||||||
messages.success(request, 'User modified successfully.')
|
messages.success(request, 'User modified successfully.')
|
||||||
else:
|
else:
|
||||||
messages.success(request, 'User added successfully.')
|
messages.success(request, 'User added successfully.')
|
||||||
return redirect('list-user')
|
return redirect('show-user', user.id)
|
||||||
|
|
||||||
return render(request, 'accounts/user_edit.html', {
|
return render(request, 'accounts/user_edit.html', {
|
||||||
'user': user,
|
'user': user,
|
||||||
|
@ -63,7 +73,7 @@ def user_activate(request, user):
|
||||||
user.is_active = True
|
user.is_active = True
|
||||||
user.save()
|
user.save()
|
||||||
messages.success(request, 'Account activated successfully.')
|
messages.success(request, 'Account activated successfully.')
|
||||||
return redirect('list-user')
|
return redirect('show-user', user.id)
|
||||||
|
|
||||||
|
|
||||||
@project_perm_required('manage_user')
|
@project_perm_required('manage_user')
|
||||||
|
@ -75,7 +85,7 @@ def user_disable(request, user):
|
||||||
messages.success(request, 'Account disabled successfully.')
|
messages.success(request, 'Account disabled successfully.')
|
||||||
else:
|
else:
|
||||||
messages.info(request, 'Account already disabled.')
|
messages.info(request, 'Account already disabled.')
|
||||||
return redirect('list-user')
|
return redirect('show-user', user.id)
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
|
@ -87,6 +97,106 @@ def user_delete(request, user):
|
||||||
return redirect('list-user')
|
return redirect('list-user')
|
||||||
|
|
||||||
|
|
||||||
|
@project_perm_required('manage_user')
|
||||||
|
def user_add_group(request, user):
|
||||||
|
user = get_object_or_404(User, id=user)
|
||||||
|
if request.method == 'POST':
|
||||||
|
group = request.POST.get('group')
|
||||||
|
if group:
|
||||||
|
try:
|
||||||
|
group = Group.objects.get(name=group)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
messages.error(request, 'Group not found.')
|
||||||
|
else:
|
||||||
|
if user.groups.filter(id=group.id).exists():
|
||||||
|
messages.info(request, 'User already in group.')
|
||||||
|
else:
|
||||||
|
user.groups.add(group)
|
||||||
|
user.save()
|
||||||
|
messages.success(request,
|
||||||
|
'User added to group successfully.')
|
||||||
|
else:
|
||||||
|
messages.error(request, 'Group not found.')
|
||||||
|
request.session['user-tab'] = 'group'
|
||||||
|
return redirect('show-user', user.id)
|
||||||
|
else:
|
||||||
|
term = request.GET.get('term')
|
||||||
|
if not term:
|
||||||
|
return Http404()
|
||||||
|
groups = Group.objects \
|
||||||
|
.exclude(id__in=user.groups.values('id')) \
|
||||||
|
.filter(name__icontains=term)[:10]
|
||||||
|
response = []
|
||||||
|
for group in groups:
|
||||||
|
response += [{
|
||||||
|
'label': group.name,
|
||||||
|
'value': group.name,
|
||||||
|
}]
|
||||||
|
return JsonResponse(response, safe=False)
|
||||||
|
|
||||||
|
|
||||||
|
@project_perm_required('manage_user')
|
||||||
|
def user_remove_group(request, user, group):
|
||||||
|
user = get_object_or_404(User, pk=user)
|
||||||
|
group = get_object_or_404(Group, pk=group)
|
||||||
|
user.groups.remove(group)
|
||||||
|
user.save()
|
||||||
|
return HttpResponse()
|
||||||
|
|
||||||
|
|
||||||
|
@project_perm_required('manage_user')
|
||||||
|
def user_add_team(request, user):
|
||||||
|
user = get_object_or_404(User, id=user)
|
||||||
|
if request.method == 'POST':
|
||||||
|
team = request.POST.get('team')
|
||||||
|
if team:
|
||||||
|
try:
|
||||||
|
team = Team.objects.get(name=team)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
messages.error(request, 'Team not found.')
|
||||||
|
else:
|
||||||
|
# We do not use user.teams because we want to be able to add an
|
||||||
|
# user to a team even if he is already a member through a group
|
||||||
|
if Team.objects.filter(users=user).exists():
|
||||||
|
messages.info(request, 'User already in team.')
|
||||||
|
else:
|
||||||
|
team.users.add(user)
|
||||||
|
team.save()
|
||||||
|
messages.success(request,
|
||||||
|
'User added to team successfully.')
|
||||||
|
else:
|
||||||
|
messages.error(request, 'Team not found.')
|
||||||
|
request.session['user-tab'] = 'team'
|
||||||
|
return redirect('show-user', user.id)
|
||||||
|
else:
|
||||||
|
term = request.GET.get('term')
|
||||||
|
if not term:
|
||||||
|
return Http404()
|
||||||
|
teams = Team.objects \
|
||||||
|
.exclude(users=user) \
|
||||||
|
.filter(name__icontains=term)[:10]
|
||||||
|
response = []
|
||||||
|
for team in teams:
|
||||||
|
response += [{
|
||||||
|
'label': team.name,
|
||||||
|
'value': team.name,
|
||||||
|
}]
|
||||||
|
return JsonResponse(response, safe=False)
|
||||||
|
|
||||||
|
|
||||||
|
@project_perm_required('manage_user')
|
||||||
|
def user_remove_team(request, user, team):
|
||||||
|
user = get_object_or_404(User, pk=user)
|
||||||
|
team = get_object_or_404(Team, pk=team)
|
||||||
|
team.users.remove(user)
|
||||||
|
team.save()
|
||||||
|
response = ''
|
||||||
|
if team.groups.filter(id__in=user.groups.values('id')).exists():
|
||||||
|
# style a member throught a group
|
||||||
|
response = '<em>member throught group</em>'
|
||||||
|
return HttpResponse(response)
|
||||||
|
|
||||||
|
|
||||||
##########
|
##########
|
||||||
# Groups #
|
# Groups #
|
||||||
##########
|
##########
|
||||||
|
|
|
@ -14,16 +14,22 @@
|
||||||
|
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% if not groups.exists %}
|
{% if not groups.exists %}
|
||||||
<li class="list-group-item">
|
<li class="list-group-item" style="line-height: 48px;">
|
||||||
<em>There are no groups quit yet.</em>
|
<em>There are no groups quit yet.</em>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for group in groups %}
|
{% for group in groups %}
|
||||||
<a class="list-group-item" href="{% url 'show-group' group.id %}">
|
<a class="list-group-item" href="{% url 'show-group' group.id %}" style="line-height: 48px;">
|
||||||
<strong>
|
<div class="row">
|
||||||
{{ group }}
|
<div class="col-md-10">
|
||||||
</strong>
|
<strong>
|
||||||
— {{ group.users.count }} user{{ group.users.count|pluralize }}
|
{{ group }}
|
||||||
|
</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 text-muted">
|
||||||
|
{{ group.users.count }} user{{ group.users.count|pluralize }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -34,8 +34,8 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li{% if tab == 'user' %} class="active"{% endif %}><a href="#user-pane" role="tab" data-toggle="tab" data-tab="user">Users</a></li>
|
<li{% if tab == 'user' %} class="active"{% endif %}><a href="#user-pane" role="tab" data-toggle="tab" data-showtab="user" data-hidetab="group">Users</a></li>
|
||||||
<li{% if tab == 'group' %} class="active"{% endif %}><a href="#group-pane" role="tab" data-toggle="tab" data-tab="group">Groups</a></li>
|
<li{% if tab == 'group' %} class="active"{% endif %}><a href="#group-pane" role="tab" data-toggle="tab" data-showtab="group" data-hidetab="user">Groups</a></li>
|
||||||
<form class="form-inline pull-right{% if tab == 'group' %} hidden{% endif %}" method="post" action="{% url 'add-user-to-team' team.id %}" role="form" id="add-user-form">
|
<form class="form-inline pull-right{% if tab == 'group' %} hidden{% endif %}" method="post" action="{% url 'add-user-to-team' team.id %}" role="form" id="add-user-form">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -106,6 +106,6 @@ $('input[name="group"]').autocomplete({
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script src="{% static 'js/accounts.js' %}"></script>
|
<script src="{% static 'js/accounts.js' %}"></script>
|
||||||
<script src="{% static 'js/team.js' %}"></script>
|
<script src="{% static 'js/tabswitch.js' %}"></script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -14,17 +14,25 @@
|
||||||
|
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% if not teams.exists %}
|
{% if not teams.exists %}
|
||||||
<li class="list-group-item">
|
<li class="list-group-item" style="line-height: 48px;">
|
||||||
<em>There are no teams quite yet.</em>
|
<em>There are no teams quite yet.</em>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for team in teams %}
|
{% for team in teams %}
|
||||||
<a class="list-group-item" href="{% url 'show-team' team.id %}">
|
<a class="list-group-item" href="{% url 'show-team' team.id %}" style="line-height: 48px;">
|
||||||
<strong>
|
<div class="row">
|
||||||
{{ team }}
|
<div class="col-md-8">
|
||||||
</strong>
|
<strong>
|
||||||
— {{ team.users.count }} user{{ team.users.count|pluralize }}
|
{{ team }}
|
||||||
— {{ team.groups.count }} group{{ team.groups.count|pluralize }}
|
</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 text-muted">
|
||||||
|
{{ team.users.count }} user{{ team.users.count|pluralize }}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 text-muted">
|
||||||
|
{{ team.groups.count }} group{{ team.groups.count|pluralize }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
119
templates/accounts/user_details.html
Normal file
119
templates/accounts/user_details.html
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
{% extends 'base_admin.html' %}
|
||||||
|
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load humanize %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% load accounts_tags %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
<link rel="stylesheet" href="{% static 'css/jquery-ui.css' %}">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block usertab %} class="active"{% endblock %}
|
||||||
|
|
||||||
|
{% block moretabs %}
|
||||||
|
<a href="{% url 'add-user' %}" class="pull-right btn btn-success">Add user</a>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block tabcontent %}
|
||||||
|
|
||||||
|
<div class="page-header">
|
||||||
|
<h1>
|
||||||
|
User {{ user }}
|
||||||
|
 
|
||||||
|
<small>
|
||||||
|
<span id="groups-counter">{{ user.groups.count }}</span> groups
|
||||||
|
—
|
||||||
|
<span id="teams-counter">{{ user.teams.count }}</span> teams
|
||||||
|
</small>
|
||||||
|
<div class="pull-right">
|
||||||
|
{% if user.is_active %}
|
||||||
|
<a href="{% url 'disable-user' user.id %}" class="btn btn-default"><span class="glyphicon glyphicon-ban-circle"></span> disable</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{% url 'activate-user' user.id %}" class="btn btn-default"><span class="glyphicon glyphicon-check"></span> activate</a>
|
||||||
|
{% endif %}
|
||||||
|
<a href="{% url 'edit-user' user.id %}" class="btn btn-primary"><span class="glyphicon glyphicon-edit"></span> edit</a>
|
||||||
|
<a href="javascript:void(0);" data-item="delete" data-action="{% url 'delete-user' user.id %}" data-toggle="modal" data-target="#confirm-delete" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span> delete</a>
|
||||||
|
</div>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li{% if tab == 'group' %} class="active"{% endif %}><a href="#group-pane" role="tab" data-toggle="tab" data-showtab="group" data-hidetab="team">Groups</a></li>
|
||||||
|
<li{% if tab == 'team' %} class="active"{% endif %}><a href="#team-pane" role="tab" data-toggle="tab" data-showtab="team" data-hidetab="group">Teams</a></li>
|
||||||
|
<form class="form-inline pull-right{% if tab == 'team' %} hidden{% endif %}" method="post" action="{% url 'add-group-to-user' user.id %}" role="form" id="add-group-form">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group ui-widget">
|
||||||
|
<input type="text" class="form-control" name="group" placeholder="add user to groups" value="">
|
||||||
|
<div class="input-group-addon">
|
||||||
|
<a href="javascript:void(0);" onclick="$('#add-group-form').submit();"><span class="glyphicon glyphicon-plus"></span></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<form class="form-inline pull-right{% if tab == 'group' %} hidden{% endif %}" method="post" action="{% url 'add-team-to-user' user.id %}" role="form" id="add-team-form">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="input-group ui-widget">
|
||||||
|
<input type="text" class="form-control" name="team" placeholder="add user to teams" value="">
|
||||||
|
<div class="input-group-addon">
|
||||||
|
<a href="javascript:void(0);" onclick="$('#add-team-form').submit();"><span class="glyphicon glyphicon-plus"></span></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane{% if tab == 'group' %} active{% endif %}" id="group-pane">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item{% if user.groups.exists %} hidden{% endif %}" id="groups-empty">
|
||||||
|
<em>This user belong to no groups.</em>
|
||||||
|
</li>
|
||||||
|
{% for group in user.groups.all %}
|
||||||
|
<li class="list-group-item">
|
||||||
|
{{ group }}
|
||||||
|
<a href="javascript:void(0);" data-href="{% url 'remove-group-from-user' user.id group.id %}" data-type="groups" class="pull-right btn btn-danger btn-xs" role="remove">remove</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane{% if tab == 'team' %} active{% endif %}" id="team-pane">
|
||||||
|
<ul class="list-group">
|
||||||
|
<li class="list-group-item{% if user.teams.exists %} hidden{% endif %}" id="teams-empty">
|
||||||
|
<em>This user belong to no teams.</em>
|
||||||
|
</li>
|
||||||
|
{% for team in user.teams.all %}
|
||||||
|
<li class="list-group-item">
|
||||||
|
{{ team }}
|
||||||
|
<span class="pull-right">
|
||||||
|
{% if team in directteams %}
|
||||||
|
<a href="javascript:void(0);" data-href="{% url 'remove-team-from-user' user.id team.id %}" data-type="teams" class="btn btn-danger btn-xs" role="remove">remove</a>
|
||||||
|
{% else %}
|
||||||
|
<em>member throught group</em>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% delete_modal %}
|
||||||
|
|
||||||
|
<script src="{% static 'js/jquery-ui.min.js' %}"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$('input[name="group"]').autocomplete({
|
||||||
|
source: "{% url 'add-group-to-user' user.id %}"
|
||||||
|
});
|
||||||
|
$('input[name="team"]').autocomplete({
|
||||||
|
source: "{% url 'add-team-to-user' user.id %}"
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<script src="{% static 'js/accounts.js' %}"></script>
|
||||||
|
<script src="{% static 'js/tabswitch.js' %}"></script>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -17,29 +17,25 @@
|
||||||
|
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<li class="list-group-item">
|
<a class="list-group-item" href="{% url 'show-user' user.id %}">
|
||||||
<div class="row">
|
<div class="row" style="line-height: 48px;">
|
||||||
<div class="col-md-4">
|
<div class="col-md-6">
|
||||||
<h4 class="media-heading">{{ user.username }}</h4>
|
<h4 class="media-heading">{{ user.username }}</h4>
|
||||||
{{ user.first_name }} {{ user.last_name }}
|
{{ user.first_name }} {{ user.last_name }}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2" style="vertical-align: center; line-height:48px;">
|
<div class="col-md-2">
|
||||||
|
{% if not user.is_active %}
|
||||||
|
<mark><span class="glyphicon glyphicon-warning-sign"></span> disabled</mark>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
<span class="text-muted">{{ user.groups.count }} group{{ user.groups.count|pluralize }}</span>
|
<span class="text-muted">{{ user.groups.count }} group{{ user.groups.count|pluralize }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2" style="vertical-align: center; line-height:48px;">
|
<div class="col-md-2">
|
||||||
<span class="text-muted">{{ user.teams.count }} team{{ user.teams.count|pluralize }}</span>
|
<span class="text-muted">{{ user.teams.count }} team{{ user.teams.count|pluralize }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4" style="text-align: right; vertical-align: center; line-height:48px;">
|
|
||||||
{% if user.is_active %}
|
|
||||||
<a href="{% url 'disable-user' user.id %}" class="btn btn-default">disable</a>
|
|
||||||
{% else %}
|
|
||||||
<a href="{% url 'activate-user' user.id %}" class="btn btn-default">activate</a>
|
|
||||||
{% endif %}
|
|
||||||
<a href="{% url 'edit-user' user.id %}" class="btn btn-primary"><span class="glyphicon glyphicon-edit"></span> edit</a>
|
|
||||||
<a href="#" data-item="user" data-action="{% url 'delete-user' user.id %}" data-toggle="modal" data-target="#confirm-delete" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span> delete</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue