Projet

Général

Profil

0003-manager-create-page-from-model-10117.patch

Lauréline Guérin, 27 août 2020 15:31

Télécharger (11,3 ko)

Voir les différences:

Subject: [PATCH 3/3] manager: create page from model (#10117)

 combo/data/models.py   |  6 ++++-
 combo/manager/forms.py | 46 ++++++++++++++++++++++++++++++--
 combo/manager/views.py | 34 +++++++++---------------
 combo/settings.py      |  1 +
 tests/test_manager.py  | 59 +++++++++++++++++++++++++++++++++++++++++-
 5 files changed, 120 insertions(+), 26 deletions(-)
combo/data/models.py
470 470
    def is_new(self):
471 471
        return self.creation_timestamp > timezone.now() - datetime.timedelta(days=7)
472 472

  
473
    def duplicate(self, title=None):
473
    def duplicate(self, title=None, parent=False):
474 474
        # clone current page
475 475
        new_page = copy.deepcopy(self)
476 476
        new_page.pk = None
......
484 484
        new_page.order = self.order + 1
485 485
        # exclude from navigation
486 486
        new_page.exclude_from_navigation = True
487
        # set parent
488
        if parent is not False:
489
            # it can be None
490
            new_page.parent = parent
487 491
        # store new page
488 492
        new_page.save()
489 493

  
combo/manager/forms.py
22 22
from django.utils.translation import ugettext_lazy as _
23 23

  
24 24
from combo.data.models import Page
25
from combo.data.models import ParentContentCell
25 26

  
26 27
from .fields import ImageIncludingSvgField
27 28

  
......
30 31
    return [(x.id, x.name) for x in Group.objects.all().order_by('name')]
31 32

  
32 33

  
33
def get_template_name_choices():
34
def get_template_name_choices(with_models=False):
34 35
    def template_exists(template):
35 36
        try:
36 37
            get_template(settings.COMBO_PUBLIC_TEMPLATES[template].get('template'))
......
41 42
    templates = [(x[0], x[1]['name']) for x in settings.COMBO_PUBLIC_TEMPLATES.items()]
42 43
    templates = [x for x in templates if template_exists(x[0])]
43 44
    templates.sort(key=lambda x: x[1])
45

  
46
    if not with_models:
47
        return templates
48

  
49
    try:
50
        model_root_page = Page.objects.get(slug=settings.COMBO_PUBLIC_TEMPLATES_ROOT_PAGE)
51
    except Page.DoesNotExist:
52
        return templates
53

  
54
    templates.extend([('model_%s' % p.slug, p.title) for p in model_root_page.get_descendants()])
55
    templates.sort(key=lambda x: x[1])
44 56
    return templates
45 57

  
46 58

  
......
58 70
        fields = ('title', 'template_name')
59 71

  
60 72
    def __init__(self, *args, **kwargs):
73
        self.request = kwargs.pop('request')
74
        self.parent = kwargs.pop('parent', None)
61 75
        super().__init__(*args, **kwargs)
62
        self.fields['template_name'].widget = forms.Select(choices=get_template_name_choices())
76
        self.fields['template_name'].widget = forms.Select(choices=get_template_name_choices(with_models=True))
63 77
        self.fields['template_name'].initial = settings.COMBO_DEFAULT_PUBLIC_TEMPLATE
64 78

  
79
    def save(self, *args, **kwargs):
80
        template_name = self.cleaned_data['template_name']
81
        if template_name.startswith('model_'):
82
            try:
83
                model_page = Page.objects.get(slug=template_name[6:])
84
            except Page.DoesNotExist:
85
                pass
86
            else:
87
                # model page, create page by duplication
88
                self.instance = model_page.duplicate(title=self.cleaned_data['title'], parent=self.parent)
89

  
90
        if self.instance.pk is None:
91
            # not a model page, create page from form
92
            self.instance = super().save(commit=False, *args, **kwargs)
93
            self.instance.parent = self.parent
94
            self.instance.save()
95

  
96
            if self.instance.slug != 'index' or self.parent:
97
                for placeholder in self.instance.get_placeholders(request=self.request):
98
                    if not placeholder.acquired:
99
                        continue
100
                    ParentContentCell.objects.create(
101
                        page=self.instance,
102
                        placeholder=placeholder.key,
103
                        order=0)
104

  
105
        return self.instance
106

  
65 107

  
66 108
class PageEditTitleForm(forms.ModelForm):
67 109
    class Meta:
combo/manager/views.py
123 123
    template_name = 'combo/page_add.html'
124 124
    form_class = PageAddForm
125 125

  
126
    def get_form_kwargs(self):
127
        kwargs = super().get_form_kwargs()
128
        kwargs['request'] = self.request
129
        return kwargs
130

  
126 131
    def get_initial(self):
127 132
        initial = super(PageAddView, self).get_initial()
128
        if not Page.objects.exists(): # first page
133
        if not Page.objects.exists():  # first page
129 134
            initial['title'] = _('Home')
130 135
        return initial
131 136

  
132
    def form_valid(self, form):
133
        response = super(PageAddView, self).form_valid(form)
134
        if self.object.slug != 'index' or self.object.parent_id:
135
            for placeholder in self.object.get_placeholders(request=self.request):
136
                if placeholder.acquired is True:
137
                    ParentContentCell(page=self.object,
138
                            placeholder=placeholder.key, order=0).save()
139

  
140
        return response
141

  
142 137
    def get_success_url(self):
143 138
        return reverse('combo-manager-page-view', kwargs={'pk': self.object.id})
144 139

  
......
147 142

  
148 143

  
149 144
class PageAddChildView(PageAddView):
145
    def get_form_kwargs(self):
146
        kwargs = super().get_form_kwargs()
147
        kwargs['parent'] = get_object_or_404(Page, pk=self.kwargs['pk'])
148
        return kwargs
149

  
150 150
    def get_initial(self):
151
        # it can not be the first page, so don't try to initial the title
151
        # it can not be the first page, so don't try to initialize the title
152 152
        return super(CreateView, self).get_initial()
153 153

  
154
    def dispatch(self, request, *args, **kwargs):
155
        self.parent = get_object_or_404(Page, pk=kwargs['pk'])
156
        return super(PageAddChildView, self).dispatch(request, *args, **kwargs)
157

  
158
    def form_valid(self, form):
159
        response = super(PageAddChildView, self).form_valid(form)
160
        self.object.parent = self.parent
161
        self.object.save()
162
        return response
163

  
164 154

  
165 155
page_add_child = PageAddChildView.as_view()
166 156

  
combo/settings.py
218 218
        '_': (_('Top banner'), _('Middle column')),
219 219
    },
220 220
}
221
COMBO_PUBLIC_TEMPLATES_ROOT_PAGE = 'modeles'
221 222

  
222 223
# extra variables for templates
223 224
TEMPLATE_VARS = {}
tests/test_manager.py
84 84
    assert page.template_name == 'standard'  # default template
85 85
    assert page.exclude_from_navigation is True
86 86

  
87
    model_root_page = Page.objects.create(slug='modeles', title='Models')
88
    model_a = Page.objects.create(slug='model-a', title='Model A', template_name='two-columns', parent=model_root_page)
89
    TextCell.objects.create(page=model_a, placeholder='content', text='Foobar', order=1)
90

  
91
    resp = app.get('/manage/pages/add/')
92
    resp.forms[0]['title'].value = 'Page A'
93
    resp.forms[0]['template_name'].value = 'model_model-a'
94
    resp = resp.forms[0].submit()
95
    new_page = Page.objects.latest('pk')
96
    assert resp.location.endswith('/manage/pages/%s/' % new_page.pk)
97
    assert new_page.slug == 'page-a'
98
    assert new_page.title == 'Page A'
99
    assert new_page.template_name == 'two-columns'
100
    assert new_page.parent is None
101
    assert TextCell.objects.filter(page=new_page).count() == 1
102
    assert ParentContentCell.objects.filter(page=new_page).count() == 0
103

  
87 104

  
88 105
def test_add_second_page(app, admin_user):
89 106
    Page.objects.all().delete()
......
115 132
    app.get('/manage/pages/%s/add/' % child.pk, status=200)
116 133
    app.get('/manage/pages/42/add/', status=404)
117 134

  
135
    model_root_page = Page.objects.create(slug='modeles', title='Models')
136
    model_a = Page.objects.create(slug='model-a', title='Model A', template_name='two-columns', parent=model_root_page)
137
    TextCell.objects.create(page=model_a, placeholder='content', text='Foobar', order=1)
138

  
139
    resp = app.get('/manage/pages/%s/add/' % page.pk)
140
    resp.forms[0]['title'].value = 'Page A'
141
    resp.forms[0]['template_name'].value = 'model_model-a'
142
    resp = resp.forms[0].submit()
143
    new_page = Page.objects.latest('pk')
144
    assert resp.location.endswith('/manage/pages/%s/' % new_page.pk)
145
    assert new_page.slug == 'page-a'
146
    assert new_page.title == 'Page A'
147
    assert new_page.template_name == 'two-columns'
148
    assert new_page.parent == page
149
    assert TextCell.objects.filter(page=new_page).count() == 1
150
    assert ParentContentCell.objects.filter(page=new_page).count() == 0
151

  
118 152

  
119 153
def test_page_add_forms(settings):
120 154
    settings.COMBO_PUBLIC_TEMPLATES = {
......
132 166
        },
133 167
    }
134 168
    settings.COMBO_DEFAULT_PUBLIC_TEMPLATE = 'one'
135
    form = PageAddForm()
169
    request = RequestFactory().get('/')
170
    form = PageAddForm(request=request)
136 171
    assert form.fields['template_name'].widget.choices == [('two', 'AAA'), ('one', 'BBB')]
137 172
    assert form['template_name'].initial == 'one'
138 173

  
174
    model_root_page = Page.objects.create(slug='modeles', title='Models')
175
    form = PageAddForm(request=request)
176
    assert form.fields['template_name'].widget.choices == [('two', 'AAA'), ('one', 'BBB')]
177
    model_a = Page.objects.create(slug='model-a', title='Model A', parent=model_root_page)
178
    Page.objects.create(slug='model-aa', title='Model AA', parent=model_a)
179
    Page.objects.create(slug='model-b', title='Model B', parent=model_root_page)
180
    normal_page = Page.objects.create(slug='models', title='Wrong Models')
181
    Page.objects.create(slug='model-c', title='Not a model (wrong parent)')
182
    Page.objects.create(slug='model-d', title='Again not a model (wrong parent)', parent=normal_page)
183
    form = PageAddForm(request=request)
184
    assert form.fields['template_name'].widget.choices == [
185
        ('two', 'AAA'),
186
        ('one', 'BBB'),
187
        ('model_model-a', 'Model A'),
188
        ('model_model-aa', 'Model AA'),
189
        ('model_model-b', 'Model B')
190
    ]
191

  
139 192

  
140 193
def test_edit_page(app, admin_user):
141 194
    Page.objects.all().delete()
......
209 262
        },
210 263
    }
211 264
    settings.COMBO_DEFAULT_PUBLIC_TEMPLATE = 'one'
265
    # model pages ignored
266
    model_root_page = Page.objects.create(slug='modeles')
267
    Page.objects.create(slug='model-a', title='Model A', parent=model_root_page)
268

  
212 269
    form = PageSelectTemplateForm(instance=page)
213 270
    assert form.fields['template_name'].widget.choices == [('two', 'AAA'), ('one', 'BBB')]
214 271
    assert form['template_name'].initial == 'two'
215
-