action view overhaul

This commit is contained in:
Thomas Nahuel Rusiecki 2024-11-01 04:36:24 -03:00
parent 3a93595396
commit b1bf33ac83
3 changed files with 66 additions and 19 deletions

View File

@ -1,20 +1,41 @@
from django import forms from django import forms
from utils.device import create_annotation, create_doc, create_index from utils.device import create_annotation, create_doc, create_index
from utils.save_snapshots import move_json, save_in_disk from utils.save_snapshots import move_json, save_in_disk
from django.forms.formsets import BaseFormSet
from django.forms import formset_factory from django.forms import formset_factory
from django.core.exceptions import ValidationError
class CustomStatusLabelForm(forms.Form): class CustomStatusLabelForm(forms.Form):
annotation_name = forms.CharField( label_name = forms.CharField(
label="Annotation Name", label="Annotation Name",
max_length=50, max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control'}) widget=forms.TextInput(attrs={'class': 'form-control'})
) )
annotation_state = forms.CharField(
class CustomStatusValueForm(forms.Form):
label_state = forms.CharField(
label="Possible State", label="Possible State",
max_length=50, max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control'}) widget=forms.TextInput(attrs={'class': 'form-control'})
) )
class CustomStatusValueFormSet(BaseFormSet):
CustomStatusLabelFormSet = formset_factory(CustomStatusLabelForm, extra=1) """Validation for inputs (no two values should be the same)"""
def clean(self):
if any(self.errors):
return
label = []
labels = []
for form in self.forms:
label = form.cleaned_data.get('label_state')
if label:
if label in labels:
raise ValidationError("Duplicate labels are not allowed.")
labels.append(label)
CustomStatusFormSet = formset_factory(CustomStatusValueForm ,formset = CustomStatusValueFormSet)

View File

@ -13,8 +13,9 @@
<form role="form" method="post" novalidate> <form role="form" method="post" novalidate>
{% csrf_token %} {% csrf_token %}
<div class="mb-3"> <div class="mb-3">
{{ form.annotation_name.label_tag }}
{{ form.annotation_name }} <h5 class="mt-4">{% translate "Status name" %}</h5>
{% bootstrap_field form.label_name show_label=False %}
</div> </div>
<h5 class="mt-4">{% translate "Possible States" %}</h5> <h5 class="mt-4">{% translate "Possible States" %}</h5>
@ -23,7 +24,7 @@
{% for form in formset %} {% for form in formset %}
<div class="row mb-3 formset-form"> <div class="row mb-3 formset-form">
<div class="col-md-10"> <div class="col-md-10">
{% bootstrap_field form.annotation_state show_label=False %} {% bootstrap_field form.label_state show_label=False %}
</div> </div>
<div class="col-md-2 d-flex align-items-center"> <div class="col-md-2 d-flex align-items-center">
{% if forloop.first %} {% if forloop.first %}
@ -48,7 +49,7 @@
</div> </div>
<script> <script>
//fix this stub chatgpt code //TODO: change this to jquery formset plugin
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
var formsetDiv = document.getElementById('formset'); var formsetDiv = document.getElementById('formset');
var totalForms = document.getElementById('id_form-TOTAL_FORMS'); var totalForms = document.getElementById('id_form-TOTAL_FORMS');

View File

@ -13,8 +13,9 @@ import logging
from dashboard.mixins import DashboardView, Http403 from dashboard.mixins import DashboardView, Http403
from user.models import User, Institution from user.models import User, Institution
from admin.email import NotifyActivateUserByEmail from admin.email import NotifyActivateUserByEmail
from admin.forms import CustomStatusLabelForm, CustomStatusLabelFormSet from admin.forms import CustomStatusLabelForm, CustomStatusValueForm, CustomStatusFormSet
from evidence.models import Annotation from evidence.models import Annotation, AllowedValue
import uuid
logger = logging.getLogger('dhub') logger = logging.getLogger('dhub')
@ -138,38 +139,62 @@ class AddReservedAnnotationView(AdminView, FormView):
title = _("New Custom State Labels") title = _("New Custom State Labels")
breadcrumb = "Admin / Custom State Labels (new name?)" breadcrumb = "Admin / Custom State Labels (new name?)"
success_url = reverse_lazy('admin:panel') success_url = reverse_lazy('admin:panel')
model = Annotation
form_class = CustomStatusLabelForm form_class = CustomStatusLabelForm
formset_class = CustomStatusLabelFormSet formset_class = CustomStatusFormSet
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
if self.request.POST: if self.request.POST:
context['form'] = self.form_class(self.request.POST)
context['formset'] = self.formset_class(self.request.POST) context['formset'] = self.formset_class(self.request.POST)
else: else:
context['form'] = self.form_class()
context['formset'] = self.formset_class() context['formset'] = self.formset_class()
context['subtitle'] = _("Add Custom Status Label") context['subtitle'] = _("Add Custom Status Label")
return context return context
def form_valid(self, form): def form_valid(self, form):
context = self.get_context_data() context = self.get_context_data()
formset = context['formset'] formset = context['formset']
form = context['form']
if form.is_valid():
label_name = form.cleaned_data['label_name']
else:
return self.form_invalid(form)
if formset.is_valid(): if formset.is_valid():
annotation_name = form.cleaned_data['annotation_name']
logger.info("Saving to db: " + annotation_name) annotation = Annotation.objects.create(
annotation = Annotation.objects.create(name=annotation_name) uuid=uuid.uuid4(),
owner=self.request.user.institution,
user=self.request.user,
type=Annotation.Type.ADMIN,
key=label_name,
value=label_name
)
first_state = None
for form in formset: for form in formset:
state = form.cleaned_data.get('annotation_state') state = form.cleaned_data.get('label_state')
if state and not first_state:
first_state = state
annotation.value = state
annotation.save()
if state: if state:
PossibleValue.objects.create(annotation=annotation, value=state) AllowedValue.objects.create(
annotation=annotation,
value=state
)
logger.info("Saved to db: " + annotation_name) logger.info("Saving custom label to db: " + label_name)
self.success_message = _("Custom status label has been added.") self.success_message = _("Custom status label has been added.")
self.success_url = reverse_lazy('admin:panel') self.success_url = reverse_lazy('admin:panel')
return super().form_valid(form) return super().form_valid(form)
else: else:
logger.error("Formset is not valid") logger.error("Formset is not valid")
logger.error(formset.errors) logger.error(formset.errors)
return self.form_invalid(form) return self.form_invalid(form)