Source code for feder.letters.logs.views

import unicodecsv as csv
from braces.views import PrefetchRelatedMixin, SelectRelatedMixin
from cached_property import cached_property
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.utils import timezone
from django.views.generic import DetailView
from django.views.generic.list import ListView

from feder.cases.models import Case
from feder.letters.logs.models import EmailLog
from feder.main.mixins import AttrPermissionRequiredMixin
from feder.monitorings.models import Monitoring


[docs] class ListMonitoringMixin(AttrPermissionRequiredMixin, SelectRelatedMixin): select_related = ["case"] paginate_by = 100 model = EmailLog monitoring = None permission_attribute = "case__monitoring" permission_required = "monitorings.view_log" def get_permission_object(self): return self.monitoring def get_queryset(self): return ( super() .get_queryset() .filter(case__monitoring=self.monitoring) .with_logrecord_count() ) def get_context_data(self, **kwargs): kwargs["monitoring"] = self.monitoring return super().get_context_data(**kwargs)
[docs] class EmailLogMonitoringListView(ListMonitoringMixin, ListView): template_name_suffix = "_list_for_monitoring" permission_required = "monitorings.view_log" @cached_property def monitoring(self): return get_object_or_404(Monitoring, pk=self.kwargs["monitoring_pk"])
[docs] class EmailLogMonitoringCsvView(ListMonitoringMixin, ListView): permission_required = "monitorings.view_log" select_related = ["case", "case__institution"] @cached_property def monitoring(self): return get_object_or_404(Monitoring, pk=self.kwargs["monitoring_pk"]) def get(self, *args, **kwargs): response = self._get_csv_response() self._write_rows(response, self.get_queryset()) return response @staticmethod def _get_base_model_field_names(queryset): opts = queryset.model._meta return [field.name for field in opts.fields if field.related_model is None] def _get_csv_response(self): csv_response = HttpResponse(content_type="text/csv") current_time = timezone.now() filename = "email_log_{}-{}-{}.csv".format( self.monitoring.id, current_time.strftime("%Y_%m_%d-%H_%M_%S"), current_time.tzname(), ) csv_response["Content-Disposition"] = f"attachment;filename={filename}" return csv_response def _write_rows(self, response, queryset): writer = csv.writer(response) # automatically add all fields from base table/model base_field_names = self._get_base_model_field_names(queryset) # print header row writer.writerow( base_field_names + [ "case id", "case email", "institution", "institution id", "monitoring id", ] ) for obj in queryset: writer.writerow( [getattr(obj, field) for field in base_field_names] + [ obj.case.id, obj.case.email, obj.case.institution.name, obj.case.institution_id, obj.case.monitoring_id, ] )
[docs] class EmailLogCaseListView(ListMonitoringMixin, ListView): template_name_suffix = "_list_for_case" @cached_property def case(self): return get_object_or_404( Case.objects.select_related("monitoring"), pk=self.kwargs["case_pk"] ) @cached_property def monitoring(self): return self.case.monitoring
[docs] def get_context_data(self, **kwargs): kwargs["case"] = self.case return super().get_context_data(**kwargs)
[docs] def get_queryset(self): return super().get_queryset().filter(case=self.case)
[docs] class EmailLogDetailView( AttrPermissionRequiredMixin, PrefetchRelatedMixin, SelectRelatedMixin, DetailView ): model = EmailLog select_related = ["case__monitoring"] prefetch_related = ["logrecord_set"] permission_attribute = "case__monitoring" permission_required = "monitorings.view_log"