nk20-scripts/management/commands/import_activities.py

132 lines
4.9 KiB
Python
Raw Normal View History

2020-07-25 19:57:46 +00:00
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
import psycopg2 as pg
import psycopg2.extras as pge
from activity.models import Activity, ActivityType, Entry, Guest
from django.db import transaction
from django.utils.timezone import make_aware
from member.models import Club
2020-07-21 23:28:28 +00:00
from note.models import Note, NoteUser
from ._import_utils import BulkCreateManager, ImportCommand, timed
2020-05-24 23:21:32 +00:00
MAP_ACTIVITY = dict()
CLUB_RELOU = [
0, # BDE
4771, # Kataclist
5162, # Assurance BDE ?!
5164, # S & L
2020-07-21 23:28:28 +00:00
625, # Aspique
5154, # Frekens
3944, # DiskJok[ENS]
5153, # Monopo[list]
2351, # JdRM
2365, # Pot Vieux
]
class Command(ImportCommand):
"""
Import command for Activities Base Data (Comptes, and Aliases)
"""
2020-05-24 23:12:31 +00:00
@timed
@transaction.atomic
2020-05-25 10:16:36 +00:00
def import_activities(self, cur, chunk):
cur.execute("SELECT * FROM activites ORDER by id")
n = cur.rowcount
2020-05-25 10:16:36 +00:00
bulk_mgr = BulkCreateManager(chunk_size=chunk)
2020-08-06 15:41:30 +00:00
pot_id = ActivityType.objects.get(name="Pot").pk
club_id = ActivityType.objects.get(name="Soirée de club").pk
kfet = Club.objects.get(name="Kfet")
2020-05-24 23:21:32 +00:00
pk_activity = 1
for idx, row in enumerate(cur):
2020-05-24 23:21:32 +00:00
self.update_line(idx, n, row["titre"])
2020-07-21 23:28:28 +00:00
if row["responsable"] in CLUB_RELOU:
row["responsable"] = 3508
2020-05-24 23:21:32 +00:00
note = self.MAP_IDBDE[row["responsable"]]
if note == 6244:
# Licorne magique ne doit pas utiliser son compte club pour proposer des activités
2020-05-24 23:21:32 +00:00
note = Note.objects.get(pk=self.MAP_IDBDE[6524])
2020-07-21 23:28:28 +00:00
note = note.id
organizer = Club.objects.filter(name=row["signature"])
if organizer.exists():
2020-05-24 23:21:32 +00:00
# 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 = {
2020-05-24 23:21:32 +00:00
"pk": pk_activity,
"name": row["titre"],
"description": row["description"],
"location": row["lieu"],
2020-08-06 15:41:30 +00:00
"activity_type_id": pot_id if row["liste"] else club_id,
2020-07-21 23:28:28 +00:00
"creater_id": NoteUser.objects.get(pk=note).user.id,
2020-05-24 23:21:32 +00:00
"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": False,
}
# WARNING: Fields lieu, liste, listeimprimee are missing
2020-05-24 23:21:32 +00:00
MAP_ACTIVITY[row["id"]] = pk_activity
2020-05-26 21:53:13 +00:00
pk_activity += 1
bulk_mgr.add(Activity(**obj_dict))
bulk_mgr.done()
2020-05-24 23:12:31 +00:00
@timed
@transaction.atomic
2020-05-25 10:16:36 +00:00
def import_guest(self, cur, chunk):
bulk_mgr = BulkCreateManager(chunk_size=chunk)
cur.execute("SELECT * FROM invites ORDER by id")
n = cur.rowcount
for idx, row in enumerate(cur):
2020-05-24 23:21:32 +00:00
self.update_line(idx, n, f"{row['nom']} {row['prenom']}")
if row["responsable"] in CLUB_RELOU:
row["responsable"] = 3508
obj_dict = {
"pk": row["id"],
2020-05-24 23:21:32 +00:00
"activity_id": MAP_ACTIVITY[row["activite"]],
"last_name": row["nom"],
"first_name": row["prenom"],
2020-05-24 23:21:32 +00:00
"inviter_id": self.MAP_IDBDE[row["responsable"]],
}
bulk_mgr.add(Guest(**obj_dict))
bulk_mgr.done()
2020-05-25 10:16:36 +00:00
@timed
@transaction.atomic
def import_activities_entries(self, cur, chunk):
bulk_mgr = BulkCreateManager(chunk_size=chunk)
cur.execute("SELECT * FROM entree_activites ORDER by id")
n = cur.rowcount
for idx, row in enumerate(cur):
2020-05-24 23:21:32 +00:00
self.update_line(idx, n, f"{row['idbde']} {row['responsable']}")
if row["idbde"] in CLUB_RELOU:
row["idbde"] = 3508
obj_dict = {
2020-05-24 23:21:32 +00:00
"activity_id": MAP_ACTIVITY[row["activite"]],
"time": make_aware(row["heure_entree"]),
2020-05-25 10:16:36 +00:00
"note_id": self.MAP_IDBDE[row["responsable"] if row['est_invite'] else row["idbde"]],
"guest_id": row["idbde"] if row['est_invite'] else None,
}
2020-05-24 23:21:32 +00:00
bulk_mgr.add(Entry(**obj_dict))
bulk_mgr.done()
def handle(self, *args, **kwargs):
# default args, provided by ImportCommand.
nk15db, nk15user = kwargs['nk15db'], kwargs['nk15user']
# connecting to nk15 database
conn = pg.connect(database=nk15db, user=nk15user)
cur = conn.cursor(cursor_factory=pge.DictCursor)
if kwargs["map"]:
2020-05-24 23:21:32 +00:00
self.load_map(kwargs["map"])
self.import_activities(cur, kwargs["chunk"])
2020-05-25 10:16:36 +00:00
self.import_guest(cur, kwargs["chunk"])
self.import_activities_entries(cur, kwargs["chunk"])