def clone_dashboard_workspace(request, workspace_id): """ Clones dashboard workspace. """ redirect_to = request.GET.get('next', None) try: workspace = DashboardWorkspace._default_manager.get(pk=workspace_id) except: messages.info(request, _("Invalid dashboard workspace.")) if redirect_to: return redirect(redirect_to) else: return redirect('dash.edit_dashboard') if not (workspace.is_clonable or request.user.pk == workspace.user.pk): messages.info(request, _("You are not allowed to clone the given " "workspace.")) if redirect_to: return redirect(redirect_to) else: return redirect('dash.edit_dashboard') cloned_workspace = clone_workspace(workspace, request.user) # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) cloned_workspace_layout = get_layout( layout_uid=workspace.layout_uid, as_instance=True ) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) if workspace.layout_uid == layout.uid or \ dashboard_settings.allow_different_layouts: messages.info( request, _("Dashboard workspace `{0}` was successfully cloned into " "`{1}`.".format(workspace.name, cloned_workspace.name)) ) return redirect('dash.edit_dashboard', workspace=cloned_workspace.slug) else: messages.info( request, _("Dashboard workspace `{0}` was successfully cloned into `{1}` " "(layout `{2}`), however your active layout is `{3}`. You should " "switch to layout `{4}` (in your dashboard settings) in order to " "see the cloned workspace.".format( workspace.name, cloned_workspace.name, cloned_workspace_layout.name, layout.name, cloned_workspace_layout.name )) ) return redirect('dash.edit_dashboard')
def dashboard_workspaces(request, workspace=None, \ template_name='dash/dashboard_workspaces.html', \ template_name_ajax='dash/dashboard_workspaces_ajax.html'): """ Workspaces list. :param django.http.HttpRequest request: :param string workspace: Workspace slug. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) context = { 'layout': layout, 'dashboard_settings': dashboard_settings } context.update(get_workspaces(request.user, layout.uid, workspace)) if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def test_04_active_layout_render_for_view(self): """ Test active layout render (`render_for_view`). """ try: # Create dashboard user create_dashboard_user() except: pass User = get_user_model() # Getting the admin (user with plugin data) user = User.objects.get(username=DASH_TEST_USER_USERNAME) # Faking the Django request request_factory = RequestFactory() request = request_factory.get('/dashboard/', data={'user': user}) request.user = user workspace = None # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(request.user) user_plugin_uids = [uid for uid, repr in registered_plugins] layout = get_layout(as_instance=True) # Fetching all dashboard entries for user and freezeing the queryset dashboard_entries = DashboardEntry._default_manager \ .get_for_user(user=request.user, layout_uid=layout.uid, workspace=workspace) \ .select_related('workspace', 'user') \ .filter(plugin_uid__in=user_plugin_uids) \ .order_by('placeholder_uid', 'position')[:] res = layout.render_for_view(dashboard_entries=dashboard_entries, request=request) return res
def detail(request, slug, template_name='news/detail.html', template_name_ajax='news/detail_ajax.html'): """News item detail. In the template, we show the title and the body of the news item and links. :param django.http.HttpRequest request: :param string slug: Foo item slug. :param string template_name: :param string template_name_ajax: :return django.http.HttpResponse: """ layout = get_layout(as_instance=True) results_kwargs = {'slug': slug} try: queryset = NewsItem.objects.filter(**results_kwargs) item = queryset.get(**results_kwargs) except NewsItem.DoesNotExist: raise Http404 context = {'layout': layout, 'item': item} if request.is_ajax(): template_name = template_name_ajax return render(request, template_name, context)
def dashboard_workspaces(request, workspace=None, \ template_name='dash/dashboard_workspaces.html', \ template_name_ajax='dash/dashboard_workspaces_ajax.html'): """ Workspaces list. :param django.http.HttpRequest request: :param string workspace: Workspace slug. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) context = { 'layout': layout, 'dashboard_settings': dashboard_settings } context.update(get_workspaces(request.user, layout.uid, workspace)) if request.is_ajax(): template_name = template_name_ajax return render(request, template_name, context)
def test_02_active_layout(self): """ Test active layout (`get_layout`). """ layout_cls = get_layout() self.assertTrue(layout_cls is not None) return layout_cls
def detail(request, slug, template_name="news/detail.html", template_name_ajax="news/detail_ajax.html"): """ News item detail. In the template, we show the title and the body of the News item and links to all its' all available translations. :param django.http.HttpRequest request: :param string slug: Foo item slug. :param string template_name: :return django.http.HttpResponse: """ layout = get_layout(as_instance=True) language = get_language_from_request(request) if language is not None: translation.activate(language) results_kwargs = {"slug": slug} try: queryset = NewsItem._default_manager.filter(**results_kwargs) item = queryset.get(**results_kwargs) except Exception as e: raise Http404 context = {"layout": layout, "item": item} if request.is_ajax(): template_name = template_name_ajax return render_to_response(template_name, context, context_instance=RequestContext(request))
def test_04_active_layout_render_for_view(self): """ Test active layout render (`render_for_view`). """ try: # Create dashboard user create_dashboard_user() except: pass # Getting the admin (user with plugin data) user = User.objects.get(username=DASH_TEST_USER_USERNAME) # Faking the Django request request_factory = RequestFactory() request = request_factory.get("/dashboard/", data={"user": user}) request.user = user workspace = None # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(request.user) user_plugin_uids = [uid for uid, repr in registered_plugins] layout = get_layout(as_instance=True) # Fetching all dashboard entries for user and freezeing the queryset dashboard_entries = ( DashboardEntry._default_manager.get_for_user(user=request.user, layout_uid=layout.uid, workspace=workspace) .select_related("workspace", "user") .filter(plugin_uid__in=user_plugin_uids) .order_by("placeholder_uid", "position")[:] ) res = layout.render_for_view(dashboard_entries=dashboard_entries, request=request) return res
def detail(request, slug, template_name='news/detail.html', \ template_name_ajax='news/detail_ajax.html'): """ News item detail. In the template, we show the title and the body of the News item and links to all its' all available translations. :param django.http.HttpRequest request: :param string slug: Foo item slug. :param string template_name: :return django.http.HttpResponse: """ layout = get_layout(as_instance=True) language = get_language_from_request(request) if language is not None: translation.activate(language) results_kwargs = {'slug': slug} try: queryset = NewsItem._default_manager.filter(**results_kwargs) item = queryset.get(**results_kwargs) except Exception as e: raise Http404 context = {'layout': layout, 'item': item} if request.is_ajax(): template_name = template_name_ajax return render_to_response(template_name, context, context_instance=RequestContext(request))
def create_dashboard_workspace( request, template_name='dash/create_dashboard_workspace.html', template_name_ajax='dash/create_dashboard_workspace_ajax.html'): """ Create dashboard workspace. :param django.http.HttpRequest request: :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) if 'POST' == request.method: form = DashboardWorkspaceForm( data=request.POST, files=request.FILES, different_layouts=dashboard_settings.allow_different_layouts) if form.is_valid(): obj = form.save(commit=False) obj.user = request.user if not dashboard_settings.allow_different_layouts: obj.layout_uid = layout.uid obj.save() messages.info( request, _('The dashboard workspace "{0}" was ' 'created successfully.').format(obj.name)) return redirect('dash.edit_dashboard', workspace=obj.slug) else: form = DashboardWorkspaceForm( initial={ 'user': request.user, 'layout_uid': layout.uid, }, different_layouts=dashboard_settings.allow_different_layouts) if layout.create_dashboard_workspace_ajax_template_name: template_name_ajax = layout.create_dashboard_workspace_ajax_template_name if request.is_ajax(): template_name = template_name_ajax elif layout.create_dashboard_workspace_template_name: template_name = layout.create_dashboard_workspace_template_name context = { 'layout': layout, 'form': form, 'dashboard_settings': dashboard_settings } return render_to_response(template_name, context, context_instance=RequestContext(request))
def delete_dashboard_workspace(request, workspace_id, template_name='dash/delete_dashboard_workspace.html', \ template_name_ajax='dash/delete_dashboard_workspace_ajax.html'): """ Delete dashboard workspace. :param django.http.HttpRequest request: :param int workspace_id: DashboardWorkspace id. :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) # Check if user trying to edit the dashboard workspace actually owns it and then delete the workspace. if 'POST' == request.method and 'delete' in request.POST is None and request.POST.get('next', None): return redirect(request.POST.get('next')) try: obj = DashboardWorkspace._default_manager.get(pk=workspace_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) if 'POST' == request.method: if 'delete' in request.POST: workspace_name = obj.name # Getting the (frozen) queryset. dashboard_entries = DashboardEntry._default_manager \ .filter(user=request.user, layout_uid=layout.uid, workspace__id=workspace_id) \ .select_related('workspace', 'user') \ .order_by('placeholder_uid', 'position')[:] # Cleaning the plugin data for the deleted entries. clean_plugin_data(dashboard_entries, request=request) # Delete the workspace. obj.delete() messages.info(request, _('The dashboard workspace "{0}" was deleted successfully.').format(workspace_name)) return redirect('dash.edit_dashboard') if request.POST.get('next', None): return redirect(request.POST.get('next')) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'workspace': obj, 'dashboard_settings': dashboard_settings } return render_to_response(template_name, context, context_instance=RequestContext(request))
def test_03_get_layout_placeholders(self): """ Test active layout placeholders (`get_placeholder_instances`). """ layout_cls = get_layout() layout = layout_cls() res = layout.get_placeholder_instances() self.assertTrue(len(res) > 0) return res
def edit_dashboard_workspace(request, workspace_id, \ template_name='dash/edit_dashboard_workspace.html', \ template_name_ajax='dash/edit_dashboard_workspace_ajax.html'): """ Edit dashboard workspace. :param django.http.HttpRequest request: :param int workspace_id: DashboardWorkspace ID. :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) # Check if user trying to edit the dashboard workspace actually owns it. try: obj = DashboardWorkspace._default_manager \ .get(pk=workspace_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) if 'POST' == request.method: form = DashboardWorkspaceForm( data = request.POST, files = request.FILES, instance = obj ) if form.is_valid(): form.save(commit=False) obj.user = request.user obj.layout_uid = layout.uid obj.save() messages.info(request, _('The dashboard workspace "{0}" was ' 'edited successfully.').format(obj.name)) return redirect('dash.edit_dashboard', workspace=obj.slug) else: form = DashboardWorkspaceForm(instance=obj) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'form': form, 'workspace_id': workspace_id, 'dashboard_settings': dashboard_settings } return render_to_response( template_name, context, context_instance=RequestContext(request) )
def create_dashboard_workspace(request, \ template_name='dash/create_dashboard_workspace.html', \ template_name_ajax='dash/create_dashboard_workspace_ajax.html'): """ Create dashboard workspace. :param django.http.HttpRequest request: :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) if 'POST' == request.method: form = DashboardWorkspaceForm( data=request.POST, files=request.FILES, different_layouts=dashboard_settings.allow_different_layouts ) if form.is_valid(): obj = form.save(commit=False) obj.user = request.user if not dashboard_settings.allow_different_layouts: obj.layout_uid = layout.uid obj.save() messages.info(request, _('The dashboard workspace "{0}" was ' 'created successfully.').format(obj.name)) return redirect('dash.edit_dashboard', workspace=obj.slug) else: form = DashboardWorkspaceForm( initial={ 'user': request.user, 'layout_uid': layout.uid, }, different_layouts=dashboard_settings.allow_different_layouts ) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'form': form, 'dashboard_settings': dashboard_settings } return render_to_response( template_name, context, context_instance=RequestContext(request) )
def edit_dashboard_workspace(request, workspace_id, \ template_name='dash/edit_dashboard_workspace.html', \ template_name_ajax='dash/edit_dashboard_workspace_ajax.html'): """ Edit dashboard workspace. :param django.http.HttpRequest request: :param int workspace_id: DashboardWorkspace ID. :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) # Check if user trying to edit the dashboard workspace actually owns it. try: obj = DashboardWorkspace._default_manager \ .get(pk=workspace_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) if 'POST' == request.method: form = DashboardWorkspaceForm(data=request.POST, files=request.FILES, instance=obj) if form.is_valid(): form.save(commit=False) obj.user = request.user obj.layout_uid = layout.uid obj.save() messages.info( request, _('The dashboard workspace "{0}" was ' 'edited successfully.').format(obj.name)) return redirect('dash.edit_dashboard', workspace=obj.slug) else: form = DashboardWorkspaceForm(instance=obj) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'form': form, 'workspace_id': workspace_id, 'dashboard_settings': dashboard_settings } return render_to_response(template_name, context, context_instance=RequestContext(request))
def edit_dashboard(request, workspace=None): """ Edit dashboard. :param django.http.HttpRequest request: :param string workspace: Workspace slug. If given, the workspace loaded. Otherwise we deal with no workspace. :return django.http.HttpResponse: """ # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(request.user) user_plugin_uids = [uid for uid, repr in registered_plugins] # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) # Getting the (frozen) queryset. dashboard_entries = DashboardEntry._default_manager \ .get_for_user(user=request.user, layout_uid=layout.uid, workspace=workspace) \ .select_related('workspace', 'user') \ .filter(plugin_uid__in=user_plugin_uids) \ .order_by('placeholder_uid', 'position')[:] placeholders = layout.get_placeholder_instances(dashboard_entries, workspace=workspace, request=request) layout.collect_widget_media(dashboard_entries) context = { 'placeholders': placeholders, 'placeholders_dict': iterable_to_dict(placeholders, key_attr_name='uid'), 'css': layout.get_css(placeholders), 'layout': layout, 'edit_mode': True, 'dashboard_settings': dashboard_settings } workspaces = get_workspaces(request.user, layout.uid, workspace) # If workspace with slug given is not found in the list of workspaces # redirect to the default dashboard. if workspaces['current_workspace_not_found']: messages.info( request, _('The workspace with slug "{0}" does not belong to layout "{1}".').format(workspace, layout.name) ) return redirect('dash.edit_dashboard') context.update(workspaces) context.update({'public_dashboard_url': get_public_dashboard_url(dashboard_settings)}) template_name = layout.get_edit_template_name(request) return render_to_response(template_name, context, context_instance=RequestContext(request))
def edit_dashboard_settings(request, \ template_name='dash/edit_dashboard_settings.html', \ template_name_ajax='dash/edit_dashboard_settings_ajax.html'): """ Edit dashboard settings. :param django.http.HttpRequest request: :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) if 'POST' == request.method: form = DashboardSettingsForm( data = request.POST, files = request.FILES, instance = dashboard_settings ) if form.is_valid(): form.save(commit=False) dashboard_settings.user = request.user dashboard_settings.save() messages.info(request, _('Dashboard settings were edited ' 'successfully.')) return redirect('dash.edit_dashboard') else: form = DashboardSettingsForm(instance=dashboard_settings) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'form': form, 'dashboard_settings': dashboard_settings } return render_to_response( template_name, context, context_instance=RequestContext(request) )
def get_or_create_dashboard_settings(user): """ Gets dashboard settings for the user given. If no settings found, creates default settings. :param django.contrib.auth.models.User: :return dash.models.DashboardSettings: Returns ``dash.models.DashboardSettings`` instance. """ # Check if user trying to edit the dashboard workspace actually owns it. try: dashboard_settings = DashboardSettings._default_manager.select_related('user').get(user=user) except ObjectDoesNotExist as e: layout = get_layout(as_instance=True) dashboard_settings = DashboardSettings() dashboard_settings.layout_uid = layout.uid dashboard_settings.user = user dashboard_settings.save() return dashboard_settings
def paste_dashboard_entry(request, placeholder_uid, position, workspace=None): """ Pastes the dashboard entry from clipboard if any available. :param django.http.HttpRequest request: :param str placeholder: :param int position: :param str workspace: Workspace slug. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) try: plugin_uid, success = paste_entry_from_clipboard( request, layout, placeholder_uid, position, workspace=workspace ) except Exception as e: plugin_uid, success = str(e), False if plugin_uid and success: plugin = plugin_registry.get(plugin_uid) messages.info( request, _('The dashboard function "{0}" was successfully pasted from ' 'clipboard.').format(safe_text(plugin.name)) ) else: # In case if not success, ``plugin_uid`` would be holding the error # message. messages.info( request, _('Problems occured while pasting from ' 'clipboard. {0}'.format(safe_text(plugin_uid))) ) if workspace: return redirect('dash.edit_dashboard', workspace=workspace) else: return redirect('dash.edit_dashboard')
def dashboard_workspaces(request, workspace=None, \ template_name='dash/dashboard_workspaces.html', \ template_name_ajax='dash/dashboard_workspaces_ajax.html'): """ Workspaces list. :param django.http.HttpRequest request: :param string workspace: Workspace slug. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) context = get_workspaces( request.user, dashboard_settings.layout_uid, workspace, different_layouts=dashboard_settings.allow_different_layouts ) if dashboard_settings.allow_different_layouts and context['current_workspace']: layout_uid = context['current_workspace'].layout_uid else: layout_uid = dashboard_settings.layout_uid layout = get_layout( layout_uid=layout_uid, as_instance=True ) context.update({ 'layout': layout, 'dashboard_settings': dashboard_settings }) if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def test_05_get_occupied_cells(self): """ Test ``dash.utils.get_occupied_cells``. """ # Fake dashboard entry class Entry(object): pass layout = get_layout(as_instance=True) placeholder = layout.get_placeholder('main') res = [] if 'android' == layout.uid: # *********** First test # 2 x 2 widget r = get_occupied_cells(layout, placeholder, 'memo_2x2', 3) self.assertEqual(r, [3, 4, 9, 10]) res.append(r) # *********** Second test # 3 x 3 widget r = get_occupied_cells(layout, placeholder, 'memo_3x3', 16) self.assertEqual(r, [16, 17, 18, 22, 23, 24, 28, 29, 30]) res.append(r) # *********** Third test (the nasty one) # 3 x 3 widget #r = get_occupied_cells(layout, placeholder, 'memo_3x3', 17) #self.assertEqual(r, [16, 17,18, 22, 23, 24, 28, 29, 30]) #res.append(r) return res
def test_05_get_occupied_cells(self): """ Test ``dash.utils.get_occupied_cells``. """ # Fake dashboard entry class Entry(object): pass layout = get_layout(as_instance=True) placeholder = layout.get_placeholder("main") res = [] if "android" == layout.uid: # *********** First test # 2 x 2 widget r = get_occupied_cells(layout, placeholder, "memo_2x2", 3) self.assertEqual(r, [3, 4, 9, 10]) res.append(r) # *********** Second test # 3 x 3 widget r = get_occupied_cells(layout, placeholder, "memo_3x3", 16) self.assertEqual(r, [16, 17, 18, 22, 23, 24, 28, 29, 30]) res.append(r) # *********** Third test (the nasty one) # 3 x 3 widget # r = get_occupied_cells(layout, placeholder, 'memo_3x3', 17) # self.assertEqual(r, [16, 17,18, 22, 23, 24, 28, 29, 30]) # res.append(r) return res
def plugin_widgets(request, placeholder_uid, workspace=None, position=None, \ template_name='dash/plugin_widgets.html', template_name_ajax='dash/plugin_widgets_ajax.html'): """ Plugin widgets view. Lists all the widgets for the placeholder and workspace given. :param django.http.HttpRequest request: :param string placeholder_uid: Placeholder UID. :param int position: Position on the dashboard to which the widget is to be added. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) placeholder = layout.get_placeholder(placeholder_uid) if not validate_placeholder_uid(layout, placeholder_uid): raise Http404(_("Invalid placeholder: {0}").format(placeholder_uid)) occupied_cells = build_cells_matrix(request.user, layout, placeholder, workspace=workspace) context = { 'layout': layout, 'grouped_widgets': get_widgets( layout, placeholder, request.user, workspace=workspace, position=position, occupied_cells=occupied_cells ), 'dashboard_settings': dashboard_settings } if request.is_ajax(): template_name = template_name_ajax return render_to_response(template_name, context, context_instance=RequestContext(request))
def get_or_create_dashboard_settings(user): """ Gets dashboard settings for the user given. If no settings found, creates default settings. :param django.contrib.auth.models.User: :return dash.models.DashboardSettings: Returns ``dash.models.DashboardSettings`` instance. """ # Check if user trying to edit the dashboard workspace actually owns it. try: dashboard_settings = DashboardSettings._default_manager \ .select_related('user') \ .get(user=user) except ObjectDoesNotExist as e: layout = get_layout(as_instance=True) dashboard_settings = DashboardSettings() dashboard_settings.layout_uid = layout.uid dashboard_settings.user = user dashboard_settings.save() return dashboard_settings
def detail(request, slug, template_name='news/detail.html', template_name_ajax='news/detail_ajax.html'): """News item detail. In the template, we show the title and the body of the news item and links. :param django.http.HttpRequest request: :param string slug: Foo item slug. :param string template_name: :param string template_name_ajax: :return django.http.HttpResponse: """ layout = get_layout(as_instance=True) results_kwargs = {'slug': slug} try: queryset = NewsItem.objects.filter(**results_kwargs) item = queryset.get(**results_kwargs) except NewsItem.DoesNotExist: raise Http404 context = { 'layout': layout, 'item': item } if request.is_ajax(): template_name = template_name_ajax if versions.DJANGO_GTE_1_10: return render(request, template_name, context) else: return render_to_response( template_name, context, context_instance=RequestContext(request) )
def edit_dashboard_entry(request, entry_id, \ template_name='dash/edit_dashboard_entry.html', \ template_name_ajax='dash/edit_dashboard_entry_ajax.html'): """ Edit dashboard entry. :param django.http.HttpRequest request: :param int entry_id: ID of the dashboard entry to edit. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) try: obj = DashboardEntry._default_manager \ .select_related('workspace') \ .get(pk=entry_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) if obj.layout_uid: layout_uid = obj.layout_uid else: layout_uid = dashboard_settings.layout_uid layout = get_layout( layout_uid=layout_uid, as_instance=True ) plugin = obj.get_plugin(fetch_related_data=True) plugin.request = request if plugin.edit_form_template: template_name = plugin.edit_form_template # Template context context = { 'layout': layout, 'dashboard_settings': dashboard_settings } # If plugin has form, it is configurable which means we have to load the # plugin form and validate user input. plugin_form = plugin.get_form() if plugin_form: # If POST request and form data is valid, save the data and redirect # to the dashboard edit. if 'POST' == request.method: form = plugin.get_initialised_edit_form_or_404( data=request.POST, files=request.FILES, ) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) # Save the object. obj.save() messages.info(request, _('The dashboard widget "{0}" was edited ' 'successfully.').format(plugin.name)) # Redirect to edit dashboard view if obj.workspace: return redirect( 'dash.edit_dashboard', workspace=obj.workspace.slug ) else: return redirect('dash.edit_dashboard') else: form = plugin.get_initialised_edit_form_or_404() context.update({'form': form, 'plugin': plugin}) if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def browse(request, template_name='news/browse.html', template_name_ajax='news/browse_ajax.html'): """ In the template, we show all available NewsItems. :param django.http.HttpRequest request: :param string template_name: :param string template_name_ajax: :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) results_kwargs = {} queryset = NewsItem.objects \ .filter(**results_kwargs) \ .order_by('-date_published') page = request.GET.get(PAGE_URL_PARAM, 1) num_posts = request.GET.get(NUM_POSTS_URL_PARAM, DEFAULT_MAX_NEWS_ITEMS) try: num_posts = int(num_posts) except Exception as e: num_posts = DEFAULT_MAX_NEWS_ITEMS if num_posts < 1 or num_posts > MAX_NUM_POSTS_LISTING: num_posts = DEFAULT_MAX_NEWS_ITEMS paginator = Paginator(queryset, num_posts, allow_empty_first_page=False) try: page_number = int(page) except ValueError as e: if 'last' == page: page_number = paginator.num_pages else: raise Http404(_("Invalid page!")) try: page_obj = paginator.page(page_number) except InvalidPage as e: raise Http404(_("Invalid page!")) _next = '' if page_obj.has_next() and page_obj.next_page_number() is not None: _next = page_obj.next_page_number() _prev = '' if page_obj.has_previous() and page_obj.previous_page_number() is not None: _prev = page_obj.previous_page_number() context = { 'layout': layout, 'PAGE_URL_PARAM': PAGE_URL_PARAM, 'NUM_POSTS_URL_PARAM': NUM_POSTS_URL_PARAM, # Pagination specific 'paginator': paginator, 'page_obj': page_obj, 'results_per_page': paginator.per_page, 'has_next': page_obj.has_next(), 'has_previous': page_obj.has_previous(), 'page': page_obj.number, 'next': _next, 'previous': _prev, 'first_on_page': page_obj.start_index(), 'last_on_page': page_obj.end_index(), 'pages': paginator.num_pages, 'hits': paginator.count, 'page_range': paginator.page_range, 'items': page_obj.object_list, 'request_path': request.path } if request.is_ajax(): template_name = template_name_ajax if versions.DJANGO_GTE_1_10: return render(request, template_name, context) else: return render_to_response( template_name, context, context_instance=RequestContext(request) )
def plugin_widgets(request, placeholder_uid, workspace=None, position=None, \ template_name='dash/plugin_widgets.html', \ template_name_ajax='dash/plugin_widgets_ajax.html'): """ Plugin widgets view. Lists all the widgets for the placeholder and workspace given. :param django.http.HttpRequest request: :param string placeholder_uid: Placeholder UID. :param int position: Position on the dashboard to which the widget is to be added. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid = dashboard_settings.layout_uid, as_instance = True ) placeholder = layout.get_placeholder(placeholder_uid) if not validate_placeholder_uid(layout, placeholder_uid): raise Http404(_("Invalid placeholder: {0}").format(placeholder_uid)) occupied_cells = build_cells_matrix( request.user, layout, placeholder, workspace = workspace ) # Here we checking if clipboard contains a plugin which is suitable for # being pasted into the cell given. paste_from_clipboard_url = None # First get the clipboard data. clipboard_plugin_data = get_plugin_data_from_clipboard(request, layout.uid) # If clipboard data is not empty, check if the data is suitable for # being pasted into the position given. if clipboard_plugin_data: can_paste_from_clipboard = can_paste_entry_from_clipboard( request = request, layout = layout, placeholder_uid = placeholder_uid, position = position, workspace = workspace ) if can_paste_from_clipboard: kwargs = { 'placeholder_uid': placeholder_uid, 'position': position } if workspace: kwargs.update({'workspace': workspace,}) paste_from_clipboard_url = reverse( 'dash.paste_dashboard_entry', kwargs = kwargs ) if int(position) in occupied_cells: registered_plugins = get_user_plugins(request.user) user_plugin_uids = [uid for uid, repr in registered_plugins] dashboard_entries = DashboardEntry._default_manager.get_for_user(user=request.user, layout_uid=layout.uid, workspace=workspace)\ .select_related('workspace', 'user')\ .filter(plugin_uid__in=user_plugin_uids)\ .filter(placeholder_uid=placeholder.uid)\ .order_by('placeholder_uid', 'position')[:] for dashboard_entry in dashboard_entries: if int(position) == dashboard_entry.position: occupied_cells = get_occupied_cells( layout, placeholder, dashboard_entry.plugin_uid, dashboard_entry.position ) context = { 'layout': layout, 'grouped_widgets': get_widgets( layout, placeholder, request.user, workspace = workspace, position = position, occupied_cells = occupied_cells ), 'dashboard_settings': dashboard_settings, 'paste_from_clipboard_url': paste_from_clipboard_url, } else: context = { 'layout': layout, 'grouped_widgets': get_widgets( layout, placeholder, request.user, workspace = workspace, position = position, occupied_cells = occupied_cells ), 'dashboard_settings': dashboard_settings, 'paste_from_clipboard_url': paste_from_clipboard_url, } if request.is_ajax(): template_name = layout.plugin_widgets_template_name_ajax return render_to_response( template_name, context, context_instance = RequestContext(request) )
def edit_dashboard_entry(request, entry_id, template_name='dash/edit_dashboard_entry.html', template_name_ajax='dash/edit_dashboard_entry_ajax.html'): """ Edit dashboard entry. :param django.http.HttpRequest request: :param int entry_id: ID of the dashboard entry to edit. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) try: obj = DashboardEntry._default_manager \ .select_related('workspace') \ .get(pk=entry_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) plugin = obj.get_plugin(fetch_related_data=True) plugin.request = request if plugin.edit_form_template: template_name = plugin.edit_form_template # Template context context = { 'layout': layout, 'dashboard_settings': dashboard_settings } # If plugin has form, it is configurable which means we have to load the # plugin form and validate user input. plugin_form = plugin.get_form() if plugin_form: # If POST request and form data is valid, save the data and redirect # to the dashboard edit. if 'POST' == request.method: form = plugin.get_initialised_edit_form_or_404( data=request.POST, files=request.FILES ) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) # Save the object. obj.save() messages.info(request, _('The dashboard widget "{0}" was edited ' 'successfully.').format(plugin.name)) # Redirect to edit dashboard view if obj.workspace: return redirect( 'dash.edit_dashboard', workspace=obj.workspace.slug ) else: return redirect('dash.edit_dashboard') else: form = plugin.get_initialised_edit_form_or_404() context.update({'form': form, 'plugin': plugin}) if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def add_dashboard_entry(request, placeholder_uid, plugin_uid, workspace=None, \ position=None, \ template_name='dash/add_dashboard_entry.html', \ template_name_ajax='dash/add_dashboard_entry_ajax.html'): """ Add dashboard entry. :param django.http.HttpRequest request: :param string placeholder_uid: Placeholder UID. :param string plugin_uid: Plugin UID. :param string workspace: Workspace slug. :param int position: If given, provided as position for the plugin (conflict resolution should take place). :param string template_name: :param string template_name_ajax: Template used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid=dashboard_settings.layout_uid, as_instance=True ) if not validate_placeholder_uid(layout, placeholder_uid): raise Http404(_("Invalid placeholder: {0}").format(placeholder_uid)) if not validate_plugin_uid(plugin_uid): raise Http404(_("Invalid plugin name: {0}").format(plugin_uid)) plugin = plugin_registry.get(plugin_uid)(layout.uid, placeholder_uid) plugin.request = request if plugin.add_form_template: template_name = plugin.add_form_template # Template context context = { 'layout': layout, 'dashboard_settings': dashboard_settings } obj = DashboardEntry() obj.layout_uid = layout.uid obj.placeholder_uid = placeholder_uid obj.plugin_uid = plugin_uid obj.user = request.user occupied_cells = build_cells_matrix( request.user, layout, placeholder=layout.get_placeholder(placeholder_uid), workspace=workspace ) # If plugin has form, it is configurable which means we have to load the # plugin form and validate user input. plugin_form = plugin.get_form() if plugin_form: # If POST request and form data is valid, save the data and redirect # to the dashboard edit. if 'POST' == request.method: form = plugin.get_initialised_create_form_or_404( data=request.POST, files=request.FILES ) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) # Handling the workspace. workspace_id = None obj.workspace = workspace_id if workspace: workspace_slug = slugify_workspace(workspace) workspace_id = DashboardWorkspace.objects.get(name=workspace).pk try: obj.workspace = DashboardWorkspace._default_manager.get( slug = workspace_slug, user = request.user, layout_uid = layout.uid ) except ObjectDoesNotExist as e: messages.info( request, _('The workspace with slug "{0}" does not belong to ' 'layout "{1}".').format(workspace_slug, layout.name) ) return redirect('dash.edit_dashboard') # If position given, use it. try: position = int(position) except Exception as e: position = None if position: obj.position = position # Save the object. obj.save() if int(position) in occupied_cells: if not DashboardEntry.objects.filter(position=int(position), layout_uid=layout.uid, workspace_id=workspace_id, plugin_uid__startswith='WidgetSwitcher').exists(): pattern = re.compile(r'\d+x\d+') dimensions = pattern.search(str(plugin_uid)) switcher = DashboardEntry() switcher.layout_uid = layout.uid switcher.placeholder_uid = placeholder_uid switcher.plugin_uid = 'WidgetSwitcher_'+dimensions.group() switcher.user = request.user switcher.plugin_data = json.dumps({"timer": 10}) switcher.position = int(position) switcher.workspace = None if workspace: switcher.workspace = DashboardWorkspace._default_manager.get( slug=workspace_slug, user=request.user, layout_uid=layout.uid ) switcher.save() messages.info(request, _('The dashboard widget "{0}" was added ' 'successfully.').format(plugin.name)) # Redirect to the dashboard view. if obj.workspace: return redirect( 'dash.edit_dashboard', workspace=obj.workspace.slug ) else: return redirect('dash.edit_dashboard') # If POST but data invalid, show the form with errors. else: form = plugin.get_initialised_create_form_or_404() context.update( {'form': form, 'plugin_uid': plugin_uid, 'plugin': plugin} ) # If plugin is not configurable, it's just saved as is. else: obj.save() return redirect('dash.edit_dashboard') if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def public_dashboard(request, username, workspace=None, template_name='public_dashboard/public_dashboard.html'): """ Public dashboard. :param django.http.HttpRequest: :param string username: :param string workspace: Workspace slug. :param string template_name: :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_dashboard_settings(username) if dashboard_settings: layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) user = dashboard_settings.user else: raise Http404 # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(user) user_plugin_uids = [uid for uid, repr in registered_plugins] logger.debug(user_plugin_uids) # A complex query required. All entries shall be taken from default dashboard (no workspace) and # joined with all entries of workspaces set to be public. Getting the (frozen) queryset. if workspace: entries_q = Q(user=user, layout_uid=layout.uid, workspace__slug=workspace, workspace__is_public=True, plugin_uid__in=user_plugin_uids) else: entries_q = Q(user=user, layout_uid=layout.uid, workspace=None) dashboard_entries = DashboardEntry._default_manager \ .filter(entries_q) \ .select_related('workspace', 'user') \ .order_by('placeholder_uid', 'position')[:] #logger.debug(dashboard_entries) placeholders = layout.get_placeholder_instances(dashboard_entries, request=request) layout.collect_widget_media(dashboard_entries) context = { 'placeholders': placeholders, 'placeholders_dict': iterable_to_dict(placeholders, key_attr_name='uid'), 'css': layout.get_css(placeholders), 'layout': layout, 'user': user, 'master_template': layout.get_view_template_name(request, origin='dash.public_dashboard'), 'dashboard_settings': dashboard_settings } workspaces = get_workspaces(user, layout.uid, workspace, public=True) # If workspace with slug given is not found in the list of workspaces # redirect to the default dashboard. if workspaces['current_workspace_not_found']: messages.info( request, _('The workspace with slug "{0}" does not exist.').format( workspace)) return redirect('dash.public_dashboard', username=username) context.update(workspaces) return render(request, template_name, context)
def add_dashboard_entry(request, placeholder_uid, plugin_uid, workspace=None, \ position=None, \ template_name='dash/add_dashboard_entry.html', \ template_name_ajax='dash/add_dashboard_entry_ajax.html'): """ Add dashboard entry. :param django.http.HttpRequest request: :param string placeholder_uid: Placeholder UID. :param string plugin_uid: Plugin UID. :param string workspace: Workspace slug. :param int position: If given, provided as position for the plugin (conflict resolution should take place). :param string template_name: :param string template_name_ajax: Template used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) if workspace: workspace_slug = slugify_workspace(workspace) filters = { 'slug': workspace_slug, 'user': request.user, } if not dashboard_settings.allow_different_layouts: filters.update({ 'layout_uid': dashboard_settings.layout_uid, }) try: workspace = DashboardWorkspace._default_manager.get(**filters) except ObjectDoesNotExist as e: if dashboard_settings.allow_different_layouts: message = _('The workspace with slug "{0}" was not foundi.').format(workspace_slug) else: message = __('The workspace with slug "{0}" does not belong to ' 'layout "{1}".').format(workspace_slug, layout.name) messages.info(request, message) return redirect('dash.edit_dashboard') if dashboard_settings.allow_different_layouts and workspace: layout_uid = workspace.layout_uid else: layout_uid = dashboard_settings.layout_uid layout = get_layout(layout_uid=layout_uid, as_instance=True) if not validate_placeholder_uid(layout, placeholder_uid): raise Http404(_("Invalid placeholder: {0}").format(placeholder)) if not validate_plugin_uid(plugin_uid): raise Http404(_("Invalid plugin name: {0}").format(plugin_uid)) plugin = plugin_registry.get(plugin_uid)(layout.uid, placeholder_uid) plugin.request = request if plugin.add_form_template: template_name = plugin.add_form_template # Template context context = { 'layout': layout, 'dashboard_settings': dashboard_settings } obj = DashboardEntry() obj.layout_uid = layout.uid obj.placeholder_uid = placeholder_uid obj.plugin_uid = plugin_uid obj.user = request.user obj.workspace = workspace # If plugin has form, it is configurable which means we have to load the # plugin form and validate user input. plugin_form = plugin.get_form() if plugin_form: # If POST request and form data is valid, save the data and redirect # to the dashboard edit. if 'POST' == request.method: form = plugin.get_initialised_create_form_or_404( data=request.POST, files=request.FILES ) if form.is_valid(): # Saving the plugin form data. form.save_plugin_data(request=request) # Getting the plugin data. obj.plugin_data = form.get_plugin_data(request=request) # If position given, use it. try: position = int(position) except Exception as e: position = None if position: obj.position = position # Save the object. obj.save() messages.info(request, _('The dashboard widget "{0}" was added ' 'successfully.').format(plugin.name)) # Redirect to the dashboard view. if obj.workspace: return redirect( 'dash.edit_dashboard', workspace=obj.workspace.slug ) else: return redirect('dash.edit_dashboard') # If POST but data invalid, show the form with errors. else: form = plugin.get_initialised_create_form_or_404() context.update( {'form': form, 'plugin_uid': plugin_uid, 'plugin': plugin} ) # If plugin is not configurable, it's just saved as is. else: obj.save() return redirect('dash.edit_dashboard') if request.is_ajax(): template_name = template_name_ajax return render_to_response( template_name, context, context_instance=RequestContext(request) )
def browse(request, template_name='news/browse.html', template_name_ajax='news/browse_ajax.html'): """ In the template, we show all available NewsItems. :param django.http.HttpRequest request: :param string template_name: :param string template_name_ajax: :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) results_kwargs = {} queryset = NewsItem.objects \ .filter(**results_kwargs) \ .order_by('-date_published') page = request.GET.get(PAGE_URL_PARAM, 1) num_posts = request.GET.get(NUM_POSTS_URL_PARAM, DEFAULT_MAX_NEWS_ITEMS) try: num_posts = int(num_posts) except Exception as e: num_posts = DEFAULT_MAX_NEWS_ITEMS if num_posts < 1 or num_posts > MAX_NUM_POSTS_LISTING: num_posts = DEFAULT_MAX_NEWS_ITEMS paginator = Paginator(queryset, num_posts, allow_empty_first_page=False) try: page_number = int(page) except ValueError as e: if 'last' == page: page_number = paginator.num_pages else: raise Http404(_("Invalid page!")) try: page_obj = paginator.page(page_number) except InvalidPage as e: raise Http404(_("Invalid page!")) _next = '' if page_obj.has_next() and page_obj.next_page_number() is not None: _next = page_obj.next_page_number() _prev = '' if page_obj.has_previous() and page_obj.previous_page_number() is not None: _prev = page_obj.previous_page_number() context = { 'layout': layout, 'PAGE_URL_PARAM': PAGE_URL_PARAM, 'NUM_POSTS_URL_PARAM': NUM_POSTS_URL_PARAM, # Pagination specific 'paginator': paginator, 'page_obj': page_obj, 'results_per_page': paginator.per_page, 'has_next': page_obj.has_next(), 'has_previous': page_obj.has_previous(), 'page': page_obj.number, 'next': _next, 'previous': _prev, 'first_on_page': page_obj.start_index(), 'last_on_page': page_obj.end_index(), 'pages': paginator.num_pages, 'hits': paginator.count, 'page_range': paginator.page_range, 'items': page_obj.object_list, 'request_path': request.path } if request.is_ajax(): template_name = template_name_ajax if versions.DJANGO_GTE_1_10: return render(request, template_name, context) else: return render_to_response(template_name, context, context_instance=RequestContext(request))
def delete_dashboard_workspace(request, workspace_id, \ template_name='dash/delete_dashboard_workspace.html', \ template_name_ajax='dash/delete_dashboard_workspace_ajax.html'): """ Delete dashboard workspace. :param django.http.HttpRequest request: :param int workspace_id: DashboardWorkspace id. :param string template_name: :param string template_name_ajax: Template used for AJAX calls. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) # Check if user trying to edit the dashboard workspace actually owns it and then delete the workspace. if 'POST' == request.method and 'delete' in request.POST is None and request.POST.get('next', None): return redirect(request.POST.get('next')) try: obj = DashboardWorkspace._default_manager \ .get(pk=workspace_id, user=request.user) except ObjectDoesNotExist as e: raise Http404(e) layout = get_layout( layout_uid=workspace.layout_uid, as_instance=True ) if 'POST' == request.method: if 'delete' in request.POST: workspace_name = obj.name # Getting the (frozen) queryset. dashboard_entries = DashboardEntry._default_manager \ .filter(user=request.user, \ layout_uid=layout.uid, \ workspace__id=workspace_id) \ .select_related('workspace', 'user') \ .order_by('placeholder_uid', 'position')[:] # Cleaning the plugin data for the deleted entries. clean_plugin_data(dashboard_entries, request=request) # Delete the workspace. obj.delete() messages.info(request, _('The dashboard workspace "{0}" was deleted ' 'successfully.').format(workspace_name)) return redirect('dash.edit_dashboard') if request.POST.get('next', None): return redirect(request.POST.get('next')) if request.is_ajax(): template_name = template_name_ajax context = { 'layout': layout, 'workspace': obj, 'dashboard_settings': dashboard_settings } return render_to_response( template_name, context, context_instance=RequestContext(request) )
def public_dashboard(request, username, workspace=None, template_name='public_dashboard/public_dashboard.html'): """ Public dashboard. :param django.http.HttpRequest: :param string username: :param string workspace: Workspace slug. :param string template_name: :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_dashboard_settings(username) if dashboard_settings: layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) user = dashboard_settings.user else: raise Http404 # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(user) user_plugin_uids = [uid for uid, repr in registered_plugins] logger.debug(user_plugin_uids) # A complex query required. All entries shall be taken from default dashboard (no workspace) and # joined with all entries of workspaces set to be public. Getting the (frozen) queryset. if workspace: entries_q = Q( user = user, layout_uid = layout.uid, workspace__slug = workspace, workspace__is_public = True, plugin_uid__in = user_plugin_uids ) else: entries_q = Q(user=user, layout_uid=layout.uid, workspace=None) dashboard_entries = DashboardEntry._default_manager \ .filter(entries_q) \ .select_related('workspace', 'user') \ .order_by('placeholder_uid', 'position')[:] #logger.debug(dashboard_entries) placeholders = layout.get_placeholder_instances(dashboard_entries, request=request) layout.collect_widget_media(dashboard_entries) context = { 'placeholders': placeholders, 'placeholders_dict': iterable_to_dict(placeholders, key_attr_name='uid'), 'css': layout.get_css(placeholders), 'layout': layout, 'user': user, 'master_template': layout.get_view_template_name(request, origin='dash.public_dashboard'), 'dashboard_settings': dashboard_settings } workspaces = get_workspaces(user, layout.uid, workspace, public=True) # If workspace with slug given is not found in the list of workspaces # redirect to the default dashboard. if workspaces['current_workspace_not_found']: messages.info( request, _('The workspace with slug "{0}" does not exist.').format(workspace) ) return redirect('dash.public_dashboard', username=username) context.update(workspaces) return render_to_response(template_name, context, context_instance=RequestContext(request))
def plugin_widgets(request, placeholder_uid, workspace=None, position=None, \ template_name='dash/plugin_widgets.html', \ template_name_ajax='dash/plugin_widgets_ajax.html'): """ Plugin widgets view. Lists all the widgets for the placeholder and workspace given. :param django.http.HttpRequest request: :param string placeholder_uid: Placeholder UID. :param int position: Position on the dashboard to which the widget is to be added. :param string template_name: :param string template_name_ajax: Tempalte used for AJAX requests. :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout( layout_uid = dashboard_settings.layout_uid, as_instance = True ) placeholder = layout.get_placeholder(placeholder_uid) if not validate_placeholder_uid(layout, placeholder_uid): raise Http404(_("Invalid placeholder: {0}").format(placeholder_uid)) occupied_cells = build_cells_matrix( request.user, layout, placeholder, workspace = workspace ) # Here we checking if clipboard contains a plugin which is suitable for # being pasted into the cell given. paste_from_clipboard_url = None # First get the clipboard data. clipboard_plugin_data = get_plugin_data_from_clipboard(request, layout.uid) # If clipboard data is not empty, check if the data is suitable for # being pasted into the position given. if clipboard_plugin_data: can_paste_from_clipboard = can_paste_entry_from_clipboard( request = request, layout = layout, placeholder_uid = placeholder_uid, position = position, workspace = workspace ) if can_paste_from_clipboard: kwargs = { 'placeholder_uid': placeholder_uid, 'position': position } if workspace: kwargs.update({'workspace': workspace,}) paste_from_clipboard_url = reverse( 'dash.paste_dashboard_entry', kwargs = kwargs ) context = { 'layout': layout, 'grouped_widgets': get_widgets( layout, placeholder, request.user, workspace = workspace, position = position, occupied_cells = occupied_cells ), 'dashboard_settings': dashboard_settings, 'paste_from_clipboard_url': paste_from_clipboard_url, } if request.is_ajax(): template_name = layout.plugin_widgets_template_name_ajax return render_to_response( template_name, context, context_instance = RequestContext(request) )
def browse(request, template_name="news/browse.html", template_name_ajax="news/browse_ajax.html"): """ In the template, we show all available NewsItems for current language. :param django.http.HttpRequest request: :param string template_name: :return django.http.HttpResponse: """ # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) layout = get_layout(layout_uid=dashboard_settings.layout_uid, as_instance=True) language = get_language_from_request(request) results_kwargs = {} if language is not None: translation.activate(language) results_kwargs.update({"language": language}) queryset = NewsItem._default_manager.filter(**results_kwargs).order_by("-date_published") page = request.GET.get(PAGE_URL_PARAM, 1) # import ipdb; ipdb.set_trace() num_posts = request.GET.get(NUM_POSTS_URL_PARAM, DEFAULT_MAX_NEWS_ITEMS) try: num_posts = int(num_posts) except Exception as e: num_posts = DEFAULT_MAX_NEWS_ITEMS if num_posts < 1 or num_posts > MAX_NUM_POSTS_LISTING: num_posts = DEFAULT_MAX_NEWS_ITEMS paginator = Paginator(queryset, num_posts, allow_empty_first_page=False) try: page_number = int(page) except ValueError as e: if "last" == page: page_number = paginator.num_pages else: raise Http404(_("Invalid page!")) try: page_obj = paginator.page(page_number) except InvalidPage as e: raise Http404(_("Invalid page!")) context = { "layout": layout, "PAGE_URL_PARAM": PAGE_URL_PARAM, "NUM_POSTS_URL_PARAM": NUM_POSTS_URL_PARAM, # Pagination specific "paginator": paginator, "page_obj": page_obj, "results_per_page": paginator.per_page, "has_next": page_obj.has_next(), "has_previous": page_obj.has_previous(), "page": page_obj.number, "next": page_obj.next_page_number() if page_obj.has_next() and page_obj.next_page_number() is not None else "", "previous": page_obj.previous_page_number() if page_obj.has_previous() and page_obj.previous_page_number() is not None else "", "first_on_page": page_obj.start_index(), "last_on_page": page_obj.end_index(), "pages": paginator.num_pages, "hits": paginator.count, "page_range": paginator.page_range, "items": page_obj.object_list, "request_path": request.path, } if request.is_ajax(): template_name = template_name_ajax return render_to_response(template_name, context, context_instance=RequestContext(request))
def dashboard(request, workspace=None): """ Dashboard. :param django.http.HttpRequest request: :param string workspace: Workspace slug. If given, the workspace loaded. Otherwise we deal with no workspace. :return django.http.HttpResponse: """ # Getting the list of plugins that user is allowed to use. registered_plugins = get_user_plugins(request.user) user_plugin_uids = [uid for uid, repr in registered_plugins] # Getting dashboard settings for the user. Then get users' layout. dashboard_settings = get_or_create_dashboard_settings(request.user) workspaces = get_workspaces( request.user, dashboard_settings.layout_uid, workspace, different_layouts=dashboard_settings.allow_different_layouts ) layout = get_layout( layout_uid=workspaces['current_workspace'].layout_uid if workspaces['current_workspace'] else dashboard_settings.layout_uid, as_instance=True ) # If workspace with slug given is not found in the list of workspaces # redirect to the default dashboard. if workspaces['current_workspace_not_found']: msg = _('The workspace with slug "{0}" does ' 'not belong to layout "{1}".').format(workspace, layout.name) if dashboard_settings.allow_different_layouts: msg = _('The workspace with slug "{0}" does not exist').format( workspace ) messages.info(request, msg) return redirect('dash.edit_dashboard') # Getting the (frozen) queryset. dashboard_entries = DashboardEntry._default_manager \ .get_for_user(user=request.user, \ layout_uid=layout.uid, \ workspace=workspace) \ .select_related('workspace', 'user') \ .filter(plugin_uid__in=user_plugin_uids) \ .order_by('placeholder_uid', 'position')[:] placeholders = layout.get_placeholder_instances( dashboard_entries, request=request ) layout.collect_widget_media(dashboard_entries) context = { 'placeholders': placeholders, 'placeholders_dict': iterable_to_dict(placeholders, \ key_attr_name='uid'), 'css': layout.get_css(placeholders), 'layout': layout, 'dashboard_settings': dashboard_settings } context.update(workspaces) context.update( {'public_dashboard_url': get_public_dashboard_url(dashboard_settings)} ) template_name = layout.get_view_template_name(request) return render_to_response( template_name, context, context_instance=RequestContext(request) )