diff --git a/src/agenda_culturel/migrations/0092_alter_categorisationrule_weight.py b/src/agenda_culturel/migrations/0092_alter_categorisationrule_weight.py new file mode 100644 index 0000000..845a59e --- /dev/null +++ b/src/agenda_culturel/migrations/0092_alter_categorisationrule_weight.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.9 on 2024-10-30 14:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agenda_culturel', '0091_duplicatedevents_fixed_event_masked'), + ] + + operations = [ + migrations.AlterField( + model_name='categorisationrule', + name='weight', + field=models.IntegerField(default=1, help_text='The lower is the weight, the earlier the filter is applied', verbose_name='Weight'), + ), + ] diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index 1bac81d..85894e2 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -1561,7 +1561,7 @@ class CategorisationRule(models.Model): weight = models.IntegerField( verbose_name=_("Weight"), help_text=_("The lower is the weight, the earlier the filter is applied"), - default=0, + default=1, ) category = models.ForeignKey( @@ -1643,14 +1643,18 @@ class CategorisationRule(models.Model): return 1 def get_category_from_rules(event): + cats = defaultdict(lambda: 0) if CategorisationRule.rules is None: - CategorisationRule.rules = CategorisationRule.objects.all().order_by("weight", "pk").prefetch_related("category").prefetch_related("place") + CategorisationRule.rules = CategorisationRule.objects.all().prefetch_related("category").prefetch_related("place") for rule in CategorisationRule.rules: if rule.match(event): - return rule.category + cats[rule.category] += rule.weight - return None + if len(cats) == 0: + return None + else: + return max(cats, key=cats.get) def match(self, event): if self.description_contains and self.description_contains != "": diff --git a/src/agenda_culturel/templates/agenda_culturel/categorisation_rules.html b/src/agenda_culturel/templates/agenda_culturel/categorisation_rules.html index ffa9321..f2f5863 100644 --- a/src/agenda_culturel/templates/agenda_culturel/categorisation_rules.html +++ b/src/agenda_culturel/templates/agenda_culturel/categorisation_rules.html @@ -22,9 +22,9 @@ Ajouter {% picto_from_name "plus-circle" %}
Chaque règle est considérée dans l'ordre croissant des poids. La première règle satisfaite est appliquée par un changement de catégorie, et on les suivantes ne sont pas appliquées.
Une règle est satisfaite si toutes ses conditions sont satisfaites.
-Les règles sont appliquées à l'import sur tous les événements, et à la demande sur les événements sans catégorie.
+Pour chaque catégorie, on calcule la somme des poids de chaque règle satisfaite sur un événement. La catégorie retenue pour un événement correspond à la somme la plus grande.
+Les règles sont appliquées à l'import sur tous les événements, et à la demande sur tous les événements, avec confirmation dans le cas d'événements déjà catégorisés.