Source code for feder.institutions.views

from atom.views import CreateMessageMixin, DeleteMessageMixin, UpdateMessageMixin
from braces.views import (
    FormValidMessageMixin,
    LoginRequiredMixin,
    PermissionRequiredMixin,
    PrefetchRelatedMixin,
    SelectRelatedMixin,
    UserFormKwargsMixin,
)
from dal import autocomplete
from django.db.models import Count
from django.urls import reverse_lazy
from django.utils.http import urlencode
from django.utils.translation import gettext_lazy as _
from django.views.generic import CreateView, DeleteView, DetailView, UpdateView
from django_filters.views import FilterView

from feder.cases.models import Case
from feder.main.mixins import ExtraListMixin
from feder.main.paginator import DefaultPagination
from feder.main.utils import DeleteViewLogEntryMixin, FormValidLogEntryMixin

from .filters import InstitutionFilter
from .forms import InstitutionForm
from .models import Institution, Tag

_("Institutions index")


[docs] class InstitutionListView(SelectRelatedMixin, FilterView): filterset_class = InstitutionFilter model = Institution select_related = ["jst", "jst__category"] paginate_by = 25
[docs] def get_queryset(self): qs = super().get_queryset() return qs.with_case_count().order_by("name")
[docs] def get_context_data(self, *args, **kwargs): params = [["format", "csv"], ["page_size", DefaultPagination.max_page_size]] context = super().get_context_data(*args, **kwargs) for name in ("name", "tags", "regon", "voivodeship", "county", "community"): api_name = "jst" if name in ("voivodeship", "county", "community") else name val_list = self.request.GET.getlist(name) if val_list: for val in val_list: if val: params.append([api_name, val]) context["csv_url"] = "{}?{}".format( reverse_lazy("institution-list"), urlencode(params) ) return context
[docs] class InstitutionDetailView(ExtraListMixin, PrefetchRelatedMixin, DetailView): model = Institution prefetch_related = ["tags"] extra_list_context = "case_list"
[docs] @staticmethod def get_object_list(obj): return ( Case.objects.filter(institution=obj) .select_related("monitoring") .order_by("monitoring") .all() )
[docs] class InstitutionCreateView( LoginRequiredMixin, PermissionRequiredMixin, CreateMessageMixin, UserFormKwargsMixin, FormValidLogEntryMixin, CreateView, ): model = Institution form_class = InstitutionForm permission_required = "institutions.add_institution" raise_exception = True redirect_unauthenticated_users = True
[docs] class InstitutionUpdateView( LoginRequiredMixin, PermissionRequiredMixin, UserFormKwargsMixin, UpdateMessageMixin, FormValidMessageMixin, FormValidLogEntryMixin, UpdateView, ): model = Institution form_class = InstitutionForm permission_required = "institutions.change_institution" raise_exception = True redirect_unauthenticated_users = True
[docs] class InstitutionDeleteView( LoginRequiredMixin, PermissionRequiredMixin, DeleteMessageMixin, UpdateMessageMixin, DeleteViewLogEntryMixin, DeleteView, ): model = Institution success_url = reverse_lazy("institutions:list") permission_required = "institutions.delete_institution" raise_exception = True redirect_unauthenticated_users = True
[docs] class InstitutionAutocomplete(autocomplete.Select2QuerySetView):
[docs] def get_queryset(self): qs = Institution.objects if self.q: qs = qs.filter(name__icontains=self.q) return qs.all().order_by("name")
[docs] def get_result_label(self, result): return f"{result.name_with_jst}"
[docs] class TagAutocomplete(autocomplete.Select2QuerySetView):
[docs] def get_queryset(self): qs = Tag.objects.annotate(institution_count=Count("institution")) if self.q: qs = qs.filter(name__icontains=self.q) return qs.order_by("name")
[docs] def get_result_label(self, result): return "%s (%d)" % (str(result), result.institution_count)