def get_workspaces(user, layout_uid=None, workspace=None, public=False): """ Gets previous, current, next and and a queryset of all workspaces. :param string workspace: :param django.contrib.auth.models.User: :return dict: """ # We need to show workspaces q_kwargs = {'user': user, 'layout_uid': layout_uid} if public: q_kwargs.update({'is_public': public}) workspaces = list(DashboardWorkspace._default_manager.filter(**q_kwargs).only('id', 'name', 'slug') \ .order_by('position')[:]) next = None previous = None current = None current_not_found = False if workspace: # Slugifying the workspace workspace_slug = slugify_workspace(workspace) num_workspaces = len(workspaces) for index, ws in enumerate(workspaces): if workspace_slug == ws.slug: current = ws if 0 == index: # No previous workspace (previous is default). try: next = workspaces[1] except IndexError: pass elif num_workspaces == index: # No next workspace (next is default). try: previous = workspaces[index - 1] except IndexError: pass else: # Getting previous and next workspaces. try: previous = workspaces[index - 1] except IndexError: pass try: next = workspaces[index + 1] except IndexError: pass if current is None: current_not_found = True else: try: previous = workspaces[-1] except IndexError as e: pass try: next = workspaces[0] except IndexError as e: pass return { 'workspaces': workspaces, 'next_workspace': next, 'previous_workspace': previous, 'current_workspace': current, 'current_workspace_not_found': current_not_found }
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 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 get_workspaces(user, layout_uid=None, workspace=None, public=False): """ Gets previous, current, next and and a queryset of all workspaces. :param string workspace: :param django.contrib.auth.models.User: :return dict: """ # We need to show workspaces q_kwargs = {'user': user, 'layout_uid': layout_uid} if public: q_kwargs.update({'is_public': public}) workspaces = list(DashboardWorkspace._default_manager \ .filter(**q_kwargs) \ .only('id', 'name', 'slug') \ .order_by('position')[:]) next = None previous = None current = None current_not_found = False if workspace: # Slugifying the workspace workspace_slug = slugify_workspace(workspace) num_workspaces = len(workspaces) for index, ws in enumerate(workspaces): if workspace_slug == ws.slug: current = ws if 0 == index: # No previous workspace (previous is default). try: next = workspaces[1] except IndexError: pass elif num_workspaces == index: # No next workspace (next is default). try: previous = workspaces[index - 1] except IndexError: pass else: # Getting previous and next workspaces. try: previous = workspaces[index - 1] except IndexError: pass try: next = workspaces[index + 1] except IndexError: pass if current is None: current_not_found = True else: try: previous = workspaces[-1] except IndexError as e: pass try: next = workspaces[0] except IndexError as e: pass return { 'workspaces': workspaces, 'next_workspace': next, 'previous_workspace': previous, 'current_workspace': current, 'current_workspace_not_found': current_not_found }