dashboard: add view to reorder tiles (#17258)

This commit is contained in:
Frédéric Péters 2017-06-29 17:56:26 +02:00
parent 06f3a8690e
commit 79a94b0aeb
3 changed files with 49 additions and 4 deletions

View File

@ -28,4 +28,7 @@ urlpatterns = [
url(r'^api/dashboard/auto-tile/(?P<key>[\w_-]+)/$',
views.dashboard_auto_tile,
name='combo-dashboard-auto-tile'),
url(r'^api/dashboard/reorder/(?P<dashboard_id>[\w]+)/$',
views.dashboard_reorder_tiles,
name='combo-dashboard-reorder-tiles'),
]

View File

@ -19,7 +19,7 @@ import json
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.http import Http404, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView
@ -87,3 +87,18 @@ def dashboard_auto_tile(request, *args, **kwargs):
# dashboard
cell.save()
return render_cell(request, cell=cell)
def dashboard_reorder_tiles(request, *args, **kwargs):
dashboard = DashboardCell.objects.all()[0]
new_order = request.GET['order'].split(',')
tiles = dict((str(x.id), x) for x in Tile.objects.filter(id__in=new_order))
for i, tile_id in enumerate(new_order):
tile = tiles.get(tile_id)
if tile.user != request.user:
raise PermissionDenied()
if tile:
tile.order = i
for tile in tiles.values():
tile.save()
return HttpResponse(status=204)

View File

@ -20,9 +20,11 @@ from test_manager import admin_user, login
def site(admin_user):
page = Page(title='One', slug='index')
page.save()
# order=100 will be useful to get to the cell later on
cell = TextCell(page=page, order=100, placeholder='content', text='hello world')
cell.save()
# order will be useful to get to the cell later on
for i in range(100, 110):
cell = TextCell(page=page, order=i, placeholder='content',
text='hello world (%s)' % i)
cell.save()
page = Page(title='Two', slug='two')
page.save()
@ -89,6 +91,31 @@ def test_remove_from_dashboard(app, site):
assert Tile.objects.count() == 0
assert TextCell.objects.count() == 1
def test_reorder_dashboard(app, site):
user = User.objects.all()[0]
dashboard = DashboardCell.objects.all()[0]
# add cells to dashboard
app = login(app)
for i in range(103, 108):
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': TextCell.objects.get(order=i).get_reference()}))
assert Tile.objects.count() == 5
# check reordering
app.reset() # logout
tiles = Tile.objects.filter(user=user).order_by('?')
new_order = ','.join([str(x.id) for x in tiles])
resp = app.get(reverse('combo-dashboard-reorder-tiles',
kwargs={'dashboard_id': dashboard.id}), params={'order': new_order}, status=403)
app = login(app)
resp = app.get(reverse('combo-dashboard-reorder-tiles',
kwargs={'dashboard_id': dashboard.id}), params={'order': new_order})
tiles = Tile.objects.filter(user=user)
assert new_order == ','.join([str(x.id) for x in tiles])
def test_auto_tile(app, site):
with override_settings(JSON_CELL_TYPES={'test-config-json-cell': {'name': 'Foobar', 'url': 'http://test/'}},
TEMPLATE_DIRS=['%s/templates-1' % os.path.abspath(os.path.dirname(__file__))]):