Ajout de fonctions pour la gestion des éléments dupliqués

This commit is contained in:
Jean-Marie Favreau
2024-01-12 13:33:32 +01:00
parent 9f40d480ab
commit cf2b9611da
11 changed files with 441 additions and 28 deletions

View File

@@ -1,9 +1,19 @@
from django.forms import ModelForm, ValidationError, TextInput, Form, URLField, MultipleHiddenInput, Textarea, CharField
from django.forms import ModelForm, ValidationError, TextInput, Form, URLField, MultipleHiddenInput, Textarea, CharField, ChoiceField, RadioSelect, MultipleChoiceField
from datetime import date
from django_better_admin_arrayfield.forms.widgets import DynamicArrayWidget
from .models import Event, BatchImportation
from django.utils.translation import gettext_lazy as _
from string import ascii_uppercase as auc
from .templatetags.utils_extra import int_to_abc
from django.utils.safestring import mark_safe
from django.utils.timezone import localtime
from django.utils.formats import localize
from .templatetags.event_extra import event_field_verbose_name, field_to_html
import logging
logger = logging.getLogger(__name__)
class EventSubmissionForm(Form):
url = URLField(max_length=512)
@@ -87,3 +97,146 @@ class BatchImportationForm(ModelForm):
return cleaned_data
class FixDuplicates(Form):
action = ChoiceField()
def __init__(self, *args, **kwargs):
nb_events = kwargs.pop('nb_events', None)
super().__init__(*args, **kwargs)
if nb_events == 2:
choices = [("NotDuplicates", "Ces événements sont différents")]
choices += [("SelectA", "Ces événements sont identiques, on garde A et on met B à la corbeile")]
choices += [("SelectB", "Ces événements sont identiques, on garde B et on met A à la corbeille")]
choices += [("Merge", "Ces événements sont identiques, on fusionne à la main")]
else:
choices = [("NotDuplicates", "Ces événements sont tous différents")]
for i in auc[0:nb_events]:
choices += [("Remove" + i, "L'événement " + i + " n'est pas identique aux autres, on le rend indépendant")]
for i in auc[0:nb_events]:
choices += [("Select" + i, "Ces événements sont identiques, on garde " + i + " et on met les autres à la corbeille")]
choices += [("Merge", "Ces événements sont identiques, on fusionne à la main")]
self.fields['action'].choices = choices
def is_action_no_duplicates(self):
return self.cleaned_data["action"] == "NotDuplicates"
def is_action_select(self):
return self.cleaned_data["action"].startswith("Select")
def is_action_remove(self):
return self.cleaned_data["action"].startswith("Remove")
def get_selected_event_code(self):
if self.is_action_select() or self.is_action_remove():
return self.cleaned_data["action"][-1]
else:
return None
def get_selected_event_id(self):
selected = self.get_selected_event_code()
if selected is None:
return None
else:
return auc.rfind(selected)
def get_selected_event(self, edup):
selected = self.get_selected_event_id()
return edup.get_duplicated()[selected]
class SelectEventInList(Form):
event = ChoiceField()
def __init__(self, *args, **kwargs):
events = kwargs.pop('events', None)
super().__init__(*args, **kwargs)
self.fields['event'].choices = [(e.pk, str(e.start_day) + " " + e.title + ", " + e.location) for e in events]
class MergeDuplicates(Form):
checkboxes_fields = ["reference_urls", "description"]
def __init__(self, *args, **kwargs):
self.duplicates = kwargs.pop('duplicates', None)
nb_events = self.duplicates.nb_duplicated()
super().__init__(*args, **kwargs)
choices = [("event" + i, "Valeur de l'évenement " + i) for i in auc[0:nb_events]]
for f in self.duplicates.get_items_comparison():
if not f["similar"]:
if f["key"] in MergeDuplicates.checkboxes_fields:
self.fields[f["key"]] = MultipleChoiceField(choices=choices)
self.fields[f["key"]].initial = choices[0][0]
else:
self.fields[f["key"]] = ChoiceField(widget=RadioSelect, choices=choices)
self.fields[f["key"]].initial = choices[0][0]
def as_grid(self):
result = '<div class="grid">'
for i, e in enumerate(self.duplicates.get_duplicated()):
result += '<div class="grid entete-badge">'
result += '<div class="badge-large">' + int_to_abc(i) + '</div>'
result += '<ul>'
result += '<li><a href="' + e.get_absolute_url() + '">' + e.title + '</a></li>'
result += '<li>Création&nbsp;: ' + localize(localtime(e.created_date)) + '</li>'
result += '<li>Dernière modification&nbsp;: ' + localize(localtime(e.modified_date)) + '</li>'
if e.imported_date:
result += '<li>Dernière importation&nbsp;: ' + localize(localtime(e.imported_date)) + '</li>'
result += '</ul>'
result += '</div>'
result += '</div>'
for e in self.duplicates.get_items_comparison():
key = e["key"]
result += "<h3>" + event_field_verbose_name(e["key"]) + "</h3>"
if e["similar"]:
result += '<div class="comparison-item">Identique&nbsp;:' + str(field_to_html(e["values"], e["key"])) + '</div>'
else:
result += '<fieldset>'
result += '<div class="grid comparison-item">'
if hasattr(self, "cleaned_data"):
checked = self.cleaned_data.get(key)
else:
checked = self.fields[key].initial
for i, (v, radio) in enumerate(zip(e["values"], self.fields[e["key"]].choices)):
result += '<div class="duplicated">'
id = 'id_' + key + '_' + str(i)
value = 'event' + auc[i]
result += '<input id="' + id + '" name="' + key + '"'
if key in MergeDuplicates.checkboxes_fields:
result += ' type="checkbox"'
if value in checked:
result += " checked"
else:
result += ' type="radio"'
if checked == value:
result += " checked"
result += ' value="' + value + '"'
result += '>'
result += '<div class="badge-small">' + int_to_abc(i) + '</div>' + str(field_to_html(v, e["key"])) + '</div>'
result += "</div></fieldset>"
return mark_safe(result)
def get_selected_events_id(self, key):
value = self.cleaned_data.get(key)
if not key in self.fields:
return None
else:
if isinstance(value, list):
return [auc.rfind(v[-1]) for v in value]
else:
return auc.rfind(value[-1])