Projet

Général

Profil

0001-manager-add-view-to-edit-a-single-attribute-with-an-.patch

Frédéric Péters, 12 septembre 2022 16:05

Télécharger (5,29 ko)

Voir les différences:

Subject: [PATCH] manager: add view to edit a single attribute with an ajax
 request (#64575)

 combo/manager/urls.py  |  5 +++++
 combo/manager/views.py | 44 +++++++++++++++++++++++++++++++++++++
 tests/test_manager.py  | 49 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 98 insertions(+)
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
-