from django.contrib.admin.models import LogEntry, ContentType, ADDITION, CHANGE, DELETION from django.utils.translation import ugettext_lazy as _ from django.views.generic import DetailView class LogBaseMixin(object): object = None request = None class LogCreateMixin(LogBaseMixin): def form_valid(self, form): response = super(LogCreateMixin, self).form_valid(form) LogEntry.objects.log_action( user_id=self.request.user.pk, content_type_id=ContentType.objects.get_for_model( self.object, False).pk, object_id=self.object.pk, object_repr=str(self.object), action_flag=ADDITION, change_message=_('Adicionado') ) return response class LogChangeMixin(LogBaseMixin): def form_valid(self, form): response = super(LogChangeMixin, self).form_valid(form) try: fs_c = '' for fs in self.get_formsets(): for fsf in fs.forms: if fsf.changed_data: fs_c += f'{fsf.instance} ' + \ ', '.join([str(fsf.fields.get(field).label) + ' de ' + str(fsf.initial.get(field)) + ' para ' + str(fsf.cleaned_data.get(field)) for field in fsf.changed_data]) except Exception as e: fs_c = '' LogEntry.objects.log_action( user_id=self.request.user.pk, content_type_id=ContentType.objects.get_for_model( self.object, False).pk, object_id=self.object.pk, object_repr=str(self.object), action_flag=CHANGE, change_message=f'Modificado {", ".join([str(form.fields.get(field).label) for field in form.changed_data])}{(", " + fs_c) if fs_c != "" else ""}. ' ) return response class LogDeleteMixin(LogBaseMixin): def delete(self, request, *args, **kwargs): obj = self.get_object() LogEntry.objects.log_action( user_id=self.request.user.pk, content_type_id=ContentType.objects.get_for_model(obj, False).pk, object_id=obj.pk, object_repr=str(obj), action_flag=DELETION, change_message=_('Deletado') ) return super(LogDeleteMixin, self).delete(request, *args, **kwargs) class HistoricView(DetailView): template_name = 'controle/historico.html' success_url = None def get_context_data(self, **kwargs): context = super(HistoricView, self).get_context_data(**kwargs) context.update({ 'log_entries': LogEntry.objects.filter( content_type=ContentType.objects.get_for_model( self.get_object(), False), object_id=self.get_object().pk, ) }) return context class LogFormsetCreateMixin(LogBaseMixin): def get_formsets(self): if self.request.POST: return [Formset(self.request.POST, self.request.FILES) for Formset in self.formset_classes] else: formsets = [] for formset in self.formset_classes: prefix = formset().prefix if self.initial.get(prefix): formsets.append(formset(initial=self.initial.get(prefix))) self.initial.pop(prefix) else: formsets.append(formset()) return formsets def get_context_data(self, **kwargs): context = super(LogFormsetCreateMixin, self).get_context_data(**kwargs) context.update({ 'formsets': self.get_formsets() }) return context def form_valid(self, form): formsets = self.get_formsets() response = super(LogFormsetCreateMixin, self).form_valid(form) for formset in formsets: if formset.cleaned_data != [{}]: if len(formset.cleaned_data) > 1: LogEntry.objects.log_action( user_id=self.request.user.pk, content_type_id=ContentType.objects.get_for_model( self.object, False).pk, object_id=self.object.pk, object_repr=str(self.object), action_flag=ADDITION, change_message=_( f'{formset.forms[0].instance.__class__._meta.verbose_name_plural} adicionados') ) else: LogEntry.objects.log_action( user_id=self.request.user.pk, content_type_id=ContentType.objects.get_for_model( self.object, False).pk, object_id=self.object.pk, object_repr=str(self.object), action_flag=ADDITION, change_message=_( f'{formset.forms[0].instance.__class__._meta.verbose_name} adicionado') ) return response class FormSetCreateView(object): formset_classes = [] initial = {} model = None object = None request = None def get_formsets(self): if self.request.POST: return [Formset(self.request.POST, self.request.FILES) for Formset in self.formset_classes] else: formsets = [] for formset in self.formset_classes: prefix = formset().prefix if self.initial.get(prefix): formsets.append(formset(initial=self.initial.get(prefix))) self.initial.pop(prefix) else: formsets.append(formset()) return formsets def get_context_data(self, **kwargs): context = super(FormSetCreateView, self).get_context_data(**kwargs) context.update({ 'formsets': self.get_formsets() }) return context def form_valid(self, form): formsets = self.get_formsets() if all([formset.is_valid() for formset in formsets]): response = super(FormSetCreateView, self).form_valid(form) for formset in formsets: formset.instance = self.object formset.save() return response else: return super(FormSetCreateView, self).form_invalid(form) class FormSetUpdateView(object): formset_classes = [] object = None request = None def get_formsets(self): if self.request.POST: formsets = [ Formset(self.request.POST, self.request.FILES, instance=self.object) for Formset in self.formset_classes ] for formset in formsets: formset.full_clean() return formsets else: return [Formset(instance=self.object) for Formset in self.formset_classes] def get_context_data(self, **kwargs): context = super(FormSetUpdateView, self).get_context_data(**kwargs) context.update({ 'formsets': self.get_formsets() }) return context def form_valid(self, form): formsets = self.get_formsets() if all([formset.is_valid() for formset in formsets]): response = super(FormSetUpdateView, self).form_valid(form) for formset in formsets: formset.instance = self.object formset.save() return response else: return super(FormSetUpdateView, self).form_invalid(form)