Merge branch 'groupmanagement-revamp' into 'master'

Group management improvements

See merge request allianceauth/allianceauth!1270
This commit is contained in:
Ariel Rin 2020-11-17 11:56:16 +00:00
commit 3b516c338e
11 changed files with 324 additions and 256 deletions

View File

@ -9,15 +9,20 @@ from .managers import GroupManager
class GroupManagementMenuItem(MenuItemHook): class GroupManagementMenuItem(MenuItemHook):
""" This class ensures only authorized users will see the menu entry """ """ This class ensures only authorized users will see the menu entry """
def __init__(self): def __init__(self):
# setup menu entry for sidebar # setup menu entry for sidebar
MenuItemHook.__init__( MenuItemHook.__init__(
self, self,
text=_('Group Management'), text=_("Group Management"),
classes='fas fa-users-cog fa-fw', classes="fas fa-users-cog fa-fw",
url_name='groupmanagement:management', url_name="groupmanagement:management",
order=50, 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): def render(self, request):
@ -25,14 +30,14 @@ class GroupManagementMenuItem(MenuItemHook):
app_count = GroupManager.pending_requests_count_for_user(request.user) app_count = GroupManager.pending_requests_count_for_user(request.user)
self.count = app_count if app_count and app_count > 0 else None self.count = app_count if app_count and app_count > 0 else None
return MenuItemHook.render(self, request) return MenuItemHook.render(self, request)
return '' return ""
@hooks.register('menu_item_hook') @hooks.register("menu_item_hook")
def register_menu(): def register_menu():
return GroupManagementMenuItem() return GroupManagementMenuItem()
@hooks.register('url_hook') @hooks.register("url_hook")
def register_urls(): def register_urls():
return UrlHook(urls, 'group', r'^group/') return UrlHook(urls, "group", r"^groups/")

View File

@ -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 <i>(max. 512 characters)</i> of the group shown to users.",
max_length=512,
),
),
]

View File

@ -107,7 +107,7 @@ class AuthGroup(models.Model):
help_text="States listed here will have the ability to join this group provided " help_text="States listed here will have the ability to join this group provided "
"they have the proper permissions.") "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 <i>(max. 512 characters)</i> of the group shown to users.")
def __str__(self): def __str__(self):
return self.group.name return self.group.name

View File

@ -8,48 +8,55 @@
<div class="col-lg-12"> <div class="col-lg-12">
<br> <br>
{% include 'groupmanagement/menu.html' %} {% include 'groupmanagement/menu.html' %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
{{ group }} - {% trans 'Audit Log' %} {{ group }} - {% trans "Audit Log" %}
</div> </div>
<div class="panel-body"> <div class="panel-body">
<p> <p>
<a class="btn btn-default" href="{% url 'groupmanagement:membership' %}" role="button"> <a class="btn btn-default" href="{% url 'groupmanagement:membership' %}" role="button">
{% trans "Back" %} {% trans "Back" %}
</a> </a>
</p> </p>
{% if entries %} {% if entries %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="log-entries"> <table class="table table-striped" id="log-entries">
<thead> <thead>
<th class="text-center" scope="col">{% trans "Date/Time" %}</th> <th scope="col">{% trans "Date/Time" %}</th>
<th class="text-center" scope="col">{% trans "Requestor" %}</th> <th scope="col">{% trans "Requestor" %}</th>
<th class="text-center" scope="col">{% trans "Character" %}</th> <th scope="col">{% trans "Character" %}</th>
<th class="text-center" scope="col">{% trans "Corporation" %}</th> <th scope="col">{% trans "Corporation" %}</th>
<th class="text-center" scope="col">{% trans "Type" %}</th> <th scope="col">{% trans "Type" %}</th>
<th class="text-center" scope="col">{% trans "Action" %}</th> <th scope="col">{% trans "Action" %}</th>
<th class="text-center" scope="col">{% trans "Actor" %}</th> <th scope="col">{% trans "Actor" %}</th>
</thead> </thead>
<tbody> <tbody>
{% for entry in entries %} {% for entry in entries %}
<tr> <tr>
<td class="text-center">{{ entry.date|date:"Y-M-d, H:i" }}</td> <td>{{ entry.date|date:"Y-M-d, H:i" }}</td>
<td class="text-center">{{ entry.requestor }}</td> <td>{{ entry.requestor }}</td>
<td class="text-center">{{ entry.req_char }}</td> <td>{{ entry.req_char }}</td>
<td class="text-center">{{ entry.req_char.corporation_name }}</td> <td>{{ entry.req_char.corporation_name }}</td>
<td class="text-center">{{ entry.type_to_str }}</td> <td>{{ entry.type_to_str }}</td>
{% if entry.request_type is None %} {% if entry.request_type is None %}
<td class="text-center"> Removed</td> <td>{% trans "Removed" %}</td>
{% else %} {% else %}
<td class="text-center">{{ entry.action_to_str }}</td> <td>{{ entry.action_to_str }}</td>
{% endif %} {% endif %}
<td class="text-center">{{ entry.request_actor }}</td>
<td>{{ entry.request_actor }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<p class="text-muted"> <p class="text-muted">
All times displayed are EVE/UTC. {% trans "All times displayed are EVE/UTC." %}
</p> </p>
</div> </div>
{% else %} {% else %}
@ -75,28 +82,27 @@
{% endblock %} {% endblock %}
{% block extra_script %} {% block extra_script %}
$.fn.dataTable.moment = function(format, locale) {
$.fn.dataTable.moment = function ( format, locale ) {
var types = $.fn.dataTable.ext.type; var types = $.fn.dataTable.ext.type;
// Add type detection // Add type detection
types.detect.unshift( function ( d ) { types.detect.unshift(function(d) {
return moment( d, format, locale, true ).isValid() ? return moment(d, format, locale, true).isValid() ?
'moment-'+format : 'moment-'+format :
null; null;
} ); });
// Add sorting method - use an integer for the sorting // Add sorting method - use an integer for the sorting
types.order[ 'moment-'+format+'-pre' ] = function ( d ) { types.order[ 'moment-'+format+'-pre' ] = function(d) {
return moment( d, format, locale, true ).unix(); return moment(d, format, locale, true).unix();
}; };
}; };
$(document).ready(function(){ $(document).ready(function(){
$.fn.dataTable.moment( 'YYYY-MMM-D, HH:mm' ); $.fn.dataTable.moment('YYYY-MMM-D, HH:mm');
$('#log-entries').DataTable({ $('#log-entries').DataTable({
order: [[ 0, 'desc' ], [ 1, 'asc' ] ], order: [[0, 'desc'], [1, 'asc']],
filterDropDown: filterDropDown:
{ {
columns: [ columns: [
@ -124,4 +130,3 @@
}); });
}); });
{% endblock %} {% endblock %}

View File

@ -14,33 +14,30 @@
<div class="panel-heading"> <div class="panel-heading">
{{ group.name }} - {% trans 'Members' %} {{ group.name }} - {% trans 'Members' %}
</div> </div>
<div class="panel-body"> <div class="panel-body">
<p> <p>
<a class="btn btn-default" href="{% url 'groupmanagement:membership' %}" role="button"> <a class="btn btn-default" href="{% url 'groupmanagement:membership' %}" role="button">
{% trans "Back" %} {% trans "Back" %}
</a> </a>
</p> </p>
{% if group.user_set %} {% if group.user_set %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa" id="tab_group_members"> <table class="table table-aa" id="tab_group_members">
<thead> <thead>
<tr> <tr>
<th class="text-right">{% trans "Portrait" %}</th> <th>{% trans "Character" %}</th>
<th class="text-center">{% trans "Character" %}</th> <th>{% trans "Organization" %}</th>
<th class="text-center">{% trans "Organization" %}</th> <th></th>
<th class="text-center"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for member in members %} {% for member in members %}
<tr> <tr>
<td class="text-right"> <td>
{% if member.is_leader %} <img src="{{ member.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;">
<i class="fas fa-star"></i>&nbsp;
{% endif %}
<img src="{{ member.main_char|character_portrait_url:32 }}" class="img-circle">
</td>
<td class="text-center">
{% if member.main_char %} {% if member.main_char %}
<a href="{{ member.main_char|evewho_character_url }}" target="_blank"> <a href="{{ member.main_char|evewho_character_url }}" target="_blank">
{{ member.main_char.character_name }} {{ member.main_char.character_name }}
@ -48,20 +45,25 @@
{% else %} {% else %}
{{ member.user.username }} {{ member.user.username }}
{% endif %} {% endif %}
{% if member.is_leader %}
<i class="fas fa-star" title="{% trans "Group leader" %}" style="margin-left: 1rem;"></i>&nbsp;
{% endif %}
</td> </td>
<td class="text-center">
<td>
{% if member.main_char %} {% if member.main_char %}
<a href="{{ member.main_char|dotlan_corporation_url }}" target="_blank"> <a href="{{ member.main_char|dotlan_corporation_url }}" target="_blank">
{{ member.main_char.corporation_name }} {{ member.main_char.corporation_name }}
</a><br> </a><br>
{{ member.main_char.alliance_name|default_if_none:"" }} {{ member.main_char.alliance_name|default_if_none:"" }}
{% else %} {% else %}
(unknown) {% trans "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td class="text-center">
<a href="{% url 'groupmanagement:membership_remove' group.id member.user.id %}" class="btn btn-danger" <td class="text-right">
title="{% trans "Remove from group" %}"> <a href="{% url 'groupmanagement:membership_remove' group.id member.user.id %}" class="btn btn-danger" title="{% trans "Remove from group" %}">
<i class="glyphicon glyphicon-remove"></i> <i class="glyphicon glyphicon-remove"></i>
</a> </a>
</td> </td>
@ -69,7 +71,10 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<p class="text-muted"><i class="fas fa-star"></i>: Group leader</p>
<p class="text-muted">
<i class="fas fa-star"></i>: {% trans "Group leader" %}
</p>
</div> </div>
{% else %} {% else %}
<div class="alert alert-warning text-center"> <div class="alert alert-warning text-center">
@ -93,9 +98,12 @@
{% block extra_script %} {% block extra_script %}
$(document).ready(function(){ $(document).ready(function(){
$('#tab_group_members').DataTable({ $('#tab_group_members').DataTable({
order: [ [ 1, "asc" ] ], order: [[0, "asc"]],
columnDefs: [ columnDefs: [
{ "sortable": false, "targets": [0, 3] }, {
"sortable": false,
"targets": [2]
},
] ]
}); });
}); });

View File

@ -9,31 +9,36 @@
<div class="col-lg-12"> <div class="col-lg-12">
<br> <br>
{% include 'groupmanagement/menu.html' %} {% include 'groupmanagement/menu.html' %}
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
{% trans "Groups" %} {% trans "Groups" %}
</div> </div>
<div class="panel-body"> <div class="panel-body">
{% if groups %} {% if groups %}
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-aa"> <table class="table table-aa">
<thead> <thead>
<tr> <tr>
<th class="text-center">{% trans "Name" %}</th> <th>{% trans "Name" %}</th>
<th class="text-center">{% trans "Description" %}</th> <th>{% trans "Description" %}</th>
<th class="text-center">{% trans "Status" %}</th> <th>{% trans "Status" %}</th>
<th class="text-center">{% trans "Member Count" %}</th> <th style="white-space: nowrap;">{% trans "Member Count" %}</th>
<th class="text-center"></th> <th style="min-width: 170px;"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for group in groups %} {% for group in groups %}
<tr> <tr>
<td class="text-center"> <td>
<a href="{% url 'groupmanagement:membership_list' group.id %}">{{ group.name }}</a> <a href="{% url 'groupmanagement:membership' group.id %}">{{ group.name }}</a>
</td> </td>
<td class="text-center">{{ group.authgroup.description }}</td>
<td class="text-center"> <td>{{ group.authgroup.description|linebreaks|urlize }}</td>
<td>
{% if group.authgroup.hidden %} {% if group.authgroup.hidden %}
<span class="label label-info">{% trans "Hidden" %}</span> <span class="label label-info">{% trans "Hidden" %}</span>
{% elif group.authgroup.open %} {% elif group.authgroup.open %}
@ -42,21 +47,23 @@
<span class="label label-default">{% trans "Requestable" %}</span> <span class="label label-default">{% trans "Requestable" %}</span>
{% endif %} {% endif %}
</td> </td>
<td class="text-center">
<td class="text-right">
{{ group.num_members }} {{ group.num_members }}
</td> </td>
<td class="text-center">
<a href="{% url 'groupmanagement:membership_list' group.id %}" class="btn btn-primary" <td class="text-right">
title="{% trans "View Members" %}"> <a href="{% url 'groupmanagement:membership' group.id %}" class="btn btn-primary" title="{% trans "View Members" %}">
<i class="glyphicon glyphicon-eye-open"></i> <i class="glyphicon glyphicon-eye-open"></i>
</a> </a>
<a href="{% url "groupmanagement:audit_log" group.id %}" class="btn btn-info" title="{% trans "Audit Members" %}"> <a href="{% url "groupmanagement:audit_log" group.id %}" class="btn btn-info" title="{% trans "Audit Members" %}">
<i class="glyphicon glyphicon-list-alt"></i> <i class="glyphicon glyphicon-list-alt"></i>
</a> </a>
<a id="clipboard-copy" data-clipboard-text="{{ request.scheme }}://{{request.get_host}}{% url 'groupmanagement:request_add' group.id %}" class="btn btn-warning" title="{% trans "Copy Direct Join Link" %}"> <a id="clipboard-copy" data-clipboard-text="{{ request.scheme }}://{{request.get_host}}{% url 'groupmanagement:request_add' group.id %}" class="btn btn-warning" title="{% trans "Copy Direct Join Link" %}">
<i class="glyphicon glyphicon-copy"></i> <i class="glyphicon glyphicon-copy"></i>
</a> </a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
@ -72,9 +79,11 @@
</div> </div>
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/clipboard-js.html' %} {% include 'bundles/clipboard-js.html' %}
<script>
<script>
new ClipboardJS('#clipboard-copy'); new ClipboardJS('#clipboard-copy');
</script> </script>
{% endblock %} {% endblock %}

View File

@ -4,7 +4,7 @@
{% block page_title %}{% trans "Available Groups" %}{% endblock page_title %} {% block page_title %}{% trans "Available Groups" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %} {% block extra_css %}{% endblock extra_css %}
url
{% block content %} {% block content %}
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Available Groups" %}</h1> <h1 class="page-header text-center">{% trans "Available Groups" %}</h1>
@ -12,17 +12,18 @@ url
<table class="table table-aa"> <table class="table table-aa">
<thead> <thead>
<tr> <tr>
<th class="text-center">{% trans "Name" %}</th> <th>{% trans "Name" %}</th>
<th class="text-center">{% trans "Description" %}</th> <th>{% trans "Description" %}</th>
<th class="text-center">{% trans "Action" %}</th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for g in groups %} {% for g in groups %}
<tr> <tr>
<td class="text-center">{{ g.group.name }}</td> <td>{{ g.group.name }}</td>
<td class="text-center">{{ g.group.authgroup.description|urlize }}</td> <td>{{ g.group.authgroup.description|linebreaks|urlize }}</td>
<td class="text-center"> <td class="text-right">
{% if g.group in user.groups.all %} {% if g.group in user.groups.all %}
{% if not g.request %} {% if not g.request %}
<a href="{% url 'groupmanagement:request_leave' g.group.id %}" class="btn btn-danger"> <a href="{% url 'groupmanagement:request_leave' g.group.id %}" class="btn btn-danger">
@ -59,5 +60,4 @@ url
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}

View File

@ -4,14 +4,14 @@
{% load evelinks %} {% load evelinks %}
{% block page_title %}{% trans "Groups Management" %}{% endblock page_title %} {% block page_title %}{% trans "Groups Management" %}{% endblock page_title %}
{% block extra_css %}
<style>
.nav-tabs>li.active>a {
background-color: #ECF0F1 !important;
color: #2C3E50;
}
</style>
{% block extra_css %}
<style>
.nav-tabs > li.active > a {
background-color: rgb(236, 240, 241) !important;
color: rgb(44, 62, 80);
}
</style>
{% endblock extra_css %} {% endblock extra_css %}
{% block content %} {% block content %}
@ -23,6 +23,7 @@
<li class="active"> <li class="active">
<a data-toggle="tab" href="#add"> <a data-toggle="tab" href="#add">
{% trans "Join Requests" %} {% trans "Join Requests" %}
{% if acceptrequests %} {% if acceptrequests %}
<span class="badge">{{ acceptrequests|length }}</span> <span class="badge">{{ acceptrequests|length }}</span>
{% endif %} {% endif %}
@ -31,6 +32,7 @@
<li> <li>
<a data-toggle="tab" href="#leave"> <a data-toggle="tab" href="#leave">
{% trans "Leave Requests" %} {% trans "Leave Requests" %}
{% if leaverequests %} {% if leaverequests %}
<span class="badge">{{ leaverequests|length }}</span> <span class="badge">{{ leaverequests|length }}</span>
{% endif %} {% endif %}
@ -39,7 +41,6 @@
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
<div id="add" class="tab-pane fade in active panel panel-default"> <div id="add" class="tab-pane fade in active panel panel-default">
<div class="panel-body"> <div class="panel-body">
{% if acceptrequests %} {% if acceptrequests %}
@ -47,20 +48,18 @@
<table class="table table-aa"> <table class="table table-aa">
<thead> <thead>
<tr> <tr>
<th class="text-center"></th> <th>{% trans "Character" %}</th>
<th class="text-center">{% trans "Character" %}</th> <th>{% trans "Organization" %}</th>
<th class="text-center">{% trans "Organization" %}</th> <th>{% trans "Group" %}</th>
<th class="text-center">{% trans "Group" %}</th> <th></th>
<th class="text-center"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for acceptrequest in acceptrequests %} {% for acceptrequest in acceptrequests %}
<tr> <tr>
<td class="text-right"> <td>
<img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="img-circle"> <img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;">
</td>
<td class="text-center">
{% if acceptrequest.main_char %} {% if acceptrequest.main_char %}
<a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank"> <a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank">
{{ acceptrequest.main_char.character_name }} {{ acceptrequest.main_char.character_name }}
@ -69,21 +68,22 @@
{{ acceptrequest.user.username }} {{ acceptrequest.user.username }}
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td>
{% if acceptrequest.main_char %} {% if acceptrequest.main_char %}
<a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank"> <a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank">
{{ acceptrequest.main_char.corporation_name }} {{ acceptrequest.main_char.corporation_name }}
</a><br> </a><br>
{{ acceptrequest.main_char.alliance_name|default_if_none:"" }} {{ acceptrequest.main_char.alliance_name|default_if_none:"" }}
{% else %} {% else %}
(unknown) {% trans "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td class="text-center">{{ acceptrequest.group.name }}</td> <td>{{ acceptrequest.group.name }}</td>
<td class="text-center"> <td class="text-right">
<a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success"> <a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success">
{% trans "Accept" %} {% trans "Accept" %}
</a> </a>
<a href="{% url 'groupmanagement:reject_request' acceptrequest.id %}" class="btn btn-danger"> <a href="{% url 'groupmanagement:reject_request' acceptrequest.id %}" class="btn btn-danger">
{% trans "Reject" %} {% trans "Reject" %}
</a> </a>
@ -106,20 +106,18 @@
<table class="table table-aa"> <table class="table table-aa">
<thead> <thead>
<tr> <tr>
<th class="text-center"></th> <th>{% trans "Character" %}</th>
<th class="text-center">{% trans "Character" %}</th> <th>{% trans "Organization" %}</th>
<th class="text-center">{% trans "Organization" %}</th> <th>{% trans "Group" %}</th>
<th class="text-center">{% trans "Group" %}</th> <th></th>
<th class="text-center"></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for leaverequest in leaverequests %} {% for leaverequest in leaverequests %}
<tr> <tr>
<td class="text-right"> <td>
<img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="img-circle"> <img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;">
</td>
<td class="text-center">
{% if leaverequest.main_char %} {% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank"> <a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank">
{{ leaverequest.main_char.character_name }} {{ leaverequest.main_char.character_name }}
@ -128,21 +126,22 @@
{{ leaverequest.user.username }} {{ leaverequest.user.username }}
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td>
{% if leaverequest.main_char %} {% if leaverequest.main_char %}
<a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank"> <a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank">
{{ leaverequest.main_char.corporation_name }} {{ leaverequest.main_char.corporation_name }}
</a><br> </a><br>
{{ leaverequest.main_char.alliance_name|default_if_none:"" }} {{ leaverequest.main_char.alliance_name|default_if_none:"" }}
{% else %} {% else %}
(unknown) {% trans "(unknown)" %}
{% endif %} {% endif %}
</td> </td>
<td class="text-center">{{ leaverequest.group.name }}</td> <td>{{ leaverequest.group.name }}</td>
<td class="text-center"> <td class="text-right">
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success"> <a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success">
{% trans "Accept" %} {% trans "Accept" %}
</a> </a>
<a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger"> <a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger">
{% trans "Reject" %} {% trans "Reject" %}
</a> </a>
@ -157,7 +156,6 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock content %} {% endblock content %}

View File

@ -4,7 +4,6 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<div class="container-fluid"> <div class="container-fluid">
<div class="navbar-header"> <div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">{% trans "Toggle navigation" %}</span> <span class="sr-only">{% trans "Toggle navigation" %}</span>
@ -12,7 +11,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand" href="">{% trans "Group Management" %}</a> <a class="navbar-brand" href="{% url 'groupmanagement:management' %}">{% trans "Group Management" %}</a>
</div> </div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
@ -20,11 +19,10 @@
<li class="{% navactive request 'groupmanagement:management' %}"> <li class="{% navactive request 'groupmanagement:management' %}">
<a href="{% url 'groupmanagement:management' %}">{% trans "Group Requests" %}</a> <a href="{% url 'groupmanagement:management' %}">{% trans "Group Requests" %}</a>
</li> </li>
<li class="{% renavactive request '^/group/membership/' %}"> <li class="{% navactive request 'groupmanagement:membership groupmanagement:audit_log' %}">
<a href="{% url 'groupmanagement:membership' %}">{% trans "Group Membership" %}</a> <a href="{% url 'groupmanagement:membership' %}">{% trans "Group Membership" %}</a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>

View File

@ -1,29 +1,52 @@
from . import views from . import views
from django.conf.urls import url from django.conf.urls import url
app_name = 'groupmanagement'
app_name = "groupmanagement"
urlpatterns = [ urlpatterns = [
url(r'^groups/', views.groups_view, name='groups'), # groups
url(r'^management/', views.group_management, url(r"^groups/$", views.groups_view, name="groups"),
name='management'), url(r"^group/request/join/(\w+)/$", views.group_request_add, name="request_add"),
url(r'^membership/$', views.group_membership, url(
name='membership'), r"^group/request/leave/(\w+)/$", views.group_request_leave, name="request_leave"
url(r'^membership/(\w+)/$', views.group_membership_list, ),
name='membership_list'), # group management
url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"), url(r"^groupmanagement/requests/$", views.group_management, name="management"),
url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove, url(r"^groupmanagement/membership/$", views.group_membership, name="membership"),
name='membership_remove'), url(
url(r'^request_add/(\w+)', views.group_request_add, r"^groupmanagement/membership/(\w+)/$",
name='request_add'), views.group_membership_list,
url(r'^request/accept/(\w+)', views.group_accept_request, name="membership",
name='accept_request'), ),
url(r'^request/reject/(\w+)', views.group_reject_request, url(
name='reject_request'), r"^groupmanagement/membership/(\w+)/audit-log/$",
url(r'^request_leave/(\w+)', views.group_request_leave, views.group_membership_audit,
name='request_leave'), name="audit_log",
url(r'leave_request/accept/(\w+)', views.group_leave_accept_request, ),
name='leave_accept_request'), url(
url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request, r"^groupmanagement/membership/(\w+)/remove/(\w+)/$",
name='leave_reject_request'), 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",
),
] ]

View File

@ -166,7 +166,7 @@ def group_membership_remove(request, group_id, user_id):
except ObjectDoesNotExist: except ObjectDoesNotExist:
messages.warning(request, _("Group does not exist")) messages.warning(request, _("Group does not exist"))
return redirect('groupmanagement:membership_list', group_id) return redirect('groupmanagement:membership', group_id)
@login_required @login_required