Projet

Général

Profil

0001-page-new-pages-are-excluded-from-navigation-by-defau.patch

Lauréline Guérin, 31 janvier 2020 10:12

Télécharger (14,4 ko)

Voir les différences:

Subject: [PATCH] page: new pages are excluded from navigation by default
 (#17659)

 .../migrations/0041_auto_20200130_1619.py     | 19 +++++++++
 combo/data/models.py                          |  4 +-
 combo/manager/forms.py                        | 22 +++++++++-
 combo/manager/templates/combo/page_view.html  |  6 +--
 combo/manager/urls.py                         |  4 +-
 combo/manager/views.py                        | 15 ++++---
 tests/test_calendar.py                        |  2 +-
 tests/test_cells.py                           | 20 +++++-----
 tests/test_manager.py                         | 40 +++++++++++++++----
 tests/test_public.py                          | 15 +++----
 10 files changed, 106 insertions(+), 41 deletions(-)
 create mode 100644 combo/data/migrations/0041_auto_20200130_1619.py
combo/data/migrations/0041_auto_20200130_1619.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('data', '0040_auto_20200119_1017'),
11
    ]
12

  
13
    operations = [
14
        migrations.AlterField(
15
            model_name='page',
16
            name='exclude_from_navigation',
17
            field=models.BooleanField(default=True, verbose_name='Exclude from navigation'),
18
        ),
19
    ]
combo/data/models.py
134 134
    template_name = models.CharField(_('Template'), max_length=50)
135 135
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
136 136
    order = models.PositiveIntegerField()
137
    exclude_from_navigation = models.BooleanField(_('Exclude from navigation'), default=False)
137
    exclude_from_navigation = models.BooleanField(_('Exclude from navigation'), default=True)
138 138
    redirect_url = models.CharField(_('Redirect URL'), max_length=200, blank=True)
139 139

  
140 140
    public = models.BooleanField(_('Public'), default=True)
......
445 445
        new_page.snapshot = None
446 446
        # set order
447 447
        new_page.order = self.order + 1
448
        # exclude from navigation
449
        new_page.exclude_from_navigation = True
448 450
        # store new page
449 451
        new_page.save()
450 452

  
combo/manager/forms.py
49 49
            raise ValidationError(_('Slug must be unique'), code='unique')
50 50
        return value
51 51

  
52

  
52 53
class PageEditDescriptionForm(forms.ModelForm):
53 54
    class Meta:
54 55
        model = Page
......
107 108
        return page
108 109

  
109 110

  
110
class PageEditExcludeFromNavigationForm(forms.ModelForm):
111
class PageEditIncludeInNavigationForm(forms.ModelForm):
112
    include_in_navigation = forms.BooleanField(
113
        label=_('Include in navigation menus'),
114
        required=False
115
    )
116

  
111 117
    class Meta:
112 118
        model = Page
113
        fields = ('exclude_from_navigation',)
119
        fields = []
120

  
121
    def __init__(self, *args, **kwargs):
122
        instance = kwargs['instance']
123
        initial = kwargs.pop('initial', {})
124
        initial['include_in_navigation'] = not instance.exclude_from_navigation
125
        super(PageEditIncludeInNavigationForm, self).__init__(initial=initial, *args, **kwargs)
126

  
127
    def save(self, *args, **kwargs):
128
        super(PageEditIncludeInNavigationForm, self).save(*args, **kwargs)
129
        self.instance.exclude_from_navigation = not self.cleaned_data['include_in_navigation']
130
        self.instance.save()
131
        return self.instance
114 132

  
115 133

  
116 134
class CellVisibilityForm(forms.Form):
combo/manager/templates/combo/page_view.html
61 61
</p>
62 62

  
63 63
<p>
64
<label>{% trans 'Exclude from navigation:' %}</label>
65
{% if object.exclude_from_navigation %}{% trans 'yes' %}{% else %}{% trans 'no' %}{% endif %}
66
(<a rel="popup" href="{% url 'combo-manager-page-edit-exclude-from-navigation' pk=object.id %}">{% trans 'change' %}</a>)
64
<label>{% trans 'Include in navigation menus:' %}</label>
65
{% if object.exclude_from_navigation %}{% trans 'no' %}{% else %}{% trans 'yes' %}{% endif %}
66
(<a rel="popup" href="{% url 'combo-manager-page-edit-include-in-navigation' pk=object.id %}">{% trans 'change' %}</a>)
67 67
</p>
68 68

  
69 69
<p>
combo/manager/urls.py
37 37
            name='combo-manager-page-visibility'),
38 38
        url(r'^pages/(?P<pk>\d+)/redirection$', views.page_edit_redirection,
39 39
            name='combo-manager-page-edit-redirection'),
40
        url(r'^pages/(?P<pk>\d+)/exclude-from-navigation$', views.page_edit_exclude_from_navigation,
41
            name='combo-manager-page-edit-exclude-from-navigation'),
40
        url(r'^pages/(?P<pk>\d+)/include-in-navigation$', views.page_edit_include_in_navigation,
41
            name='combo-manager-page-edit-include-in-navigation'),
42 42
        url(r'^pages/(?P<pk>\d+)/slug$', views.page_edit_slug,
43 43
            name='combo-manager-page-edit-slug'),
44 44
        url(r'^pages/(?P<pk>\d+)/title$', views.page_edit_title,
combo/manager/views.py
40 40

  
41 41
from .forms import (PageEditTitleForm, PageVisibilityForm, SiteImportForm,
42 42
        PageEditRedirectionForm, PageSelectTemplateForm, PageEditSlugForm,
43
        PageEditPictureForm, PageEditExcludeFromNavigationForm,
43
        PageEditPictureForm, PageEditIncludeInNavigationForm,
44 44
        PageEditDescriptionForm, CellVisibilityForm)
45 45

  
46 46

  
......
186 186
page_edit_redirection = PageEditRedirectionView.as_view()
187 187

  
188 188

  
189
class PageEditExcludeFromNavigationView(PageEditView):
190
    form_class = PageEditExcludeFromNavigationForm
191
    comment = _('changed navigation exclusion')
189
class PageEditIncludeInNavigationView(PageEditView):
190
    form_class = PageEditIncludeInNavigationForm
191
    comment = _('changed navigation inclusion')
192 192

  
193
page_edit_exclude_from_navigation = PageEditExcludeFromNavigationView.as_view()
193
page_edit_include_in_navigation = PageEditIncludeInNavigationView.as_view()
194 194

  
195 195

  
196 196
class PageEditSlugView(PageEditView):
......
361 361
    def get_redirect_url(self, pk):
362 362
        page = Page.objects.get(pk=pk)
363 363
        new_page = page.duplicate()
364
        messages.info(self.request, _('Page %s has been duplicated.') % page.title)
364
        if not page.exclude_from_navigation:
365
            messages.info(self.request, _('Page %s has been duplicated, it has been marked as excluded from navigation.') % page.title)
366
        else:
367
            messages.info(self.request, _('Page %s has been duplicated.') % page.title)
365 368
        return reverse('combo-manager-page-view', kwargs={'pk': new_page.pk})
366 369

  
367 370

  
tests/test_calendar.py
173 173

  
174 174
@pytest.fixture
175 175
def cell(db):
176
    page = Page.objects.create(title='whatever', slug='booking', template_name='standard')
176
    page = Page.objects.create(title='whatever', slug='booking', template_name='standard', exclude_from_navigation=False)
177 177
    cell = BookingCalendar(
178 178
        page=page, title='Example Of Calendar',
179 179
        agenda_reference='default:test',
tests/test_cells.py
167 167

  
168 168
def test_menu_cell():
169 169
    Page.objects.all().delete()
170
    parent = page = Page(title='Page1', slug='page1', template_name='standard')
171
    page.save()
172
    page = Page(title='Page2', slug='page2', template_name='standard',
173
            parent=parent)
174
    page.save()
175
    page = Page(title='Page3', slug='page3', template_name='standard',
176
            parent=parent, public=False)
177
    page.save()
178
    cell = MenuCell(root_page=parent, order=0, page=parent)
179
    cell.save()
170
    parent = Page.objects.create(
171
        title='Page1', slug='page1', template_name='standard',
172
        exclude_from_navigation=False)
173
    page = Page.objects.create(
174
        title='Page2', slug='page2', template_name='standard',
175
        parent=parent, exclude_from_navigation=False)
176
    page = Page.objects.create(
177
        title='Page3', slug='page3', template_name='standard',
178
        parent=parent, public=False, exclude_from_navigation=False)
179
    cell = MenuCell.objects.create(root_page=parent, order=0, page=parent)
180 180
    request = RequestFactory().get('/page1/')
181 181
    request.user = None
182 182
    ctx = {'page': parent, 'request': request}
tests/test_manager.py
50 50
    assert 'Pages' in resp.text
51 51
    assert "This site doesn't have any page yet." in resp.text
52 52

  
53

  
53 54
def test_add_page(app, admin_user):
54 55
    app = login(app)
55 56
    resp = app.get('/manage/', status=200)
56 57
    resp = resp.click('New')
57
    assert resp.forms[0]['title'].value == 'Home' # default title for first page
58
    assert resp.forms[0]['title'].value == 'Home'  # default title for first page
58 59
    resp = resp.forms[0].submit()
59
    assert resp.location.endswith('/manage/pages/1/')
60
    assert Page.objects.get(slug='index').title == 'Home'
61
    assert Page.objects.get(slug='index').template_name == 'standard' # first one was taken
60
    page = Page.objects.latest('pk')
61
    assert resp.location.endswith('/manage/pages/%s/' % page.pk)
62
    assert page.slug == 'index'
63
    assert page.title == 'Home'
64
    assert page.template_name == 'standard'  # first one was taken
65
    assert page.exclude_from_navigation is True
66

  
62 67

  
63 68
def test_add_second_page(app, admin_user):
64 69
    Page.objects.all().delete()
......
133 138
    assert 'http://www.example.net' in resp.text
134 139
    assert Page.objects.all()[0].redirect_url == 'http://www.example.net'
135 140
    # exclude from nav
136
    resp = resp.click(href='.*/exclude-from-navigation')
137
    resp.form['exclude_from_navigation'].checked = True
141
    resp = resp.click(href='.*/include-in-navigation')
142
    resp.form['include_in_navigation'].checked = False
138 143
    resp = resp.form.submit()
139 144
    resp = resp.follow()
140 145
    assert Page.objects.all()[0].exclude_from_navigation is True
146
    # include from nav
147
    resp = resp.click(href='.*/include-in-navigation')
148
    resp.form['include_in_navigation'].checked = True
149
    resp = resp.form.submit()
150
    resp = resp.follow()
151
    assert Page.objects.all()[0].exclude_from_navigation is False
141 152

  
142 153

  
143 154
def test_edit_page_optional_placeholder(app, admin_user):
......
514 525
    resp = resp.form.submit()
515 526
    assert 'Missing groups: foobar' in resp.text
516 527

  
528

  
517 529
def test_duplicate_page(app, admin_user):
518
    page = Page.objects.create(title='One', slug='one', template_name='standard')
530
    page = Page.objects.create(title='One', slug='one', template_name='standard', exclude_from_navigation=False)
519 531
    TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0)
520 532

  
521 533
    app = login(app)
......
524 536
    new_page = Page.objects.latest('pk')
525 537
    assert resp.status_int == 302
526 538
    assert resp.location.endswith('/manage/pages/%s/' % new_page.pk)
539
    resp = resp.follow()
540
    assert 'Page %s has been duplicated, it has been marked as excluded from navigation.' % page.title in resp.text
541
    assert new_page.exclude_from_navigation is True
542

  
543
    page.exclude_from_navigation = True
544
    page.save()
545
    resp = app.get('/manage/pages/%s/' % page.pk)
546
    resp = resp.click('Duplicate')
547
    new_page = Page.objects.latest('pk')
548
    assert resp.status_int == 302
549
    assert resp.location.endswith('/manage/pages/%s/' % new_page.pk)
550
    resp = resp.follow()
551
    assert 'Page %s has been duplicated.' % page.title in resp.text
552
    assert new_page.exclude_from_navigation is True
527 553

  
528 554

  
529 555
def test_add_edit_cell(app, admin_user):
tests/test_public.py
320 320
    resp = app.get('/__skeleton__/?source=%s' % quote('http://example.net/badredir'))
321 321

  
322 322
    # add a page with restricted visibility
323
    page = Page(title='RestrictedVisibility', slug='restrictedvisibilit',
324
            template_name='standard', public=False)
325
    page.save()
323
    page = Page.objects.create(
324
        title='RestrictedVisibility', slug='restrictedvisibilit',
325
        template_name='standard', public=False, exclude_from_navigation=False)
326 326
    resp = app.get('/__skeleton__/?source=%s' % quote('http://127.0.0.1:8999/'))
327 327
    assert 'RestrictedVisibility' in resp.text
328 328

  
......
406 406

  
407 407
def test_menu(app):
408 408
    Page.objects.all().delete()
409
    page = Page(title='Page1', slug='index', template_name='standard')
410
    page.save()
411
    page = Page(title='Page2', slug='page2', template_name='standard')
412
    page.save()
413
    page = Page(title='Page3', slug='page3', template_name='standard', public=False)
414
    page.save()
409
    Page.objects.create(title='Page1', slug='index', template_name='standard', exclude_from_navigation=False)
410
    Page.objects.create(title='Page2', slug='page2', template_name='standard', exclude_from_navigation=False)
411
    Page.objects.create(title='Page3', slug='page3', template_name='standard', public=False, exclude_from_navigation=False)
415 412
    resp = app.get('/', status=200)
416 413
    assert 'menu-index' in resp.text
417 414
    assert 'menu-page2' in resp.text
418
-