dashboard: return json for ajax calls to add/remove tile URLs (#17308)

This commit is contained in:
Frédéric Péters 2017-07-01 18:14:07 +02:00
parent 5f34724597
commit e2dbaa52fc
2 changed files with 64 additions and 18 deletions

View File

@ -19,27 +19,42 @@ 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, HttpResponse
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView
from django.views.generic import View
from combo.data.models import CellBase, ConfigJsonCell
from combo.data.library import get_cell_class
from combo.public.views import render_cell
from .models import DashboardCell, Tile
from .templatetags.dashboard import get_cell_data
class DashboardAddTileView(RedirectView):
permanent = False
def dashboard_success(request, dashboard, cell_data):
dashboard_url = dashboard.page.get_online_url()
def get_redirect_url(self, cell_reference):
dashboard = DashboardCell.objects.all()[0]
if request.is_ajax():
return HttpResponse(
json.dumps({
'err': 0,
'url': request.build_absolute_uri(dashboard_url),
'cell_data': cell_data}),
content_type='application/json')
cell = CellBase.get_cell(cell_reference)
if not cell.page.is_visible(self.request.user):
return HttpResponseRedirect(dashboard_url)
class DashboardAddTileView(View):
def get(self, request, *args, **kwargs):
if not request.user.is_authenticated():
raise PermissionDenied()
if not cell.is_visible(self.request.user):
dashboard = DashboardCell.objects.all()[0]
cell = CellBase.get_cell(kwargs['cell_reference'])
if not cell.page.is_visible(request.user):
raise PermissionDenied()
if not cell.is_visible(request.user):
raise PermissionDenied()
cell.pk = None
cell.page = dashboard.page
@ -48,30 +63,30 @@ class DashboardAddTileView(RedirectView):
tile = Tile(dashboard=dashboard,
cell=cell,
user=self.request.user)
user=request.user)
tile.order = 0
tile.save()
return dashboard.page.get_online_url()
return dashboard_success(request, dashboard, get_cell_data(cell))
dashboard_add_tile = DashboardAddTileView.as_view()
class DashboardRemoveTileView(RedirectView):
permanent = False
def get_redirect_url(self, cell_reference):
cell = CellBase.get_cell(cell_reference)
class DashboardRemoveTileView(View):
def get(self, request, *args, **kwargs):
cell = CellBase.get_cell(kwargs['cell_reference'])
try:
tile = Tile.get_by_cell(cell)
except Tile.DoesNotExist:
raise Http404()
if tile.user != self.request.user:
if tile.user != request.user:
raise PermissionDenied()
dashboard = tile.dashboard
cell_data = get_cell_data(cell)
tile.delete()
cell.delete()
return dashboard.page.get_online_url()
return dashboard_success(request, dashboard, cell_data)
dashboard_remove_tile = DashboardRemoveTileView.as_view()

View File

@ -2,6 +2,7 @@ import json
import mock
import os
import pytest
import urlparse
from webtest import TestApp
from django.contrib.auth.models import User
@ -48,6 +49,7 @@ def test_add_to_dashboard(app, site):
user = User.objects.all()[0]
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}))
assert urlparse.urlparse(resp.location).path == dashboard.page.get_online_url()
assert Tile.objects.count() == 1
assert Tile.objects.all()[0].cell.id != cell.id
assert Tile.objects.all()[0].cell.text == cell.text
@ -58,6 +60,22 @@ def test_add_to_dashboard(app, site):
resp = app.get('/two/', status=200)
assert 'hello world' in resp.body
def test_ajax_add_to_dashboard(app, site):
cell = TextCell.objects.get(order=100)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'},
status=403)
assert Tile.objects.count() == 0
app = login(app)
resp = app.get(reverse('combo-dashboard-add-tile',
kwargs={'cell_reference': cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'})
assert resp.json['err'] == 0
assert resp.json['url'] == 'http://testserver/two/'
assert Tile.objects.count() == 1
def test_ajax_render(app, site):
test_add_to_dashboard(app, site)
app.reset() # logout
@ -91,6 +109,19 @@ def test_remove_from_dashboard(app, site):
assert Tile.objects.count() == 0
assert TextCell.objects.count() == 10
def test_ajax_remove_from_dashboard(app, site):
test_add_to_dashboard(app, site)
tile = Tile.objects.all()[0]
app = login(app)
resp = app.get(reverse('combo-dashboard-remove-tile',
kwargs={'cell_reference': tile.cell.get_reference()}),
headers={'x-requested-with': 'XMLHttpRequest'},
status=200)
assert resp.json['err'] == 0
assert resp.json['url'] == 'http://testserver/two/'
assert Tile.objects.count() == 0
def test_reorder_dashboard(app, site):
user = User.objects.all()[0]
dashboard = DashboardCell.objects.all()[0]