kopia lustrzana https://github.com/wagtail/bakerydemo
Admin interface for regions
rodzic
6013a41164
commit
4ec0bd5552
|
@ -58,6 +58,7 @@ INSTALLED_APPS = [
|
||||||
'wagtailfontawesome',
|
'wagtailfontawesome',
|
||||||
'wagtail_i18n',
|
'wagtail_i18n',
|
||||||
'wagtail_i18n.plugins.sites',
|
'wagtail_i18n.plugins.sites',
|
||||||
|
'wagtail_i18n.plugins.regions_admin',
|
||||||
|
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
|
|
|
@ -65,6 +65,9 @@ class Region(models.Model):
|
||||||
def default_id(cls):
|
def default_id(cls):
|
||||||
return cls.default().id
|
return cls.default().id
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class TranslatableMixin(models.Model):
|
class TranslatableMixin(models.Model):
|
||||||
translation_key = models.UUIDField(default=uuid.uuid4, editable=False)
|
translation_key = models.UUIDField(default=uuid.uuid4, editable=False)
|
||||||
|
|
|
@ -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"
|
|
@ -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']
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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
|
|
@ -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'])
|
|
@ -1,8 +1,10 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.utils.functional import cached_property
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from wagtail.admin.widgets import AdminPageChooser
|
from wagtail.admin.widgets import AdminPageChooser
|
||||||
|
|
||||||
|
from wagtail_i18n.models import Region
|
||||||
from .models import Site, SiteLanguage
|
from .models import Site, SiteLanguage
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +29,10 @@ class SiteLanguageFormSet(SiteLanguageFormSetBase):
|
||||||
minimum_forms = 1
|
minimum_forms = 1
|
||||||
minimum_forms_message = _("Please specify at least one language for this site.")
|
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):
|
def add_fields(self, form, *args, **kwargs):
|
||||||
super().add_fields(form, *args, **kwargs)
|
super().add_fields(form, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -35,3 +41,7 @@ class SiteLanguageFormSet(SiteLanguageFormSetBase):
|
||||||
|
|
||||||
# Use page chooser for root page
|
# Use page chooser for root page
|
||||||
form.fields['root_page'].widget = AdminPageChooser()
|
form.fields['root_page'].widget = AdminPageChooser()
|
||||||
|
|
||||||
|
# Hide region field if there is only one
|
||||||
|
if self.single_region:
|
||||||
|
form.fields['region'].widget = forms.HiddenInput()
|
||||||
|
|
Ładowanie…
Reference in New Issue