manager: move title and slug to their own edit dialogs (#10940)
This commit is contained in:
parent
3912bcdaa9
commit
541343d2ed
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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 }}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -146,6 +146,7 @@ CKEDITOR_CONFIGS = {
|
|||
},
|
||||
}
|
||||
|
||||
COMBO_DEFAULT_PUBLIC_TEMPLATE = 'standard'
|
||||
COMBO_PUBLIC_TEMPLATES = {
|
||||
'standard': {
|
||||
'name': _('One column'),
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue