Ajout de fonctions pour la gestion des éléments dupliqués
This commit is contained in:
@@ -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 : ' + localize(localtime(e.created_date)) + '</li>'
|
||||
result += '<li>Dernière modification : ' + localize(localtime(e.modified_date)) + '</li>'
|
||||
if e.imported_date:
|
||||
result += '<li>Dernière importation : ' + 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 :' + 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])
|
||||
|
||||
Reference in New Issue
Block a user