You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
7.5 KiB
218 lines
7.5 KiB
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)
|