mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-12 14:00:17 +02:00
Merge branch 'groupmanagement-revamp' into 'master'
Group management improvements See merge request allianceauth/allianceauth!1270
This commit is contained in:
commit
3b516c338e
@ -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/")
|
||||||
|
@ -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,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
@ -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
|
||||||
|
@ -8,58 +8,65 @@
|
|||||||
<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">
|
|
||||||
<p>
|
<div class="panel-body">
|
||||||
|
<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 %}
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
<br>
|
<br>
|
||||||
<div class="alert alert-warning text-center">
|
<div class="alert alert-warning text-center">
|
||||||
{% trans "No entries found for this group." %}
|
{% trans "No entries found for this group." %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -75,31 +82,30 @@
|
|||||||
{% 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: [
|
||||||
{
|
{
|
||||||
idx: 1
|
idx: 1
|
||||||
},
|
},
|
||||||
@ -124,4 +130,3 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -9,38 +9,35 @@
|
|||||||
<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.name }} - {% trans 'Members' %}
|
{{ group.name }} - {% trans 'Members' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
|
||||||
<p>
|
<div class="panel-body">
|
||||||
|
<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>
|
|
||||||
{% 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,28 +45,36 @@
|
|||||||
{% 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>
|
||||||
|
{% 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>
|
||||||
</tr>
|
</tr>
|
||||||
{% 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">
|
||||||
@ -77,7 +82,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
@ -93,10 +98,13 @@
|
|||||||
{% 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]
|
||||||
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -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>
|
|
||||||
new ClipboardJS('#clipboard-copy');
|
<script>
|
||||||
</script>
|
new ClipboardJS('#clipboard-copy');
|
||||||
{% endblock %}
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
@ -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 %}
|
||||||
|
@ -4,25 +4,26 @@
|
|||||||
{% 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 %}
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<br>
|
<br>
|
||||||
{% include 'groupmanagement/menu.html' %}
|
{% include 'groupmanagement/menu.html' %}
|
||||||
|
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<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,133 +32,130 @@
|
|||||||
<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 %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</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 %}
|
||||||
<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"></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>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for acceptrequest in acceptrequests %}
|
|
||||||
<tr>
|
|
||||||
<td class="text-right">
|
|
||||||
<img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="img-circle">
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if acceptrequest.main_char %}
|
|
||||||
<a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank">
|
|
||||||
{{ acceptrequest.main_char.character_name }}
|
|
||||||
</a>
|
|
||||||
{% else %}
|
|
||||||
{{ acceptrequest.user.username }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if acceptrequest.main_char %}
|
|
||||||
<a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank">
|
|
||||||
{{ acceptrequest.main_char.corporation_name }}
|
|
||||||
</a><br>
|
|
||||||
{{ acceptrequest.main_char.alliance_name|default_if_none:"" }}
|
|
||||||
{% else %}
|
|
||||||
(unknown)
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">{{ acceptrequest.group.name }}</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success">
|
|
||||||
{% trans "Accept" %}
|
|
||||||
</a>
|
|
||||||
<a href="{% url 'groupmanagement:reject_request' acceptrequest.id %}" class="btn btn-danger">
|
|
||||||
{% trans "Reject" %}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
</thead>
|
||||||
</tbody>
|
|
||||||
</table>
|
<tbody>
|
||||||
</div>
|
{% for acceptrequest in acceptrequests %}
|
||||||
{% else %}
|
<tr>
|
||||||
<div class="alert alert-warning text-center">{% trans "No group add requests." %}</div>
|
<td>
|
||||||
{% endif %}
|
<img src="{{ acceptrequest.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;">
|
||||||
|
{% if acceptrequest.main_char %}
|
||||||
|
<a href="{{ acceptrequest.main_char|evewho_character_url }}" target="_blank">
|
||||||
|
{{ acceptrequest.main_char.character_name }}
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
{{ acceptrequest.user.username }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if acceptrequest.main_char %}
|
||||||
|
<a href="{{ acceptrequest.main_char|dotlan_corporation_url }}" target="_blank">
|
||||||
|
{{ acceptrequest.main_char.corporation_name }}
|
||||||
|
</a><br>
|
||||||
|
{{ acceptrequest.main_char.alliance_name|default_if_none:"" }}
|
||||||
|
{% else %}
|
||||||
|
{% trans "(unknown)" %}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>{{ acceptrequest.group.name }}</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success">
|
||||||
|
{% trans "Accept" %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a href="{% url 'groupmanagement:reject_request' acceptrequest.id %}" class="btn btn-danger">
|
||||||
|
{% trans "Reject" %}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="alert alert-warning text-center">{% trans "No group add requests." %}</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="leave" class="tab-pane fade panel panel-default">
|
<div id="leave" class="tab-pane fade panel panel-default">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{% if leaverequests %}
|
{% if leaverequests %}
|
||||||
<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"></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>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for leaverequest in leaverequests %}
|
|
||||||
<tr>
|
|
||||||
<td class="text-right">
|
|
||||||
<img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="img-circle">
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if leaverequest.main_char %}
|
|
||||||
<a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank">
|
|
||||||
{{ leaverequest.main_char.character_name }}
|
|
||||||
</a>
|
|
||||||
{% else %}
|
|
||||||
{{ leaverequest.user.username }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">
|
|
||||||
{% if leaverequest.main_char %}
|
|
||||||
<a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank">
|
|
||||||
{{ leaverequest.main_char.corporation_name }}
|
|
||||||
</a><br>
|
|
||||||
{{ leaverequest.main_char.alliance_name|default_if_none:"" }}
|
|
||||||
{% else %}
|
|
||||||
(unknown)
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
<td class="text-center">{{ leaverequest.group.name }}</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success">
|
|
||||||
{% trans "Accept" %}
|
|
||||||
</a>
|
|
||||||
<a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger">
|
|
||||||
{% trans "Reject" %}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
</thead>
|
||||||
</tbody>
|
|
||||||
</table>
|
<tbody>
|
||||||
</div>
|
{% for leaverequest in leaverequests %}
|
||||||
{% else %}
|
<tr>
|
||||||
<div class="alert alert-warning text-center">{% trans "No group leave requests." %}</div>
|
<td>
|
||||||
{% endif %}
|
<img src="{{ leaverequest.main_char|character_portrait_url:32 }}" class="img-circle" style="margin-right: 1rem;">
|
||||||
|
{% if leaverequest.main_char %}
|
||||||
|
<a href="{{ leaverequest.main_char|evewho_character_url }}" target="_blank">
|
||||||
|
{{ leaverequest.main_char.character_name }}
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
{{ leaverequest.user.username }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if leaverequest.main_char %}
|
||||||
|
<a href="{{ leaverequest.main_char|dotlan_corporation_url }}" target="_blank">
|
||||||
|
{{ leaverequest.main_char.corporation_name }}
|
||||||
|
</a><br>
|
||||||
|
{{ leaverequest.main_char.alliance_name|default_if_none:"" }}
|
||||||
|
{% else %}
|
||||||
|
{% trans "(unknown)" %}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>{{ leaverequest.group.name }}</td>
|
||||||
|
<td class="text-right">
|
||||||
|
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success">
|
||||||
|
{% trans "Accept" %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger">
|
||||||
|
{% trans "Reject" %}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="alert alert-warning text-center">{% trans "No group leave requests." %}</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -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>
|
||||||
|
@ -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",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
@ -103,7 +103,7 @@ def group_membership_list(request, group_id):
|
|||||||
|
|
||||||
# Check its a joinable group i.e. not corp or internal
|
# Check its a joinable group i.e. not corp or internal
|
||||||
# And the user has permission to manage it
|
# 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)
|
or not GroupManager.can_manage_group(request.user, group)
|
||||||
):
|
):
|
||||||
logger.warning(
|
logger.warning(
|
||||||
@ -132,7 +132,7 @@ def group_membership_list(request, group_id):
|
|||||||
render_items = {'group': group, 'members': members}
|
render_items = {'group': group, 'members': members}
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request, 'groupmanagement/groupmembers.html',
|
request, 'groupmanagement/groupmembers.html',
|
||||||
context=render_items
|
context=render_items
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -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
|
||||||
@ -312,18 +312,18 @@ def group_leave_reject_request(request, group_request_id):
|
|||||||
@login_required
|
@login_required
|
||||||
def groups_view(request):
|
def groups_view(request):
|
||||||
logger.debug("groups_view called by user %s" % request.user)
|
logger.debug("groups_view called by user %s" % request.user)
|
||||||
|
|
||||||
groups_qs = GroupManager.get_joinable_groups_for_user(
|
groups_qs = GroupManager.get_joinable_groups_for_user(
|
||||||
request.user, include_hidden=False
|
request.user, include_hidden=False
|
||||||
)
|
)
|
||||||
groups_qs = groups_qs.order_by('name')
|
groups_qs = groups_qs.order_by('name')
|
||||||
groups = []
|
groups = []
|
||||||
for group in groups_qs:
|
for group in groups_qs:
|
||||||
group_request = GroupRequest.objects\
|
group_request = GroupRequest.objects\
|
||||||
.filter(user=request.user)\
|
.filter(user=request.user)\
|
||||||
.filter(group=group)
|
.filter(group=group)
|
||||||
groups.append({
|
groups.append({
|
||||||
'group': group,
|
'group': group,
|
||||||
'request': group_request[0] if group_request else None
|
'request': group_request[0] if group_request else None
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user