diff options
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r-- | ishtar_common/utils.py | 78 |
1 files changed, 35 insertions, 43 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py index 3161e0003..08e7a49b4 100644 --- a/ishtar_common/utils.py +++ b/ishtar_common/utils.py @@ -65,6 +65,7 @@ from django.core.files.storage import FileSystemStorage from django.core.validators import EMPTY_VALUES, MaxValueValidator from django.db import models from django.db.models import Q +from django.db.models.functions import Length from django.http import HttpResponseRedirect from django.urls import reverse, NoReverseMatch from django.utils.crypto import get_random_string @@ -1496,61 +1497,52 @@ def create_default_areas(models=None, verbose=False): areas = {} - idx = 0 - for state in State.objects.all(): - slug = "state-" + slugify(state.label) - area, created = Area.objects.get_or_create( + created = 0 + q = State.objects + total = q.count() + for idx, state in enumerate(q.all()): + if verbose: + sys.stdout.write(f"State \t{idx + 1}/{total}\r") + slug = "state-" + state.number + area, create = Area.objects.get_or_create( txt_idx=slug, defaults={"label": state.label} ) - areas["state-{}".format(state.pk)] = area - if created: - idx += 1 + areas[f"state-{state.pk}"] = area + if create: + created += 1 if verbose: - print("\n* {} state areas added".format(idx)) + sys.stdout.write(f"* {created} state areas added\n") - idx, idx2 = 0, 0 - for dep in Department.objects.all(): - slug = "dep-" + slugify(dep.label) - area, created = Area.objects.get_or_create( + created, association, association2 = 0, 0, 0 + q = Department.objects + total = q.count() + for idx, dep in enumerate(q.all()): + if verbose: + sys.stdout.write(f"Department \t{idx + 1}/{total}\r") + slug = f"dep-{dep.number}" + area, create = Area.objects.get_or_create( txt_idx=slug, defaults={"label": dep.label} ) areas["dep-" + dep.number] = area - if created: - idx += 1 + if create: + created += 1 if not dep.state_id: continue state_slug = "state-{}".format(dep.state_id) - if state_slug not in areas: - continue - if area.parent and area.parent.pk == areas[state_slug].pk: - continue - idx2 += 1 - area.parent = areas[state_slug] - area.save() - if verbose: - print( - "* {} department areas added with {} associations to state".format( - idx, idx2 - ) - ) - - idx = 0 - for town in Town.objects.all(): - if not town.numero_insee or len(town.numero_insee) != 5: - continue - code_dep = "dep-" + town.numero_insee[:2] - code_dep_dom = "dep-" + town.numero_insee[:3] - if code_dep in areas: - if not areas[code_dep].towns.filter(pk=town.pk).count(): - areas[code_dep].towns.add(town) - idx += 1 - elif code_dep_dom in areas: - if not areas[code_dep_dom].towns.filter(pk=town.pk).count(): - areas[code_dep_dom].towns.add(town) - idx += 1 + if state_slug in areas and (not area.parent or area.parent.pk != areas[state_slug].pk): + association += 1 + area.parent = areas[state_slug] + area.save() + area.towns.clear() + q2 = Town.objects.annotate(insee_len=Length('numero_insee')).filter( + numero_insee__startswith=dep.number, insee_len=5) + area.towns.add(*list(q2.all())) if verbose: - print("* {} town associated to department area".format(idx)) + sys.stdout.write( + f"* {created} department areas added with {association} associations to state\n" + ) + sys.stdout.write(f"* {association} town associated to department area") def get_relations_for_graph( |