0003-rename-parameters-to-extra-variables.patch
combo/data/migrations/0053_page_parameters.py → combo/data/migrations/0053_page_variables.py | ||
---|---|---|
11 | 11 |
operations = [ |
12 | 12 |
migrations.AddField( |
13 | 13 |
model_name='page', |
14 |
name='parameters',
|
|
14 |
name='extra_variables',
|
|
15 | 15 |
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), |
16 | 16 |
), |
17 | 17 |
] |
combo/data/models.py | ||
---|---|---|
194 | 194 |
order = models.PositiveIntegerField() |
195 | 195 |
exclude_from_navigation = models.BooleanField(_('Exclude from navigation'), default=True) |
196 | 196 |
redirect_url = models.CharField(_('Redirect URL'), max_length=200, blank=True) |
197 |
parameters = JSONField(blank=True, default=dict)
|
|
197 |
extra_variables = JSONField(blank=True, default=dict)
|
|
198 | 198 | |
199 | 199 |
public = models.BooleanField(_('Public'), default=True) |
200 | 200 |
groups = models.ManyToManyField(Group, verbose_name=_('Groups'), blank=True) |
... | ... | |
642 | 642 |
def get_last_update_time(self): |
643 | 643 |
return self.last_update_timestamp |
644 | 644 | |
645 |
def get_parameters(self, request, original_context):
|
|
645 |
def get_extra_variables(self, request, original_context):
|
|
646 | 646 |
result = {} |
647 | 647 |
context = RequestContext(request) |
648 | 648 |
context.push(original_context) |
649 |
for key, tplt in (self.parameters or {}).items():
|
|
649 |
for key, tplt in (self.extra_variables or {}).items():
|
|
650 | 650 |
try: |
651 | 651 |
template = Template(tplt) |
652 | 652 |
except TemplateSyntaxError: |
... | ... | |
654 | 654 |
result[key] = template.render(context) |
655 | 655 |
return result |
656 | 656 | |
657 |
def get_parameters_keys(self):
|
|
658 |
return sorted((self.parameters or {}).keys())
|
|
657 |
def get_extra_variables_keys(self):
|
|
658 |
return sorted((self.extra_variables or {}).keys())
|
|
659 | 659 | |
660 | 660 |
def is_new(self): |
661 | 661 |
return self.creation_timestamp > timezone.now() - datetime.timedelta(days=7) |
combo/manager/forms.py | ||
---|---|---|
169 | 169 |
field_classes = {'picture': ImageIncludingSvgField} |
170 | 170 | |
171 | 171 | |
172 |
class PageEditParameterForm(forms.Form):
|
|
173 |
key = forms.CharField(label=_('Property name'), required=False)
|
|
172 |
class PageEditExtraVariableForm(forms.Form):
|
|
173 |
key = forms.CharField(label=_('Variable name'), required=False)
|
|
174 | 174 |
value = forms.CharField( |
175 | 175 |
label=_('Value template'), widget=forms.TextInput(attrs={'size': 60}), required=False |
176 | 176 |
) |
177 | 177 | |
178 | 178 | |
179 |
PageEditParameterFormSet = formset_factory(PageEditParameterForm)
|
|
179 |
PageEditExtraVariablesFormSet = formset_factory(PageEditExtraVariableForm)
|
|
180 | 180 | |
181 | 181 | |
182 | 182 |
class PageVisibilityForm(forms.ModelForm): |
combo/manager/templates/combo/page_parameters.html → combo/manager/templates/combo/page_extra_variables.html | ||
---|---|---|
26 | 26 |
{% endfor %} |
27 | 27 |
</tbody> |
28 | 28 |
</table> |
29 |
<button id="add-page-property-form" type="button">{% trans "Add another property" %}</button>
|
|
29 |
<button id="add-page-property-form" type="button">{% trans "Add another" %}</button> |
|
30 | 30 |
<div class="buttons"> |
31 | 31 |
<button class="submit-button">{% trans "Save" %}</button> |
32 | 32 |
<a class="cancel" href="{% url 'combo-manager-page-view' pk=object.pk %}">{% trans 'Cancel' %}</a> |
combo/manager/templates/combo/page_view.html | ||
---|---|---|
14 | 14 |
{% if request.user.is_superuser %} |
15 | 15 |
<li><a class="action-add-child" rel="popup" href="{% url 'combo-manager-page-add-child' pk=object.id %}">{% trans 'Add a child page' %}</a></li> |
16 | 16 |
<li><a class="action-edit-roles" rel="popup" href="{% url 'combo-manager-page-edit-roles' pk=object.id %}">{% trans 'Manage edit roles' %}</a></li> |
17 |
<li><a class="action-edit-page-variables" rel="popup" href="{% url 'combo-manager-page-edit-extra-variables' pk=object.id %}">{% trans "Edit extra page variables" %}</a></li> |
|
17 | 18 |
<li><a rel="popup" class="action-duplicate" href="{% url 'combo-manager-page-duplicate' pk=object.id %}">{% trans 'Duplicate' %}</a></li> |
18 | 19 |
<li><a class="action-delete" rel="popup" href="{% url 'combo-manager-page-delete' pk=object.id %}">{% trans 'Delete' %}</a></li> |
19 | 20 |
{% endif %} |
... | ... | |
90 | 91 |
(<a rel="popup" href="{% url 'combo-manager-page-edit-picture' pk=object.id %}">{% trans 'change' %}</a>) |
91 | 92 |
</p> |
92 | 93 | |
94 |
{% if object.extra_variables %} |
|
93 | 95 |
<p> |
94 |
<label>{% trans 'Parameters:' %}</label>
|
|
95 |
{% for key in object.get_parameters_keys %}<i>{{ key }}</i>{% if not forloop.last %}, {% endif %}{% empty %}<i>{% trans 'none' context 'parameters' %}</i>{% endfor %}
|
|
96 |
(<a rel="popup" href="{% url 'combo-manager-page-edit-parameters' pk=object.id %}">{% trans 'change' %}</a>)
|
|
96 |
<label>{% trans 'Extra variables:' %}</label>
|
|
97 |
{% for key in object.get_extra_variables_keys %}<i>{{ key }}</i>{% if not forloop.last %}, {% endif %}{% endfor %}
|
|
98 |
(<a rel="popup" href="{% url 'combo-manager-page-edit-extra-variables' pk=object.id %}">{% trans 'change' %}</a>)
|
|
97 | 99 |
</p> |
100 |
{% endif %} |
|
98 | 101 | |
99 | 102 |
</div> |
100 | 103 |
combo/manager/urls.py | ||
---|---|---|
65 | 65 |
name='combo-manager-page-remove-picture', |
66 | 66 |
), |
67 | 67 |
url( |
68 |
r'^pages/(?P<pk>\d+)/parameters/$',
|
|
69 |
views.page_edit_parameters,
|
|
70 |
name='combo-manager-page-edit-parameters',
|
|
68 |
r'^pages/(?P<pk>\d+)/extra-variables/$',
|
|
69 |
views.page_edit_extra_variables,
|
|
70 |
name='combo-manager-page-edit-extra-variables',
|
|
71 | 71 |
), |
72 | 72 |
url(r'^pages/(?P<pk>\d+)/delete$', staff_required(views.page_delete), name='combo-manager-page-delete'), |
73 | 73 |
url(r'^pages/(?P<pk>\d+)/export$', views.page_export, name='combo-manager-page-export'), |
combo/manager/views.py | ||
---|---|---|
63 | 63 |
PageAddForm, |
64 | 64 |
PageDuplicateForm, |
65 | 65 |
PageEditDescriptionForm, |
66 |
PageEditExtraVariablesFormSet, |
|
66 | 67 |
PageEditIncludeInNavigationForm, |
67 |
PageEditParameterFormSet, |
|
68 | 68 |
PageEditPictureForm, |
69 | 69 |
PageEditRedirectionForm, |
70 | 70 |
PageEditRolesForm, |
... | ... | |
367 | 367 |
page_remove_picture = PageRemovePictureView.as_view() |
368 | 368 | |
369 | 369 | |
370 |
class PageEditParametersView(PageEditView):
|
|
371 |
form_class = PageEditParameterFormSet
|
|
372 |
comment = _('changed parameters')
|
|
373 |
template_name = 'combo/page_parameters.html'
|
|
374 |
page_title = _('Page properties')
|
|
370 |
class PageEditExtraVariablesView(PageEditView):
|
|
371 |
form_class = PageEditExtraVariablesFormSet
|
|
372 |
comment = _('changed extra variables')
|
|
373 |
template_name = 'combo/page_extra_variables.html'
|
|
374 |
page_title = _('Extra page variables')
|
|
375 | 375 | |
376 | 376 |
def get_initial(self): |
377 | 377 |
return sorted( |
378 |
({'key': k, 'value': v} for k, v in self.get_object().parameters.items()), key=itemgetter('key') |
|
378 |
({'key': k, 'value': v} for k, v in self.get_object().extra_variables.items()), |
|
379 |
key=itemgetter('key'), |
|
379 | 380 |
) |
380 | 381 | |
381 | 382 |
def get_form_kwargs(self): |
... | ... | |
385 | 386 | |
386 | 387 |
def form_valid(self, form): |
387 | 388 |
self.object = self.get_object() |
388 |
self.object.parameters = {}
|
|
389 |
self.object.extra_variables = {}
|
|
389 | 390 |
for sub_data in form.cleaned_data: |
390 | 391 |
if not sub_data.get('key'): |
391 | 392 |
continue |
392 |
self.object.parameters[sub_data['key']] = sub_data['value']
|
|
393 |
self.object.extra_variables[sub_data['key']] = sub_data['value']
|
|
393 | 394 |
self.object.save() |
394 | 395 |
PageSnapshot.take(self.object, request=self.request, comment=self.comment) |
395 | 396 |
return HttpResponseRedirect(self.get_success_url()) |
396 | 397 | |
397 | 398 | |
398 |
page_edit_parameters = PageEditParametersView.as_view()
|
|
399 |
page_edit_extra_variables = PageEditExtraVariablesView.as_view()
|
|
399 | 400 | |
400 | 401 | |
401 | 402 |
class PageView(ManagedPageMixin, DetailView): |
combo/public/views.py | ||
---|---|---|
104 | 104 |
ctx['selected_user'] = get_user_from_name_id(ctx['name_id']) |
105 | 105 |
if 'page' in ctx: |
106 | 106 |
page = ctx['page'] |
107 |
ctx.update(page.get_parameters(request, ctx))
|
|
107 |
ctx.update(page.get_extra_variables(request, ctx))
|
|
108 | 108 | |
109 | 109 | |
110 | 110 |
@csrf_exempt |
tests/test_manager.py | ||
---|---|---|
571 | 571 |
assert Page.objects.get(id=page.id).picture.url in resp.text |
572 | 572 | |
573 | 573 | |
574 |
def test_page_edit_parameters(app, admin_user):
|
|
574 |
def test_page_edit_extra_variables(app, admin_user):
|
|
575 | 575 |
app = login(app) |
576 | 576 |
page = Page.objects.create(title='One', slug='one', template_name='standard') |
577 |
assert page.parameters == {}
|
|
577 |
assert page.extra_variables == {}
|
|
578 | 578 |
resp = app.get('/manage/pages/%s/' % page.id) |
579 |
assert resp.text.count('<i>none</i>') == 4
|
|
580 |
resp = resp.click(href='.*/parameters/')
|
|
579 |
assert '<label>Extra variables:</label>' not in resp.text
|
|
580 |
resp = resp.click(href='.*/extra-variables/')
|
|
581 | 581 |
resp.form['form-0-key'] = 'foo' |
582 | 582 |
resp.form['form-0-value'] = 'bar' |
583 | 583 |
resp = resp.form.submit().follow() |
584 | 584 |
page.refresh_from_db() |
585 |
assert page.parameters == {'foo': 'bar'}
|
|
586 |
assert resp.text.count('<i>none</i>') == 3
|
|
585 |
assert page.extra_variables == {'foo': 'bar'}
|
|
586 |
assert '<label>Extra variables:</label>' in resp.text
|
|
587 | 587 |
assert '<i>foo</i>' in resp |
588 | 588 | |
589 |
resp = resp.click(href='.*/parameters/')
|
|
589 |
resp = resp.click(href='.*/extra-variables/', index=0)
|
|
590 | 590 |
assert resp.form['form-TOTAL_FORMS'].value == '2' |
591 | 591 |
assert resp.form['form-0-key'].value == 'foo' |
592 | 592 |
assert resp.form['form-0-value'].value == 'bar' |
... | ... | |
597 | 597 |
resp.form['form-1-value'] = 'baz' |
598 | 598 |
resp = resp.form.submit().follow() |
599 | 599 |
page.refresh_from_db() |
600 |
assert page.parameters == {
|
|
600 |
assert page.extra_variables == {
|
|
601 | 601 |
'foo': 'bar-bis', |
602 | 602 |
'blah': 'baz', |
603 | 603 |
} |
604 |
assert resp.text.count('<i>none</i>') == 3 |
|
605 | 604 |
assert '<i>blah</i>, <i>foo</i>' in resp |
606 | 605 | |
607 |
resp = resp.click(href='.*/parameters/')
|
|
606 |
resp = resp.click(href='.*/extra-variables/', index=0)
|
|
608 | 607 |
assert resp.form['form-TOTAL_FORMS'].value == '3' |
609 | 608 |
assert resp.form['form-0-key'].value == 'blah' |
610 | 609 |
assert resp.form['form-0-value'].value == 'baz' |
... | ... | |
617 | 616 |
resp.form['form-0-key'] = '' |
618 | 617 |
resp = resp.form.submit().follow() |
619 | 618 |
page.refresh_from_db() |
620 |
assert page.parameters == {
|
|
619 |
assert page.extra_variables == {
|
|
621 | 620 |
'foo': 'bar', |
622 | 621 |
} |
623 |
assert resp.text.count('<i>none</i>') == 3 |
|
624 | 622 |
assert '<i>foo</i>' in resp |
625 | 623 | |
626 | 624 |
tests/test_public.py | ||
---|---|---|
1093 | 1093 |
assert resp.context['card_foo_bar_id'] == '42' |
1094 | 1094 | |
1095 | 1095 | |
1096 |
def test_page_parameters(app):
|
|
1096 |
def test_page_extra_variables(app):
|
|
1097 | 1097 |
page = Page.objects.create( |
1098 | 1098 |
title='Home', |
1099 | 1099 |
slug='page', |
1100 | 1100 |
template_name='standard', |
1101 |
parameters={'foo': 'bar', 'bar_id': '{{ 40|add:2 }}'},
|
|
1101 |
extra_variables={'foo': 'bar', 'bar_id': '{{ 40|add:2 }}'},
|
|
1102 | 1102 |
) |
1103 | 1103 |
cell = JsonCell.objects.create( |
1104 | 1104 |
page=page, |
... | ... | |
1123 | 1123 |
) |
1124 | 1124 |
assert resp.text.strip() == 'XXbarYY42ZZ' |
1125 | 1125 | |
1126 |
# check sub_slug/parameters override
|
|
1126 |
# check sub_slug/extra_variables override
|
|
1127 | 1127 |
page.sub_slug = '(?P<fooo>[a-z]+)' |
1128 | 1128 |
page.save() |
1129 | 1129 |
cell.template_string = 'XX{{ foo }}YY{{ bar_id }}ZZ{{ fooo }}AA' |
1130 |
- |