Admin interface for regions

i18n-poc
Karl Hobley 2019-03-25 17:15:31 +00:00
rodzic 6013a41164
commit 4ec0bd5552
11 zmienionych plików z 217 dodań i 0 usunięć

Wyświetl plik

@ -58,6 +58,7 @@ INSTALLED_APPS = [
'wagtailfontawesome',
'wagtail_i18n',
'wagtail_i18n.plugins.sites',
'wagtail_i18n.plugins.regions_admin',
'django.contrib.admin',
'django.contrib.auth',

Wyświetl plik

@ -65,6 +65,9 @@ class Region(models.Model):
def default_id(cls):
return cls.default().id
def __str__(self):
return self.name
class TranslatableMixin(models.Model):
translation_key = models.UUIDField(default=uuid.uuid4, editable=False)

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailI18NRegionsAdminAppConfig(AppConfig):
label = 'wagtail_i18n_regions_admin'
name = 'wagtail_i18n.plugins.regions_admin'
verbose_name = "Wagtail I18N Regions admin"

Wyświetl plik

@ -0,0 +1,15 @@
from django import forms
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from wagtail.admin.widgets import AdminPageChooser
from wagtail_i18n.models import Region
class RegionForm(forms.ModelForm):
required_css_class = 'required'
class Meta:
model = Region
fields = ['name', 'slug', 'languages']

Wyświetl plik

@ -0,0 +1,31 @@
{% extends "wagtailadmin/generic/create.html" %}
{% load i18n %}
{% block content %}
{% include "wagtailadmin/shared/header.html" with title=view.page_title icon=view.header_icon %}
<form action="{{ view.get_add_url }}" method="POST" novalidate{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% csrf_token %}
{% block hidden_fields %}
{% for field in form.hidden_fields %}{{ field }}{% endfor %}
{% endblock %}
<div class="nice-padding">
<ul class="fields">
{% block visible_fields %}
{% for field in form.visible_fields %}
{% include "wagtailadmin/shared/field_as_li.html" %}
{% endfor %}
{% endblock %}
<li><input type="submit" value="{% trans 'Save' %}" class="button" /></li>
</ul>
</div>
</form>
{% endblock %}
{% block extra_js %}
{{ block.super }}
{% include "wagtailadmin/pages/_editor_js.html" %}
{% endblock %}

Wyświetl plik

@ -0,0 +1,38 @@
{% extends "wagtailadmin/generic/edit.html" %}
{% load i18n %}
{% block content %}
{% include "wagtailadmin/shared/header.html" with title=view.page_title subtitle=view.get_page_subtitle icon=view.header_icon %}
<div class="nice-padding">
{% block before_form %}{% endblock %}
<form action="{{ view.get_edit_url }}" method="POST" novalidate{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% csrf_token %}
{% block hidden_fields %}
{% for field in form.hidden_fields %}{{ field }}{% endfor %}
{% endblock %}
<ul class="fields">
{% block visible_fields %}
{% for field in form.visible_fields %}
{% include "wagtailadmin/shared/field_as_li.html" %}
{% endfor %}
{% endblock %}
<li>
<input type="submit" value="{% trans 'Save' %}" class="button" />
{% if can_delete %}
<a href="{{ view.get_delete_url }}" class="button button-secondary no">{{ view.delete_item_label }}</a>
{% endif %}
</li>
</ul>
</form>
</div>
{% endblock %}
{% block extra_js %}
{{ block.super }}
{% include "wagtailadmin/pages/_editor_js.html" %}
{% endblock %}

Wyświetl plik

@ -0,0 +1,28 @@
{% extends "wagtailadmin/generic/index.html" %}
{% load i18n %}
{% block listing %}
<div class="nice-padding">
<div id="sites-list">
<table class="listing">
<thead>
<tr>
<th class="name">{% trans "Name" %}</th>
</tr>
</thead>
<tbody>
{% for region in regions %}
<tr>
<td class="hostname title">
<h2>
<a href="{% url 'wagtail_i18n_regions_admin:edit' region.id %}">{{ region.name }}</a>
</h2>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}

Wyświetl plik

@ -0,0 +1,50 @@
from django.db import transaction
from django.utils.translation import ugettext_lazy
from wagtail.admin.views import generic
from wagtail.admin.viewsets.model import ModelViewSet
from wagtail.core.permission_policies import ModelPermissionPolicy
from wagtail_i18n.models import Region
from .forms import RegionForm
class IndexView(generic.IndexView):
template_name = 'wagtail_i18n_regions_admin/index.html'
page_title = ugettext_lazy("Regions")
add_item_label = ugettext_lazy("Add a region")
context_object_name = 'regions'
class CreateView(generic.CreateView):
page_title = ugettext_lazy("Add region")
success_message = ugettext_lazy("Region '{0}' created.")
template_name = 'wagtail_i18n_regions_admin/create.html'
class EditView(generic.EditView):
success_message = ugettext_lazy("Region '{0}' updated.")
error_message = ugettext_lazy("The site could not be saved due to errors.")
delete_item_label = ugettext_lazy("Delete region")
context_object_name = 'region'
template_name = 'wagtail_i18n_regions_admin/edit.html'
class DeleteView(generic.DeleteView):
success_message = ugettext_lazy("Region '{0}' deleted.")
page_title = ugettext_lazy("Delete region")
confirmation_message = ugettext_lazy("Are you sure you want to delete this region?")
class RegionViewSet(ModelViewSet):
icon = 'site'
model = Region
permission_policy = ModelPermissionPolicy(Region)
index_view_class = IndexView
add_view_class = CreateView
edit_view_class = EditView
delete_view_class = DeleteView
def get_form_class(self, for_update=False):
return RegionForm

Wyświetl plik

@ -0,0 +1,34 @@
from django.contrib.auth.models import Permission
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from wagtail.admin.menu import MenuItem
from wagtail.core import hooks
from wagtail.core.permission_policies import ModelPermissionPolicy
from wagtail_i18n.models import Region
from .views import RegionViewSet
@hooks.register('register_admin_viewset')
def register_viewset():
return RegionViewSet('wagtail_i18n_regions_admin', url_prefix='i18nregions')
class RegionsMenuItem(MenuItem):
def is_shown(self, request):
return ModelPermissionPolicy(Region).user_has_any_permission(
request.user, ['add', 'change', 'delete']
)
@hooks.register('register_settings_menu_item')
def register_sites_menu_item():
return RegionsMenuItem(_('Regions'), reverse('wagtail_i18n_regions_admin:index'),
classnames='icon icon-site', order=602)
@hooks.register('register_permissions')
def register_permissions():
return Permission.objects.filter(content_type__app_label='wagtail_i18n_regions_admin',
codename__in=['add_region', 'change_region', 'delete_region'])

Wyświetl plik

@ -1,8 +1,10 @@
from django import forms
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from wagtail.admin.widgets import AdminPageChooser
from wagtail_i18n.models import Region
from .models import Site, SiteLanguage
@ -27,6 +29,10 @@ class SiteLanguageFormSet(SiteLanguageFormSetBase):
minimum_forms = 1
minimum_forms_message = _("Please specify at least one language for this site.")
@cached_property
def single_region(self):
return Region.objects.count() == 1
def add_fields(self, form, *args, **kwargs):
super().add_fields(form, *args, **kwargs)
@ -35,3 +41,7 @@ class SiteLanguageFormSet(SiteLanguageFormSetBase):
# Use page chooser for root page
form.fields['root_page'].widget = AdminPageChooser()
# Hide region field if there is only one
if self.single_region:
form.fields['region'].widget = forms.HiddenInput()