0003-manager-create-page-from-model-10117.patch
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 or settings.COMBO_PUBLIC_TEMPLATES_ROOT_PAGE is None: |
|
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 | ||
192 |
settings.COMBO_PUBLIC_TEMPLATES_ROOT_PAGE = None |
|
193 |
form = PageAddForm(request=request) |
|
194 |
assert form.fields['template_name'].widget.choices == [('two', 'AAA'), ('one', 'BBB')] |
|
195 | ||
139 | 196 | |
140 | 197 |
def test_edit_page(app, admin_user): |
141 | 198 |
Page.objects.all().delete() |
... | ... | |
209 | 266 |
}, |
210 | 267 |
} |
211 | 268 |
settings.COMBO_DEFAULT_PUBLIC_TEMPLATE = 'one' |
269 |
# model pages ignored |
|
270 |
model_root_page = Page.objects.create(slug='modeles') |
|
271 |
Page.objects.create(slug='model-a', title='Model A', parent=model_root_page) |
|
272 | ||
212 | 273 |
form = PageSelectTemplateForm(instance=page) |
213 | 274 |
assert form.fields['template_name'].widget.choices == [('two', 'AAA'), ('one', 'BBB')] |
214 | 275 |
assert form['template_name'].initial == 'two' |
215 |
- |