Group system overhaul (#588)

* Add open/hidden group membership display and remove

* Include requestable groups other than open

* Prevent users requesting or leaving non-joinable groups

I have not prevented users joining hidden groups however, as
there may be some use cases where the direct link is provided
for users to request access to the group.

Also prevent users generating leave requests for groups they
are not a member of.

* Refactor Group extension models into a single OneToOne model

Added group leader field

* Add blankable fields

* Switched to use navactive for menu highlighting

* Consolidate member state checking for easier code reuse

* Added support for group leaders to manage groups

* Added info log when a user removes someone from a group

* Add ordering to group member list
This commit is contained in:
Basraah
2017-01-03 09:52:20 +10:00
committed by Adarnof
parent 959e167987
commit 4ae450f963
17 changed files with 589 additions and 102 deletions

View File

@@ -153,7 +153,7 @@
</li>
{% endif %}
{% if perms.auth.group_management %}
{% if can_manage_groups %}
<li>
<a class="{% navactive request 'auth_group_management' %}" href="{% url 'auth_group_management' %}">
<i class="fa fa-lock fa-sitemap fa-fw grayiconecolor"></i>{% trans " Group Management" %}

View File

@@ -9,7 +9,7 @@
{% block content %}
<div class="col-lg-12">
<h3 class="page-header text-center">{% trans "Group Management" %}</h3>
{% include 'registered/groupmanagementmenu.html' %}
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#add">{% trans "Group Add Requests" %}</a></li>
<li><a data-toggle="tab" href="#leave">{% trans "Group Leave Requests" %}</a></li>

View File

@@ -0,0 +1,27 @@
{% load staticfiles %}
{% load i18n %}
{% load navactive %}
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<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="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Group Management</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="{% navactive request 'auth_group_management' %}">
<a href="{% url 'auth_group_management' %}">{% trans "Group Requests" %}</a>
</li>
<li class="{% navactive request 'auth_group_membership auth_group_membership_list' %}">
<a href="{% url 'auth_group_membership' %}">{% trans "Group Membership" %}</a>
</li>
</ul>
</div>
</div>
</nav>

View File

@@ -0,0 +1,44 @@
{% extends "public/base.html" %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}{% trans "Group Members" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
{% include 'registered/groupmanagementmenu.html' %}
<h3>{{ group.name }} {% trans 'Members' %}</h3>
<div id="list" class="">
{% if group.user_set %}
<table class="table">
<tr>
<th class="text-center">{% trans "User" %}</th>
<th class="text-center">{% trans "Character" %}</th>
<th class="text-center">{% trans "Corp" %}</th>
<th class="text-center">{% trans "Alliance" %}</th>
<th class="text-center">{% trans "Action" %}</th>
</tr>
{% for member in members %}
<tr>
<td class="text-center">{{ member.user.username }}</td>
<td class="text-center">{{ member.main_char.character_name }}</td>
<td class="text-center">{{ member.main_char.corporation_name }}</td>
<td class="text-center">{{ member.main_char.alliance_name }}</td>
<td class="text-center">
<a href="{% url 'auth_group_membership_remove' group.id member.user.id %}" class="btn btn-danger"
title="{% trans "Remove from group" %}">
<i class="glyphicon glyphicon-remove"></i>
</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="alert alert-warning text-center">No group members to list.</div>
{% endif %}
</div>
</div>
{% endblock content %}

View File

@@ -0,0 +1,54 @@
{% extends "public/base.html" %}
{% load staticfiles %}
{% load i18n %}
{% block title %}Alliance Auth{% endblock %}
{% block page_title %}{% trans "Groups Membership" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
{% include 'registered/groupmanagementmenu.html' %}
<div>
{% if groups %}
<h3>Groups</h3>
<table class="table">
<tr>
<th class="text-center">{% trans "Name" %}</th>
<th class="text-center">{% trans "Description" %}</th>
<th class="text-center">{% trans "Status" %}</th>
<th class="text-center">{% trans "Member Count" %}</th>
<th class="text-center">{% trans "Action" %}</th>
</tr>
{% for group in groups %}
<tr>
<td class="text-center">{{ group.name }}</td>
<td class="text-center">{{ group.authgroup.description }}</td>
<td class="text-center">
{% if group.authgroup.hidden %}
<span class="label label-info">{% trans "Hidden" %}</span>
{% elif group.authgroup.open %}
<span class="label label-success">{% trans "Open" %}</span>
{% else %}
<span class="label label-default">{% trans "Requestable" %}</span>
{% endif %}
</td>
<td class="text-center">
{{ group.num_members }}
</td>
<td class="text-center">
<a href="{% url 'auth_group_membership_list' group.id %}" class="btn btn-primary"
title="{% trans "View Members" %}">
<i class="glyphicon glyphicon-eye-open"></i>
</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<div class="alert alert-warning text-center">No groups to list.</div>
{% endif %}
</div>
</div>
{% endblock content %}

View File

@@ -11,36 +11,36 @@
<div class="col-lg-12">
<h1 class="page-header text-center">{% trans "Available Groups" %}</h1>
{% if STATE == MEMBER_STATE or user.is_superuser %}
{% if pairs %}
{% if groups %}
<table class="table">
<tr>
<th class="text-center">{% trans "GroupName" %}</th>
<th class="text-center">{% trans "GroupDesc" %}</th>
<th class="text-center">{% trans "Name" %}</th>
<th class="text-center">{% trans "Description" %}</th>
<th class="text-center">{% trans "Action" %}</th>
</tr>
{% for pair in pairs %}
{% for g in groups %}
<tr>
<td class="text-center">{{ pair.0.name }}</td>
<td class="text-center">{{ pair.1.description }}</td>
<td class="text-center">{{ g.group.name }}</td>
<td class="text-center">{{ g.group.authgroup.description }}</td>
<td class="text-center">
{% if pair.0 in user.groups.all %}
{% if pair.2 == "" %}
<a href="{% url 'auth_group_request_leave' pair.0.id %}" class="btn btn-danger">
{% if g.group in user.groups.all %}
{% if not g.request %}
<a href="{% url 'auth_group_request_leave' g.group.id %}" class="btn btn-danger">
{% trans "Leave" %}
</a>
{% else %}
<button type="button" class="btn btn-primary" disabled>
{{ pair.2.status }}
{{ g.request.status }}
</button>
{% endif %}
{% elif pair.2 == "" %}
<a href="{% url 'auth_group_request_add' pair.0.id %}" class="btn btn-success">
{% elif not g.request %}
<a href="{% url 'auth_group_request_add' g.group.id %}" class="btn btn-success">
{% trans "Request" %}
</a>
{% else %}
<button type="button" class="btn btn-primary" disabled>
{{ pair.2.status }}
{{ g.request.status }}
</button>
{% endif %}
</td>