dashboard: add view to dynamically create a tile from json (#16688)
This commit is contained in:
parent
e52ccbe7c8
commit
707f96b71c
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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/'
|
||||
|
|
Loading…
Reference in New Issue