From 281dbdbb01eba4a8e57a9f7d51278dac9f493e80 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 25 Oct 2020 11:21:35 +0100 Subject: [PATCH 1/8] proper URL structure established --- .../groupmanagement/groupmembership.html | 13 +- allianceauth/groupmanagement/urls.py | 69 ++- allianceauth/groupmanagement/views.py | 457 ++++++++++++------ 3 files changed, 368 insertions(+), 171 deletions(-) diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html index d4c0ad8a..1ddd9c89 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html @@ -14,7 +14,7 @@ {% trans "Groups" %}
- {% if groups %} + {% if groups %}
@@ -30,7 +30,7 @@ {% for group in groups %} - + @@ -36,7 +36,7 @@ {{ group.name }} - + {% endfor %} diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groups.html b/allianceauth/groupmanagement/templates/groupmanagement/groups.html index a94f4cd4..a577402c 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groups.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groups.html @@ -22,7 +22,7 @@ {% for g in groups %} - + From 4c42153bfd6f414a57b2138d4bb107a8b33a9ced Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 25 Oct 2020 13:53:17 +0100 Subject: [PATCH 5/8] stop member count header from line breaking --- .../templates/groupmanagement/groupmembership.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html index 0aa53fac..dd43ede1 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html @@ -24,7 +24,7 @@ - + @@ -48,7 +48,7 @@ {% endif %} - From 6cd0a42791a70a7d4d401d18c7e66a05b2ed4182 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 26 Oct 2020 01:06:58 +0100 Subject: [PATCH 6/8] reverted code formatting for Aaron :-) --- allianceauth/groupmanagement/models.py | 88 ++--- allianceauth/groupmanagement/views.py | 453 ++++++++----------------- 2 files changed, 169 insertions(+), 372 deletions(-) diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index e36f7e2d..861872ef 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -55,6 +55,7 @@ class RequestLog(models.Model): return user.profile.main_character + class AuthGroup(models.Model): """ Extends Django Group model with a one-to-one field @@ -75,75 +76,46 @@ class AuthGroup(models.Model): Open - Users are automatically accepted into the group Not Open - Users requests must be approved before they are added to the group """ - group = models.OneToOneField(Group, on_delete=models.CASCADE, primary_key=True) - internal = models.BooleanField( - default=True, - help_text="Internal group, users cannot see, join or request to join this group.
" - "Used for groups such as Members, Corp_*, Alliance_* etc.
" - "Overrides Hidden and Open options when selected.", - ) - - hidden = models.BooleanField( - default=True, - help_text="Group is hidden from users but can still join with the correct link.", - ) - - open = models.BooleanField( - default=False, - help_text="Group is open and users will be automatically added upon request.
" - "If the group is not open users will need their request manually approved.", - ) - - public = models.BooleanField( - default=False, - help_text="Group is public. Any registered user is able to join this group, with " - "visibility based on the other options set for this group.
Auth will " - "not remove users from this group automatically when they are no longer " - "authenticated.", - ) - + internal = models.BooleanField(default=True, + help_text="Internal group, users cannot see, join or request to join this group.
" + "Used for groups such as Members, Corp_*, Alliance_* etc.
" + "Overrides Hidden and Open options when selected.") + hidden = models.BooleanField(default=True, + help_text="Group is hidden from users but can still join with the correct link.") + open = models.BooleanField(default=False, + help_text="Group is open and users will be automatically added upon request.
" + "If the group is not open users will need their request manually approved.") + public = models.BooleanField(default=False, + help_text="Group is public. Any registered user is able to join this group, with " + "visibility based on the other options set for this group.
Auth will " + "not remove users from this group automatically when they are no longer " + "authenticated.") # Group leaders have management access to this group - group_leaders = models.ManyToManyField( - User, - related_name="leads_groups", - blank=True, - help_text="Group leaders can process group requests for this group " - "specifically. Use the auth.group_management permission to allow " - "a user to manage all groups.", - ) - + group_leaders = models.ManyToManyField(User, related_name='leads_groups', blank=True, + help_text="Group leaders can process group requests for this group " + "specifically. Use the auth.group_management permission to allow " + "a user to manage all groups.") # allow groups to be *group leads* - group_leader_groups = models.ManyToManyField( - Group, - related_name="leads_group_groups", - blank=True, - help_text="Group leaders can process group requests for this group " - "specifically. Use the auth.group_management permission to allow " - "a user to manage all groups.", - ) + group_leader_groups = models.ManyToManyField(Group, related_name='leads_group_groups', blank=True, + help_text="Group leaders can process group requests for this group " + "specifically. Use the auth.group_management permission to allow " + "a user to manage all groups.") - states = models.ManyToManyField( - State, - related_name="valid_states", - blank=True, - help_text="States listed here will have the ability to join this group provided " - "they have the proper permissions.", - ) + states = models.ManyToManyField(State, related_name='valid_states', blank=True, + help_text="States listed here will have the ability to join this group provided " + "they have the proper permissions.") - description = models.TextField( - max_length=512, - null=True, - blank=True, - help_text="Short description (max. 512 characters) of the group shown to users.", - ) + description = models.TextField(max_length=512, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") def __str__(self): return self.group.name class Meta: - permissions = (("request_groups", u"Can request non-public groups"),) + permissions = ( + ("request_groups", u"Can request non-public groups"), + ) default_permissions = tuple() diff --git a/allianceauth/groupmanagement/views.py b/allianceauth/groupmanagement/views.py index 55956f7b..4e6e27ff 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -27,9 +27,7 @@ def group_management(request): acceptrequests = [] leaverequests = [] - base_group_query = GroupRequest.objects.select_related( - "user", "group", "user__profile__main_character" - ) + base_group_query = GroupRequest.objects.select_related('user', 'group', 'user__profile__main_character') if GroupManager.has_management_permission(request.user): # Full access group_requests = base_group_query.all() @@ -44,14 +42,12 @@ def group_management(request): else: acceptrequests.append(grouprequest) - logger.debug( - "Providing user %s with %s acceptrequests and %s leaverequests." - % (request.user, len(acceptrequests), len(leaverequests)) - ) + logger.debug("Providing user %s with %s acceptrequests and %s leaverequests." % ( + request.user, len(acceptrequests), len(leaverequests))) - render_items = {"acceptrequests": acceptrequests, "leaverequests": leaverequests} + render_items = {'acceptrequests': acceptrequests, 'leaverequests': leaverequests} - return render(request, "groupmanagement/index.html", context=render_items) + return render(request, 'groupmanagement/index.html', context=render_items) @login_required @@ -66,15 +62,11 @@ def group_membership(request): # Group leader specific groups = GroupManager.get_group_leaders_groups(request.user) - groups = ( - groups.exclude(authgroup__internal=True) - .annotate(num_members=Count("user")) - .order_by("name") - ) + groups = groups.exclude(authgroup__internal=True).annotate(num_members=Count('user')).order_by('name') - render_items = {"groups": groups} + render_items = {'groups': groups} - return render(request, "groupmanagement/groupmembership.html", context=render_items) + return render(request, 'groupmanagement/groupmembership.html', context=render_items) @login_required @@ -85,22 +77,18 @@ def group_membership_audit(request, group_id): try: # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if not GroupManager.check_internal_group( - group - ) or not GroupManager.can_manage_group(request.user, group): - logger.warning( - "User %s attempted to view the membership of group %s but permission was denied" - % (request.user, group_id) - ) + if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): + logger.warning("User %s attempted to view the membership of group %s but permission was denied" % + (request.user, group_id)) raise PermissionDenied except ObjectDoesNotExist: raise Http404("Group does not exist") - render_items = {"group": group.name} - entries = RequestLog.objects.filter(group=group).order_by("-date") - render_items["entries"] = entries + render_items = {'group': group.name} + entries = RequestLog.objects.filter(group=group).order_by('-date') + render_items['entries'] = entries - return render(request, "groupmanagement/audit.html", context=render_items) + return render(request, 'groupmanagement/audit.html', context=render_items) @login_required @@ -115,9 +103,9 @@ def group_membership_list(request, group_id): # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if not GroupManager.check_internal_group( - group - ) or not GroupManager.can_manage_group(request.user, group): + if (not GroupManager.check_internal_group(group) + or not GroupManager.can_manage_group(request.user, group) + ): logger.warning( "User %s attempted to view the membership of group %s " "but permission was denied" % (request.user, group_id) @@ -129,136 +117,90 @@ def group_membership_list(request, group_id): group_leaders = group.authgroup.group_leaders.all() members = list() - for member in ( - group.user_set.all() - .select_related("profile", "profile__main_character") - .order_by("profile__main_character__character_name") - ): + for member in \ + group.user_set\ + .all()\ + .select_related('profile', 'profile__main_character')\ + .order_by('profile__main_character__character_name'): - members.append( - { - "user": member, - "main_char": member.profile.main_character, - "is_leader": member in group_leaders, - } - ) + members.append({ + 'user': member, + 'main_char': member.profile.main_character, + 'is_leader': member in group_leaders + }) - render_items = {"group": group, "members": members} + render_items = {'group': group, 'members': members} - return render(request, "groupmanagement/groupmembers.html", context=render_items) + return render( + request, 'groupmanagement/groupmembers.html', + context=render_items + ) @login_required @user_passes_test(GroupManager.can_manage_groups) def group_membership_remove(request, group_id, user_id): - logger.debug( - "group_membership_remove called by user %s for group id %s on user id %s" - % (request.user, group_id, user_id) - ) + logger.debug("group_membership_remove called by user %s for group id %s on user id %s" % + (request.user, group_id, user_id)) group = get_object_or_404(Group, id=group_id) try: # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if not GroupManager.check_internal_group( - group - ) or not GroupManager.can_manage_group(request.user, group): - logger.warning( - "User %s attempted to remove a user from group %s but permission was denied" - % (request.user, group_id) - ) + if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): + logger.warning("User %s attempted to remove a user from group %s but permission was denied" % (request.user, + group_id)) raise PermissionDenied try: user = group.user_set.get(id=user_id) request_info = user.username + ":" + group.name - log = RequestLog( - request_type=None, - group=group, - request_info=request_info, - action=1, - request_actor=request.user, - ) + log = RequestLog(request_type=None,group=group,request_info=request_info,action=1,request_actor=request.user) log.save() # Remove group from user user.groups.remove(group) - logger.info( - "User %s removed user %s from group %s" % (request.user, user, group) - ) - messages.success( - request, - _("Removed user %(user)s from group %(group)s.") - % {"user": user, "group": group}, - ) + logger.info("User %s removed user %s from group %s" % (request.user, user, group)) + messages.success(request, _("Removed user %(user)s from group %(group)s.") % {"user": user, "group": group}) except ObjectDoesNotExist: messages.warning(request, _("User does not exist in that group")) except ObjectDoesNotExist: messages.warning(request, _("Group does not exist")) - return redirect("groupmanagement:membership", group_id) + return redirect('groupmanagement:membership', group_id) @login_required @user_passes_test(GroupManager.can_manage_groups) def group_accept_request(request, group_request_id): - logger.debug( - "group_accept_request called by user %s for grouprequest id %s" - % (request.user, group_request_id) - ) + logger.debug("group_accept_request called by user %s for grouprequest id %s" % (request.user, group_request_id)) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: group, created = Group.objects.get_or_create(name=group_request.group.name) - if not GroupManager.joinable_group( - group_request.group, group_request.user.profile.state - ) or not GroupManager.can_manage_group(request.user, group_request.group): + if not GroupManager.joinable_group(group_request.group, group_request.user.profile.state) or \ + not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied group_request.user.groups.add(group) group_request.user.save() - log = RequestLog( - request_type=group_request.leave_request, - group=group, - request_info=group_request.__str__(), - action=1, - request_actor=request.user, - ) + log = RequestLog(request_type=group_request.leave_request,group=group,request_info=group_request.__str__(),action=1,request_actor=request.user) log.save() group_request.delete() - logger.info( - "User %s accepted group request from user %s to group %s" - % (request.user, group_request.user, group_request.group.name) - ) - notify( - group_request.user, - "Group Application Accepted", - level="success", - message="Your application to %s has been accepted." % group_request.group, - ) - messages.success( - request, - _("Accepted application from %(mainchar)s to %(group)s.") - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) + logger.info("User %s accepted group request from user %s to group %s" % ( + request.user, group_request.user, group_request.group.name)) + notify(group_request.user, "Group Application Accepted", level="success", + message="Your application to %s has been accepted." % group_request.group) + messages.success(request, + _('Accepted application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) except PermissionDenied as p: - logger.warning( - "User %s attempted to accept group join request %s but permission was denied" - % (request.user, group_request_id) - ) + logger.warning("User %s attempted to accept group join request %s but permission was denied" % + (request.user, group_request_id)) raise p except: - messages.error( - request, - _( - "An unhandled error occurred while processing the application from %(mainchar)s to %(group)s." - ) - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) - logger.exception( - "Unhandled exception occurred while user %s attempting to accept grouprequest id %s." - % (request.user, group_request_id) - ) + messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) + logger.exception("Unhandled exception occurred while user %s attempting to accept grouprequest id %s." % ( + request.user, group_request_id)) pass return redirect("groupmanagement:management") @@ -267,60 +209,31 @@ def group_accept_request(request, group_request_id): @login_required @user_passes_test(GroupManager.can_manage_groups) def group_reject_request(request, group_request_id): - logger.debug( - "group_reject_request called by user %s for group request id %s" - % (request.user, group_request_id) - ) + logger.debug("group_reject_request called by user %s for group request id %s" % (request.user, group_request_id)) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied if group_request: - logger.info( - "User %s rejected group request from user %s to group %s" - % (request.user, group_request.user, group_request.group.name) - ) - log = RequestLog( - request_type=group_request.leave_request, - group=group_request.group, - request_info=group_request.__str__(), - action=0, - request_actor=request.user, - ) + logger.info("User %s rejected group request from user %s to group %s" % ( + request.user, group_request.user, group_request.group.name)) + log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user) log.save() group_request.delete() - notify( - group_request.user, - "Group Application Rejected", - level="danger", - message="Your application to %s has been rejected." - % group_request.group, - ) - messages.success( - request, - _("Rejected application from %(mainchar)s to %(group)s.") - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) + notify(group_request.user, "Group Application Rejected", level="danger", + message="Your application to %s has been rejected." % group_request.group) + messages.success(request, + _('Rejected application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) except PermissionDenied as p: - logger.warning( - "User %s attempted to reject group join request %s but permission was denied" - % (request.user, group_request_id) - ) + logger.warning("User %s attempted to reject group join request %s but permission was denied" % + (request.user, group_request_id)) raise p except: - messages.error( - request, - _( - "An unhandled error occurred while processing the application from %(mainchar)s to %(group)s." - ) - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) - logger.exception( - "Unhandled exception occurred while user %s attempting to reject group request id %s" - % (request.user, group_request_id) - ) + messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) + logger.exception("Unhandled exception occurred while user %s attempting to reject group request id %s" % ( + request.user, group_request_id)) pass return redirect("groupmanagement:management") @@ -330,9 +243,7 @@ def group_reject_request(request, group_request_id): @user_passes_test(GroupManager.can_manage_groups) def group_leave_accept_request(request, group_request_id): logger.debug( - "group_leave_accept_request called by user %s for group request id %s" - % (request.user, group_request_id) - ) + "group_leave_accept_request called by user %s for group request id %s" % (request.user, group_request_id)) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): @@ -341,48 +252,24 @@ def group_leave_accept_request(request, group_request_id): group, created = Group.objects.get_or_create(name=group_request.group.name) group_request.user.groups.remove(group) group_request.user.save() - log = RequestLog( - request_type=group_request.leave_request, - group=group_request.group, - request_info=group_request.__str__(), - action=1, - request_actor=request.user, - ) + log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=1,request_actor=request.user) log.save() group_request.delete() - logger.info( - "User %s accepted group leave request from user %s to group %s" - % (request.user, group_request.user, group_request.group.name) - ) - notify( - group_request.user, - "Group Leave Request Accepted", - level="success", - message="Your request to leave %s has been accepted." % group_request.group, - ) - messages.success( - request, - _("Accepted application from %(mainchar)s to leave %(group)s.") - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) + logger.info("User %s accepted group leave request from user %s to group %s" % ( + request.user, group_request.user, group_request.group.name)) + notify(group_request.user, "Group Leave Request Accepted", level="success", + message="Your request to leave %s has been accepted." % group_request.group) + messages.success(request, + _('Accepted application from %(mainchar)s to leave %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) except PermissionDenied as p: - logger.warning( - "User %s attempted to accept group leave request %s but permission was denied" - % (request.user, group_request_id) - ) + logger.warning("User %s attempted to accept group leave request %s but permission was denied" % + (request.user, group_request_id)) raise p except: - messages.error( - request, - _( - "An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s." - ) - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) - logger.exception( - "Unhandled exception occurred while user %s attempting to accept group leave request id %s" - % (request.user, group_request_id) - ) + messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { + "mainchar": group_request.main_char, "group": group_request.group}) + logger.exception("Unhandled exception occurred while user %s attempting to accept group leave request id %s" % ( + request.user, group_request_id)) pass return redirect("groupmanagement:management") @@ -392,58 +279,31 @@ def group_leave_accept_request(request, group_request_id): @user_passes_test(GroupManager.can_manage_groups) def group_leave_reject_request(request, group_request_id): logger.debug( - "group_leave_reject_request called by user %s for group request id %s" - % (request.user, group_request_id) - ) + "group_leave_reject_request called by user %s for group request id %s" % (request.user, group_request_id)) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied if group_request: - log = RequestLog( - request_type=group_request.leave_request, - group=group_request.group, - request_info=group_request.__str__(), - action=0, - request_actor=request.user, - ) + log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user) log.save() group_request.delete() - logger.info( - "User %s rejected group leave request from user %s for group %s" - % (request.user, group_request.user, group_request.group.name) - ) - notify( - group_request.user, - "Group Leave Request Rejected", - level="danger", - message="Your request to leave %s has been rejected." - % group_request.group, - ) - messages.success( - request, - _("Rejected application from %(mainchar)s to leave %(group)s.") - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) + logger.info("User %s rejected group leave request from user %s for group %s" % ( + request.user, group_request.user, group_request.group.name)) + notify(group_request.user, "Group Leave Request Rejected", level="danger", + message="Your request to leave %s has been rejected." % group_request.group) + messages.success(request, _('Rejected application from %(mainchar)s to leave %(group)s.') % { + "mainchar": group_request.main_char, "group": group_request.group}) except PermissionDenied as p: - logger.warning( - "User %s attempted to reject group leave request %s but permission was denied" - % (request.user, group_request_id) - ) + logger.warning("User %s attempted to reject group leave request %s but permission was denied" % + (request.user, group_request_id)) raise p except: - messages.error( - request, - _( - "An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s." - ) - % {"mainchar": group_request.main_char, "group": group_request.group}, - ) - logger.exception( - "Unhandled exception occurred while user %s attempting to reject group leave request id %s" - % (request.user, group_request_id) - ) + messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { + "mainchar": group_request.main_char, "group": group_request.group}) + logger.exception("Unhandled exception occurred while user %s attempting to reject group leave request id %s" % ( + request.user, group_request_id)) pass return redirect("groupmanagement:management") @@ -456,131 +316,96 @@ def groups_view(request): groups_qs = GroupManager.get_joinable_groups_for_user( request.user, include_hidden=False ) - groups_qs = groups_qs.order_by("name") + groups_qs = groups_qs.order_by('name') groups = [] for group in groups_qs: - group_request = GroupRequest.objects.filter(user=request.user).filter( - group=group - ) - groups.append( - {"group": group, "request": group_request[0] if group_request else None} - ) + group_request = GroupRequest.objects\ + .filter(user=request.user)\ + .filter(group=group) + groups.append({ + 'group': group, + 'request': group_request[0] if group_request else None + }) - context = {"groups": groups} - return render(request, "groupmanagement/groups.html", context=context) + context = {'groups': groups} + return render(request, 'groupmanagement/groups.html', context=context) @login_required def group_request_add(request, group_id): - logger.debug( - "group_request_add called by user %s for group id %s" % (request.user, group_id) - ) + logger.debug("group_request_add called by user %s for group id %s" % (request.user, group_id)) group = Group.objects.get(id=group_id) state = request.user.profile.state if not GroupManager.joinable_group(group, state): - logger.warning( - "User %s attempted to join group id %s but it is not a joinable group" - % (request.user, group_id) - ) + logger.warning("User %s attempted to join group id %s but it is not a joinable group" % + (request.user, group_id)) messages.warning(request, _("You cannot join that group")) - return redirect("groupmanagement:groups") + return redirect('groupmanagement:groups') if group in request.user.groups.all(): # User is already a member of this group. - logger.warning( - "User %s attempted to join group id %s but they are already a member." - % (request.user, group_id) - ) + logger.warning("User %s attempted to join group id %s but they are already a member." % + (request.user, group_id)) messages.warning(request, _("You are already a member of that group.")) - return redirect("groupmanagement:groups") - if ( - not request.user.has_perm("groupmanagement.request_groups") - and not group.authgroup.public - ): + return redirect('groupmanagement:groups') + if not request.user.has_perm('groupmanagement.request_groups') and not group.authgroup.public: # Does not have the required permission, trying to join a non-public group - logger.warning( - "User %s attempted to join group id %s but it is not a public group" - % (request.user, group_id) - ) + logger.warning("User %s attempted to join group id %s but it is not a public group" % + (request.user, group_id)) messages.warning(request, _("You cannot join that group")) - return redirect("groupmanagement:groups") + return redirect('groupmanagement:groups') if group.authgroup.open: logger.info("%s joining %s as is an open group" % (request.user, group)) request.user.groups.add(group) return redirect("groupmanagement:groups") req = GroupRequest.objects.filter(user=request.user, group=group) if len(req) > 0: - logger.info( - "%s attempted to join %s but already has an open application" - % (request.user, group) - ) - messages.warning( - request, _("You already have a pending application for that group.") - ) + logger.info("%s attempted to join %s but already has an open application" % (request.user, group)) + messages.warning(request, _("You already have a pending application for that group.")) return redirect("groupmanagement:groups") grouprequest = GroupRequest() - grouprequest.status = _("Pending") + grouprequest.status = _('Pending') grouprequest.group = group grouprequest.user = request.user grouprequest.leave_request = False grouprequest.save() - logger.info( - "Created group request for user %s to group %s" - % (request.user, Group.objects.get(id=group_id)) - ) - messages.success(request, _("Applied to group %(group)s.") % {"group": group}) + logger.info("Created group request for user %s to group %s" % (request.user, Group.objects.get(id=group_id))) + messages.success(request, _('Applied to group %(group)s.') % {"group": group}) return redirect("groupmanagement:groups") @login_required def group_request_leave(request, group_id): - logger.debug( - "group_request_leave called by user %s for group id %s" - % (request.user, group_id) - ) + logger.debug("group_request_leave called by user %s for group id %s" % (request.user, group_id)) group = Group.objects.get(id=group_id) if not GroupManager.check_internal_group(group): - logger.warning( - "User %s attempted to leave group id %s but it is not a joinable group" - % (request.user, group_id) - ) + logger.warning("User %s attempted to leave group id %s but it is not a joinable group" % + (request.user, group_id)) messages.warning(request, _("You cannot leave that group")) - return redirect("groupmanagement:groups") + return redirect('groupmanagement:groups') if group not in request.user.groups.all(): - logger.debug( - "User %s attempted to leave group id %s but they are not a member" - % (request.user, group_id) - ) + logger.debug("User %s attempted to leave group id %s but they are not a member" % + (request.user, group_id)) messages.warning(request, _("You are not a member of that group")) - return redirect("groupmanagement:groups") + return redirect('groupmanagement:groups') if group.authgroup.open: logger.info("%s leaving %s as is an open group" % (request.user, group)) request.user.groups.remove(group) return redirect("groupmanagement:groups") req = GroupRequest.objects.filter(user=request.user, group=group) if len(req) > 0: - logger.info( - "%s attempted to leave %s but already has an pending leave request." - % (request.user, group) - ) - messages.warning( - request, _("You already have a pending leave request for that group.") - ) + logger.info("%s attempted to leave %s but already has an pending leave request." % (request.user, group)) + messages.warning(request, _("You already have a pending leave request for that group.")) return redirect("groupmanagement:groups") - if getattr(settings, "AUTO_LEAVE", False): - logger.info( - "%s leaving joinable group %s due to auto_leave" % (request.user, group) - ) + if getattr(settings, 'AUTO_LEAVE', False): + logger.info("%s leaving joinable group %s due to auto_leave" % (request.user, group)) request.user.groups.remove(group) - return redirect("groupmanagement:groups") + return redirect('groupmanagement:groups') grouprequest = GroupRequest() - grouprequest.status = _("Pending") + grouprequest.status = _('Pending') grouprequest.group = group grouprequest.user = request.user grouprequest.leave_request = True grouprequest.save() - logger.info( - "Created group leave request for user %s to group %s" - % (request.user, Group.objects.get(id=group_id)) - ) - messages.success(request, _("Applied to leave group %(group)s.") % {"group": group}) + logger.info("Created group leave request for user %s to group %s" % (request.user, Group.objects.get(id=group_id))) + messages.success(request, _('Applied to leave group %(group)s.') % {"group": group}) return redirect("groupmanagement:groups") From 2f59c8df22c3dbdd47ece2a9210b07cf3d02ead4 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 26 Oct 2020 01:10:41 +0100 Subject: [PATCH 7/8] And of course I missed something ... --- allianceauth/groupmanagement/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 861872ef..250b40b1 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -107,7 +107,7 @@ class AuthGroup(models.Model): help_text="States listed here will have the ability to join this group provided " "they have the proper permissions.") - description = models.TextField(max_length=512, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") + description = models.TextField(max_length=512, null=True, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") def __str__(self): return self.group.name From 9952685805308739c8e3746216058129aa9fa7f4 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 16 Nov 2020 18:04:57 +0100 Subject: [PATCH 8/8] textfield should not be Null=True --- .../migrations/0015_make_descriptions_great_again.py | 1 - allianceauth/groupmanagement/models.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py index 6d086c89..63b3807f 100644 --- a/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py +++ b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py @@ -17,7 +17,6 @@ class Migration(migrations.Migration): blank=True, help_text="Short description (max. 512 characters) of the group shown to users.", max_length=512, - null=True, ), ), ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 250b40b1..861872ef 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -107,7 +107,7 @@ class AuthGroup(models.Model): help_text="States listed here will have the ability to join this group provided " "they have the proper permissions.") - description = models.TextField(max_length=512, null=True, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") + description = models.TextField(max_length=512, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") def __str__(self): return self.group.name
- {{ group.name }} + {{ group.name }} {{ group.authgroup.description }} @@ -46,9 +46,8 @@ {{ group.num_members }} - - + + @@ -72,9 +71,9 @@ {% endblock content %} -{% block extra_javascript %} +{% block extra_javascript %} {% include 'bundles/clipboard-js.html' %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/allianceauth/groupmanagement/urls.py b/allianceauth/groupmanagement/urls.py index d2d57783..2bc1103f 100644 --- a/allianceauth/groupmanagement/urls.py +++ b/allianceauth/groupmanagement/urls.py @@ -1,29 +1,52 @@ from . import views from django.conf.urls import url -app_name = 'groupmanagement' + +app_name = "groupmanagement" urlpatterns = [ - url(r'^groups/', views.groups_view, name='groups'), - url(r'^management/', views.group_management, - name='management'), - url(r'^membership/$', views.group_membership, - name='membership'), - url(r'^membership/(\w+)/$', views.group_membership_list, - name='membership_list'), - url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"), - url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove, - name='membership_remove'), - url(r'^request_add/(\w+)', views.group_request_add, - name='request_add'), - url(r'^request/accept/(\w+)', views.group_accept_request, - name='accept_request'), - url(r'^request/reject/(\w+)', views.group_reject_request, - name='reject_request'), - url(r'^request_leave/(\w+)', views.group_request_leave, - name='request_leave'), - url(r'leave_request/accept/(\w+)', views.group_leave_accept_request, - name='leave_accept_request'), - url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request, - name='leave_reject_request'), + # groups + url(r"^groups/$", views.groups_view, name="groups"), + url(r"^group/request/join/(\w+)/$", views.group_request_add, name="request_add"), + url( + r"^group/request/leave/(\w+)/$", views.group_request_leave, name="request_leave" + ), + # group management + url(r"^groupmanagement/requests/$", views.group_management, name="management"), + url(r"^groupmanagement/membership/$", views.group_membership, name="membership"), + url( + r"^groupmanagement/membership/(\w+)/$", + views.group_membership_list, + name="membership", + ), + url( + r"^groupmanagement/membership/(\w+)/audit-log/$", + views.group_membership_audit, + name="audit_log", + ), + url( + r"^groupmanagement/membership/(\w+)/remove/(\w+)/$", + views.group_membership_remove, + name="membership_remove", + ), + url( + r"^groupmanagement/request/join/accept/(\w+)/$", + views.group_accept_request, + name="accept_request", + ), + url( + r"^groupmanagement/request/join/reject/(\w+)/$", + views.group_reject_request, + name="reject_request", + ), + url( + r"groupmanagement/request/leave/accept/(\w+)/$", + views.group_leave_accept_request, + name="leave_accept_request", + ), + url( + r"^groupmanagement/request/leave/reject/(\w+)/$", + views.group_leave_reject_request, + name="leave_reject_request", + ), ] diff --git a/allianceauth/groupmanagement/views.py b/allianceauth/groupmanagement/views.py index caa680d7..55956f7b 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -27,7 +27,9 @@ def group_management(request): acceptrequests = [] leaverequests = [] - base_group_query = GroupRequest.objects.select_related('user', 'group', 'user__profile__main_character') + base_group_query = GroupRequest.objects.select_related( + "user", "group", "user__profile__main_character" + ) if GroupManager.has_management_permission(request.user): # Full access group_requests = base_group_query.all() @@ -42,12 +44,14 @@ def group_management(request): else: acceptrequests.append(grouprequest) - logger.debug("Providing user %s with %s acceptrequests and %s leaverequests." % ( - request.user, len(acceptrequests), len(leaverequests))) + logger.debug( + "Providing user %s with %s acceptrequests and %s leaverequests." + % (request.user, len(acceptrequests), len(leaverequests)) + ) - render_items = {'acceptrequests': acceptrequests, 'leaverequests': leaverequests} + render_items = {"acceptrequests": acceptrequests, "leaverequests": leaverequests} - return render(request, 'groupmanagement/index.html', context=render_items) + return render(request, "groupmanagement/index.html", context=render_items) @login_required @@ -62,11 +66,15 @@ def group_membership(request): # Group leader specific groups = GroupManager.get_group_leaders_groups(request.user) - groups = groups.exclude(authgroup__internal=True).annotate(num_members=Count('user')).order_by('name') + groups = ( + groups.exclude(authgroup__internal=True) + .annotate(num_members=Count("user")) + .order_by("name") + ) - render_items = {'groups': groups} + render_items = {"groups": groups} - return render(request, 'groupmanagement/groupmembership.html', context=render_items) + return render(request, "groupmanagement/groupmembership.html", context=render_items) @login_required @@ -77,18 +85,22 @@ def group_membership_audit(request, group_id): try: # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): - logger.warning("User %s attempted to view the membership of group %s but permission was denied" % - (request.user, group_id)) + if not GroupManager.check_internal_group( + group + ) or not GroupManager.can_manage_group(request.user, group): + logger.warning( + "User %s attempted to view the membership of group %s but permission was denied" + % (request.user, group_id) + ) raise PermissionDenied except ObjectDoesNotExist: raise Http404("Group does not exist") - render_items = {'group': group.name} - entries = RequestLog.objects.filter(group=group).order_by('-date') - render_items['entries'] = entries + render_items = {"group": group.name} + entries = RequestLog.objects.filter(group=group).order_by("-date") + render_items["entries"] = entries - return render(request, 'groupmanagement/audit.html', context=render_items) + return render(request, "groupmanagement/audit.html", context=render_items) @login_required @@ -103,9 +115,9 @@ def group_membership_list(request, group_id): # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if (not GroupManager.check_internal_group(group) - or not GroupManager.can_manage_group(request.user, group) - ): + if not GroupManager.check_internal_group( + group + ) or not GroupManager.can_manage_group(request.user, group): logger.warning( "User %s attempted to view the membership of group %s " "but permission was denied" % (request.user, group_id) @@ -117,90 +129,136 @@ def group_membership_list(request, group_id): group_leaders = group.authgroup.group_leaders.all() members = list() - for member in \ - group.user_set\ - .all()\ - .select_related('profile', 'profile__main_character')\ - .order_by('profile__main_character__character_name'): + for member in ( + group.user_set.all() + .select_related("profile", "profile__main_character") + .order_by("profile__main_character__character_name") + ): - members.append({ - 'user': member, - 'main_char': member.profile.main_character, - 'is_leader': member in group_leaders - }) + members.append( + { + "user": member, + "main_char": member.profile.main_character, + "is_leader": member in group_leaders, + } + ) - render_items = {'group': group, 'members': members} + render_items = {"group": group, "members": members} - return render( - request, 'groupmanagement/groupmembers.html', - context=render_items - ) + return render(request, "groupmanagement/groupmembers.html", context=render_items) @login_required @user_passes_test(GroupManager.can_manage_groups) def group_membership_remove(request, group_id, user_id): - logger.debug("group_membership_remove called by user %s for group id %s on user id %s" % - (request.user, group_id, user_id)) + logger.debug( + "group_membership_remove called by user %s for group id %s on user id %s" + % (request.user, group_id, user_id) + ) group = get_object_or_404(Group, id=group_id) try: # Check its a joinable group i.e. not corp or internal # And the user has permission to manage it - if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): - logger.warning("User %s attempted to remove a user from group %s but permission was denied" % (request.user, - group_id)) + if not GroupManager.check_internal_group( + group + ) or not GroupManager.can_manage_group(request.user, group): + logger.warning( + "User %s attempted to remove a user from group %s but permission was denied" + % (request.user, group_id) + ) raise PermissionDenied try: user = group.user_set.get(id=user_id) request_info = user.username + ":" + group.name - log = RequestLog(request_type=None,group=group,request_info=request_info,action=1,request_actor=request.user) + log = RequestLog( + request_type=None, + group=group, + request_info=request_info, + action=1, + request_actor=request.user, + ) log.save() # Remove group from user user.groups.remove(group) - logger.info("User %s removed user %s from group %s" % (request.user, user, group)) - messages.success(request, _("Removed user %(user)s from group %(group)s.") % {"user": user, "group": group}) + logger.info( + "User %s removed user %s from group %s" % (request.user, user, group) + ) + messages.success( + request, + _("Removed user %(user)s from group %(group)s.") + % {"user": user, "group": group}, + ) except ObjectDoesNotExist: messages.warning(request, _("User does not exist in that group")) except ObjectDoesNotExist: messages.warning(request, _("Group does not exist")) - return redirect('groupmanagement:membership_list', group_id) + return redirect("groupmanagement:membership", group_id) @login_required @user_passes_test(GroupManager.can_manage_groups) def group_accept_request(request, group_request_id): - logger.debug("group_accept_request called by user %s for grouprequest id %s" % (request.user, group_request_id)) + logger.debug( + "group_accept_request called by user %s for grouprequest id %s" + % (request.user, group_request_id) + ) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: group, created = Group.objects.get_or_create(name=group_request.group.name) - if not GroupManager.joinable_group(group_request.group, group_request.user.profile.state) or \ - not GroupManager.can_manage_group(request.user, group_request.group): + if not GroupManager.joinable_group( + group_request.group, group_request.user.profile.state + ) or not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied group_request.user.groups.add(group) group_request.user.save() - log = RequestLog(request_type=group_request.leave_request,group=group,request_info=group_request.__str__(),action=1,request_actor=request.user) + log = RequestLog( + request_type=group_request.leave_request, + group=group, + request_info=group_request.__str__(), + action=1, + request_actor=request.user, + ) log.save() group_request.delete() - logger.info("User %s accepted group request from user %s to group %s" % ( - request.user, group_request.user, group_request.group.name)) - notify(group_request.user, "Group Application Accepted", level="success", - message="Your application to %s has been accepted." % group_request.group) - messages.success(request, - _('Accepted application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) + logger.info( + "User %s accepted group request from user %s to group %s" + % (request.user, group_request.user, group_request.group.name) + ) + notify( + group_request.user, + "Group Application Accepted", + level="success", + message="Your application to %s has been accepted." % group_request.group, + ) + messages.success( + request, + _("Accepted application from %(mainchar)s to %(group)s.") + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) except PermissionDenied as p: - logger.warning("User %s attempted to accept group join request %s but permission was denied" % - (request.user, group_request_id)) + logger.warning( + "User %s attempted to accept group join request %s but permission was denied" + % (request.user, group_request_id) + ) raise p except: - messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) - logger.exception("Unhandled exception occurred while user %s attempting to accept grouprequest id %s." % ( - request.user, group_request_id)) + messages.error( + request, + _( + "An unhandled error occurred while processing the application from %(mainchar)s to %(group)s." + ) + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) + logger.exception( + "Unhandled exception occurred while user %s attempting to accept grouprequest id %s." + % (request.user, group_request_id) + ) pass return redirect("groupmanagement:management") @@ -209,31 +267,60 @@ def group_accept_request(request, group_request_id): @login_required @user_passes_test(GroupManager.can_manage_groups) def group_reject_request(request, group_request_id): - logger.debug("group_reject_request called by user %s for group request id %s" % (request.user, group_request_id)) + logger.debug( + "group_reject_request called by user %s for group request id %s" + % (request.user, group_request_id) + ) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied if group_request: - logger.info("User %s rejected group request from user %s to group %s" % ( - request.user, group_request.user, group_request.group.name)) - log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user) + logger.info( + "User %s rejected group request from user %s to group %s" + % (request.user, group_request.user, group_request.group.name) + ) + log = RequestLog( + request_type=group_request.leave_request, + group=group_request.group, + request_info=group_request.__str__(), + action=0, + request_actor=request.user, + ) log.save() group_request.delete() - notify(group_request.user, "Group Application Rejected", level="danger", - message="Your application to %s has been rejected." % group_request.group) - messages.success(request, - _('Rejected application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) + notify( + group_request.user, + "Group Application Rejected", + level="danger", + message="Your application to %s has been rejected." + % group_request.group, + ) + messages.success( + request, + _("Rejected application from %(mainchar)s to %(group)s.") + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) except PermissionDenied as p: - logger.warning("User %s attempted to reject group join request %s but permission was denied" % - (request.user, group_request_id)) + logger.warning( + "User %s attempted to reject group join request %s but permission was denied" + % (request.user, group_request_id) + ) raise p except: - messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) - logger.exception("Unhandled exception occurred while user %s attempting to reject group request id %s" % ( - request.user, group_request_id)) + messages.error( + request, + _( + "An unhandled error occurred while processing the application from %(mainchar)s to %(group)s." + ) + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) + logger.exception( + "Unhandled exception occurred while user %s attempting to reject group request id %s" + % (request.user, group_request_id) + ) pass return redirect("groupmanagement:management") @@ -243,7 +330,9 @@ def group_reject_request(request, group_request_id): @user_passes_test(GroupManager.can_manage_groups) def group_leave_accept_request(request, group_request_id): logger.debug( - "group_leave_accept_request called by user %s for group request id %s" % (request.user, group_request_id)) + "group_leave_accept_request called by user %s for group request id %s" + % (request.user, group_request_id) + ) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): @@ -252,24 +341,48 @@ def group_leave_accept_request(request, group_request_id): group, created = Group.objects.get_or_create(name=group_request.group.name) group_request.user.groups.remove(group) group_request.user.save() - log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=1,request_actor=request.user) + log = RequestLog( + request_type=group_request.leave_request, + group=group_request.group, + request_info=group_request.__str__(), + action=1, + request_actor=request.user, + ) log.save() group_request.delete() - logger.info("User %s accepted group leave request from user %s to group %s" % ( - request.user, group_request.user, group_request.group.name)) - notify(group_request.user, "Group Leave Request Accepted", level="success", - message="Your request to leave %s has been accepted." % group_request.group) - messages.success(request, - _('Accepted application from %(mainchar)s to leave %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) + logger.info( + "User %s accepted group leave request from user %s to group %s" + % (request.user, group_request.user, group_request.group.name) + ) + notify( + group_request.user, + "Group Leave Request Accepted", + level="success", + message="Your request to leave %s has been accepted." % group_request.group, + ) + messages.success( + request, + _("Accepted application from %(mainchar)s to leave %(group)s.") + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) except PermissionDenied as p: - logger.warning("User %s attempted to accept group leave request %s but permission was denied" % - (request.user, group_request_id)) + logger.warning( + "User %s attempted to accept group leave request %s but permission was denied" + % (request.user, group_request_id) + ) raise p except: - messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { - "mainchar": group_request.main_char, "group": group_request.group}) - logger.exception("Unhandled exception occurred while user %s attempting to accept group leave request id %s" % ( - request.user, group_request_id)) + messages.error( + request, + _( + "An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s." + ) + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) + logger.exception( + "Unhandled exception occurred while user %s attempting to accept group leave request id %s" + % (request.user, group_request_id) + ) pass return redirect("groupmanagement:management") @@ -279,31 +392,58 @@ def group_leave_accept_request(request, group_request_id): @user_passes_test(GroupManager.can_manage_groups) def group_leave_reject_request(request, group_request_id): logger.debug( - "group_leave_reject_request called by user %s for group request id %s" % (request.user, group_request_id)) + "group_leave_reject_request called by user %s for group request id %s" + % (request.user, group_request_id) + ) group_request = get_object_or_404(GroupRequest, id=group_request_id) try: if not GroupManager.can_manage_group(request.user, group_request.group): raise PermissionDenied if group_request: - log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user) + log = RequestLog( + request_type=group_request.leave_request, + group=group_request.group, + request_info=group_request.__str__(), + action=0, + request_actor=request.user, + ) log.save() group_request.delete() - logger.info("User %s rejected group leave request from user %s for group %s" % ( - request.user, group_request.user, group_request.group.name)) - notify(group_request.user, "Group Leave Request Rejected", level="danger", - message="Your request to leave %s has been rejected." % group_request.group) - messages.success(request, _('Rejected application from %(mainchar)s to leave %(group)s.') % { - "mainchar": group_request.main_char, "group": group_request.group}) + logger.info( + "User %s rejected group leave request from user %s for group %s" + % (request.user, group_request.user, group_request.group.name) + ) + notify( + group_request.user, + "Group Leave Request Rejected", + level="danger", + message="Your request to leave %s has been rejected." + % group_request.group, + ) + messages.success( + request, + _("Rejected application from %(mainchar)s to leave %(group)s.") + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) except PermissionDenied as p: - logger.warning("User %s attempted to reject group leave request %s but permission was denied" % - (request.user, group_request_id)) + logger.warning( + "User %s attempted to reject group leave request %s but permission was denied" + % (request.user, group_request_id) + ) raise p except: - messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { - "mainchar": group_request.main_char, "group": group_request.group}) - logger.exception("Unhandled exception occurred while user %s attempting to reject group leave request id %s" % ( - request.user, group_request_id)) + messages.error( + request, + _( + "An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s." + ) + % {"mainchar": group_request.main_char, "group": group_request.group}, + ) + logger.exception( + "Unhandled exception occurred while user %s attempting to reject group leave request id %s" + % (request.user, group_request_id) + ) pass return redirect("groupmanagement:management") @@ -312,100 +452,135 @@ def group_leave_reject_request(request, group_request_id): @login_required def groups_view(request): logger.debug("groups_view called by user %s" % request.user) - + groups_qs = GroupManager.get_joinable_groups_for_user( request.user, include_hidden=False ) - groups_qs = groups_qs.order_by('name') + groups_qs = groups_qs.order_by("name") groups = [] - for group in groups_qs: - group_request = GroupRequest.objects\ - .filter(user=request.user)\ - .filter(group=group) - groups.append({ - 'group': group, - 'request': group_request[0] if group_request else None - }) + for group in groups_qs: + group_request = GroupRequest.objects.filter(user=request.user).filter( + group=group + ) + groups.append( + {"group": group, "request": group_request[0] if group_request else None} + ) - context = {'groups': groups} - return render(request, 'groupmanagement/groups.html', context=context) + context = {"groups": groups} + return render(request, "groupmanagement/groups.html", context=context) @login_required def group_request_add(request, group_id): - logger.debug("group_request_add called by user %s for group id %s" % (request.user, group_id)) + logger.debug( + "group_request_add called by user %s for group id %s" % (request.user, group_id) + ) group = Group.objects.get(id=group_id) state = request.user.profile.state if not GroupManager.joinable_group(group, state): - logger.warning("User %s attempted to join group id %s but it is not a joinable group" % - (request.user, group_id)) + logger.warning( + "User %s attempted to join group id %s but it is not a joinable group" + % (request.user, group_id) + ) messages.warning(request, _("You cannot join that group")) - return redirect('groupmanagement:groups') + return redirect("groupmanagement:groups") if group in request.user.groups.all(): # User is already a member of this group. - logger.warning("User %s attempted to join group id %s but they are already a member." % - (request.user, group_id)) + logger.warning( + "User %s attempted to join group id %s but they are already a member." + % (request.user, group_id) + ) messages.warning(request, _("You are already a member of that group.")) - return redirect('groupmanagement:groups') - if not request.user.has_perm('groupmanagement.request_groups') and not group.authgroup.public: + return redirect("groupmanagement:groups") + if ( + not request.user.has_perm("groupmanagement.request_groups") + and not group.authgroup.public + ): # Does not have the required permission, trying to join a non-public group - logger.warning("User %s attempted to join group id %s but it is not a public group" % - (request.user, group_id)) + logger.warning( + "User %s attempted to join group id %s but it is not a public group" + % (request.user, group_id) + ) messages.warning(request, _("You cannot join that group")) - return redirect('groupmanagement:groups') + return redirect("groupmanagement:groups") if group.authgroup.open: logger.info("%s joining %s as is an open group" % (request.user, group)) request.user.groups.add(group) return redirect("groupmanagement:groups") req = GroupRequest.objects.filter(user=request.user, group=group) if len(req) > 0: - logger.info("%s attempted to join %s but already has an open application" % (request.user, group)) - messages.warning(request, _("You already have a pending application for that group.")) + logger.info( + "%s attempted to join %s but already has an open application" + % (request.user, group) + ) + messages.warning( + request, _("You already have a pending application for that group.") + ) return redirect("groupmanagement:groups") grouprequest = GroupRequest() - grouprequest.status = _('Pending') + grouprequest.status = _("Pending") grouprequest.group = group grouprequest.user = request.user grouprequest.leave_request = False grouprequest.save() - logger.info("Created group request for user %s to group %s" % (request.user, Group.objects.get(id=group_id))) - messages.success(request, _('Applied to group %(group)s.') % {"group": group}) + logger.info( + "Created group request for user %s to group %s" + % (request.user, Group.objects.get(id=group_id)) + ) + messages.success(request, _("Applied to group %(group)s.") % {"group": group}) return redirect("groupmanagement:groups") @login_required def group_request_leave(request, group_id): - logger.debug("group_request_leave called by user %s for group id %s" % (request.user, group_id)) + logger.debug( + "group_request_leave called by user %s for group id %s" + % (request.user, group_id) + ) group = Group.objects.get(id=group_id) if not GroupManager.check_internal_group(group): - logger.warning("User %s attempted to leave group id %s but it is not a joinable group" % - (request.user, group_id)) + logger.warning( + "User %s attempted to leave group id %s but it is not a joinable group" + % (request.user, group_id) + ) messages.warning(request, _("You cannot leave that group")) - return redirect('groupmanagement:groups') + return redirect("groupmanagement:groups") if group not in request.user.groups.all(): - logger.debug("User %s attempted to leave group id %s but they are not a member" % - (request.user, group_id)) + logger.debug( + "User %s attempted to leave group id %s but they are not a member" + % (request.user, group_id) + ) messages.warning(request, _("You are not a member of that group")) - return redirect('groupmanagement:groups') + return redirect("groupmanagement:groups") if group.authgroup.open: logger.info("%s leaving %s as is an open group" % (request.user, group)) request.user.groups.remove(group) return redirect("groupmanagement:groups") req = GroupRequest.objects.filter(user=request.user, group=group) if len(req) > 0: - logger.info("%s attempted to leave %s but already has an pending leave request." % (request.user, group)) - messages.warning(request, _("You already have a pending leave request for that group.")) + logger.info( + "%s attempted to leave %s but already has an pending leave request." + % (request.user, group) + ) + messages.warning( + request, _("You already have a pending leave request for that group.") + ) return redirect("groupmanagement:groups") - if getattr(settings, 'AUTO_LEAVE', False): - logger.info("%s leaving joinable group %s due to auto_leave" % (request.user, group)) + if getattr(settings, "AUTO_LEAVE", False): + logger.info( + "%s leaving joinable group %s due to auto_leave" % (request.user, group) + ) request.user.groups.remove(group) - return redirect('groupmanagement:groups') + return redirect("groupmanagement:groups") grouprequest = GroupRequest() - grouprequest.status = _('Pending') + grouprequest.status = _("Pending") grouprequest.group = group grouprequest.user = request.user grouprequest.leave_request = True grouprequest.save() - logger.info("Created group leave request for user %s to group %s" % (request.user, Group.objects.get(id=group_id))) - messages.success(request, _('Applied to leave group %(group)s.') % {"group": group}) + logger.info( + "Created group leave request for user %s to group %s" + % (request.user, Group.objects.get(id=group_id)) + ) + messages.success(request, _("Applied to leave group %(group)s.") % {"group": group}) return redirect("groupmanagement:groups") From 8a91e7f6ac16a55fd884db05c7661b5e77094d6c Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 25 Oct 2020 11:22:10 +0100 Subject: [PATCH 2/8] navactive status fixed in left menu and top menu --- allianceauth/groupmanagement/auth_hooks.py | 21 ++++++++++++------- .../templates/groupmanagement/menu.html | 6 ++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/allianceauth/groupmanagement/auth_hooks.py b/allianceauth/groupmanagement/auth_hooks.py index 6d11e41d..e077110b 100644 --- a/allianceauth/groupmanagement/auth_hooks.py +++ b/allianceauth/groupmanagement/auth_hooks.py @@ -9,15 +9,20 @@ from .managers import GroupManager class GroupManagementMenuItem(MenuItemHook): """ This class ensures only authorized users will see the menu entry """ + def __init__(self): # setup menu entry for sidebar MenuItemHook.__init__( self, - text=_('Group Management'), - classes='fas fa-users-cog fa-fw', - url_name='groupmanagement:management', + text=_("Group Management"), + classes="fas fa-users-cog fa-fw", + url_name="groupmanagement:management", order=50, - navactive=['groupmanagement:management'] + navactive=[ + "groupmanagement:management", # group requests view + "groupmanagement:membership", # group membership view + "groupmanagement:audit_log", # group audit log view + ], ) def render(self, request): @@ -25,14 +30,14 @@ class GroupManagementMenuItem(MenuItemHook): app_count = GroupManager.pending_requests_count_for_user(request.user) self.count = app_count if app_count and app_count > 0 else None return MenuItemHook.render(self, request) - return '' + return "" -@hooks.register('menu_item_hook') +@hooks.register("menu_item_hook") def register_menu(): return GroupManagementMenuItem() -@hooks.register('url_hook') +@hooks.register("url_hook") def register_urls(): - return UrlHook(urls, 'group', r'^group/') + return UrlHook(urls, "group", r"^groups/") diff --git a/allianceauth/groupmanagement/templates/groupmanagement/menu.html b/allianceauth/groupmanagement/templates/groupmanagement/menu.html index a0a057e7..788b987e 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/menu.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/menu.html @@ -4,7 +4,6 @@ From 87c0c3ac73e8cff2f9444cf8e67c5c045dcb020d Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 25 Oct 2020 11:55:03 +0100 Subject: [PATCH 3/8] tables formatted properly align center is horrible to read .... --- .../templates/groupmanagement/audit.html | 79 +++--- .../groupmanagement/groupmembers.html | 68 ++--- .../groupmanagement/groupmembership.html | 37 ++- .../templates/groupmanagement/groups.html | 16 +- .../templates/groupmanagement/index.html | 232 +++++++++--------- 5 files changed, 226 insertions(+), 206 deletions(-) diff --git a/allianceauth/groupmanagement/templates/groupmanagement/audit.html b/allianceauth/groupmanagement/templates/groupmanagement/audit.html index 51cc2ef5..7273107e 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/audit.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/audit.html @@ -8,58 +8,65 @@

{% include 'groupmanagement/menu.html' %} +
- {{ group }} - {% trans 'Audit Log' %} + {{ group }} - {% trans "Audit Log" %}
-
-

+ +

+

{% trans "Back" %} -

+

+ {% if entries %}
- - - - - - - + + + + + + + + {% for entry in entries %} - - - - - + + + + + + {% if entry.request_type is None %} - + {% else %} - + {% endif %} - + + {% endfor %}
{% trans "Date/Time" %}{% trans "Requestor" %}{% trans "Character" %}{% trans "Corporation" %}{% trans "Type" %}{% trans "Action" %}{% trans "Actor" %}{% trans "Date/Time" %}{% trans "Requestor" %}{% trans "Character" %}{% trans "Corporation" %}{% trans "Type" %}{% trans "Action" %}{% trans "Actor" %}
{{ entry.date|date:"Y-M-d, H:i" }}{{ entry.requestor }}{{ entry.req_char }}{{ entry.req_char.corporation_name }}{{ entry.type_to_str }}{{ entry.date|date:"Y-M-d, H:i" }}{{ entry.requestor }}{{ entry.req_char }}{{ entry.req_char.corporation_name }}{{ entry.type_to_str }} Removed{% trans "Removed" %}{{ entry.action_to_str }}{{ entry.action_to_str }}{{ entry.request_actor }}{{ entry.request_actor }}
+

- All times displayed are EVE/UTC. + {% trans "All times displayed are EVE/UTC." %}

- {% else %} + {% else %}

-
+
{% trans "No entries found for this group." %} -
+
{% endif %} -
+
{% endblock %} @@ -75,31 +82,30 @@ {% endblock %} {% block extra_script %} - - $.fn.dataTable.moment = function ( format, locale ) { + $.fn.dataTable.moment = function(format, locale) { var types = $.fn.dataTable.ext.type; - + // Add type detection - types.detect.unshift( function ( d ) { - return moment( d, format, locale, true ).isValid() ? + types.detect.unshift(function(d) { + return moment(d, format, locale, true).isValid() ? 'moment-'+format : null; - } ); - + }); + // Add sorting method - use an integer for the sorting - types.order[ 'moment-'+format+'-pre' ] = function ( d ) { - return moment( d, format, locale, true ).unix(); + types.order[ 'moment-'+format+'-pre' ] = function(d) { + return moment(d, format, locale, true).unix(); }; }; $(document).ready(function(){ - $.fn.dataTable.moment( 'YYYY-MMM-D, HH:mm' ); + $.fn.dataTable.moment('YYYY-MMM-D, HH:mm'); $('#log-entries').DataTable({ - order: [[ 0, 'desc' ], [ 1, 'asc' ] ], + order: [[0, 'desc'], [1, 'asc']], filterDropDown: { - columns: [ + columns: [ { idx: 1 }, @@ -124,4 +130,3 @@ }); }); {% endblock %} - diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html b/allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html index 438137fc..f7b58d54 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html @@ -9,38 +9,35 @@

{% include 'groupmanagement/menu.html' %} - +
{{ group.name }} - {% trans 'Members' %}
-
-

+ +

+

{% trans "Back" %} -

- {% if group.user_set %} +

+ + {% if group.user_set %}
- - - - - + + + + + {% for member in members %} - - - + - - + + {% endfor %}
{% trans "Portrait" %}{% trans "Character" %}{% trans "Organization" %}
{% trans "Character" %}{% trans "Organization" %}
- {% if member.is_leader %} -   - {% endif %} - - +
+ {% if member.main_char %} {{ member.main_char.character_name }} @@ -48,28 +45,36 @@ {% else %} {{ member.user.username }} {% endif %} + + {% if member.is_leader %} +   + {% endif %} + + {% if member.main_char %} {{ member.main_char.corporation_name }}
{{ member.main_char.alliance_name|default_if_none:"" }} {% else %} - (unknown) + {% trans "(unknown)" %} {% endif %} -
- - + + +
-

: Group leader

+ +

+ : {% trans "Group leader" %} +

{% else %}
@@ -77,7 +82,7 @@
{% endif %}
- +
{% endblock content %} @@ -93,10 +98,13 @@ {% block extra_script %} $(document).ready(function(){ $('#tab_group_members').DataTable({ - order: [ [ 1, "asc" ] ], + order: [[0, "asc"]], columnDefs: [ - { "sortable": false, "targets": [0, 3] }, + { + "sortable": false, + "targets": [2] + }, ] }); }); -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html index 1ddd9c89..c2291f7f 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html @@ -9,31 +9,36 @@

{% include 'groupmanagement/menu.html' %} +
{% trans "Groups" %}
+
{% if groups %}
- - - - - + + + + + + {% for group in groups %} - - - + + - - + {% for leaverequest in leaverequests %} + + + + + + + {% endfor %} + +
{% trans "Name" %}{% trans "Description" %}{% trans "Status" %}{% trans "Member Count" %}{% trans "Name" %}{% trans "Description" %}{% trans "Status" %}{% trans "Member Count" %}
+ {{ group.name }} {{ group.authgroup.description }} + + {{ group.authgroup.description }} {% if group.authgroup.hidden %} {% trans "Hidden" %} {% elif group.authgroup.open %} @@ -42,16 +47,20 @@ {% trans "Requestable" %} {% endif %} + + {{ group.num_members }} + + + + @@ -71,9 +80,11 @@ {% endblock content %} + {% block extra_javascript %} {% include 'bundles/clipboard-js.html' %} - + + {% endblock %} diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groups.html b/allianceauth/groupmanagement/templates/groupmanagement/groups.html index d2c2b036..a94f4cd4 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groups.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groups.html @@ -4,7 +4,7 @@ {% block page_title %}{% trans "Available Groups" %}{% endblock page_title %} {% block extra_css %}{% endblock extra_css %} -url + {% block content %}

{% trans "Available Groups" %}

@@ -12,17 +12,18 @@ url - - - + + + + {% for g in groups %} - - - + + + {% for acceptrequest in acceptrequests %} + + + + + + + {% endfor %} + +
{% trans "Name" %}{% trans "Description" %}{% trans "Action" %}{% trans "Name" %}{% trans "Description" %}
{{ g.group.name }}{{ g.group.authgroup.description|urlize }} + {{ g.group.name }}{{ g.group.authgroup.description|urlize }} {% if g.group in user.groups.all %} {% if not g.request %} @@ -59,5 +60,4 @@ url {% endif %} - {% endblock content %} diff --git a/allianceauth/groupmanagement/templates/groupmanagement/index.html b/allianceauth/groupmanagement/templates/groupmanagement/index.html index 117bbd79..138122e5 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/index.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/index.html @@ -4,25 +4,25 @@ {% load evelinks %} {% block page_title %}{% trans "Groups Management" %}{% endblock page_title %} -{% block extra_css %} - +{% block extra_css %} + {% endblock extra_css %} {% block content %}

{% include 'groupmanagement/menu.html' %} - +
- -
+
- {% if acceptrequests %} -
- - - - - - - - - - - - {% for acceptrequest in acceptrequests %} - - - - - - + {% if acceptrequests %} +
+
{% trans "Character" %}{% trans "Organization" %}{% trans "Group" %}
- - - {% if acceptrequest.main_char %} - - {{ acceptrequest.main_char.character_name }} - - {% else %} - {{ acceptrequest.user.username }} - {% endif %} - - {% if acceptrequest.main_char %} - - {{ acceptrequest.main_char.corporation_name }} -
- {{ acceptrequest.main_char.alliance_name|default_if_none:"" }} - {% else %} - (unknown) - {% endif %} -
{{ acceptrequest.group.name }} - - {% trans "Accept" %} - - - {% trans "Reject" %} - -
+ + + + + + - {% endfor %} - -
{% trans "Character" %}{% trans "Organization" %}{% trans "Group" %}
-
- {% else %} -
{% trans "No group add requests." %}
- {% endif %} + + +
+ + {% if acceptrequest.main_char %} + + {{ acceptrequest.main_char.character_name }} + + {% else %} + {{ acceptrequest.user.username }} + {% endif %} + + {% if acceptrequest.main_char %} + + {{ acceptrequest.main_char.corporation_name }} +
+ {{ acceptrequest.main_char.alliance_name|default_if_none:"" }} + {% else %} + {% trans "(unknown)" %} + {% endif %} +
{{ acceptrequest.group.name }} + + {% trans "Accept" %} + + + + {% trans "Reject" %} + +
+
+ {% else %} +
{% trans "No group add requests." %}
+ {% endif %}
- {% if leaverequests %} -
- - - - - - - - - - - - {% for leaverequest in leaverequests %} - - - - - - + {% if leaverequests %} +
+
{% trans "Character" %}{% trans "Organization" %}{% trans "Group" %}
- - - {% if leaverequest.main_char %} - - {{ leaverequest.main_char.character_name }} - - {% else %} - {{ leaverequest.user.username }} - {% endif %} - - {% if leaverequest.main_char %} - - {{ leaverequest.main_char.corporation_name }} -
- {{ leaverequest.main_char.alliance_name|default_if_none:"" }} - {% else %} - (unknown) - {% endif %} -
{{ leaverequest.group.name }} - - {% trans "Accept" %} - - - {% trans "Reject" %} - -
+ + + + + + - {% endfor %} - -
{% trans "Character" %}{% trans "Organization" %}{% trans "Group" %}
-
- {% else %} -
{% trans "No group leave requests." %}
- {% endif %} + + +
+ + {% if leaverequest.main_char %} + + {{ leaverequest.main_char.character_name }} + + {% else %} + {{ leaverequest.user.username }} + {% endif %} + + {% if leaverequest.main_char %} + + {{ leaverequest.main_char.corporation_name }} +
+ {{ leaverequest.main_char.alliance_name|default_if_none:"" }} + {% else %} + (unknown) + {% endif %} +
{{ leaverequest.group.name }} + + {% trans "Accept" %} + + + + {% trans "Reject" %} + +
+
+ {% else %} +
{% trans "No group leave requests." %}
+ {% endif %}
-
{% endblock content %} From 603bd9c37c0a4c9f0a62cc1c9250798c2a91cbac Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 25 Oct 2020 12:16:09 +0100 Subject: [PATCH 4/8] make description a real description textfield instead of charfield. a bit more user friendly in the backend --- .../0015_make_descriptions_great_again.py | 23 +++++ allianceauth/groupmanagement/models.py | 88 ++++++++++++------- .../groupmanagement/groupmembership.html | 5 +- .../templates/groupmanagement/groups.html | 2 +- .../templates/groupmanagement/index.html | 4 +- 5 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py diff --git a/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py new file mode 100644 index 00000000..6d086c89 --- /dev/null +++ b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.2 on 2020-10-25 11:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("groupmanagement", "0014_auto_20200918_1412"), + ] + + operations = [ + migrations.AlterField( + model_name="authgroup", + name="description", + field=models.TextField( + blank=True, + help_text="Short description (max. 512 characters) of the group shown to users.", + max_length=512, + null=True, + ), + ), + ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 035b9ba2..e36f7e2d 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -55,7 +55,6 @@ class RequestLog(models.Model): return user.profile.main_character - class AuthGroup(models.Model): """ Extends Django Group model with a one-to-one field @@ -76,46 +75,75 @@ class AuthGroup(models.Model): Open - Users are automatically accepted into the group Not Open - Users requests must be approved before they are added to the group """ + group = models.OneToOneField(Group, on_delete=models.CASCADE, primary_key=True) - internal = models.BooleanField(default=True, - help_text="Internal group, users cannot see, join or request to join this group.
" - "Used for groups such as Members, Corp_*, Alliance_* etc.
" - "Overrides Hidden and Open options when selected.") - hidden = models.BooleanField(default=True, - help_text="Group is hidden from users but can still join with the correct link.") - open = models.BooleanField(default=False, - help_text="Group is open and users will be automatically added upon request.
" - "If the group is not open users will need their request manually approved.") - public = models.BooleanField(default=False, - help_text="Group is public. Any registered user is able to join this group, with " - "visibility based on the other options set for this group.
Auth will " - "not remove users from this group automatically when they are no longer " - "authenticated.") + internal = models.BooleanField( + default=True, + help_text="Internal group, users cannot see, join or request to join this group.
" + "Used for groups such as Members, Corp_*, Alliance_* etc.
" + "Overrides Hidden and Open options when selected.", + ) + + hidden = models.BooleanField( + default=True, + help_text="Group is hidden from users but can still join with the correct link.", + ) + + open = models.BooleanField( + default=False, + help_text="Group is open and users will be automatically added upon request.
" + "If the group is not open users will need their request manually approved.", + ) + + public = models.BooleanField( + default=False, + help_text="Group is public. Any registered user is able to join this group, with " + "visibility based on the other options set for this group.
Auth will " + "not remove users from this group automatically when they are no longer " + "authenticated.", + ) + # Group leaders have management access to this group - group_leaders = models.ManyToManyField(User, related_name='leads_groups', blank=True, - help_text="Group leaders can process group requests for this group " - "specifically. Use the auth.group_management permission to allow " - "a user to manage all groups.") + group_leaders = models.ManyToManyField( + User, + related_name="leads_groups", + blank=True, + help_text="Group leaders can process group requests for this group " + "specifically. Use the auth.group_management permission to allow " + "a user to manage all groups.", + ) + # allow groups to be *group leads* - group_leader_groups = models.ManyToManyField(Group, related_name='leads_group_groups', blank=True, - help_text="Group leaders can process group requests for this group " - "specifically. Use the auth.group_management permission to allow " - "a user to manage all groups.") + group_leader_groups = models.ManyToManyField( + Group, + related_name="leads_group_groups", + blank=True, + help_text="Group leaders can process group requests for this group " + "specifically. Use the auth.group_management permission to allow " + "a user to manage all groups.", + ) - states = models.ManyToManyField(State, related_name='valid_states', blank=True, - help_text="States listed here will have the ability to join this group provided " - "they have the proper permissions.") + states = models.ManyToManyField( + State, + related_name="valid_states", + blank=True, + help_text="States listed here will have the ability to join this group provided " + "they have the proper permissions.", + ) - description = models.CharField(max_length=512, blank=True, help_text="Description of the group shown to users.") + description = models.TextField( + max_length=512, + null=True, + blank=True, + help_text="Short description (max. 512 characters) of the group shown to users.", + ) def __str__(self): return self.group.name class Meta: - permissions = ( - ("request_groups", u"Can request non-public groups"), - ) + permissions = (("request_groups", u"Can request non-public groups"),) default_permissions = tuple() diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html index c2291f7f..0aa53fac 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html @@ -25,7 +25,7 @@
{% trans "Description" %} {% trans "Status" %} {% trans "Member Count" %}
{{ group.authgroup.description }}{{ group.authgroup.description|linebreaks|urlize }} {% if group.authgroup.hidden %} @@ -64,7 +64,6 @@ -
{{ g.group.name }}{{ g.group.authgroup.description|urlize }}{{ g.group.authgroup.description|linebreaks|urlize }} {% if g.group in user.groups.all %} {% if not g.request %} diff --git a/allianceauth/groupmanagement/templates/groupmanagement/index.html b/allianceauth/groupmanagement/templates/groupmanagement/index.html index 138122e5..060a5670 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/index.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/index.html @@ -23,6 +23,7 @@
  • {% trans "Join Requests" %} + {% if acceptrequests %} {{ acceptrequests|length }} {% endif %} @@ -31,6 +32,7 @@
  • {% trans "Leave Requests" %} + {% if leaverequests %} {{ leaverequests|length }} {% endif %} @@ -131,7 +133,7 @@
    {{ leaverequest.main_char.alliance_name|default_if_none:"" }} {% else %} - (unknown) + {% trans "(unknown)" %} {% endif %}
  • {{ leaverequest.group.name }}{% trans "Name" %} {% trans "Description" %} {% trans "Status" %}{% trans "Member Count" %}{% trans "Member Count" %}
    + {{ group.num_members }}