mirror of
https://github.com/Hopiu/wagtail.git
synced 2026-05-28 08:28:18 +00:00
Add groups to wagtail admin interface
This commit is contained in:
parent
bceda21a05
commit
f97524f2e1
9 changed files with 261 additions and 1 deletions
|
|
@ -2,6 +2,7 @@ from django import forms
|
|||
from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
|
||||
from wagtail.wagtailusers.models import UserProfile
|
||||
from wagtail.wagtailcore.models import UserPagePermissionsProxy
|
||||
|
|
@ -136,6 +137,34 @@ class UserEditForm(forms.ModelForm):
|
|||
return user
|
||||
|
||||
|
||||
class GroupForm(forms.ModelForm):
|
||||
required_css_class = "required"
|
||||
|
||||
error_messages = {
|
||||
'duplicate_name': _("A group with that name already exists."),
|
||||
}
|
||||
|
||||
is_superuser = forms.BooleanField(
|
||||
label=_("Administrator"),
|
||||
required=False,
|
||||
help_text=_("Administrators have the ability to manage user accounts.")
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Group
|
||||
fields = ("name", "permissions", )
|
||||
|
||||
def clean_name(self):
|
||||
# Since Group.name is unique, this check is redundant,
|
||||
# but it sets a nicer error message than the ORM. See #13147.
|
||||
name = self.cleaned_data["name"]
|
||||
try:
|
||||
Group._default_manager.exclude(id=self.instance.id).get(name=name)
|
||||
except Group.DoesNotExist:
|
||||
return name
|
||||
raise forms.ValidationError(self.error_messages['duplicate_name'])
|
||||
|
||||
|
||||
class NotificationPreferencesForm(forms.ModelForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(NotificationPreferencesForm, self).__init__(*args, **kwargs)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% load image_tags %}
|
||||
{% load i18n %}
|
||||
{% block titletag %}{% trans "Add group" %}{% endblock %}
|
||||
{% block bodyclass %}menu-groups{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
{% trans "Add group" as add_group_str %}
|
||||
{% include "wagtailadmin/shared/header.html" with title=add_group_str icon="group" %}
|
||||
|
||||
<form action="{% url 'wagtailusers_groups_create' %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<div class="nice-padding">
|
||||
<ul class="fields">
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.name %}
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.permissions %}
|
||||
<li><input type="submit" value='{% trans "Add group" %}' /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
21
wagtail/wagtailusers/templates/wagtailusers/groups/edit.html
Normal file
21
wagtail/wagtailusers/templates/wagtailusers/groups/edit.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% load image_tags %}
|
||||
{% load i18n %}
|
||||
{% block titletag %}{% trans "Editing" %} {{ group.name }}{% endblock %}
|
||||
{% block bodyclass %}menu-groups{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
{% trans "Editing" as editing_str %}
|
||||
{% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=group.name icon="group" %}
|
||||
|
||||
<form action="{% url 'wagtailusers_groups_edit' group.id %}" method="POST">
|
||||
{% csrf_token %}
|
||||
<div class="nice-padding">
|
||||
<ul class="fields">
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.name %}
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.permissions %}
|
||||
<li><input type="submit" value="{% trans 'Save' %}" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
{% extends "wagtailadmin/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load gravatar %}
|
||||
{% block titletag %}{% trans "groups" %}{% endblock %}
|
||||
{% block bodyclass %}menu-groups{% endblock %}
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
window.headerSearch = {
|
||||
url: "{% url 'wagtailusers_groups_index' %}",
|
||||
termInput: "#id_q",
|
||||
targetOutput: "#group-results"
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% trans "groups" as groups_str %}
|
||||
{% trans "Add a group" as add_a_group_str %}
|
||||
{% include "wagtailadmin/shared/header.html" with title=groups_str add_link="wagtailusers_groups_create" add_text=add_a_group_str icon="group" search_url="wagtailusers_groups_index" %}
|
||||
|
||||
<div class="nice-padding">
|
||||
<div id="group-results" class="groups">
|
||||
{% include "wagtailusers/groups/results.html" %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
27
wagtail/wagtailusers/templates/wagtailusers/groups/list.html
Normal file
27
wagtail/wagtailusers/templates/wagtailusers/groups/list.html
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{% load i18n %}
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">
|
||||
{% trans "Name" %}
|
||||
{% if ordering == "name" %}
|
||||
<a href="{% url 'wagtailusers_groups_index' %}" class="icon icon-arrow-down-after teal"></a>
|
||||
{% else %}
|
||||
<a href="{% url 'wagtailusers_groups_index' %}?ordering=name" class="icon icon-arrow-down-after"></a>
|
||||
{% endif %}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for group in groups %}
|
||||
<tr>
|
||||
<td class="title">
|
||||
<h2>
|
||||
<span class="avatar small icon icon-group"></span>
|
||||
<a href="{% url 'wagtailusers_groups_edit' group.id %}">{{ group.name }}</a>
|
||||
</h2>
|
||||
</td>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
{% load i18n %}
|
||||
{% if groups %}
|
||||
|
||||
{% include "wagtailusers/groups/list.html" %}
|
||||
|
||||
{% include "wagtailadmin/shared/pagination_nav.html" with items=groups is_searching=is_searching linkurl="wagtailusers_groups_index" %}
|
||||
{% else %}
|
||||
{% url 'wagtailusers_groups_create' as wagtailusers_create_group_url %}
|
||||
<p>{% blocktrans %}There are no groups configured. Why not <a href="{{ wagtailusers_create_group_url }}">add some</a>?{% endblocktrans %}</p>
|
||||
{% endif %}
|
||||
8
wagtail/wagtailusers/urls/groups.py
Normal file
8
wagtail/wagtailusers/urls/groups.py
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
from django.conf.urls import url
|
||||
from wagtail.wagtailusers.views import groups
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', groups.index, name='wagtailusers_groups_index'),
|
||||
url(r'^new/$', groups.create, name='wagtailusers_groups_create'),
|
||||
url(r'^(\d+)/$', groups.edit, name='wagtailusers_groups_edit'),
|
||||
]
|
||||
114
wagtail/wagtailusers/views/groups.py
Normal file
114
wagtail/wagtailusers/views/groups.py
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
from django.contrib import messages
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.views.decorators.vary import vary_on_headers
|
||||
|
||||
from wagtail.wagtailadmin.forms import SearchForm
|
||||
from wagtail.wagtailusers.forms import GroupForm
|
||||
from wagtail.wagtailcore.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
# Typically we would check the permission 'auth.change_user' for user
|
||||
# management actions, but this may vary according to the AUTH_USER_MODEL
|
||||
# setting
|
||||
change_user_perm = "{0}.change_{1}".format(AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower())
|
||||
|
||||
|
||||
@permission_required(change_user_perm)
|
||||
@vary_on_headers('X-Requested-With')
|
||||
def index(request):
|
||||
q = None
|
||||
p = request.GET.get("p", 1)
|
||||
is_searching = False
|
||||
|
||||
if 'q' in request.GET:
|
||||
form = SearchForm(request.GET, placeholder=_("Search groups"))
|
||||
if form.is_valid():
|
||||
q = form.cleaned_data['q']
|
||||
|
||||
is_searching = True
|
||||
groups = Group.objects.filter(name__icontains=q)
|
||||
else:
|
||||
form = SearchForm(placeholder=_("Search groups"))
|
||||
|
||||
if not is_searching:
|
||||
groups = Group.objects
|
||||
|
||||
groups = groups.order_by('name')
|
||||
|
||||
if 'ordering' in request.GET:
|
||||
ordering = request.GET['ordering']
|
||||
|
||||
if ordering in ['name', 'username']:
|
||||
if ordering != 'name':
|
||||
users = users.order_by(ordering)
|
||||
else:
|
||||
ordering = 'name'
|
||||
|
||||
paginator = Paginator(groups, 20)
|
||||
|
||||
try:
|
||||
groups = paginator.page(p)
|
||||
except PageNotAnInteger:
|
||||
groups = paginator.page(1)
|
||||
except EmptyPage:
|
||||
groups = paginator.page(paginator.num_pages)
|
||||
|
||||
if request.is_ajax():
|
||||
return render(request, "wagtailusers/groups/results.html", {
|
||||
'groups': groups,
|
||||
'is_searching': is_searching,
|
||||
'query_string': q,
|
||||
'ordering': ordering,
|
||||
})
|
||||
else:
|
||||
return render(request, "wagtailusers/groups/index.html", {
|
||||
'search_form': form,
|
||||
'groups': groups,
|
||||
'is_searching': is_searching,
|
||||
'ordering': ordering,
|
||||
'query_string': q,
|
||||
})
|
||||
|
||||
@permission_required(change_user_perm)
|
||||
def create(request):
|
||||
if request.POST:
|
||||
form = GroupForm(request.POST)
|
||||
if form.is_valid():
|
||||
group = form.save()
|
||||
messages.success(request, _("Group '{0}' created.").format(group))
|
||||
return redirect('wagtailusers_groups_index')
|
||||
else:
|
||||
messages.error(request, _("The group could not be created due to errors.") )
|
||||
else:
|
||||
form = GroupForm()
|
||||
|
||||
return render(request, 'wagtailusers/groups/create.html', {
|
||||
'form': form,
|
||||
})
|
||||
|
||||
|
||||
@permission_required(change_user_perm)
|
||||
def edit(request, group_id):
|
||||
group = get_object_or_404(Group, id=group_id)
|
||||
if request.POST:
|
||||
form = GroupForm(request.POST, instance=group)
|
||||
if form.is_valid():
|
||||
group = form.save()
|
||||
messages.success(request, _("Group '{0}' updated.").format(group))
|
||||
return redirect('wagtailusers_groups_index')
|
||||
else:
|
||||
messages.error(request, _("The group could not be saved due to errors."))
|
||||
else:
|
||||
form = GroupForm(instance=group)
|
||||
|
||||
return render(request, 'wagtailusers/groups/edit.html', {
|
||||
'group': group,
|
||||
'form': form,
|
||||
})
|
||||
|
|
@ -5,12 +5,13 @@ from django.utils.translation import ugettext_lazy as _
|
|||
from wagtail.wagtailcore import hooks
|
||||
from wagtail.wagtailadmin.menu import MenuItem
|
||||
|
||||
from wagtail.wagtailusers.urls import users
|
||||
from wagtail.wagtailusers.urls import users, groups
|
||||
|
||||
|
||||
def register_admin_urls():
|
||||
return [
|
||||
url(r'^users/', include(users)),
|
||||
url(r'^groups/', include(groups)),
|
||||
]
|
||||
hooks.register('register_admin_urls', register_admin_urls)
|
||||
|
||||
|
|
@ -20,4 +21,7 @@ def construct_main_menu(request, menu_items):
|
|||
menu_items.append(
|
||||
MenuItem(_('Users'), urlresolvers.reverse('wagtailusers_users_index'), classnames='icon icon-user', order=600)
|
||||
)
|
||||
menu_items.append(
|
||||
MenuItem(_('Groups'), urlresolvers.reverse('wagtailusers_groups_index'), classnames='icon icon-group', order=601)
|
||||
)
|
||||
hooks.register('construct_main_menu', construct_main_menu)
|
||||
|
|
|
|||
Loading…
Reference in a new issue