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
-
-
- {% trans "Requestor" %} |
- {% trans "Main Character" %} |
- {% trans "Group" %} |
- {% trans "Type" %} |
- {% trans "Action" %} |
- {% trans "Actor" %} |
-
- {% for entry in entries %}
-
- {{ entry.requestor }} |
- {{ entry.req_char }} |
- {{ entry.group }} |
- {{ entry.type_to_str }} |
- {{ entry.action_to_str }} |
- {{ entry.request_actor }} |
-
- {% endfor %}
-
+
All times displayed are EVE/UTC.
+ {% if entries %}
+
+
+
+ {% trans "Date/Time" %} |
+ {% trans "Requestor" %} |
+ {% trans "Main Character" %} |
+ {% trans "Group" %} |
+ {% trans "Type" %} |
+ {% trans "Action" %} |
+ {% trans "Actor" %} |
+
+
+ {% for entry in entries %}
+
+ {{ entry.date }} |
+ {{ entry.requestor }} |
+ {{ entry.req_char }} |
+ {{ entry.group }} |
+ {{ entry.type_to_str }} |
+ {% if entry.request_type is None %}
+ Removed |
+ {% else %}
+ {{ entry.action_to_str }} |
+ {% endif %}
+ {{ entry.request_actor }} |
+
+ {% endfor %}
+
+
+
{% 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 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).
+
+
+
+```eval_rst
+.. note::
+ There is no tracking for "Open" groups as members are able to freely join/leave these groups.
+```
## Group Leaders