Projet

Général

Profil

0001-assets-always-redirect-user-to-most-appropriate-page.patch

Frédéric Péters, 15 novembre 2018 15:14

Télécharger (7,74 ko)

Voir les différences:

Subject: [PATCH] assets: always redirect user to most appropriate page
 (#21609)

 combo/apps/assets/views.py | 35 +++++++++++++++++-----
 tests/test_manager.py      | 59 ++++++++++++++++++++++++++++++++------
 2 files changed, 79 insertions(+), 15 deletions(-)
combo/apps/assets/views.py
120 120
        context['query'] = self.request.GET.get('q') or ''
121 121
        return context
122 122

  
123
    def get_anchored_url(self, key=None, name=None):
124
        url = reverse('combo-manager-assets')
125
        for i, asset in enumerate(self.get_queryset()):
126
            if key and key != getattr(asset, 'key', None):
127
                continue
128
            if name and name > getattr(asset, 'name', None):
129
                continue
130
            return url + '?page=%s' % ((i // self.paginate_by) + 1)
131
        return url
132

  
123 133
assets = Assets.as_view()
124 134

  
125 135

  
126 136
class AssetUpload(FormView):
127 137
    form_class = AssetUploadForm
128 138
    template_name = 'combo/manager_asset_upload.html'
129
    success_url = reverse_lazy('combo-manager-assets')
130 139

  
131 140
    def form_valid(self, form):
132 141
        # use native ckeditor view so it's available from ckeditor file/image
......
136 145
        ckeditor_upload_view.post(self.request)
137 146
        return super(AssetUpload, self).form_valid(form)
138 147

  
148
    def get_success_url(self):
149
        return Assets(request=self.request).get_anchored_url(name=self.request.FILES['upload'].name)
150

  
139 151
asset_upload = AssetUpload.as_view()
140 152

  
141 153

  
......
171 183
                backend.create_thumbnail(saved_path)
172 184
        return super(AssetOverwrite, self).form_valid(form)
173 185

  
186
    def get_success_url(self):
187
        img_orig = self.request.GET['img']
188
        return Assets(request=self.request).get_anchored_url(name=os.path.basename(img_orig))
189

  
174 190
asset_overwrite = AssetOverwrite.as_view()
175 191

  
176 192

  
......
187 203
        if not img_orig.startswith(base_path):
188 204
            raise PermissionDenied()
189 205
        default_storage.delete(img_orig)
190
        return redirect(reverse('combo-manager-assets'))
206
        return redirect(
207
                Assets(request=self.request).get_anchored_url(
208
                    name=os.path.basename(img_orig)))
191 209

  
192 210
asset_delete = AssetDelete.as_view()
193 211

  
......
199 217

  
200 218
    def form_valid(self, form):
201 219
        try:
202
            asset = Asset.objects.get(key=self.kwargs['key'])
220
            self.asset = Asset.objects.get(key=self.kwargs['key'])
203 221
        except Asset.DoesNotExist:
204
            asset = Asset(key=self.kwargs['key'])
205
        asset.asset = self.request.FILES['upload']
206
        asset.save()
222
            self.asset = Asset(key=self.kwargs['key'])
223
        self.asset.asset = self.request.FILES['upload']
224
        self.asset.save()
207 225
        return super(SlotAssetUpload, self).form_valid(form)
208 226

  
227
    def get_success_url(self):
228
        return Assets(request=self.request).get_anchored_url(key=self.kwargs['key'])
229

  
209 230
slot_asset_upload = SlotAssetUpload.as_view()
210 231

  
211 232

  
......
214 235

  
215 236
    def post(self, request, *args, **kwargs):
216 237
        Asset.objects.filter(key=kwargs['key']).delete()
217
        return redirect(reverse('combo-manager-assets'))
238
        return redirect(Assets(request=self.request).get_anchored_url(key=kwargs['key']))
218 239

  
219 240
slot_asset_delete = SlotAssetDelete.as_view()
220 241

  
tests/test_manager.py
38 38
        user = User.objects.create_superuser('admin', email=None, password='admin')
39 39
    return user
40 40

  
41
@pytest.fixture
42
def clean_media():
43
    for path in ('uploads', 'assets'):
44
        if os.path.exists(default_storage.path(path)):
45
            shutil.rmtree(default_storage.path(path))
46
    return None
47

  
41 48
def login(app, username='admin', password='admin'):
42 49
    login_page = app.get('/login/')
43 50
    login_form = login_page.forms[0]
......
711 718
    resp = resp.form.submit().follow()
712 719
    assert 'have any asset yet.' in resp.text
713 720

  
714
def test_asset_management_search(app, admin_user):
721
def test_asset_management_anchor(app, admin_user):
722
    app = login(app)
723
    resp = app.get('/manage/assets/')
724
    assert 'have any asset yet.' in resp.text
725

  
726
    for i in range(25):
727
        filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'cc.png')
728
        pix = b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg=='
729
        default_storage.save(filepath, BytesIO(base64.decodestring(pix)))
730

  
731
    # test upload
732
    resp = app.get('/manage/assets/')
733
    resp = resp.click('Upload')
734
    resp.form['upload'] = Upload('test.png',
735
            base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVQI12NoAAAAggCB3UNq9AAAAABJRU5ErkJggg=='),
736
            'image/png')
737
    resp = resp.form.submit()
738
    assert resp.location.endswith('?page=3')
739
    resp = resp.follow()
740

  
741
    # overwrite
742
    resp = resp.click(href=re.compile('overwrite.*test.png'))
743
    resp.form['upload'] = Upload('aa.png',
744
            base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
745
            'image/png')
746
    resp = resp.form.submit()
747
    assert resp.location.endswith('?page=3')
748
    resp = resp.follow()
749

  
750
    # delete
751
    resp = resp.click(href=re.compile('delete.*test.png'))
752
    resp = resp.form.submit()
753
    assert resp.location.endswith('?page=3')
754
    resp = resp.follow()
755
    assert 'test.png' not in resp.text
756

  
757
def test_asset_management_search(app, admin_user, clean_media):
715 758
    app = login(app)
716 759

  
717 760
    filepath = os.path.join(settings.CKEDITOR_UPLOAD_PATH, 'test.png')
......
732 775
    resp = resp.form.submit()
733 776
    assert resp.text.count('<tr class="asset') == 2
734 777

  
735
def test_asset_slots_management(app, admin_user):
778
def test_asset_slots_management(app, admin_user, clean_media):
736 779
    app = login(app)
737

  
738
    for path in ('uploads', 'assets'):
739
        if os.path.exists(default_storage.path(path)):
740
            shutil.rmtree(default_storage.path(path))
741 780
    assert Asset.objects.count() == 0
742 781

  
743 782
    with override_settings(COMBO_ASSET_SLOTS={'collectivity:banner': {'label': 'Banner'}}):
......
749 788
        resp.form['upload'] = Upload('test.png',
750 789
                base64.decodestring(b'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12NgAgAABAADRWoApgAA\nAABJRU5ErkJggg=='),
751 790
                'image/png')
752
        resp = resp.form.submit().follow()
791
        resp = resp.form.submit()
792
        assert resp.location.endswith('?page=1')
793
        resp = resp.follow()
753 794
        assert 'test.png' in resp.text
754 795
        assert '>Delete<' in resp.text
755 796
        assert Asset.objects.filter(key='collectivity:banner').count() == 1
......
768 809
        assert Asset.objects.filter(key='collectivity:banner').count() == 1
769 810

  
770 811
        resp = resp.click('Delete')
771
        resp = resp.form.submit().follow()
812
        resp = resp.form.submit()
813
        assert resp.location.endswith('?page=1')
814
        resp = resp.follow()
772 815
        assert '>Banner<' in resp.text
773 816
        assert '>Delete<' not in resp.text
774 817
        assert Asset.objects.filter(key='collectivity:banner').count() == 0
775
-