Projet

Général

Profil

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

Frédéric Péters, 10 septembre 2022 20:53

Télécharger (4,48 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 | 43 ++++++++++++++++++++++++++++++++++++++++++
 tests/test_manager.py  | 34 +++++++++++++++++++++++++++++++++
 3 files changed, 82 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
        form_class = forms.models.modelform_factory(
887
            self.object.__class__,
888
            fields=[attr],
889
        )
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['errorlist'] = form.errors
907

  
908
        return JsonResponse(response)
909

  
910

  
911
page_edit_cell_attribute = PageEditCellAttributeView.as_view()
912

  
913

  
871 914
class PageCellOrder(ManagedPageMixin, View):
872 915
    def get(self, *args, **kwargs):
873 916
        request = self.request
tests/test_manager.py
1636 1636
        assert TextCell.objects.get(id=cell.id).order == new_order[i]
1637 1637

  
1638 1638

  
1639
def test_edit_cell_attribute_ajax(settings, app, admin_user):
1640
    Page.objects.all().delete()
1641
    page = Page(title='One', slug='one', template_name='standard')
1642
    page.save()
1643
    cell = TextCell(page=page, placeholder='content', text='Foobar', order=0)
1644
    cell.save()
1645

  
1646
    app = login(app)
1647
    params = {
1648
        'text': 'new text',
1649
    }
1650
    app.post(
1651
        f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/text/', params=params, status=403
1652
    )
1653

  
1654
    resp = app.get(f'/manage/pages/{page.id}/')
1655
    params = {
1656
        'text': 'new text',
1657
        'csrfmiddlewaretoken': PyQuery(resp.text).find('[name=csrfmiddlewaretoken]').val(),
1658
    }
1659
    resp = app.post(f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/text/', params=params)
1660
    assert resp.json == {'err': 0}
1661
    assert TextCell.objects.get(id=cell.id).text == 'new text'
1662

  
1663
    params = {
1664
        'placeholder': '',
1665
        'csrfmiddlewaretoken': params['csrfmiddlewaretoken'],
1666
    }
1667
    resp = app.post(
1668
        f'/manage/pages/{page.id}/cell/data_textcell-{cell.id}/attribute/placeholder/', params=params
1669
    )
1670
    assert resp.json == {'err': 1, 'errorlist': {'placeholder': ['This field is required.']}}
1671

  
1672

  
1639 1673
def test_edit_text_cell(app, admin_user):
1640 1674
    Page.objects.all().delete()
1641 1675
    page = Page(title='One', slug='one', template_name='standard')
1642
-