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/migrations/0015_make_descriptions_great_again.py b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py new file mode 100644 index 00000000..63b3807f --- /dev/null +++ b/allianceauth/groupmanagement/migrations/0015_make_descriptions_great_again.py @@ -0,0 +1,22 @@ +# 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, + ), + ), + ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 035b9ba2..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.CharField(max_length=512, blank=True, help_text="Description 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 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 d4c0ad8a..dd43ede1 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 %} + {% if groups %}
- - - - - + + + + + + {% for group in groups %} - - - + + - - {% endfor %} @@ -72,9 +79,11 @@ {% 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/templates/groupmanagement/groups.html b/allianceauth/groupmanagement/templates/groupmanagement/groups.html index d2c2b036..a577402c 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
{% trans "Name" %}{% trans "Description" %}{% trans "Status" %}{% trans "Member Count" %}{% trans "Name" %}{% trans "Description" %}{% trans "Status" %}{% trans "Member Count" %}
- {{ group.name }} + + {{ group.name }} {{ group.authgroup.description }} + + {{ group.authgroup.description|linebreaks|urlize }} {% if group.authgroup.hidden %} {% trans "Hidden" %} {% elif group.authgroup.open %} @@ -42,21 +47,23 @@ {% trans "Requestable" %} {% endif %} + + {{ group.num_members }} - - + + + + + + -
- - - + + + + {% 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|linebreaks|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..060a5670 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/index.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/index.html @@ -4,25 +4,26 @@ {% 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 %} + + + + {% for leaverequest in leaverequests %} + + + + {% 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 %} + {% trans "(unknown)" %} + {% endif %} + + {{ leaverequest.group.name }} + + + {% trans "Accept" %} + + + + {% trans "Reject" %} + + + + {% endfor %} + + +
+ {% else %} +
{% trans "No group leave requests." %}
+ {% endif %}
-
{% endblock content %} 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 @@ 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..4e6e27ff 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -103,7 +103,7 @@ 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) + if (not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group) ): logger.warning( @@ -132,7 +132,7 @@ def group_membership_list(request, group_id): render_items = {'group': group, 'members': members} return render( - request, 'groupmanagement/groupmembers.html', + request, 'groupmanagement/groupmembers.html', context=render_items ) @@ -166,7 +166,7 @@ def group_membership_remove(request, group_id, user_id): except ObjectDoesNotExist: messages.warning(request, _("Group does not exist")) - return redirect('groupmanagement:membership_list', group_id) + return redirect('groupmanagement:membership', group_id) @login_required @@ -312,18 +312,18 @@ 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 = [] - for group in groups_qs: + for group in groups_qs: group_request = GroupRequest.objects\ .filter(user=request.user)\ .filter(group=group) groups.append({ - 'group': group, + 'group': group, 'request': group_request[0] if group_request else None })