From ea5737ac8f7d8425b936c8f07f956de34fd0a41a Mon Sep 17 00:00:00 2001
From: Pierre-antoine Comby <comby@crans.org>
Date: Sun, 23 Feb 2020 16:43:13 +0100
Subject: [PATCH] refactoring in atomic function

---
 .../member/management/commands/import_nk15.py | 229 +++++++++++-------
 1 file changed, 139 insertions(+), 90 deletions(-)

diff --git a/apps/member/management/commands/import_nk15.py b/apps/member/management/commands/import_nk15.py
index 1ae59ee2..28b946e9 100644
--- a/apps/member/management/commands/import_nk15.py
+++ b/apps/member/management/commands/import_nk15.py
@@ -11,104 +11,153 @@ from django.core.exceptions import ValidationError
 
 from django.contrib.auth.models import User
 from note.models import Note, NoteSpecial, NoteUser, NoteClub
+from note.models import Transaction, TransactionTemplate, TransactionCategory, TransactionType
 from member.models import Profile, Club
 
+
+@transaction.atomic
+def import_special(cur):
+    cur.execute("SELECT * FROM comptes WHERE idbde <0 ORDER BY idbde;")
+    map_idbde = dict()
+    for row in cur:
+        obj,created = NoteSpecial.objects.get_or_create(special_type = row["pseudo"],
+                                                        balance = row["solde"],
+                                                        is_active =True)
+        if created:
+            obj.save()
+            map_idbde[row["idbde"]] = obj.pk
+
+    cur.execute("SELECT * FROM comptes WHERE idbde=0;")
+    res = cur.fetchone()
+    clubBde, c = Club.objects.get_or_create(pk = 1,
+                                            name = "Bde",
+                                            email = "bureau.bde@lists.crans.org",
+                                            membership_duration = "396 00:00:00",
+                                            membership_start = "213 00:00:00",
+                                            membership_end = "273 00:00:00",
+                                            membership_fee = 5,
+    )
+    clubKfet, c = Club.objects.get_or_create(pk = 2,
+                                             name = "Kfet",
+                                             email = "tresorerie.bde@lists.crans.org",
+                                             membership_duration = "396 00:00:00",
+                                             membership_start = "213 00:00:00",
+                                             membership_end = "273 00:00:00",
+                                             membership_fee = 35,
+    )
+    clubBde.save()
+    clubKfet.save()
+    clubBde.note.solde=res["solde"]
+    map_idbde[0] = clubKfet.note.pk
+    return map_idbde
+
+
+@transaction.atomic
+def import_comptes(cur,map_idbde):
+    cur.execute("SELECT * FROM comptes WHERE idbde > 0 ORDER BY idbde;")
+    pkclub = 3
+    for row in cur:
+        if row["type"] == "personne":
+            #sanitize password
+            if row["passwd"] != "*|*":
+                passwd_nk15 = "$".join(["custom_nk15","1",row["passwd"]])
+            else:
+                passwd_nk15 = ''
+            try:
+                user = User.objects.create(
+                    username =row["pseudo"],
+                    password = passwd_nk15,
+                    first_name = row["nom"],
+                    last_name = row["prenom"],
+                    email = row["mail"],
+                )
+                #sanitize duplicate aliases (nk12)
+            except ValidationError as e:
+                if e.code == 'same_alias':
+                    user = User.objects.create(
+                        username = row["pseudo"]+str(row["idbde"]),
+                        password = row["passwd"] if row["passwd"] != '*|*' else '',
+                        first_name = row["nom"],
+                        last_name = row["prenom"],
+                        email = row["mail"],
+                    )
+                else:
+                    raise(e)
+            else:
+                pass
+            profile = Profile.objects.create(
+                phone_number = row["tel"],
+                address = row["adresse"],
+                paid = row["normalien"],
+                user = user,
+            )
+            note = user.note
+            note.balance = row["solde"]
+
+            obj_list =[user, profile, note]
+        else:#club
+            club,c = Club.objects.get_or_create(pk=pkclub,
+                                                name = row["pseudo"],
+                                                email = row["mail"],
+                                                membership_duration = "396 00:00:00",
+                                                membership_start = "213 00:00:00",
+                                                membership_end = "273 00:00:00",
+                                                membership_fee =0,
+            )
+            pkclub +=1
+            note = club.note
+            note.balance = row["solde"]
+            obj_list = [club,note]
+        for obj in obj_list:
+            obj.save()
+            map_idbde[row["idbde"]] = note.pk
+            #
+    return map_idbde
+
+@transaction.atomic
+def import_boutons(cur,map_idbde):
+    cur.execute("SELECT * FROM boutons;")
+    for row in cur:
+        cat, created = TransactionCategory.objects.get_or_create(name=row["categorie"])
+
+        button = TransactionTemplate.objects.create(pk=row["id"],
+                                            name=row["label"],
+                                            amount=row["montant"],
+                                            destination_id=map_idbde[row["destinataire"]],
+                                            category = cat,
+                                            display = row["affiche"],
+                                            description = row["description"],
+        )
+        if created:
+            cat.save()
+        button.save()
+
+
 class Command(BaseCommand):
     """
     Command for importing the database of NK15.
     Need to be run by a user with a registered role in postgres for the database nk15. 
     """
+    def add_arguments(self,parser):
+        parser.add_argument('-s', '--special', action = 'store_true')
+        parser.add_argument('-c', '--comptes', action = 'store_true')
+        parser.add_argument('-b', '--boutons', action = 'store_true')
+
 
-    def handle(self, *args, **options):
+    def handle(self, *args, **kwargs):
         conn = pg.connect(database="nk15",user="nk15_user")
         cur = conn.cursor(cursor_factory = pge.DictCursor)
 
-        #  Start with Special accounts
-        cur.execute("SELECT * FROM comptes WHERE idbde <0 ORDER BY idbde;")
-
-        for row in cur:
-            with transaction.atomic():
-                obj,created = NoteSpecial.objects.get_or_create(special_type = row["pseudo"],
-                                   balance = row["solde"],
-                                   is_active =True)
-                if created:
-                    obj.save()
-                    # The rest
-        cur.execute("SELECT * FROM comptes WHERE idbde=0;")
-        res = cur.fetchone()
-        clubBde, c = Club.objects.get_or_create(pk = 1,
-                                                name = "Bde",
-                                                email = "bureau.bde@lists.crans.org",
-                                                membership_duration = "396 00:00:00",
-                                                membership_start = "213 00:00:00",
-                                                membership_end = "273 00:00:00",
-                                                membership_fee = 5,
-        )
-        clubKfet, c = Club.objects.get_or_create(pk = 2,
-                                                 name = "Kfet",
-                                                 email = "tresorerie.bde@lists.crans.org",
-                                                 membership_duration = "396 00:00:00",
-                                                 membership_start = "213 00:00:00",
-                                                 membership_end = "273 00:00:00",
-                                                 membership_fee = 35,
-        )
-        clubBde.save()
-        clubKfet.save()
-        clubBde.note.solde=res["solde"]
-
-        cur.execute("SELECT * FROM comptes WHERE idbde > 0 ORDER BY idbde;")
-        pkclub = 3
-        with transaction.atomic():
-            for row in cur:
-                row["idbde"] += 7 # do not overwrite the already populated id.
-                if row["type"] == "personne":
-                    #sanitize password
-                    if row["passwd"] != "*|*":
-                        passwd_nk15 = "$".join(["custom_nk15","1",row["passwd"]])
-                    else:
-                        passwd_nk15 = ''
-                    try:
-                        user = User.objects.create(
-                            username =row["pseudo"],
-                            password = passwd_nk15,
-                            first_name = row["nom"],
-                            last_name = row["prenom"],
-                            email = row["mail"],
-                        )
-                    #sanitize duplicate aliases (nk12)
-                    except ValidationError as e:
-                        if e.code == 'same_alias':
-                            user = User.objects.create(
-                                username = row["pseudo"]+str(row["idbde"]),
-                                password = row["passwd"] if row["passwd"] != '*|*' else '',
-                                first_name = row["nom"],
-                                last_name = row["prenom"],
-                                email = row["mail"],
-                            )
-                    profile = Profile.objects.create(
-                        phone_number = row["tel"],
-                        address = row["adresse"],
-                        paid = row["normalien"],
-                        user = user,
-                    )
-                    note = user.note
-                    note.balance = row["solde"]
-
-                    obj_list =[user, profile, note]
-                else:#club
-                    print(row)
-                    club,c = Club.objects.get_or_create(pk=pkclub,
-                                                        name = row["pseudo"],
-                                                        email = row["mail"],
-                                                        membership_duration = "396 00:00:00",
-                                                        membership_start = "213 00:00:00",
-                                                        membership_end = "273 00:00:00",
-                                                        membership_fee =0,
-                    )
-                    pkclub +=1
-                    note = club.note
-                    note.balance = row["solde"]
-                    obj_list = [club,note]
-                for obj in obj_list:
-                    obj.save()
-                    #endfor
+        if kwargs["special"]:
+            map_idbde = import_special(cur)
+            print("Minimal setup created")
+
+        if kwargs["comptes"]:
+            map_idbde = import_comptes(cur,map_idbde)
+            print("comptes table imported")
+
+        if kwargs["boutons"]:
+            import_boutons(cur,map_idbde)
+            print("boutons table imported")
+        if kwargs["transaction"]:
+            import_transaction(cur)
-- 
GitLab