예제 #1
0
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)
        )
예제 #2
0
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)
예제 #3
0
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')
예제 #4
0
파일: views.py 프로젝트: ykkwon/django-dash
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))
예제 #5
0
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))
예제 #6
0
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)
        )
예제 #7
0
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))
예제 #8
0
파일: views.py 프로젝트: GMcD/django-dash
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)
        )
예제 #9
0
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))
예제 #10
0
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)
        )
예제 #11
0
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)
        )
예제 #12
0
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')
예제 #13
0
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')
예제 #14
0
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)
        )
예제 #15
0
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))
예제 #16
0
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))
예제 #17
0
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)
        )
예제 #18
0
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))
예제 #19
0
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)
        )
예제 #20
0
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)
        )
예제 #21
0
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)
        )
예제 #22
0
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)
        )
예제 #23
0
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)
        )
예제 #24
0
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)
        )
예제 #25
0
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)
        )
예제 #26
0
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)
        )