0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch
combo/manager/urls.py | ||
---|---|---|
126 | 126 |
views.page_duplicate_cell, |
127 | 127 |
name='combo-manager-page-duplicate-cell', |
128 | 128 |
), |
129 |
re_path( |
|
130 |
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/attribute/(?P<attribute>[\w_]+)/$', |
|
131 |
views.page_edit_cell_attribute, |
|
132 |
name='combo-manager-page-edit-cell-attribute', |
|
133 |
), |
|
129 | 134 |
re_path( |
130 | 135 |
r'^pages/(?P<page_pk>\d+)/cell/(?P<cell_reference>[\w_-]+)/add-link/(?P<link_code>[\w-]+)$', |
131 | 136 |
views.page_list_cell_add_link, |
combo/manager/views.py | ||
---|---|---|
868 | 868 |
page_duplicate_cell = PageDuplicateCellView.as_view() |
869 | 869 | |
870 | 870 | |
871 |
class PageEditCellAttributeView(ManagedPageMixin, UpdateView): |
|
872 |
http_method_names = ['post'] |
|
873 | ||
874 |
def get_object(self, queryset=None): |
|
875 |
page_pk = self.kwargs.get('page_pk') |
|
876 |
cell_reference = self.kwargs.get('cell_reference') |
|
877 |
try: |
|
878 |
return CellBase.get_cell(cell_reference, page_id=page_pk) |
|
879 |
except ObjectDoesNotExist: |
|
880 |
raise Http404() |
|
881 | ||
882 |
def post(self, request, *args, **kwargs): |
|
883 |
self.object = self.get_object() |
|
884 |
attr = kwargs['attribute'] |
|
885 | ||
886 |
if attr not in self.object.get_default_form_fields(): |
|
887 |
return JsonResponse({'err': 1, 'err_desc': 'not-attribute-from-default-form'}) |
|
888 | ||
889 |
form_class = self.object.get_default_form_class(fields=[attr]) |
|
890 |
form = form_class(**self.get_form_kwargs()) |
|
891 |
response = {} |
|
892 |
if form.is_valid(): |
|
893 |
response['err'] = 0 |
|
894 |
self.object = form.save() |
|
895 |
PageSnapshot.take( |
|
896 |
self.object.page, |
|
897 |
request=self.request, |
|
898 |
comment=_('changed cell "%(cell)s" (attribute: %(attr)s)') |
|
899 |
% { |
|
900 |
'cell': self.object, |
|
901 |
'attr': attr, |
|
902 |
}, |
|
903 |
) |
|
904 |
else: |
|
905 |
response['err'] = 1 |
|
906 |
response['err_desc'] = 'form-error-see-errorlist' |
|
907 |
response['errorlist'] = form.errors |
|
908 | ||
909 |
return JsonResponse(response) |
|
910 | ||
911 | ||
912 |
page_edit_cell_attribute = PageEditCellAttributeView.as_view() |
|
913 | ||
914 | ||
871 | 915 |
class PageCellOrder(ManagedPageMixin, View): |
872 | 916 |
def get(self, *args, **kwargs): |
873 | 917 |
request = self.request |
tests/test_manager.py | ||
---|---|---|
33 | 33 |
from combo.data.models import ( |
34 | 34 |
CellBase, |
35 | 35 |
ConfigJsonCell, |
36 |
FeedCell, |
|
36 | 37 |
JsonCell, |
37 | 38 |
LinkCell, |
38 | 39 |
LinkListCell, |
... | ... | |
1636 | 1637 |
assert TextCell.objects.get(id=cell.id).order == new_order[i] |
1637 | 1638 | |
1638 | 1639 | |
1640 |
def test_edit_cell_attribute_ajax(settings, app, admin_user): |
|
1641 |
Page.objects.all().delete() |
|
1642 |
page = Page(title='One', slug='one', template_name='standard') |
|
1643 |
page.save() |
|
1644 |
cell = TextCell(page=page, placeholder='content', text='Foobar', order=0) |
|
1645 |
cell.save() |
|
1646 | ||
1647 |
app = login(app) |
|
1648 |
params = { |
|
1649 |
'text': 'new text', |
|
1650 |
} |
|
1651 |
app.post( |
|
1652 |
f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/text/', params=params, status=403 |
|
1653 |
) |
|
1654 | ||
1655 |
resp = app.get(f'/manage/pages/{page.id}/') |
|
1656 |
params = { |
|
1657 |
'text': 'new text', |
|
1658 |
'csrfmiddlewaretoken': PyQuery(resp.text).find('[name=csrfmiddlewaretoken]').val(), |
|
1659 |
} |
|
1660 |
resp = app.post(f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/text/', params=params) |
|
1661 |
assert resp.json == {'err': 0} |
|
1662 |
assert TextCell.objects.get(id=cell.id).text == 'new text' |
|
1663 | ||
1664 |
params = { |
|
1665 |
'placeholder': '', |
|
1666 |
'csrfmiddlewaretoken': params['csrfmiddlewaretoken'], |
|
1667 |
} |
|
1668 |
resp = app.post( |
|
1669 |
f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/placeholder/', params=params |
|
1670 |
) |
|
1671 |
assert resp.json == {'err': 1, 'err_desc': 'not-attribute-from-default-form'} |
|
1672 | ||
1673 |
feedcell = FeedCell.objects.create(page=page, placeholder='content', order=1) |
|
1674 |
params = { |
|
1675 |
'limit': 'foo', |
|
1676 |
'csrfmiddlewaretoken': params['csrfmiddlewaretoken'], |
|
1677 |
} |
|
1678 |
resp = app.post( |
|
1679 |
f'/manage/pages/{page.id}/cell/data_feedcell-{feedcell.id}/attribute/limit/', params=params |
|
1680 |
) |
|
1681 |
assert resp.json == { |
|
1682 |
'err': 1, |
|
1683 |
'err_desc': 'form-error-see-errorlist', |
|
1684 |
'errorlist': {'limit': ['Enter a whole number.']}, |
|
1685 |
} |
|
1686 | ||
1687 | ||
1639 | 1688 |
def test_edit_text_cell(app, admin_user): |
1640 | 1689 |
Page.objects.all().delete() |
1641 | 1690 |
page = Page(title='One', slug='one', template_name='standard') |
1642 |
- |