kopia lustrzana https://github.com/wagtail/wagtail
				
				
				
			Add site switcher to header in settings
							rodzic
							
								
									72c81e8317
								
							
						
					
					
						commit
						5d81269548
					
				|  | @ -55,6 +55,7 @@ var apps = [ | |||
|             'wagtailstyleguide/scss/styleguide.scss' | ||||
|         ], | ||||
|     }), | ||||
|     new App('wagtail/contrib/settings'), | ||||
| ]; | ||||
| 
 | ||||
| module.exports = { | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| static/ | ||||
|  | @ -0,0 +1,27 @@ | |||
| from __future__ import absolute_import, unicode_literals | ||||
| 
 | ||||
| from django import forms | ||||
| from django.core.urlresolvers import reverse | ||||
| 
 | ||||
| from wagtail.wagtailcore.models import Site | ||||
| 
 | ||||
| 
 | ||||
| class SiteSwitchForm(forms.Form): | ||||
|     site = forms.ChoiceField(choices=[]) | ||||
| 
 | ||||
|     class Media: | ||||
|         js = [ | ||||
|             'settings/js/site-switcher.js', | ||||
|         ] | ||||
| 
 | ||||
|     def __init__(self, current_site, model, **kwargs): | ||||
|         initial_data = {'site': self.get_change_url(current_site, model)} | ||||
|         super(SiteSwitchForm, self).__init__(initial=initial_data, **kwargs) | ||||
|         sites = [(self.get_change_url(site, model), site) | ||||
|                  for site in Site.objects.all()] | ||||
|         self.fields['site'].choices = sites | ||||
| 
 | ||||
|     @classmethod | ||||
|     def get_change_url(cls, site, model): | ||||
|         return reverse('wagtailsettings_edit', args=[ | ||||
|             site.pk, model._meta.app_label, model._meta.model_name]) | ||||
|  | @ -0,0 +1,12 @@ | |||
| $(function() { | ||||
|     var $switcher = $('form#settings-site-switch select'); | ||||
|     if (!$switcher.length) return; | ||||
| 
 | ||||
|     var initial = $switcher.val(); | ||||
|     $switcher.on('change', function() { | ||||
|         var url = $switcher.val(); | ||||
|         if (url != initial) { | ||||
|             window.location = url; | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
|  | @ -3,10 +3,30 @@ | |||
| {% block titletag %}{% blocktrans %}Editing {{ setting_type_name}} - {{ instance }}{% endblocktrans %}{% endblock %} | ||||
| {% block bodyclass %}menu-settings{% endblock %} | ||||
| {% block content %} | ||||
|     {% trans "Editing" as editing_str %} | ||||
|     {% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=setting_type_name|capfirst icon="cogs" %} | ||||
|     <header class="nice-padding"> | ||||
|         <div class="row"> | ||||
|             <div class="left"> | ||||
|                 <div class="col"> | ||||
|                     <h1 class="icon icon-cogs"> | ||||
|                         {% trans "Editing" %} | ||||
|                         <span>{{ setting_type_name|capfirst }}</span> | ||||
|                     </h1> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="right"> | ||||
|                 {% if site_switcher %} | ||||
|                 <form method="get" id="settings-site-switch"> | ||||
|                     <label for="{{ site_switcher.site.id_for_label }}"> | ||||
|                         Site: | ||||
|                     </label> | ||||
|                     {{ site_switcher.site }} | ||||
|                 </form> | ||||
|                 {% endif %} | ||||
|             </div> | ||||
|         </div> | ||||
|     </header> | ||||
| 
 | ||||
|     <form action="{% url 'wagtailsettings_edit' opts.app_label opts.model_name %}" method="POST"> | ||||
|     <form action="{% url 'wagtailsettings_edit' site.pk opts.app_label opts.model_name %}" method="POST"> | ||||
|         {% csrf_token %} | ||||
|         {{ edit_handler.render_form_content }} | ||||
| 
 | ||||
|  | @ -23,7 +43,11 @@ | |||
| 
 | ||||
| {% block extra_css %} | ||||
|     {% include "wagtailadmin/pages/_editor_css.html" %} | ||||
|     {{ form.media.css }} | ||||
|     {{ site_switcher.media.css }} | ||||
| {% endblock %} | ||||
| {% block extra_js %} | ||||
|     {% include "wagtailadmin/pages/_editor_js.html" %} | ||||
|     {{ form.media.js }} | ||||
|     {{ site_switcher.media.js }} | ||||
| {% endblock %} | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| from __future__ import absolute_import, unicode_literals | ||||
| 
 | ||||
| from django.contrib.auth import get_user_model | ||||
| from django.contrib.auth.models import Permission | ||||
| from django.core.urlresolvers import reverse | ||||
|  | @ -8,7 +10,7 @@ from wagtail.contrib.settings.registry import SettingMenuItem | |||
| from wagtail.tests.testapp.models import IconSetting, TestSetting | ||||
| from wagtail.tests.utils import WagtailTestUtils | ||||
| from wagtail.wagtailcore import hooks | ||||
| from wagtail.wagtailcore.models import Site | ||||
| from wagtail.wagtailcore.models import Page, Site | ||||
| 
 | ||||
| 
 | ||||
| class TestSettingMenu(TestCase, WagtailTestUtils): | ||||
|  | @ -42,20 +44,23 @@ class TestSettingMenu(TestCase, WagtailTestUtils): | |||
|         self.assertEqual(classnames, {'icon', 'icon-tag', 'test-class'}) | ||||
| 
 | ||||
| 
 | ||||
| class TestSettingCreateView(TestCase, WagtailTestUtils): | ||||
| class BaseTestSettingView(TestCase, WagtailTestUtils): | ||||
|     def get(self, site_pk=1, params={}): | ||||
|         url = self.edit_url('tests', 'testsetting', site_pk=site_pk) | ||||
|         return self.client.get(url, params) | ||||
| 
 | ||||
|     def post(self, site_pk=1, post_data={}): | ||||
|         url = self.edit_url('tests', 'testsetting', site_pk=site_pk) | ||||
|         return self.client.post(url, post_data) | ||||
| 
 | ||||
|     def edit_url(self, app, model, site_pk=1): | ||||
|         return reverse('wagtailsettings_edit', args=[site_pk, app, model]) | ||||
| 
 | ||||
| 
 | ||||
| class TestSettingCreateView(BaseTestSettingView): | ||||
|     def setUp(self): | ||||
|         self.login() | ||||
| 
 | ||||
|     def get(self, params={}): | ||||
|         return self.client.get( | ||||
|             reverse('wagtailsettings_edit', args=('tests', 'testsetting')), | ||||
|             params) | ||||
| 
 | ||||
|     def post(self, post_data={}): | ||||
|         return self.client.post( | ||||
|             reverse('wagtailsettings_edit', args=('tests', 'testsetting')), | ||||
|             post_data) | ||||
| 
 | ||||
|     def test_status_code(self): | ||||
|         self.assertEqual(self.get().status_code, 200) | ||||
| 
 | ||||
|  | @ -75,7 +80,7 @@ class TestSettingCreateView(TestCase, WagtailTestUtils): | |||
|         self.assertEqual(setting.email, 'test@example.com') | ||||
| 
 | ||||
| 
 | ||||
| class TestSettingEditView(TestCase, WagtailTestUtils): | ||||
| class TestSettingEditView(BaseTestSettingView): | ||||
|     def setUp(self): | ||||
|         default_site = Site.objects.get(is_default_site=True) | ||||
| 
 | ||||
|  | @ -87,22 +92,11 @@ class TestSettingEditView(TestCase, WagtailTestUtils): | |||
| 
 | ||||
|         self.login() | ||||
| 
 | ||||
|     def get(self, params={}): | ||||
|         return self.client.get( | ||||
|             reverse('wagtailsettings_edit', args=('tests', 'testsetting')), | ||||
|             params) | ||||
| 
 | ||||
|     def post(self, post_data={}): | ||||
|         return self.client.post( | ||||
|             reverse('wagtailsettings_edit', args=('tests', 'testsetting')), | ||||
|             post_data) | ||||
| 
 | ||||
|     def test_status_code(self): | ||||
|         self.assertEqual(self.get().status_code, 200) | ||||
| 
 | ||||
|     def test_non_existant_model(self): | ||||
|         response = self.client.get( | ||||
|             reverse('wagtailsettings_edit', args=('tests', 'foo'))) | ||||
|         response = self.client.get(self.edit_url('test', 'foo')) | ||||
|         self.assertEqual(response.status_code, 404) | ||||
| 
 | ||||
|     def test_edit_invalid(self): | ||||
|  | @ -121,6 +115,74 @@ class TestSettingEditView(TestCase, WagtailTestUtils): | |||
|         self.assertEqual(setting.email, 'test@example.com') | ||||
| 
 | ||||
| 
 | ||||
| class TestMultiSite(BaseTestSettingView): | ||||
|     def setUp(self): | ||||
|         self.default_site = Site.objects.get(is_default_site=True) | ||||
|         self.other_site = Site.objects.create(hostname='example.com', root_page=Page.objects.get(pk=2)) | ||||
|         self.login() | ||||
| 
 | ||||
|     def test_redirect_to_default(self): | ||||
|         """ | ||||
|         Should redirect to the setting for the default site. | ||||
|         """ | ||||
|         start_url = reverse('wagtailsettings_edit', args=[ | ||||
|             'tests', 'testsetting']) | ||||
|         dest_url = 'http://testserver' + reverse('wagtailsettings_edit', args=[ | ||||
|             self.default_site.pk, 'tests', 'testsetting']) | ||||
|         response = self.client.get(start_url, follow=True) | ||||
|         self.assertEqual([(dest_url, 302)], response.redirect_chain) | ||||
| 
 | ||||
|     def test_redirect_to_current(self): | ||||
|         """ | ||||
|         Should redirect to the setting for the current site taken from the URL, | ||||
|         by default | ||||
|         """ | ||||
|         start_url = reverse('wagtailsettings_edit', args=[ | ||||
|             'tests', 'testsetting']) | ||||
|         dest_url = 'http://example.com' + reverse('wagtailsettings_edit', args=[ | ||||
|             self.other_site.pk, 'tests', 'testsetting']) | ||||
|         response = self.client.get(start_url, follow=True, HTTP_HOST=self.other_site.hostname) | ||||
|         self.assertEqual([(dest_url, 302)], response.redirect_chain) | ||||
| 
 | ||||
|     def test_switcher(self): | ||||
|         """ Check that the switcher form exists in the page """ | ||||
|         response = self.get() | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         self.assertContains(response, 'id="settings-site-switch"') | ||||
| 
 | ||||
|     def test_unknown_site(self): | ||||
|         """ Check that unknown sites throw a 404 """ | ||||
|         response = self.get(site_pk=3) | ||||
|         self.assertEqual(response.status_code, 404) | ||||
| 
 | ||||
|     def test_edit(self): | ||||
|         """ | ||||
|         Check that editing settings in multi-site mode edits the correct | ||||
|         setting, and leaves the other ones alone | ||||
|         """ | ||||
|         TestSetting.objects.create( | ||||
|             title='default', | ||||
|             email='default@example.com', | ||||
|             site=self.default_site) | ||||
|         TestSetting.objects.create( | ||||
|             title='other', | ||||
|             email='other@example.com', | ||||
|             site=self.other_site) | ||||
|         response = self.post(site_pk=self.other_site.pk, post_data={ | ||||
|             'title': 'other-new', 'email': 'other-other@example.com'}) | ||||
|         self.assertEqual(response.status_code, 302) | ||||
| 
 | ||||
|         # Check that the correct setting was updated | ||||
|         other_setting = TestSetting.for_site(self.other_site) | ||||
|         self.assertEqual(other_setting.title, 'other-new') | ||||
|         self.assertEqual(other_setting.email, 'other-other@example.com') | ||||
| 
 | ||||
|         # Check that the other setting was not updated | ||||
|         default_setting = TestSetting.for_site(self.default_site) | ||||
|         self.assertEqual(default_setting.title, 'default') | ||||
|         self.assertEqual(default_setting.email, 'default@example.com') | ||||
| 
 | ||||
| 
 | ||||
| class TestAdminPermission(TestCase, WagtailTestUtils): | ||||
|     def test_registered_permission(self): | ||||
|         permission = Permission.objects.get_by_natural_key( | ||||
|  |  | |||
|  | @ -3,5 +3,6 @@ from django.conf.urls import url | |||
| from . import views | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|     url(r'^(\w+)/(\w+)/$', views.edit, name='wagtailsettings_edit'), | ||||
|     url(r'^(\w+)/(\w+)/$', views.edit_current_site, name='wagtailsettings_edit'), | ||||
|     url(r'^(\d+)/(\w+)/(\w+)/$', views.edit, name='wagtailsettings_edit'), | ||||
| ] | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| from django.contrib.auth.decorators import permission_required | ||||
| from django.core.exceptions import PermissionDenied | ||||
| from django.http import Http404 | ||||
| from django.shortcuts import redirect, render | ||||
| from django.shortcuts import redirect, render, get_object_or_404 | ||||
| from django.utils.lru_cache import lru_cache | ||||
| from django.utils.text import capfirst | ||||
| from django.utils.translation import ugettext as _ | ||||
|  | @ -9,7 +8,9 @@ from django.utils.translation import ugettext as _ | |||
| from wagtail.wagtailadmin import messages | ||||
| from wagtail.wagtailadmin.edit_handlers import ( | ||||
|     ObjectList, extract_panel_definitions_from_model_class) | ||||
| from wagtail.wagtailcore.models import Site | ||||
| 
 | ||||
| from .forms import SiteSwitchForm | ||||
| from .permissions import user_can_edit_setting_type | ||||
| from .registry import registry | ||||
| 
 | ||||
|  | @ -31,15 +32,20 @@ def get_setting_edit_handler(model): | |||
|     return ObjectList(panels).bind_to_model(model) | ||||
| 
 | ||||
| 
 | ||||
| @permission_required('wagtailadmin.access_admin')  # further permissions are enforced within the view | ||||
| def edit(request, app_name, model_name): | ||||
| def edit_current_site(request, app_name, model_name): | ||||
|     # Redirect the user to the edit page for the current site | ||||
|     return redirect('wagtailsettings_edit', request.site.pk, app_name, model_name) | ||||
| 
 | ||||
| 
 | ||||
| def edit(request, site_pk, app_name, model_name): | ||||
|     model = get_model_from_url_params(app_name, model_name) | ||||
|     if not user_can_edit_setting_type(request.user, model): | ||||
|         raise PermissionDenied | ||||
|     site = get_object_or_404(Site, pk=site_pk) | ||||
| 
 | ||||
|     setting_type_name = model._meta.verbose_name | ||||
| 
 | ||||
|     instance = model.for_site(request.site) | ||||
|     instance = model.for_site(site) | ||||
|     edit_handler_class = get_setting_edit_handler(model) | ||||
|     form_class = edit_handler_class.get_form_class(model) | ||||
| 
 | ||||
|  | @ -56,7 +62,7 @@ def edit(request, app_name, model_name): | |||
|                     instance=instance | ||||
|                 ) | ||||
|             ) | ||||
|             return redirect('wagtailsettings_edit', app_name, model_name) | ||||
|             return redirect('wagtailsettings_edit', site.pk, app_name, model_name) | ||||
|         else: | ||||
|             messages.error(request, _("The setting could not be saved due to errors.")) | ||||
|             edit_handler = edit_handler_class(instance=instance, form=form) | ||||
|  | @ -64,9 +70,16 @@ def edit(request, app_name, model_name): | |||
|         form = form_class(instance=instance) | ||||
|         edit_handler = edit_handler_class(instance=instance, form=form) | ||||
| 
 | ||||
|     # Show a site switcher form if there are multiple sites | ||||
|     site_switcher = None | ||||
|     if Site.objects.count() > 1: | ||||
|         site_switcher = SiteSwitchForm(site, model) | ||||
| 
 | ||||
|     return render(request, 'wagtailsettings/edit.html', { | ||||
|         'opts': model._meta, | ||||
|         'setting_type_name': setting_type_name, | ||||
|         'instance': instance, | ||||
|         'edit_handler': edit_handler, | ||||
|         'site': site, | ||||
|         'site_switcher': site_switcher, | ||||
|     }) | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Tim Heap
						Tim Heap