diff --git a/groups/urls.py b/groups/urls.py index daffdd5..020023b 100644 --- a/groups/urls.py +++ b/groups/urls.py @@ -6,4 +6,10 @@ urlpatterns = patterns('', ('^$', views.index), (r'^list/$', views.group_list), (r'^request/(?P\d+)/$', views.create_request), + (r'^kick/(?P\d+)/(?P\d+)/$', views.kick_member), + (r'^promote/(?P\d+)/(?P\d+)/$', views.promote_member), + + (r'^admin/(?P\d+)/$', views.admin_group), + (r'^accept/(?P\d+)/$', views.accept_request), + (r'^reject/(?P\d+)/$', views.reject_request), ) diff --git a/groups/views.py b/groups/views.py index 52c439c..5a29d88 100644 --- a/groups/views.py +++ b/groups/views.py @@ -5,16 +5,20 @@ from django.template import RequestContext from django.core.urlresolvers import reverse from django.contrib import messages -from django.contrib.auth.models import Group +from django.contrib.auth.models import Group, User from django.contrib.auth.decorators import login_required -from groups.models import GroupInformation +from groups.models import GroupInformation, GroupRequest from groups.app_defines import * from groups.forms import GroupRequestForm +from sso.tasks import update_user_access + + def index(request): return HttpResponseRedirect(reverse('groups.views.group_list')) + @login_required def group_list(request): """ View all groups, for users only public ones """ @@ -22,8 +26,8 @@ def group_list(request): if request.user.is_superuser: groups = Group.objects.select_related('groupinformation').all() else: - groups = Group.objects.select_related('groupinformation').filter(Q(groupinformation__public=True) | - Q(groupinformation__admins__in=[request.user]) | + groups = Group.objects.select_related('groupinformation').filter(Q(groupinformation__public=True) | + Q(groupinformation__admins__in=[request.user]) | Q(user__in=[request.user])) # Process the query into a list of tuples including status @@ -49,9 +53,6 @@ def group_list(request): return render_to_response('groups/group_list.html', locals(), context_instance=RequestContext(request)) -@login_required -def view_group(request): - pass @login_required def create_request(request, groupid): @@ -74,4 +75,100 @@ def create_request(request, groupid): else: form = GroupRequestForm() # An unbound form - return render_to_response('groups/create_request.html', locals(), context_instance=RequestContext(request)) + return render_to_response('groups/create_request.html', locals(), context_instance=RequestContext(request)) + + +@login_required +def accept_request(request, requestid): + + requestobj = get_object_or_404(GroupRequest, id=requestid) + + if request.user in requestobj.group.groupinformation.admins.all() or request.user.is_superuser: + requestobj.status = REQUEST_ACCEPTED + requestobj.user.groups.add(requestobj.group) + requestobj.changed_by = request.user + requestobj.save() + update_user_access.delay(requestobj.user.id) + messages.add_message(request, messages.INFO, "%s has been accepted into %s" % (requestobj.user, requestobj.group)) + return HttpResponseRedirect(reverse('groups.views.admin_group', args=[requestobj.group.id])) + + +@login_required +def reject_request(request, requestid): + + requestobj = get_object_or_404(GroupRequest, id=requestid) + if request.user in requestobj.group.groupinformation.admins.all() or request.user.is_superuser: + requestobj.status = REQUEST_REJECTED + requestobj.changed_by = request.user + requestobj.save() + messages.add_message(request, messages.INFO, "%s has been rejected for %s" % (requestobj.user, requestobj.group)) + return HttpResponseRedirect(reverse('groups.views.admin_group', args=[requestobj.group.id])) + + +@login_required +def admin_group(request, groupid): + + group = get_object_or_404(Group, id=groupid) + if group.groupinformation and request.user in group.groupinformation.admins.all() or request.user.is_superuser: + + member_list = [] + for member in set(group.user_set.all()): + if group.groupinformation and member in group.groupinformation.admins.all(): + status = "Admin" + else: + status = "Member" + + chars = [] + for acc in member.eveaccount_set.all(): + chars.extend(acc.characters.all().values_list('name', flat=True)) + + member_list.append((member, ', '.join(chars), status)) + + requests = group.requests.filter(status=REQUEST_PENDING) + return render_to_response('groups/group_admin.html', locals(), context_instance=RequestContext(request)) + + return HttpResponseRedirect(reverse('groups.views.group_list')) + + +@login_required +def promote_member(request, groupid, userid): + + if request.user.is_superuser: + + user = get_object_or_404(User, id=userid) + group = get_object_or_404(Group, id=groupid) + + if not user in group.groupinformation.admins.all(): + group.groupinformation.admins.add(user) + messages.add_message(request, messages.INFO, "%s is now a admin of %s" % (user.username, group.name)) + else: + group.groupinformation.admins.remove(user) + messages.add_message(request, messages.INFO, "%s is no longer a admin of %s" % (user.username, group.name)) + + return HttpResponseRedirect(reverse('groups.views.admin_group', args=[groupid])) + + +@login_required +def kick_member(request, groupid, userid): + + group = get_object_or_404(Group, id=groupid) + user = get_object_or_404(User, id=userid) + + if user == request.user: + if user in group.groupinformation.admins.all(): + group.groupinformation.admins.remove(user) + user.groups.remove(group) + update_user_access.delay(user.id) + messages.add_message(request, messages.INFO, "You have left the group %s" % group.name) + + elif request.user in group.groupinformation.admins.all() or request.user.is_superuser: + if not user in group.groupinformation.admins.all(): + user.groups.remove(group) + update_user_access.delay(user.id) + messages.add_message(request, messages.INFO, "%s has been removed from %s." % (user.username, group.name)) + else: + messages.add_message(request, messages.INFO, "%s is a admin of %s and cannot be removed." % (user.username, group.name)) + + return HttpResponseRedirect(reverse('groups.views.admin_group', args=[groupid])) + + return HttpResponseRedirect(reverse('groups.views.group_list')) diff --git a/settings.py b/settings.py index 05d7975..863aaa1 100755 --- a/settings.py +++ b/settings.py @@ -103,7 +103,7 @@ INSTALLED_APPS = ( 'reddit', 'hr', 'sso', -# 'groups', + 'groups', 'api', ) diff --git a/templates/groups/group_admin.html b/templates/groups/group_admin.html new file mode 100644 index 0000000..9b33f37 --- /dev/null +++ b/templates/groups/group_admin.html @@ -0,0 +1,45 @@ +{% extends "base.html" %} + +{% block content %} + +

{{ group.name }}

+ +

Members

+ +{% if group.user_set.all %} + + +{% for user, chars, status in member_list %} + + + + + +{% endfor %} +
Member UsernameCharactersStatusActions
{{ user.username }}{{ chars }}{{ status }}Kick Member + {% if request.user.is_superuser %} Toggle Admin{% endif %}
+{% else %} +This group has no members +{% endif %} + +

Membership Requests

+ +{% if requests %} + + +{% for req in requests %} + + + + + + +{% endfor %} +
UsernameReasonStatusCreated DateActions
{{ req.user }}{{ req.reason }}{{ req.get_status_description }}{{ req.created_date }}Accept  + Reject
+{% else %} +This group has no outstanding requests +{% endif %} + + +{% endblock %} diff --git a/templates/groups/group_list.html b/templates/groups/group_list.html index 73a4a5c..e8a7c15 100644 --- a/templates/groups/group_list.html +++ b/templates/groups/group_list.html @@ -12,7 +12,9 @@ {% for id, group, status, requestable in group_list %} {{ group }} {{ status }} - {% ifequal status None %}{% if requestable %}Request Membership{% endif %}{% endifequal %} + {% ifequal status None %}{% if requestable %}Request Membership{% endif %}{% endifequal %} + {% if status == 'Member' or status == 'Admin' %}Leave {% endif %} + {% if status == 'Admin' or request.user.is_superuser %}Admin{% endif %} {% endfor %}