0001-manager-support-for-setting-labels-on-page-snapshots.patch
combo/data/migrations/0057_pagesnapshot_label.py | ||
---|---|---|
1 |
# Generated by Django 2.2.26 on 2022-07-06 12:14 |
|
2 | ||
3 |
from django.db import migrations, models |
|
4 | ||
5 | ||
6 |
class Migration(migrations.Migration): |
|
7 | ||
8 |
dependencies = [ |
|
9 |
('data', '0056_display_condition'), |
|
10 |
] |
|
11 | ||
12 |
operations = [ |
|
13 |
migrations.AddField( |
|
14 |
model_name='pagesnapshot', |
|
15 |
name='label', |
|
16 |
field=models.CharField(blank=True, max_length=150, verbose_name='Label'), |
|
17 |
), |
|
18 |
] |
combo/data/models.py | ||
---|---|---|
717 | 717 |
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True) |
718 | 718 |
comment = models.TextField(blank=True, null=True) |
719 | 719 |
serialization = JSONField(blank=True, default=dict) |
720 |
label = models.CharField(_('Label'), max_length=150, blank=True) |
|
720 | 721 | |
721 | 722 |
class Meta: |
722 | 723 |
ordering = ('-timestamp',) |
combo/manager/forms.py | ||
---|---|---|
26 | 26 |
from django.utils.translation import ugettext_lazy as _ |
27 | 27 | |
28 | 28 |
from combo.data.forms import get_page_choices |
29 |
from combo.data.models import Page, ParentContentCell, SiteSettings, compile_sub_slug |
|
29 |
from combo.data.models import Page, PageSnapshot, ParentContentCell, SiteSettings, compile_sub_slug
|
|
30 | 30 | |
31 | 31 |
from .fields import ImageIncludingSvgField |
32 | 32 | |
... | ... | |
408 | 408 |
('fx-grid--t3', _('3 columns')), |
409 | 409 |
], |
410 | 410 |
) |
411 | ||
412 | ||
413 |
class PageSnapshotSetLabelForm(forms.ModelForm): |
|
414 |
class Meta: |
|
415 |
model = PageSnapshot |
|
416 |
fields = ['label'] |
combo/manager/templates/combo/page_history.html | ||
---|---|---|
16 | 16 |
{% block content %} |
17 | 17 | |
18 | 18 |
<div> |
19 |
<ul class="objects-list"> |
|
20 |
{% for snapshot in object_list %} |
|
21 |
<li>{{ snapshot.timestamp }}, {{ snapshot.comment }} |
|
22 |
{% if snapshot.user %} ({{ snapshot.user.get_full_name }}){% endif %} |
|
23 |
— <a href="{% url 'combo-snapshot-view' pk=snapshot.id %}">{% trans "view" %}</a> |
|
24 |
— <a href="{% url 'combo-manager-snapshot-export' page_pk=view.page.id pk=snapshot.id %}">{% trans "export" %}</a> |
|
25 |
— <a href="{% url 'combo-manager-snapshot-restore' page_pk=view.page.id pk=snapshot.id %}" rel="popup">{% trans "restore" %}</a> |
|
26 |
</li> |
|
27 |
{% endfor %} |
|
28 |
</ul> |
|
19 |
<table class="main"> |
|
20 |
<thead> |
|
21 |
<th>{% trans 'Date' %}</th> |
|
22 |
<th>{% trans 'Description' %}</th> |
|
23 |
<th>{% trans 'User' %}</th> |
|
24 |
<th>{% trans 'Label' %}</th> |
|
25 |
<th>{% trans 'Actions' %}</th> |
|
26 |
</thead> |
|
27 |
<tbody> |
|
28 |
{% for snapshot in object_list %} |
|
29 |
<tr> |
|
30 |
<td> |
|
31 |
{{ snapshot.timestamp }} |
|
32 |
</td> |
|
33 |
<td> |
|
34 |
{{ snapshot.comment }} |
|
35 |
</td> |
|
36 |
<td>{% if snapshot.user %} ({{ snapshot.user.get_full_name }}){% endif %}</td> |
|
37 |
<td> |
|
38 |
{% if snapshot.label %}{{ snapshot.label }}{% endif %} |
|
39 |
</td> |
|
40 |
<td> |
|
41 |
<a href="{% url 'combo-snapshot-view' pk=snapshot.id %}">{% trans "view" %}</a> |
|
42 |
— <a href="{% url 'combo-manager-snapshot-export' page_pk=view.page.id pk=snapshot.id %}">{% trans "export" %}</a> |
|
43 |
— <a href="{% url 'combo-manager-snapshot-restore' page_pk=view.page.id pk=snapshot.id %}" rel="popup">{% trans "restore" %}</a> |
|
44 |
— <a href="{% url 'combo-manager-snapshot-set-label' page_pk=view.page.id pk=snapshot.id %}" rel="popup">{% trans "set label" %}</a> |
|
45 |
</td> |
|
46 |
</tr> |
|
47 |
{% endfor %} |
|
48 |
</tbody> |
|
49 |
</table> |
|
29 | 50 | |
30 | 51 |
{% include "gadjo/pagination.html" %} |
31 | 52 |
combo/manager/templates/combo/snapshot_set_label.html | ||
---|---|---|
1 |
{% extends "combo/manager_base.html" %} |
|
2 |
{% load i18n %} |
|
3 |
{% load cells %} |
|
4 |
{% load thumbnail %} |
|
5 | ||
6 |
{% block appbar %} |
|
7 |
<h2>{% trans 'Snapshot Set Label' %} - {{ snapshot.page.title }}</h2> |
|
8 |
{% endblock %} |
|
9 | ||
10 |
{% block breadcrumb %} |
|
11 |
{{ block.super }} |
|
12 |
<a href="{% url 'combo-manager-page-view' pk=snapshot.page.id %}">{% trans 'Page' %} - {{page.title }}</a> |
|
13 |
<a href="{% url 'combo-manager-page-history' pk=snapshot.page.id %}">{% trans "History" %}</a> |
|
14 |
<a href="{% url 'combo-manager-snapshot-set-label' page_pk=snapshot.page.id pk=snapshot.id %}">{% trans "Snapshot Set Label" %}</a> |
|
15 |
{% endblock %} |
|
16 | ||
17 |
{% block content %} |
|
18 |
<form method="post"> |
|
19 |
{% csrf_token %} |
|
20 |
{{ form.as_p }} |
|
21 |
<div class="buttons"> |
|
22 |
<button class="submit-button">{% trans 'Save' %}</button> |
|
23 |
<a class="cancel" href="{% url 'combo-manager-page-history' pk=snapshot.page.id %}">{% trans 'Cancel' %}</a> |
|
24 |
</div> |
|
25 |
</form> |
|
26 |
{% endblock %} |
combo/manager/urls.py | ||
---|---|---|
101 | 101 |
pages_admin_required(views.snapshot_export), |
102 | 102 |
name='combo-manager-snapshot-export', |
103 | 103 |
), |
104 |
url( |
|
105 |
r'^pages/(?P<page_pk>\d+)/history/(?P<pk>\d+)/set-label$', |
|
106 |
pages_admin_required(views.snapshot_set_label), |
|
107 |
name='combo-manager-snapshot-set-label', |
|
108 |
), |
|
104 | 109 |
url( |
105 | 110 |
r'^pages/(?P<page_pk>\d+)/add-cell-to-(?P<ph_key>[\w_-]+)/(?P<cell_type>\w+)/(?P<variant>[\w-]+)/$', |
106 | 111 |
views.page_add_cell, |
combo/manager/views.py | ||
---|---|---|
36 | 36 |
) |
37 | 37 |
from django.shortcuts import get_object_or_404, redirect, render |
38 | 38 |
from django.template import engines |
39 |
from django.template.response import TemplateResponse |
|
39 | 40 |
from django.urls import reverse, reverse_lazy |
40 | 41 |
from django.utils.encoding import force_bytes, force_text |
41 | 42 |
from django.utils.formats import date_format |
... | ... | |
83 | 84 |
PageExportForm, |
84 | 85 |
PageRestrictedAddForm, |
85 | 86 |
PageSelectTemplateForm, |
87 |
PageSnapshotSetLabelForm, |
|
86 | 88 |
PageVisibilityForm, |
87 | 89 |
PlaceholderOptionsForm, |
88 | 90 |
SiteExportForm, |
... | ... | |
644 | 646 |
return response |
645 | 647 | |
646 | 648 | |
649 |
def snapshot_set_label(request, *args, **kwargs): |
|
650 |
snapshot = get_object_or_404(PageSnapshot, id=kwargs['pk']) |
|
651 |
if request.method == 'POST': |
|
652 |
form = PageSnapshotSetLabelForm(instance=snapshot, data=request.POST) |
|
653 |
if form.is_valid(): |
|
654 |
form.save() |
|
655 |
return HttpResponseRedirect( |
|
656 |
reverse('combo-manager-page-history', kwargs={'pk': kwargs['page_pk']}) |
|
657 |
) |
|
658 |
else: |
|
659 |
form = PageSnapshotSetLabelForm(instance=snapshot) |
|
660 | ||
661 |
return TemplateResponse(request, 'combo/snapshot_set_label.html', {'form': form, 'snapshot': snapshot}) |
|
662 | ||
663 | ||
647 | 664 |
class PageRedirectToEditView(RedirectView): |
648 | 665 |
permanent = False |
649 | 666 |
tests/test_manager.py | ||
---|---|---|
2500 | 2500 |
app.get('/logout/') |
2501 | 2501 |
resp3 = app.get(json_cell_url, status=403) |
2502 | 2502 | |
2503 |
# add a label to a snapshot |
|
2504 |
app = login(app) |
|
2505 |
resp = resp.click('set label', index=4) |
|
2506 |
resp.form['label'] = 'CGUv1' |
|
2507 |
resp = resp.form.submit().follow() |
|
2508 |
assert PageSnapshot.objects.all()[4].label == 'CGUv1' |
|
2509 | ||
2503 | 2510 |
# restore a snapshot |
2504 | 2511 |
app = login(app) |
2505 | 2512 |
resp = resp.click('restore', index=6) |
2506 |
- |