diff --git a/migrate.py b/migrate.py index 10adda45..d8dd8a2c 100644 --- a/migrate.py +++ b/migrate.py @@ -34,6 +34,8 @@ db = MySQLdb.connect( charset='utf8', use_unicode=True) +start = datetime.datetime.now() + def reset_index(*args): sqlcmd = StringIO() call_command("sqlsequencereset", *args, stdout=sqlcmd) @@ -46,201 +48,219 @@ def to_unicode(s): return "" -def migrate_users(): - SEX = {'1': 'MAN', '2': 'WOMAN', None: 'MAN'} - TSHIRT = { - None: '-', - '': '-', - 'NULL': '-', - 'XS': 'XS', - 'S': 'S', - 'M': 'M', - 'L': 'L', - 'XL': 'XL', - 'XXL': 'XXL', - 'XXXL': 'XXXL', - } - ROLE = { - 'doc': 'DOCTOR', - 'etu': 'STUDENT', - 'anc': 'FORMER STUDENT', - 'ens': 'TEACHER', - 'adm': 'ADMINISTRATIVE', - 'srv': 'SERVICE', - 'per': 'AGENT', - None: '', - } - DEPARTMENTS = { - 'tc': 'TC', - 'gi': 'GI', - 'gesc': 'GESC', - 'na': 'NA', - 'mc': 'MC', - 'imap': 'IMAP', - 'huma': 'HUMA', - 'edim': 'EDIM', - 'ee': 'EE', - 'imsi': 'IMSI', - 'truc': 'NA', - None: 'NA', - } +def migrate_core(): + def migrate_users(): + SEX = {'1': 'MAN', '2': 'WOMAN', None: 'MAN'} + TSHIRT = { + None: '-', + '': '-', + 'NULL': '-', + 'XS': 'XS', + 'S': 'S', + 'M': 'M', + 'L': 'L', + 'XL': 'XL', + 'XXL': 'XXL', + 'XXXL': 'XXXL', + } + ROLE = { + 'doc': 'DOCTOR', + 'etu': 'STUDENT', + 'anc': 'FORMER STUDENT', + 'ens': 'TEACHER', + 'adm': 'ADMINISTRATIVE', + 'srv': 'SERVICE', + 'per': 'AGENT', + None: '', + } + DEPARTMENTS = { + 'tc': 'TC', + 'gi': 'GI', + 'gesc': 'GESC', + 'na': 'NA', + 'mc': 'MC', + 'imap': 'IMAP', + 'huma': 'HUMA', + 'edim': 'EDIM', + 'ee': 'EE', + 'imsi': 'IMSI', + 'truc': 'NA', + None: 'NA', + } - def get_random_free_email(): - email = "no_email_%s@git.an" % random.randrange(4000, 40000) - while User.objects.filter(email=email).exists(): + def get_random_free_email(): email = "no_email_%s@git.an" % random.randrange(4000, 40000) - return email + while User.objects.filter(email=email).exists(): + email = "no_email_%s@git.an" % random.randrange(4000, 40000) + return email - c = db.cursor(MySQLdb.cursors.SSDictCursor) - c.execute(""" - SELECT * - FROM utilisateurs utl - LEFT JOIN utl_etu ue - ON ue.id_utilisateur = utl.id_utilisateur - LEFT JOIN utl_etu_utbm ueu - ON ueu.id_utilisateur = utl.id_utilisateur - LEFT JOIN utl_extra uxtra - ON uxtra.id_utilisateur = utl.id_utilisateur - LEFT JOIN loc_ville ville - ON utl.id_ville = ville.id_ville - -- WHERE utl.id_utilisateur = 9360 - """) - User.objects.filter(id__gt=0).delete() - print("Users deleted") + c = db.cursor(MySQLdb.cursors.SSDictCursor) + c.execute(""" + SELECT * + FROM utilisateurs utl + LEFT JOIN utl_etu ue + ON ue.id_utilisateur = utl.id_utilisateur + LEFT JOIN utl_etu_utbm ueu + ON ueu.id_utilisateur = utl.id_utilisateur + LEFT JOIN utl_extra uxtra + ON uxtra.id_utilisateur = utl.id_utilisateur + LEFT JOIN loc_ville ville + ON utl.id_ville = ville.id_ville + -- WHERE utl.id_utilisateur = 9360 + """) + User.objects.filter(id__gt=0).delete() + print("Users deleted") - for u in c: - try: - new = User( - id=u['id_utilisateur'], - last_name=to_unicode(u['nom_utl']) or "Bou", - first_name=to_unicode(u['prenom_utl']) or "Bi", - email=u['email_utl'], - second_email=u['email_utbm'] or "", - date_of_birth=u['date_naissance_utl'], - last_update=u['date_maj_utl'], - nick_name=to_unicode(u['surnom_utbm']), - sex=SEX[u['sexe_utl']], - tshirt_size=TSHIRT[u['taille_tshirt_utl']], - role=ROLE[u['role_utbm']], - department=DEPARTMENTS[u['departement_utbm']], - dpt_option=to_unicode(u['filiere_utbm']), - semester=u['semestre_utbm'] or 0, - quote=to_unicode(u['citation']), - school=to_unicode(u['nom_ecole_etudiant']), - promo=u['promo_utbm'] or 0, - forum_signature=to_unicode(u['signature_utl']), - address=(to_unicode(u['addresse_utl']) + ", " + to_unicode(u['cpostal_ville']) + " " + to_unicode(u['nom_ville'])), - parent_address=(to_unicode(u['adresse_parents']) + ", " + to_unicode(u['cpostal_parents']) + " " + to_unicode(u['ville_parents'])), - phone=u['tel_portable_utl'] or "", - parent_phone=u['tel_parents'] or "", - is_subscriber_viewable=bool(u['publique_utl']), - ) - new.generate_username() - new.save() - except IntegrityError as e: - if "Key (email)" in repr(e): - new.email = get_random_free_email() - new.save() - print("New email generated") - else: - print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e))) - except Exception as e: - print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e))) - c.close() - -def migrate_profile_pict(): - PROFILE_ROOT = "/data/matmatronch/" - - profile = SithFile.objects.filter(parent=None, name="profiles").first() - profile.children.all().delete() - print("Profiles pictures deleted") - for filename in listdir(PROFILE_ROOT): - if filename.split('.')[-2] != "mini": + for u in c: try: - uid = filename.split('.')[0].split('-')[0] - user = User.objects.filter(id=int(uid)).first() - if user: - f = File(open(PROFILE_ROOT + '/' + filename, 'rb')) - f.name = f.name.split('/')[-1] - t = filename.split('.')[1] - new_file = SithFile(parent=profile, name=filename, - file=f, owner=user, is_folder=False, mime_type="image/jpeg", size=f.size) - if t == "identity": - new_file.save() - user.profile_pict = new_file - user.save() - elif t == "blouse": - new_file.save() - user.scrub_pict = new_file - user.save() - else: - new_file.save() - user.avatar_pict = new_file - user.save() + new = User( + id=u['id_utilisateur'], + last_name=to_unicode(u['nom_utl']) or "Bou", + first_name=to_unicode(u['prenom_utl']) or "Bi", + email=u['email_utl'], + second_email=u['email_utbm'] or "", + date_of_birth=u['date_naissance_utl'], + last_update=u['date_maj_utl'], + nick_name=to_unicode(u['surnom_utbm']), + sex=SEX[u['sexe_utl']], + tshirt_size=TSHIRT[u['taille_tshirt_utl']], + role=ROLE[u['role_utbm']], + department=DEPARTMENTS[u['departement_utbm']], + dpt_option=to_unicode(u['filiere_utbm']), + semester=u['semestre_utbm'] or 0, + quote=to_unicode(u['citation']), + school=to_unicode(u['nom_ecole_etudiant']), + promo=u['promo_utbm'] or 0, + forum_signature=to_unicode(u['signature_utl']), + address=(to_unicode(u['addresse_utl']) + ", " + to_unicode(u['cpostal_ville']) + " " + to_unicode(u['nom_ville'])), + parent_address=(to_unicode(u['adresse_parents']) + ", " + to_unicode(u['cpostal_parents']) + " " + to_unicode(u['ville_parents'])), + phone=u['tel_portable_utl'] or "", + parent_phone=u['tel_parents'] or "", + is_subscriber_viewable=bool(u['publique_utl']), + ) + new.generate_username() + new.set_password(str(random.randrange(1000000, 10000000))) + new.save() + except IntegrityError as e: + if "Key (email)" in repr(e): + new.email = get_random_free_email() + new.save() + print("New email generated") + else: + print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e))) except Exception as e: - print(repr(e)) + print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e))) + c.close() + print("Users migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_clubs(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM asso asso - WHERE nom_unix_asso <> "ae" - AND nom_unix_asso <> "bdf" - AND nom_unix_asso <> "laverie" - """) - # club = cur.fetchone() - # for k,v in club.items(): - # print("%40s | %40s" % (k, v)) + def migrate_profile_pict(): + PROFILE_ROOT = "/data/matmatronch/" - for c in cur: - try: - new = Club( - id=c['id_asso'], - name=to_unicode(c['nom_asso']), - unix_name=to_unicode(c['nom_unix_asso']), - address=to_unicode(c['adresse_postale']), - ) - new.save() - except Exception as e: - print("FAIL for club %s: %s" % (c['nom_unix_asso'], repr(e))) - cur.execute(""" - SELECT * - FROM asso - """) - for c in cur: - club = Club.objects.filter(id=c['id_asso']).first() - parent = Club.objects.filter(id=c['id_asso_parent']).first() - club.parent = parent - club.save() - cur.close() + profile = SithFile.objects.filter(parent=None, name="profiles").first() + profile.children.all().delete() + print("Profiles pictures deleted") + for filename in listdir(PROFILE_ROOT): + if filename.split('.')[-2] != "mini": + try: + uid = filename.split('.')[0].split('-')[0] + user = User.objects.filter(id=int(uid)).first() + if user: + f = File(open(PROFILE_ROOT + '/' + filename, 'rb')) + f.name = f.name.split('/')[-1] + t = filename.split('.')[1] + new_file = SithFile(parent=profile, name=filename, + file=f, owner=user, is_folder=False, mime_type="image/jpeg", size=f.size) + if t == "identity": + new_file.save() + user.profile_pict = new_file + user.save() + elif t == "blouse": + new_file.save() + user.scrub_pict = new_file + user.save() + else: + new_file.save() + user.avatar_pict = new_file + user.save() + except Exception as e: + print(repr(e)) + print("Profile pictures migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_club_memberships(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM asso_membre - """) + migrate_users() + migrate_profile_pict() - Membership.objects.all().delete() - print("Memberships deleted") - for m in cur: - try: - club = Club.objects.filter(id=m['id_asso']).first() - user = User.objects.filter(id=m['id_utilisateur']).first() - if club and user: - new = Membership( - club=club, - user=user, - start_date=m['date_debut'], - end_date=m['date_fin'], - role=m['role'], - description=to_unicode(m['desc_role']), + +def migrate_club(): + def migrate_clubs(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM asso asso + WHERE nom_unix_asso <> "ae" + AND nom_unix_asso <> "bdf" + AND nom_unix_asso <> "laverie" + """) + # club = cur.fetchone() + # for k,v in club.items(): + # print("%40s | %40s" % (k, v)) + + for c in cur: + try: + new = Club( + id=c['id_asso'], + name=to_unicode(c['nom_asso']), + unix_name=to_unicode(c['nom_unix_asso']), + address=to_unicode(c['adresse_postale']), ) new.save() - except Exception as e: - print("FAIL for club membership %s: %s" % (m['id_asso'], repr(e))) - cur.close() + except Exception as e: + print("FAIL for club %s: %s" % (c['nom_unix_asso'], repr(e))) + cur.execute(""" + SELECT * + FROM asso + """) + for c in cur: + club = Club.objects.filter(id=c['id_asso']).first() + parent = Club.objects.filter(id=c['id_asso_parent']).first() + club.parent = parent + club.save() + cur.close() + print("Clubs migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_club_memberships(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM asso_membre + """) + + Membership.objects.all().delete() + print("Memberships deleted") + for m in cur: + try: + club = Club.objects.filter(id=m['id_asso']).first() + user = User.objects.filter(id=m['id_utilisateur']).first() + if club and user: + new = Membership( + club=club, + user=user, + start_date=m['date_debut'], + end_date=m['date_fin'], + role=m['role'], + description=to_unicode(m['desc_role']), + ) + new.save() + except Exception as e: + print("FAIL for club membership %s: %s" % (m['id_asso'], repr(e))) + cur.close() + print("Clubs memberships migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + migrate_clubs() + migrate_club_memberships() def migrate_subscriptions(): LOCATION = { @@ -298,559 +318,333 @@ def migrate_subscriptions(): except Exception as e: print("FAIL for subscription %s: %s" % (r['id_cotisation'], repr(e))) cur.close() + print("Subscriptions migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def update_customer_account(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM ae_carte carte - JOIN ae_cotisations cotis - ON carte.id_cotisation = cotis.id_cotisation - """) - for r in cur: - try: - user = Customer.objects.filter(user_id=r['id_utilisateur']).first() - if user: - user.account_id = str(r['id_carte_ae']) + r['cle_carteae'].lower() - user.save() - except Exception as e: - print("FAIL to update customer account for %s: %s" % (r['id_cotisation'], repr(e))) - cur.close() +def migrate_counter(): + def update_customer_account(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM ae_carte carte + JOIN ae_cotisations cotis + ON carte.id_cotisation = cotis.id_cotisation + """) + for r in cur: + try: + user = Customer.objects.filter(user_id=r['id_utilisateur']).first() + if user: + user.account_id = str(r['id_carte_ae']) + r['cle_carteae'].lower() + user.save() + except Exception as e: + print("FAIL to update customer account for %s: %s" % (r['id_cotisation'], repr(e))) + cur.close() + print("Customer accounts migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_counters(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_comptoir - """) - Counter.objects.all().delete() - for r in cur: - try: - club = Club.objects.filter(id=r['id_assocpt']).first() - new = Counter( - id=r['id_comptoir'], - name=to_unicode(r['nom_cpt']), - club=club, - type="OFFICE", - ) - new.save() - except Exception as e: - print("FAIL to migrate counter %s: %s" % (r['id_comptoir'], repr(e))) - cur.close() - eboutic = Counter.objects.filter(id=3).first() - eboutic.type = "EBOUTIC" - eboutic.save() + def migrate_counters(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_comptoir + """) + Counter.objects.all().delete() + for r in cur: + try: + club = Club.objects.filter(id=r['id_assocpt']).first() + new = Counter( + id=r['id_comptoir'], + name=to_unicode(r['nom_cpt']), + club=club, + type="OFFICE", + ) + new.save() + except Exception as e: + print("FAIL to migrate counter %s: %s" % (r['id_comptoir'], repr(e))) + cur.close() + eboutic = Counter.objects.filter(id=3).first() + eboutic.type = "EBOUTIC" + eboutic.save() + print("Counters migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def reset_customer_amount(): - Refilling.objects.all().delete() - Selling.objects.all().delete() - Invoice.objects.all().delete() - for c in Customer.objects.all(): - c.amount = 0 - c.save() - print("Customer amount reset") + def reset_customer_amount(): + Refilling.objects.all().delete() + Selling.objects.all().delete() + Invoice.objects.all().delete() + for c in Customer.objects.all(): + c.amount = 0 + c.save() + print("Customer amount reset") -def migrate_refillings(): - BANK = { - 0: "OTHER", - 1: "SOCIETE-GENERALE", - 2: "BANQUE-POPULAIRE", - 3: "BNP", - 4: "CAISSE-EPARGNE", - 5: "CIC", - 6: "CREDIT-AGRICOLE", - 7: "CREDIT-MUTUEL", - 8: "CREDIT-LYONNAIS", - 9: "LA-POSTE", - 100: "OTHER", - None: "OTHER", - } - PAYMENT = { - 2: "CARD", - 1: "CASH", - 0: "CHECK", - } - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_rechargements - """) - root_cust = Customer.objects.filter(user__id=0).first() - mde = Counter.objects.filter(id=1).first() - Refilling.objects.all().delete() - print("Refillings deleted") - fail = 100 - for r in cur: - try: - cust = Customer.objects.filter(user__id=r['id_utilisateur']).first() - user = User.objects.filter(id=r['id_utilisateur']).first() - if not cust: - if not user: - cust = root_cust - else: - cust = Customer(user=user, amount=0, account_id=Customer.generate_account_id(fail)) - cust.save() - fail += 1 - op = User.objects.filter(id=r['id_utilisateur_operateur']).first() - counter = Counter.objects.filter(id=r['id_comptoir']).first() - new = Refilling( - id=r['id_rechargement'], - counter=counter or mde, - customer=cust or root_cust, - operator=op or root_cust.user, - amount=r['montant_rech']/100, - payment_method=PAYMENT[r['type_paiement_rech']], - bank=BANK[r['banque_rech']], - date=r['date_rech'].replace(tzinfo=timezone('Europe/Paris')), - ) - new.save() - except Exception as e: - print("FAIL to migrate refilling %s for %s: %s" % (r['id_rechargement'], r['id_utilisateur'], repr(e))) - cur.close() + def migrate_refillings(): + BANK = { + 0: "OTHER", + 1: "SOCIETE-GENERALE", + 2: "BANQUE-POPULAIRE", + 3: "BNP", + 4: "CAISSE-EPARGNE", + 5: "CIC", + 6: "CREDIT-AGRICOLE", + 7: "CREDIT-MUTUEL", + 8: "CREDIT-LYONNAIS", + 9: "LA-POSTE", + 100: "OTHER", + None: "OTHER", + } + PAYMENT = { + 2: "CARD", + 1: "CASH", + 0: "CHECK", + } + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_rechargements + """) + root_cust = Customer.objects.filter(user__id=0).first() + mde = Counter.objects.filter(id=1).first() + Refilling.objects.all().delete() + print("Refillings deleted") + fail = 100 + for r in cur: + try: + cust = Customer.objects.filter(user__id=r['id_utilisateur']).first() + user = User.objects.filter(id=r['id_utilisateur']).first() + if not cust: + if not user: + cust = root_cust + else: + cust = Customer(user=user, amount=0, account_id=Customer.generate_account_id(fail)) + cust.save() + fail += 1 + op = User.objects.filter(id=r['id_utilisateur_operateur']).first() + counter = Counter.objects.filter(id=r['id_comptoir']).first() + new = Refilling( + id=r['id_rechargement'], + counter=counter or mde, + customer=cust or root_cust, + operator=op or root_cust.user, + amount=r['montant_rech']/100, + payment_method=PAYMENT[r['type_paiement_rech']], + bank=BANK[r['banque_rech']], + date=r['date_rech'].replace(tzinfo=timezone('Europe/Paris')), + ) + new.save() + except Exception as e: + print("FAIL to migrate refilling %s for %s: %s" % (r['id_rechargement'], r['id_utilisateur'], repr(e))) + cur.close() + print("Refillings migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_typeproducts(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_type_produit - """) - ProductType.objects.all().delete() - print("Product types deleted") - for r in cur: - try: - new = ProductType( - id=r['id_typeprod'], - name=to_unicode(r['nom_typeprod']), - description=to_unicode(r['description_typeprod']), - ) - new.save() - except Exception as e: - print("FAIL to migrate product type %s: %s" % (r['nom_typeprod'], repr(e))) - cur.close() + def migrate_typeproducts(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_type_produit + """) + ProductType.objects.all().delete() + print("Product types deleted") + for r in cur: + try: + new = ProductType( + id=r['id_typeprod'], + name=to_unicode(r['nom_typeprod']), + description=to_unicode(r['description_typeprod']), + ) + new.save() + except Exception as e: + print("FAIL to migrate product type %s: %s" % (r['nom_typeprod'], repr(e))) + cur.close() + print("Product types migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_products(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_produits - """) - Product.objects.all().delete() - print("Product deleted") - for r in cur: - try: - type = ProductType.objects.filter(id=r['id_typeprod']).first() - club = Club.objects.filter(id=r['id_assocpt']).first() - new = Product( - id=r['id_produit'], - product_type=type, - name=to_unicode(r['nom_prod']), - description=to_unicode(r['description_prod']), - code=to_unicode(r['cbarre_prod']), - purchase_price=r['prix_achat_prod']/100, - selling_price=r['prix_vente_prod']/100, - special_selling_price=r['prix_vente_barman_prod']/100, - club=club, - limit_age=r['mineur'] or 0, - tray=bool(r['plateau']), - ) - new.save() - except Exception as e: - print("FAIL to migrate product %s: %s" % (r['nom_prod'], repr(e))) - cur.close() + def migrate_products(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_produits + """) + Product.objects.all().delete() + print("Product deleted") + for r in cur: + try: + type = ProductType.objects.filter(id=r['id_typeprod']).first() + club = Club.objects.filter(id=r['id_assocpt']).first() + new = Product( + id=r['id_produit'], + product_type=type, + name=to_unicode(r['nom_prod']), + description=to_unicode(r['description_prod']), + code=to_unicode(r['cbarre_prod']), + purchase_price=r['prix_achat_prod']/100, + selling_price=r['prix_vente_prod']/100, + special_selling_price=r['prix_vente_barman_prod']/100, + club=club, + limit_age=r['mineur'] or 0, + tray=bool(r['plateau']), + ) + new.save() + except Exception as e: + print("FAIL to migrate product %s: %s" % (r['nom_prod'], repr(e))) + cur.close() + print("Product migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_product_pict(): - FILE_ROOT = "/data/files/" + def migrate_product_pict(): + FILE_ROOT = "/data/files/" - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_produits - WHERE id_file IS NOT NULL - """) - for r in cur: - try: - prod = Product.objects.filter(id=r['id_produit']).first() - if prod: - f = File(open(FILE_ROOT + '/' + str(r['id_file']) + ".1", 'rb')) - f.name = prod.name - prod.icon = f - prod.save() - except Exception as e: - print(repr(e)) + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_produits + WHERE id_file IS NOT NULL + """) + for r in cur: + try: + prod = Product.objects.filter(id=r['id_produit']).first() + if prod: + f = File(open(FILE_ROOT + '/' + str(r['id_file']) + ".1", 'rb')) + f.name = prod.name + prod.icon = f + prod.save() + except Exception as e: + print(repr(e)) + print("Product pictures migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_products_to_counter(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_mise_en_vente - """) - for r in cur: - try: - product = Product.objects.filter(id=r['id_produit']).first() - counter = Counter.objects.filter(id=r['id_comptoir']).first() - counter.products.add(product) - counter.save() - except Exception as e: - print("FAIL to set product %s in counter %s: %s" % (product, counter, repr(e))) - cur.close() + def migrate_products_to_counter(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_mise_en_vente + """) + for r in cur: + try: + product = Product.objects.filter(id=r['id_produit']).first() + counter = Counter.objects.filter(id=r['id_comptoir']).first() + counter.products.add(product) + counter.save() + except Exception as e: + print("FAIL to set product %s in counter %s: %s" % (product, counter, repr(e))) + cur.close() + print("Product in counters migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_invoices(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_vendu ven - LEFT JOIN cpt_debitfacture fac - ON ven.id_facture = fac.id_facture - WHERE fac.mode_paiement = 'SG' - """) - Invoice.objects.all().delete() - print("Invoices deleted") - Refilling.objects.filter(payment_method="CARD").delete() - print("Card refillings deleted") - Selling.objects.filter(payment_method="CARD").delete() - print("Card sellings deleted") - root = User.objects.filter(id=0).first() - for r in cur: - try: - product = Product.objects.filter(id=r['id_produit']).first() - user = User.objects.filter(id=r['id_utilisateur_client']).first() - i = Invoice.objects.filter(id=r['id_facture']).first() or Invoice(id=r['id_facture']) - i.user = user or root + def migrate_invoices(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_vendu ven + LEFT JOIN cpt_debitfacture fac + ON ven.id_facture = fac.id_facture + WHERE fac.mode_paiement = 'SG' + """) + Invoice.objects.all().delete() + print("Invoices deleted") + Refilling.objects.filter(payment_method="CARD").delete() + print("Card refillings deleted") + Selling.objects.filter(payment_method="CARD").delete() + print("Card sellings deleted") + root = User.objects.filter(id=0).first() + for r in cur: + try: + product = Product.objects.filter(id=r['id_produit']).first() + user = User.objects.filter(id=r['id_utilisateur_client']).first() + i = Invoice.objects.filter(id=r['id_facture']).first() or Invoice(id=r['id_facture']) + i.user = user or root + for f in i._meta.local_fields: + if f.name == "date": + f.auto_now = False + i.date = r['date_facture'].replace(tzinfo=timezone('Europe/Paris')) + i.save() + InvoiceItem(invoice=i, product_id=product.id, product_name=product.name, type_id=product.product_type.id, + product_unit_price=r['prix_unit']/100, quantity=r['quantite']).save() + except ValidationError as e: + print(repr(e) + " for %s (%s)" % (customer, customer.user.id)) + except Exception as e: + print("FAIL to migrate invoice %s: %s" % (r['id_facture'], repr(e))) + cur.close() + for i in Invoice.objects.all(): for f in i._meta.local_fields: if f.name == "date": f.auto_now = False - i.date = r['date_facture'].replace(tzinfo=timezone('Europe/Paris')) - i.save() - InvoiceItem(invoice=i, product_id=product.id, product_name=product.name, type_id=product.product_type.id, - product_unit_price=r['prix_unit']/100, quantity=r['quantite']).save() - except ValidationError as e: - print(repr(e) + " for %s (%s)" % (customer, customer.user.id)) - except Exception as e: - print("FAIL to migrate invoice %s: %s" % (r['id_facture'], repr(e))) - cur.close() - for i in Invoice.objects.all(): - for f in i._meta.local_fields: - if f.name == "date": - f.auto_now = False - i.validate() + i.validate() + print("Invoices migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def migrate_sellings(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_vendu ven - LEFT JOIN cpt_debitfacture fac - ON ven.id_facture = fac.id_facture - WHERE fac.mode_paiement = 'AE' - """) - Selling.objects.filter(payment_method="SITH_ACCOUNT").delete() - print("Sith account selling deleted") - for c in Customer.objects.all(): - c.amount = sum([r.amount for r in c.refillings.all()]) - c.save() - print("Customer amount reset to sum of refillings") - ae = Club.objects.filter(unix_name="ae").first() - mde = Counter.objects.filter(id=1).first() - root = User.objects.filter(id=0).first() - beer = Product.objects.filter(id=1).first() - for r in cur: - try: - product = Product.objects.filter(id=r['id_produit']).first() or beer - club = Club.objects.filter(id=r['id_assocpt']).first() or ae - counter = Counter.objects.filter(id=r['id_comptoir']).first() or mde - op = User.objects.filter(id=r['id_utilisateur']).first() or root - customer = Customer.objects.filter(user__id=r['id_utilisateur_client']).first() or root.customer - new = Selling( - label=product.name or "Produit inexistant", - counter=counter, - club=club, - product=product, - seller=op, - customer=customer, - unit_price=r['prix_unit']/100, - quantity=r['quantite'], - payment_method="SITH_ACCOUNT", - date=r['date_facture'].replace(tzinfo=timezone('Europe/Paris')), - ) - new.save() - except ValidationError as e: - print(repr(e) + " for %s (%s)" % (customer, customer.user.id)) - except Exception as e: - print("FAIL to migrate selling %s: %s" % (r['id_facture'], repr(e))) - cur.close() - -def migrate_permanencies(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpt_tracking - """) - Permanency.objects.all().delete() - print("Permanencies deleted") - for r in cur: - try: - counter = Counter.objects.filter(id=r['id_comptoir']).first() - user = User.objects.filter(id=r['id_utilisateur']).first() - new = Permanency( - user=user, - counter=counter, - start=r['logged_time'].replace(tzinfo=timezone('Europe/Paris')), - end=r['closed_time'].replace(tzinfo=timezone('Europe/Paris')), - ) - new.save() - except Exception as e: - print("FAIL to migrate permanency: %s" % (repr(e))) - cur.close() - -### Accounting - -def migrate_companies(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM entreprise - """) - Company.objects.all().delete() - print("Company deleted") - for r in cur: - try: - new = Company( - id=r['id_ent'], - name=to_unicode(r['nom_entreprise']), - street=to_unicode(r['rue_entreprise']), - city=to_unicode(r['ville_entreprise']), - postcode=to_unicode(r['cpostal_entreprise']), - country=to_unicode(r['pays_entreprise']), - phone=to_unicode(r['telephone_entreprise']), - email=to_unicode(r['email_entreprise']), - website=to_unicode(r['siteweb_entreprise']), - ) - new.save() - except Exception as e: - print("FAIL to migrate company: %s" % (repr(e))) - cur.close() - -def migrate_bank_accounts(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_cpbancaire - """) - BankAccount.objects.all().delete() - print("Bank accounts deleted") - ae = Club.objects.filter(unix_name='ae').first() - for r in cur: - try: - new = BankAccount( - id=r['id_cptbc'], - club=ae, - name=to_unicode(r['nom_cptbc']), - ) - new.save() - except Exception as e: - print("FAIL to migrate bank account: %s" % (repr(e))) - cur.close() - -def migrate_club_accounts(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_cpasso - """) - ClubAccount.objects.all().delete() - print("Club accounts deleted") - ae = Club.objects.filter(id=1).first() - for r in cur: - try: - club = Club.objects.filter(id=r['id_asso']).first() or ae - bank_acc = BankAccount.objects.filter(id=r['id_cptbc']).first() - new = ClubAccount( - id=r['id_cptasso'], - club=club, - name=club.name[:30], - bank_account=bank_acc, - ) - new.save() - except Exception as e: - print("FAIL to migrate club account: %s" % (repr(e))) - cur.close() - -def migrate_journals(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_classeur - """) - GeneralJournal.objects.all().delete() - print("General journals deleted") - for r in cur: - try: - club_acc = ClubAccount.objects.filter(id=r['id_cptasso']).first() - new = GeneralJournal( - id=r['id_classeur'], - club_account=club_acc, - name=to_unicode(r['nom_classeur']), - start_date=r['date_debut_classeur'], - end_date=r['date_fin_classeur'], - closed=bool(r['ferme']), - ) - new.save() - except Exception as e: - print("FAIL to migrate general journal: %s" % (repr(e))) - cur.close() - -def migrate_accounting_types(): - MOVEMENT = { - -1: "DEBIT", - 0: "NEUTRAL", - 1: "CREDIT", - } - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_op_plcptl - """) - AccountingType.objects.all().delete() - print("Accounting types deleted") - for r in cur: - try: - new = AccountingType( - id=r['id_opstd'], - code=str(r['code_plan']), - label=to_unicode(r['libelle_plan']).capitalize(), - movement_type=MOVEMENT[r['type_mouvement']], - ) - new.save() - except Exception as e: - print("FAIL to migrate accounting type: %s" % (repr(e))) - cur.close() - -def migrate_simpleaccounting_types(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_op_clb - WHERE id_asso IS NULL - """) - SimplifiedAccountingType.objects.all().delete() - print("Simple accounting types deleted") - for r in cur: - try: - at = AccountingType.objects.filter(id=r['id_opstd']).first() - new = SimplifiedAccountingType( - id=r['id_opclb'], - label=to_unicode(r['libelle_opclb']).capitalize(), - accounting_type=at, - ) - new.save() - except Exception as e: - print("FAIL to migrate simple type: %s" % (repr(e))) - cur.close() - -def migrate_operations(): - MODE = { - 1: "CHECK", - 2: "CASH", - 3: "TRANSFERT", - 4: "CARD", - 0: "CASH", - None: "CASH", - } - MOVEMENT_TYPE = { - -1: "DEBIT", - 0: "NEUTRAL", - 1: "CREDIT", - None: "NEUTRAL", - } - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_operation op - LEFT JOIN cpta_op_clb clb - ON op.id_opclb = clb.id_opclb - """) - Operation.objects.all().delete() - print("Operation deleted") - for r in cur: - try: - simple_type = None - accounting_type = None - if r['id_opclb']: - simple_type = SimplifiedAccountingType.objects.filter(id=r['id_opclb']).first() - if r['id_opstd']: - accounting_type = AccountingType.objects.filter(id=r['id_opstd']).first() - if not accounting_type and simple_type: - accounting_type = simple_type.accounting_type - if not accounting_type: - accounting_type = AccountingType.objects.filter(movement_type=MOVEMENT_TYPE[r['type_mouvement']]).first() - journal = GeneralJournal.objects.filter(id=r['id_classeur']).first() - def get_target_type(): - if r['id_utilisateur']: - return "USER" - if r['id_asso']: - return "CLUB" - if r['id_ent']: - return "COMPANY" - if r['id_classeur']: - return "ACCOUNT" - def get_target_id(): - return int(r['id_utilisateur'] or r['id_asso'] or r['id_ent'] or r['id_classeur']) or None - new = Operation( - id=r['id_op'], - journal=journal, - amount=r['montant_op']/100, - date=r['date_op'] or journal.end_date, - remark=to_unicode(r['commentaire_op']), - mode=MODE[r['mode_op']], - cheque_number=str(r['num_cheque_op']), - done=bool(r['op_effctue']), - simpleaccounting_type=simple_type, - accounting_type=accounting_type, - target_type=get_target_type(), - target_id=get_target_id(), - target_label="-", - ) + def migrate_sellings(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_vendu ven + LEFT JOIN cpt_debitfacture fac + ON ven.id_facture = fac.id_facture + WHERE fac.mode_paiement = 'AE' + """) + Selling.objects.filter(payment_method="SITH_ACCOUNT").delete() + print("Sith account selling deleted") + for c in Customer.objects.all(): + c.amount = sum([r.amount for r in c.refillings.all()]) + c.save() + print("Customer amount reset to sum of refillings") + ae = Club.objects.filter(unix_name="ae").first() + mde = Counter.objects.filter(id=1).first() + root = User.objects.filter(id=0).first() + beer = Product.objects.filter(id=1).first() + for r in cur: try: - new.clean() - except: - new.target_id = get_target_id() - new.target_type = "OTHER" - new.save() - except Exception as e: - print("FAIL to migrate operation: %s" % (repr(e))) - cur.close() - -def make_operation_links(): - cur = db.cursor(MySQLdb.cursors.SSDictCursor) - cur.execute(""" - SELECT * - FROM cpta_operation - """) - for r in cur: - if r['id_op_liee']: - try: - op1 = Operation.objects.filter(id=r['id_op']).first() - op2 = Operation.objects.filter(id=r['id_op_liee']).first() - op1.linked_operation = op2 - op1.save() - op2.linked_operation = op1 - op2.save() + product = Product.objects.filter(id=r['id_produit']).first() or beer + club = Club.objects.filter(id=r['id_assocpt']).first() or ae + counter = Counter.objects.filter(id=r['id_comptoir']).first() or mde + op = User.objects.filter(id=r['id_utilisateur']).first() or root + customer = Customer.objects.filter(user__id=r['id_utilisateur_client']).first() or root.customer + new = Selling( + label=product.name or "Produit inexistant", + counter=counter, + club=club, + product=product, + seller=op, + customer=customer, + unit_price=r['prix_unit']/100, + quantity=r['quantite'], + payment_method="SITH_ACCOUNT", + date=r['date_facture'].replace(tzinfo=timezone('Europe/Paris')), + ) + new.save() + except ValidationError as e: + print(repr(e) + " for %s (%s)" % (customer, customer.user.id)) except Exception as e: - print("FAIL to link operations: %s" % (repr(e))) - cur.close() + print("FAIL to migrate selling %s: %s" % (r['id_facture'], repr(e))) + cur.close() + print("Sellings migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_permanencies(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpt_tracking + """) + Permanency.objects.all().delete() + print("Permanencies deleted") + for r in cur: + try: + counter = Counter.objects.filter(id=r['id_comptoir']).first() + user = User.objects.filter(id=r['id_utilisateur']).first() + new = Permanency( + user=user, + counter=counter, + start=r['logged_time'].replace(tzinfo=timezone('Europe/Paris')), + end=r['closed_time'].replace(tzinfo=timezone('Europe/Paris')), + ) + new.save() + except Exception as e: + print("FAIL to migrate permanency: %s" % (repr(e))) + cur.close() + print("Permanencies migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) -def main(): - start = datetime.datetime.now() - print("Start at %s" % start) - # Core - migrate_users() - migrate_profile_pict() - # Club - migrate_clubs() - migrate_club_memberships() - # Subscriptions - migrate_subscriptions() - # Counters update_customer_account() migrate_counters() migrate_permanencies() @@ -860,10 +654,263 @@ def main(): migrate_products_to_counter() reset_customer_amount() migrate_invoices() - reset_index('counter') migrate_refillings() migrate_sellings() - # Accounting + +### Accounting + +def migrate_accounting(): + def migrate_companies(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM entreprise + """) + Company.objects.all().delete() + print("Company deleted") + for r in cur: + try: + new = Company( + id=r['id_ent'], + name=to_unicode(r['nom_entreprise']), + street=to_unicode(r['rue_entreprise']), + city=to_unicode(r['ville_entreprise']), + postcode=to_unicode(r['cpostal_entreprise']), + country=to_unicode(r['pays_entreprise']), + phone=to_unicode(r['telephone_entreprise']), + email=to_unicode(r['email_entreprise']), + website=to_unicode(r['siteweb_entreprise']), + ) + new.save() + except Exception as e: + print("FAIL to migrate company: %s" % (repr(e))) + cur.close() + print("Companies migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_bank_accounts(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_cpbancaire + """) + BankAccount.objects.all().delete() + print("Bank accounts deleted") + ae = Club.objects.filter(unix_name='ae').first() + for r in cur: + try: + new = BankAccount( + id=r['id_cptbc'], + club=ae, + name=to_unicode(r['nom_cptbc']), + ) + new.save() + except Exception as e: + print("FAIL to migrate bank account: %s" % (repr(e))) + cur.close() + print("Bank accounts migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_club_accounts(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_cpasso + """) + ClubAccount.objects.all().delete() + print("Club accounts deleted") + ae = Club.objects.filter(id=1).first() + for r in cur: + try: + club = Club.objects.filter(id=r['id_asso']).first() or ae + bank_acc = BankAccount.objects.filter(id=r['id_cptbc']).first() + new = ClubAccount( + id=r['id_cptasso'], + club=club, + name=club.name[:30], + bank_account=bank_acc, + ) + new.save() + except Exception as e: + print("FAIL to migrate club account: %s" % (repr(e))) + cur.close() + print("Club accounts migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_journals(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_classeur + """) + GeneralJournal.objects.all().delete() + print("General journals deleted") + for r in cur: + try: + club_acc = ClubAccount.objects.filter(id=r['id_cptasso']).first() + new = GeneralJournal( + id=r['id_classeur'], + club_account=club_acc, + name=to_unicode(r['nom_classeur']), + start_date=r['date_debut_classeur'], + end_date=r['date_fin_classeur'], + closed=bool(r['ferme']), + ) + new.save() + except Exception as e: + print("FAIL to migrate general journal: %s" % (repr(e))) + cur.close() + print("General journals migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_accounting_types(): + MOVEMENT = { + -1: "DEBIT", + 0: "NEUTRAL", + 1: "CREDIT", + } + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_op_plcptl + """) + AccountingType.objects.all().delete() + print("Accounting types deleted") + for r in cur: + try: + new = AccountingType( + id=r['id_opstd'], + code=str(r['code_plan']), + label=to_unicode(r['libelle_plan']).capitalize(), + movement_type=MOVEMENT[r['type_mouvement']], + ) + new.save() + except Exception as e: + print("FAIL to migrate accounting type: %s" % (repr(e))) + cur.close() + print("Accounting types migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_simpleaccounting_types(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_op_clb + WHERE id_asso IS NULL + """) + SimplifiedAccountingType.objects.all().delete() + print("Simple accounting types deleted") + for r in cur: + try: + at = AccountingType.objects.filter(id=r['id_opstd']).first() + new = SimplifiedAccountingType( + id=r['id_opclb'], + label=to_unicode(r['libelle_opclb']).capitalize(), + accounting_type=at, + ) + new.save() + except Exception as e: + print("FAIL to migrate simple type: %s" % (repr(e))) + cur.close() + print("Simple accounting types migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def migrate_operations(): + MODE = { + 1: "CHECK", + 2: "CASH", + 3: "TRANSFERT", + 4: "CARD", + 0: "CASH", + None: "CASH", + } + MOVEMENT_TYPE = { + -1: "DEBIT", + 0: "NEUTRAL", + 1: "CREDIT", + None: "NEUTRAL", + } + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_operation op + LEFT JOIN cpta_op_clb clb + ON op.id_opclb = clb.id_opclb + """) + Operation.objects.all().delete() + print("Operation deleted") + for r in cur: + try: + simple_type = None + accounting_type = None + if r['id_opclb']: + simple_type = SimplifiedAccountingType.objects.filter(id=r['id_opclb']).first() + if r['id_opstd']: + accounting_type = AccountingType.objects.filter(id=r['id_opstd']).first() + if not accounting_type and simple_type: + accounting_type = simple_type.accounting_type + if not accounting_type: + accounting_type = AccountingType.objects.filter(movement_type=MOVEMENT_TYPE[r['type_mouvement']]).first() + journal = GeneralJournal.objects.filter(id=r['id_classeur']).first() + def get_target_type(): + if r['id_utilisateur']: + return "USER" + if r['id_asso']: + return "CLUB" + if r['id_ent']: + return "COMPANY" + if r['id_classeur']: + return "ACCOUNT" + def get_target_id(): + return int(r['id_utilisateur'] or r['id_asso'] or r['id_ent'] or r['id_classeur']) or None + new = Operation( + id=r['id_op'], + journal=journal, + amount=r['montant_op']/100, + date=r['date_op'] or journal.end_date, + remark=to_unicode(r['commentaire_op']), + mode=MODE[r['mode_op']], + cheque_number=str(r['num_cheque_op']), + done=bool(r['op_effctue']), + simpleaccounting_type=simple_type, + accounting_type=accounting_type, + target_type=get_target_type(), + target_id=get_target_id(), + target_label="-", + ) + try: + new.clean() + except: + new.target_id = get_target_id() + new.target_type = "OTHER" + new.save() + except Exception as e: + print("FAIL to migrate operation: %s" % (repr(e))) + cur.close() + print("Operations migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + + def make_operation_links(): + cur = db.cursor(MySQLdb.cursors.SSDictCursor) + cur.execute(""" + SELECT * + FROM cpta_operation + """) + for r in cur: + if r['id_op_liee']: + try: + op1 = Operation.objects.filter(id=r['id_op']).first() + op2 = Operation.objects.filter(id=r['id_op_liee']).first() + op1.linked_operation = op2 + op1.save() + op2.linked_operation = op1 + op2.save() + except Exception as e: + print("FAIL to link operations: %s" % (repr(e))) + cur.close() + print("Operations links migrated at %s" % datetime.datetime.now()) + print("Running time: %s" % (datetime.datetime.now()-start)) + migrate_companies() migrate_accounting_types() migrate_simpleaccounting_types() @@ -872,6 +919,19 @@ def main(): migrate_journals() migrate_operations() make_operation_links() + +def main(): + print("Start at %s" % start) + # Core + migrate_core() + # Club + migrate_club() + # Subscriptions + migrate_subscriptions() + # Counters + migrate_counter() + # Accounting + migrate_accounting() reset_index('core', 'club', 'subscription', 'accounting', 'eboutic', 'launderette', 'counter') end = datetime.datetime.now() print("End at %s" % end)