dashboard: return json for ajax calls to add/remove tile URLs (#17308)
This commit is contained in:
parent
5f34724597
commit
e2dbaa52fc
|
@ -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()
|
||||
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue