diff --git a/allianceauth/groupmanagement/migrations/0011_requestlog_date.py b/allianceauth/groupmanagement/migrations/0011_requestlog_date.py new file mode 100644 index 00000000..fbe535ce --- /dev/null +++ b/allianceauth/groupmanagement/migrations/0011_requestlog_date.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.8 on 2018-12-07 08:56 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('groupmanagement', '0010_authgroup_states'), + ] + + operations = [ + migrations.AddField( + model_name='requestlog', + name='date', + field=models.DateTimeField(default=datetime.datetime(2018, 12, 7, 8, 56, 33, 846342)), + ), + ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index ce83dd05..e8c1c913 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -4,6 +4,7 @@ from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver from allianceauth.authentication.models import State +from datetime import datetime class GroupRequest(models.Model): @@ -30,6 +31,7 @@ class RequestLog(models.Model): request_info = models.CharField(max_length=254) action = models.BooleanField(default=0) request_actor = models.ForeignKey(User, on_delete=models.CASCADE) + date = models.DateTimeField(auto_now_add=datetime.utcnow()) def requestor(self): return self.request_info.split(":")[0] diff --git a/allianceauth/groupmanagement/templates/groupmanagement/audit.html b/allianceauth/groupmanagement/templates/groupmanagement/audit.html index c5f26892..8cdad2cd 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/audit.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/audit.html @@ -3,38 +3,60 @@ {% load i18n %} {% block page_title %}{{ group }} {% trans "Audit Log" %}{% endblock page_title %} -{% block extra_css %}{% endblock extra_css %} {% block content %}

{% include 'groupmanagement/menu.html' %}
- {% if entries %}

{{ group }} Audit Log

- - - - - - - - - - {% for entry in entries %} - - - - - - - - - {% endfor %} -
{% trans "Requestor" %}{% trans "Main Character" %}{% trans "Group" %}{% trans "Type" %}{% trans "Action" %}{% trans "Actor" %}
{{ entry.requestor }}{{ entry.req_char }}{{ entry.group }}{{ entry.type_to_str }}{{ entry.action_to_str }}{{ entry.request_actor }}
+

All times displayed are EVE/UTC.

+ {% if entries %} +
+ + + + + + + + + + + + {% for entry in entries %} + + + + + + + {% if entry.request_type is None %} + + {% else %} + + {% endif %} + + + {% endfor %} + +
{% trans "Date/Time" %}{% trans "Requestor" %}{% trans "Main Character" %}{% trans "Group" %}{% trans "Type" %}{% trans "Action" %}{% trans "Actor" %}
{{ entry.date }}{{ entry.requestor }}{{ entry.req_char }}{{ entry.group }}{{ entry.type_to_str }} Removed{{ entry.action_to_str }}{{ entry.request_actor }}
+
{% else %} -
{% trans "No entries found." %}
+
{% trans "No entries found for this group." %}
{% endif %}
-{% endblock content %} +{% endblock %} +{% block extra_javascript %} + {% include 'bundles/datatables-js.html' %} +{% endblock %} +{% block extra_css %} + {% include 'bundles/datatables-css.html' %} +{% endblock %} +{% block extra_script %} + $(document).ready(function(){ + $('#log-entries').DataTable(); + }); +{% endblock %} + diff --git a/allianceauth/groupmanagement/urls.py b/allianceauth/groupmanagement/urls.py index 3533df01..f16cad7f 100644 --- a/allianceauth/groupmanagement/urls.py +++ b/allianceauth/groupmanagement/urls.py @@ -12,7 +12,7 @@ urlpatterns = [ 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+)/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, diff --git a/allianceauth/groupmanagement/views.py b/allianceauth/groupmanagement/views.py index 213a904f..d0d7381d 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -5,6 +5,7 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.models import Group from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.core.paginator import Paginator, EmptyPage from django.db.models import Count from django.http import Http404 from django.shortcuts import render, redirect, get_object_or_404 @@ -83,10 +84,9 @@ def group_membership_audit(request, group_id): except ObjectDoesNotExist: raise Http404("Group does not exist") - - entries = RequestLog.objects.filter(group=group) - - render_items = {'entries': entries, 'group': group.name} + 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) diff --git a/docs/_static/images/features/group_audit_log.png b/docs/_static/images/features/group_audit_log.png new file mode 100644 index 00000000..e01998bc Binary files /dev/null and b/docs/_static/images/features/group_audit_log.png differ diff --git a/docs/features/groups.md b/docs/features/groups.md index 07f63fcf..d3267ea9 100644 --- a/docs/features/groups.md +++ b/docs/features/groups.md @@ -66,6 +66,17 @@ Clicking on the blue eye will take you to the group member management screen. He ![Group overview](/_static/images/features/group-member-management.png) +### Group Audit Log +Whenever a user Joins, Leaves, or is Removed from a group, this is logged. To find the audit log for a given group, click the light-blue button to the right of the Group Member Management (blue eye) button. + +These logs contain the Date and Time the action was taken (in EVE/UTC), the user which submitted the request being acted upon (requestor), the user's main character, the type of request (join, leave or removed), the action taken (accept, reject or remove), and the user that took the action (actor). + +![Audit Log Example](/_static/images/features/group_audit_log.png) + +```eval_rst +.. note:: + There is no tracking for "Open" groups as members are able to freely join/leave these groups. +``` ## Group Leaders