From 8758cb5238de7202598fece86bbd1269c7f0b974 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Mon, 25 May 2020 01:21:32 +0200 Subject: [PATCH] import activities and entry fixes --- management/commands/import_activities.py | 81 +++++++++++------------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/management/commands/import_activities.py b/management/commands/import_activities.py index 74fdb94..d7b7c9e 100644 --- a/management/commands/import_activities.py +++ b/management/commands/import_activities.py @@ -2,103 +2,95 @@ import psycopg2 as pg import psycopg2.extras as pge -import pytz import datetime import copy from django.utils.timezone import make_aware from django.db import transaction -from activity.models import ActivityType, Activity +from activity.models import ActivityType, Activity, Guest, Entry from member.models import Club +from note.models import Note +from ._import_utils import ImportCommand, BulkCreateManager, timed -from ._import_utils import ImportCommand, BulkCreateManager - +MAP_ACTIVITY = dict() class Command(ImportCommand): """ Import command for Activities Base Data (Comptes, and Aliases) """ - def add_arguments(self, parser): - pass @timed @transaction.atomic def import_activities(self, cur, chunk_size): cur.execute("SELECT * FROM activites ORDER by id") n = cur.rowcount bulk_mgr = BulkCreateManager(chunk_size=chunk_size) - activity_type = ActivityType.objects.get(name="Pot") # Need to be fixed manually + activity_type_id = ActivityType.objects.get(name="Pot").pk # Need to be fixed manually kfet = Club.objects.get(name="Kfet") + pk_activity = 1 for idx, row in enumerate(cur): - update_line(idx, n, row["alias"]) + self.update_line(idx, n, row["titre"]) + note = self.MAP_IDBDE[row["responsable"]] + if note == 6244: + # Licorne magique ne doit pas utiliser son compte club pour proposer des activités + note = Note.objects.get(pk=self.MAP_IDBDE[6524]) + note = note.user_id organizer = Club.objects.filter(name=row["signature"]) if organizer.exists(): - # Try to find the club that organizes the activity. If not found, assume it's Kfet (fix manually) + # Try to find the club that organizes the activity. + # If not found, assume it's Kfet (fix manually) organizer = organizer.get() else: organizer = kfet obj_dict = { - "pk": row["id"] + "pk": pk_activity, "name": row["titre"], "description": row["description"], - "activity_type": activity_type, # By default Pot - "creater": self.MAP_IDBDE[row["responsable"]], - "organizer": organizer, - "attendees_club": kfet, # Maybe fix manually - "date_start": row["debut"], - "date_end": row["fin"], + "activity_type_id": activity_type_id, # By default Pot + "creater_id": note, + "organizer_id": organizer.pk, + "attendees_club_id": kfet.pk, # Maybe fix manually + "date_start": make_aware(row["debut"]), + "date_end": make_aware(row["fin"]), "valid": row["validepar"] is not None, - "open": row["open"], # Should always be False + "open": row["ouvert"], # Should always be False } # WARNING: Fields lieu, liste, listeimprimee are missing - # + MAP_ACTIVITY[row["id"]] = pk_activity + pk_activity +=1 bulk_mgr.add(Activity(**obj_dict)) - MAP_NAMEACTIVITY[activity.name] = activity bulk_mgr.done() - return MAP_IDACTIVITY, MAP_NAMEACTIVITY @timed @transaction.atomic - def import_activity_entries(cur): + def import_activities_entries(self, cur): bulk_mgr = BulkCreateManager() - map_idguests = set() cur.execute("SELECT * FROM invites ORDER by id") n = cur.rowcount for idx, row in enumerate(cur): - update_line(idx, n, row["nom"] + " " + row["prenom"]) + self.update_line(idx, n, f"{row['nom']} {row['prenom']}") obj_dict = { "pk": row["id"], - "activity_id": row["activity"], + "activity_id": MAP_ACTIVITY[row["activite"]], "last_name": row["nom"], "first_name": row["prenom"], - "inviter": self.MAP_IDBDE[row["responsable"]], + "inviter_id": self.MAP_IDBDE[row["responsable"]], } bulk_mgr.add(Guest(**obj_dict)) bulk_mgr.done() cur.execute("SELECT * FROM entree_activites ORDER by id") n = cur.rowcount for idx, row in enumerate(cur): - update_line(idx, n, row["nom"] + " " + row["prenom"]) - guest = None - if row["est_invite"]: - for g in map_idguests[row["id"]]: - if g.activity.pk == activity.pk: - guest = g - break - if not guest: + self.update_line(idx, n, f"{row['idbde']} {row['responsable']}") obj_dict = { - "activity": row["activity"], + "activity_id": MAP_ACTIVITY[row["activite"]], "time": make_aware(row["heure_entree"]), - "note": guest.inviter if guest else MAP_IDBDE[row["idbde"]], - "guest": guest, + "note_id": self.MAP_IDBDE[row["responsable"]] if row['est_invite'] else row["idbde"], + "guest_id": row["idbde"] if row['est_invite'] else None, } - try: - with transaction.atomic(): - Entry.objects.get_or_create(**obj_dict) - except IntegrityError as e: - raise e - + bulk_mgr.add(Entry(**obj_dict)) + bulk_mgr.done() def handle(self, *args, **kwargs): # default args, provided by ImportCommand. @@ -108,5 +100,6 @@ class Command(ImportCommand): cur = conn.cursor(cursor_factory=pge.DictCursor) if kwargs["map"]: - self.load(kwargs["map"]) - self.import_activities(cur, chunk_size) + self.load_map(kwargs["map"]) + self.import_activities(cur, kwargs["chunk"]) + self.import_activities_entries(cur)