dashboard: add view to dynamically create a tile from json (#16688)

This commit is contained in:
Frédéric Péters 2017-06-03 22:18:36 +02:00
parent e52ccbe7c8
commit 707f96b71c
4 changed files with 58 additions and 12 deletions

View File

@ -25,4 +25,7 @@ urlpatterns = [
url(r'^api/dashboard/remove/(?P<cell_reference>[\w_-]+)/$',
views.dashboard_remove_tile,
name='combo-dashboard-remove-tile'),
url(r'^api/dashboard/auto-tile/(?P<key>[\w_-]+)/$',
views.dashboard_auto_tile,
name='combo-dashboard-auto-tile'),
]

View File

@ -14,14 +14,18 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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.views.decorators.csrf import csrf_exempt
from django.views.generic import RedirectView
from combo.data.models import CellBase
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
@ -70,3 +74,16 @@ class DashboardRemoveTileView(RedirectView):
return dashboard.page.get_online_url()
dashboard_remove_tile = DashboardRemoveTileView.as_view()
@csrf_exempt
def dashboard_auto_tile(request, *args, **kwargs):
dashboard = DashboardCell.objects.all()[0]
cell = ConfigJsonCell(key=kwargs.get('key'), order=1,
page_id=dashboard.page_id, placeholder='_auto_tile')
cell.parameters = json.loads(request.body)
if request.user.is_authenticated():
# save cell if the user is connected, so it can be added to the
# dashboard
cell.save()
return render_cell(request, cell=cell)

View File

@ -80,22 +80,26 @@ def ajax_page_cell(request, page_pk, cell_reference):
if not cell.is_visible(request.user):
raise PermissionDenied()
return render_cell(request, cell)
def render_cell(request, cell):
context = RequestContext(request, {
'page': page,
'page': cell.page if cell.page_id else None,
'request': request,
'cell': cell,
'synchronous': True,
'site_base': request.build_absolute_uri('/')[:-1],
})
other_cells = CellBase.get_cells(page_id=page_pk)
other_cells = [x for x in other_cells if x.is_visible(user=request.user)]
for other_cell in other_cells:
if other_cell.get_reference() != cell.get_reference():
other_cell.modify_global_context(context, request)
else:
# Cell can pass data through its own __dict__
cell.modify_global_context(context, request)
if cell.page_id:
other_cells = CellBase.get_cells(page_id=cell.page_id)
other_cells = [x for x in other_cells if x.is_visible(user=request.user)]
for other_cell in other_cells:
if other_cell.get_reference() != cell.get_reference():
other_cell.modify_global_context(context, request)
else:
# Cell can pass data through its own __dict__
cell.modify_global_context(context, request)
template = Template('{% load combo %}{% render_cell cell %}')
return HttpResponse(template.render(context), content_type='text/html')

View File

@ -1,11 +1,15 @@
from webtest import TestApp
import json
import mock
import os
import pytest
from webtest import TestApp
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.test import override_settings
from combo.wsgi import application
from combo.data.models import Page, CellBase, TextCell
from combo.data.models import Page, CellBase, TextCell, ConfigJsonCell
from combo.apps.dashboard.models import DashboardCell, Tile
pytestmark = pytest.mark.django_db
@ -84,3 +88,21 @@ def test_remove_from_dashboard(app, site):
kwargs={'cell_reference': tile.cell.get_reference()}), status=302)
assert Tile.objects.count() == 0
assert TextCell.objects.count() == 1
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__))]):
with mock.patch('combo.utils.requests.get') as requests_get:
# logged out
requests_get.return_value = mock.Mock(content='<div>HELLO</div>', status_code=200)
resp = app.post(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
params=json.dumps({'var1': 'one', 'var2': 'two'}),
content_type='application/json')
assert resp.body.strip() == '/var1=one/var2=two/'
# and logged in
app = login(app)
resp = app.post(reverse('combo-dashboard-auto-tile', kwargs={'key': 'test-config-json-cell'}),
params=json.dumps({'var1': 'one', 'var2': 'two'}),
content_type='application/json')
assert resp.body.strip() == '/var1=one/var2=two/'