manager: move title and slug to their own edit dialogs (#10940)

This commit is contained in:
Frédéric Péters 2016-05-16 20:28:48 +02:00
parent 3912bcdaa9
commit 541343d2ed
8 changed files with 117 additions and 45 deletions

View File

@ -33,6 +33,7 @@ from django.forms import models as model_forms
from django import forms
from django import template
from django.utils.safestring import mark_safe
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _
from django.forms.widgets import MediaDefiningClass
from django.contrib.auth.models import Group
@ -102,6 +103,23 @@ class Page(models.Model):
if not self.order:
max_order = Page.objects.all().aggregate(Max('order')).get('order__max') or 0
self.order = max_order + 1
if not self.slug:
if Page.objects.count() == 0:
slug = 'index'
else:
base_slug = slugify(self.title)[:40]
slug = base_slug
i = 1
while True:
try:
Page.objects.get(slug=slug)
except ObjectDoesNotExist:
break
i += 1
slug = '%s-%s' % (base_slug, i)
self.slug = slug
if not self.template_name:
self.template_name = settings.COMBO_DEFAULT_PUBLIC_TEMPLATE
return super(Page, self).save(*args, **kwargs)
def get_parents_and_self(self):

View File

@ -22,13 +22,40 @@ from django.utils.translation import ugettext_lazy as _
from combo.data.models import Page
class PageForm(forms.ModelForm):
class PageEditTitleForm(forms.ModelForm):
class Meta:
model = Page
fields = ('title', 'slug', 'template_name')
fields = ('title',)
class PageEditSlugForm(forms.ModelForm):
class Meta:
model = Page
fields = ('slug',)
def clean_slug(self):
value = self.cleaned_data.get('slug')
if self.instance.slug == value:
return value
if Page.objects.filter(slug=value).count() > 0:
raise ValidationError(_('Slug must be unique'), code='unique')
return value
class PageVisibilityForm(forms.ModelForm):
class Meta:
model = Page
fields = ('public', 'groups')
class PageSelectTemplateForm(forms.ModelForm):
class Meta:
model = Page
fields = ('template_name',)
def __init__(self, *args, **kwargs):
super(PageForm, self).__init__(*args, **kwargs)
super(PageSelectTemplateForm, self).__init__(*args, **kwargs)
templates = [(x[0], x[1]['name']) for x in settings.COMBO_PUBLIC_TEMPLATES.items()]
templates = [x for x in templates if self.template_exists(x[0])]
templates.sort(lambda x, y: cmp(x[1], y[1]))
@ -42,32 +69,6 @@ class PageForm(forms.ModelForm):
return False
return True
def clean_slug(self):
value = self.cleaned_data.get('slug')
if self.instance.slug == value:
return value
if Page.objects.filter(slug=value).count() > 0:
raise ValidationError(_('Slug must be unique'), code='unique')
return value
class PageEditForm(PageForm):
class Meta:
model = Page
fields = ('title', 'slug')
class PageVisibilityForm(forms.ModelForm):
class Meta:
model = Page
fields = ('public', 'groups')
class PageSelectTemplateForm(PageForm):
class Meta:
model = Page
fields = ('template_name',)
class PageEditRedirectionForm(forms.ModelForm):
class Meta:

View File

@ -17,7 +17,7 @@
<div class="buttons">
<button>{% trans "Save" %}</button>
{% if object.id %}
<a class="cancel" href="{{ object.get_absolute_url }}">{% trans 'Cancel' %}</a>
<a class="cancel" href="{% url 'combo-manager-page-view' pk=object.id %}">{% trans 'Cancel' %}</a>
{% else %}
<a class="cancel" href="{% url 'combo-manager-homepage' %}">{% trans 'Cancel' %}</a>
{% endif %}

View File

@ -5,7 +5,6 @@
{% block appbar %}
<h2>{% trans 'Page' %} - {{ object.title }}</h2>
<a href="{% url 'combo-manager-page-export' pk=object.id %}">{% trans 'export' %}</a>
<a rel="popup" href="{% url 'combo-manager-page-edit' pk=object.id %}">{% trans 'edit' %}</a>
<a rel="popup" href="{% url 'combo-manager-page-delete' pk=object.id %}">{% trans 'delete' %}</a>
{% endblock %}
@ -26,6 +25,18 @@
<div class="page-options">
<h2>{% trans 'Parameters' %}</h2>
<p>
<label>{% trans 'Title:' %}</label>
{{object.title}}
(<a rel="popup" href="{% url 'combo-manager-page-edit-title' pk=object.id %}">{% trans 'change' %}</a>)
</p>
<p>
<label>{% trans 'Slug:' %}</label>
<tt>{{ object.slug }}</tt>
(<a rel="popup" href="{% url 'combo-manager-page-edit-slug' pk=object.id %}">{% trans 'change' %}</a>)
</p>
<p>
<label>{% trans 'Template:' %}</label>
{{ object.get_template_display_name }}

View File

@ -27,14 +27,16 @@ urlpatterns = patterns('combo.views',
url(r'^pages/add/$', views.page_add, name='combo-manager-page-add'),
url(r'^pages/(?P<pk>\w+)/$', views.page_view,
name='combo-manager-page-view'),
url(r'^pages/(?P<pk>\w+)/edit$', views.page_edit,
name='combo-manager-page-edit'),
url(r'^pages/(?P<pk>\w+)/template$', views.page_select_template,
name='combo-manager-page-select-template'),
url(r'^pages/(?P<pk>\w+)/visibility$', views.page_visibility,
name='combo-manager-page-visibility'),
url(r'^pages/(?P<pk>\w+)/redirection$', views.page_edit_redirection,
name='combo-manager-page-edit-redirection'),
url(r'^pages/(?P<pk>\w+)/slug$', views.page_edit_slug,
name='combo-manager-page-edit-slug'),
url(r'^pages/(?P<pk>\w+)/title$', views.page_edit_title,
name='combo-manager-page-edit-title'),
url(r'^pages/(?P<pk>\w+)/delete$', views.page_delete,
name='combo-manager-page-delete'),
url(r'^pages/(?P<pk>\w+)/export$', views.page_export,

View File

@ -35,8 +35,8 @@ from combo.data.models import Page, CellBase, UnlockMarkerCell
from combo.data.library import get_cell_class
from combo import plugins
from .forms import (PageForm, PageEditForm, PageVisibilityForm, SiteImportForm,
PageEditRedirectionForm, PageSelectTemplateForm)
from .forms import (PageEditTitleForm, PageVisibilityForm, SiteImportForm,
PageEditRedirectionForm, PageSelectTemplateForm, PageEditSlugForm)
class HomepageView(ListView):
@ -80,14 +80,12 @@ site_import = SiteImportView.as_view()
class PageAddView(CreateView):
model = Page
template_name = 'combo/page_add.html'
form_class = PageForm
form_class = PageEditTitleForm
def get_initial(self):
initial = super(PageAddView, self).get_initial()
if Page.objects.count() == 0:
# first page
if Page.objects.count() == 0: # first page
initial['title'] = _('Home')
initial['slug'] = 'index'
return initial
def get_success_url(self):
@ -99,13 +97,10 @@ page_add = PageAddView.as_view()
class PageEditView(UpdateView):
model = Page
template_name = 'combo/page_add.html'
form_class = PageEditForm
def get_success_url(self):
return reverse('combo-manager-page-view', kwargs={'pk': self.object.id})
page_edit = PageEditView.as_view()
class PageSelectTemplateView(PageEditView):
form_class = PageSelectTemplateForm
@ -119,6 +114,18 @@ class PageEditRedirectionView(PageEditView):
page_edit_redirection = PageEditRedirectionView.as_view()
class PageEditSlugView(PageEditView):
form_class = PageEditSlugForm
page_edit_slug = PageEditSlugView.as_view()
class PageEditTitleView(PageEditView):
form_class = PageEditTitleForm
page_edit_title = PageEditTitleView.as_view()
class PageVisibilityView(PageEditView):
form_class = PageVisibilityForm

View File

@ -146,6 +146,7 @@ CKEDITOR_CONFIGS = {
},
}
COMBO_DEFAULT_PUBLIC_TEMPLATE = 'standard'
COMBO_PUBLIC_TEMPLATES = {
'standard': {
'name': _('One column'),

View File

@ -45,9 +45,10 @@ def test_add_page(app, admin_user):
resp = app.get('/manage/', status=200)
resp = resp.click('New')
assert resp.forms[0]['title'].value == 'Home' # default title for first page
assert resp.forms[0]['slug'].value == 'index' # default slug for first page
resp = resp.forms[0].submit()
assert resp.location == 'http://localhost:80/manage/pages/1/'
assert Page.objects.get(slug='index').title == 'Home'
assert Page.objects.get(slug='index').template_name == 'standard' # first one was taken
def test_add_second_page(app, admin_user):
Page.objects.all().delete()
@ -56,9 +57,40 @@ def test_add_second_page(app, admin_user):
app = login(app)
resp = app.get('/manage/', status=200)
resp = resp.click('New')
# assert there's no defaul title or slug for the second page
# assert there's no defaul title for the second page
assert resp.forms[0]['title'].value == ''
assert resp.forms[0]['slug'].value == ''
resp.forms[0]['title'].value = 'Foobar'
resp = resp.forms[0].submit()
assert Page.objects.get(slug='foobar').title == 'Foobar'
def test_edit_page(app, admin_user):
Page.objects.all().delete()
app = login(app)
resp = app.get('/manage/', status=200)
resp = resp.click('New')
resp = resp.forms[0].submit()
resp = resp.follow()
# title
resp = resp.click(href='.*/title')
resp.form['title'].value = 'Home 2'
resp = resp.form.submit()
resp = resp.follow()
assert Page.objects.all()[0].title == 'Home 2'
# slug
resp = resp.click(href='.*/slug')
resp.form['slug'].value = 'foobar'
resp = resp.form.submit()
resp = resp.follow()
assert Page.objects.all()[0].slug == 'foobar'
# template name
resp = resp.click(href='.*/template')
assert resp.form['template_name'].value == 'standard'
assert len(resp.form['template_name'].options) == 2 # by default there are 2 templates
resp.form['template_name'].value = 'standard-sidebar'
resp = resp.form.submit()
resp = resp.follow()
assert Page.objects.all()[0].template_name == 'standard-sidebar'
assert resp.click(href='.*/template').form['template_name'].value == 'standard-sidebar'
def test_delete_page(app, admin_user):
Page.objects.all().delete()