Skip to content
Snippets Groups Projects
__init__.py 3.86 KiB
Newer Older
from django.views.generic import ListView
from django.views.generic.base import ContextMixin
from django.views.generic.detail import BaseDetailView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import JsonResponse
from django.utils.translation import ugettext_lazy as _
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.mixins import UserPassesTestMixin

import copy

from ..models import AppSettings


class StaffViewMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_staff


class PageViewMixin(ContextMixin):
    page_title = ''

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['page_title'] = self.page_title

        return context


class ActivePageViewMixin(PageViewMixin):
    active_page = ''

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['active_page'] = self.active_page

        return context


class SubmitLabelMixin(ContextMixin):
    submit_label = ''

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['submit_label'] = self.submit_label
        return context


class SuccessUrlMixin(ContextMixin):
    success_url = '#'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['success_url'] = self.success_url
        return context


class CreateViewMixin(SubmitLabelMixin, SuccessMessageMixin, SuccessUrlMixin, ActivePageViewMixin, ContextMixin):
    submit_label = _('Create')
    template_name = 'portal/secure/admin/create_update.html'
    success_message = _('Successfully Created "%(name)s"')


class UpdateViewMixin(SubmitLabelMixin, SuccessMessageMixin, SuccessUrlMixin, ActivePageViewMixin, ContextMixin):
    submit_label = _('Update')
    template_name = 'portal/secure/admin/create_update.html'
    success_message = _('Successfully Updated "%(name)s"')


class DeleteViewMixin(SubmitLabelMixin, SuccessMessageMixin, SuccessUrlMixin, ActivePageViewMixin, ContextMixin):
    submit_label = _('Delete')
    template_name = 'portal/secure/admin/delete.html'
    success_message = _('Successfully Deleted "%(name)s"')


class AppSettingsMixin(ContextMixin):
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        app_settings = AppSettings.objects.first()
        if app_settings and app_settings.home_institution:
            context['home_institution'] = app_settings.home_institution.id
        return context


class AjaxDatatableBackboneMixin(ContextMixin):
    """List view to display a Datatable with AJAX datasource"""
    template_name = 'portal/secure/admin/list.html'
    create_url = '#'
    create_label = _('Create New')
    api_url = ''
    dt_struct = {}

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['create_url'] = self.create_url
        context['create_label'] = self.create_label
        context['api_url'] = self.api_url
        context['dt_struct'] = copy.copy(self.dt_struct)
        return context


    """Children must implement get_rows()
    Keep in mind: overriding get_queryset() to add 'select_related' statements might provide nice speed boost
    """
    def get_rows(self):
        pass

    def render_to_response(self, context, **response_kwargs):
        return JsonResponse({'data': self.get_rows()}, **response_kwargs)


class JSONView(BaseDetailView):
    """Children must implement get_rows()
    Keep in mind: overriding get_queryset() to add 'select_related' statements might provide nice speed boost
    """
    def get_data(self):
        pass

    def render_to_response(self, context, **response_kwargs):
        return JsonResponse({'data': self.get_data()}, **response_kwargs)