mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-18 12:13:24 +00:00
1701 lines
58 KiB
Python
1701 lines
58 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding:utf-8 -*
|
|
#
|
|
# Copyright 2016,2017
|
|
# - Skia <skia@libskia.so>
|
|
#
|
|
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
|
|
# http://ae.utbm.fr.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License a published by the Free Software
|
|
# Foundation; either version 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple
|
|
# Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
#
|
|
#
|
|
|
|
import MySQLdb
|
|
import os
|
|
import django
|
|
import random
|
|
import datetime
|
|
from io import StringIO
|
|
from pytz import timezone
|
|
from os import listdir
|
|
|
|
os.environ["DJANGO_SETTINGS_MODULE"] = "sith.settings"
|
|
os.environ["DJANGO_COLORS"] = "nocolor"
|
|
django.setup()
|
|
|
|
from django.db import IntegrityError
|
|
from django.conf import settings
|
|
from django.core.management import call_command
|
|
from django.db import connection
|
|
from django.forms import ValidationError
|
|
from django.core.files import File
|
|
|
|
|
|
from core.models import User, SithFile
|
|
from core.utils import doku_to_markdown, bbcode_to_markdown
|
|
from club.models import Club, Membership, Mailing, MailingSubscription
|
|
from counter.models import (
|
|
Customer,
|
|
Counter,
|
|
Selling,
|
|
Refilling,
|
|
Product,
|
|
ProductType,
|
|
Permanency,
|
|
Eticket,
|
|
)
|
|
from subscription.models import Subscription
|
|
from eboutic.models import Invoice, InvoiceItem
|
|
from accounting.models import (
|
|
BankAccount,
|
|
ClubAccount,
|
|
GeneralJournal,
|
|
Operation,
|
|
AccountingType,
|
|
Company,
|
|
SimplifiedAccountingType,
|
|
Label,
|
|
)
|
|
from sas.models import Album, Picture, PeoplePictureRelation
|
|
from forum.models import (
|
|
Forum,
|
|
ForumTopic,
|
|
ForumMessage,
|
|
ForumMessageMeta,
|
|
ForumUserInfo,
|
|
)
|
|
from pedagogy.models import UV, UVComment, UVResult
|
|
|
|
db = MySQLdb.connect(**settings.OLD_MYSQL_INFOS)
|
|
start = datetime.datetime.now()
|
|
|
|
|
|
def reset_index(*args):
|
|
sqlcmd = StringIO()
|
|
call_command("sqlsequencereset", *args, stdout=sqlcmd)
|
|
cursor = connection.cursor()
|
|
cursor.execute(sqlcmd.getvalue())
|
|
|
|
|
|
def to_unicode(s):
|
|
if s:
|
|
return bytes(s, "cp1252", errors="replace").decode("utf-8", errors="replace")
|
|
return ""
|
|
|
|
|
|
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():
|
|
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")
|
|
|
|
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.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("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_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":
|
|
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))
|
|
|
|
migrate_users()
|
|
migrate_profile_pict()
|
|
|
|
|
|
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 %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(
|
|
id=Membership.objects.count() + 1,
|
|
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 = {5: "SEVENANS", 6: "BELFORT", 9: "MONTBELIARD", None: "SEVENANS"}
|
|
TYPE = {
|
|
0: "un-semestre",
|
|
1: "deux-semestres",
|
|
2: "cursus-tronc-commun",
|
|
3: "cursus-branche",
|
|
4: "membre-honoraire",
|
|
5: "assidu",
|
|
6: "amicale/doceo",
|
|
7: "reseau-ut",
|
|
8: "crous",
|
|
9: "sbarro/esta",
|
|
10: "cursus-alternant",
|
|
None: "un-semestre",
|
|
}
|
|
PAYMENT = {1: "CHECK", 2: "CARD", 3: "CASH", 4: "OTHER", 5: "EBOUTIC", 0: "OTHER"}
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM ae_cotisations
|
|
"""
|
|
)
|
|
|
|
Subscription.objects.all().delete()
|
|
print("Subscriptions deleted")
|
|
Customer.objects.all().delete()
|
|
print("Customers deleted")
|
|
for r in cur:
|
|
try:
|
|
user = User.objects.filter(id=r["id_utilisateur"]).first()
|
|
if user:
|
|
new = Subscription(
|
|
id=r["id_cotisation"],
|
|
member=user,
|
|
subscription_start=r["date_cotis"],
|
|
subscription_end=r["date_fin_cotis"],
|
|
subscription_type=TYPE[r["type_cotis"]],
|
|
payment_method=PAYMENT[r["mode_paiement_cotis"]],
|
|
location=LOCATION[r["id_comptoir"]],
|
|
)
|
|
new.save()
|
|
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 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()
|
|
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 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()
|
|
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()
|
|
print("Product migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
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))
|
|
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()
|
|
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
|
|
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()
|
|
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()
|
|
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")),
|
|
activity=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))
|
|
|
|
update_customer_account()
|
|
migrate_counters()
|
|
migrate_permanencies()
|
|
migrate_typeproducts()
|
|
migrate_products()
|
|
migrate_product_pict()
|
|
migrate_products_to_counter()
|
|
reset_customer_amount()
|
|
migrate_invoices()
|
|
migrate_refillings()
|
|
migrate_sellings()
|
|
|
|
|
|
def check_accounts():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM utilisateurs
|
|
"""
|
|
)
|
|
mde = Counter.objects.filter(id=1).first()
|
|
ae = Club.objects.filter(unix_name="ae").first()
|
|
root = User.objects.filter(id=0).first()
|
|
for r in cur:
|
|
if r["montant_compte"] and r["montant_compte"] > 0:
|
|
try:
|
|
cust = Customer.objects.filter(user__id=r["id_utilisateur"]).first()
|
|
if int(cust.amount * 100) != r["montant_compte"]:
|
|
print(
|
|
"Adding %s to %s's account"
|
|
% (float(cust.amount) - (r["montant_compte"] / 100), cust.user)
|
|
)
|
|
new = Selling(
|
|
label="Ajustement migration base de donnée",
|
|
counter=mde,
|
|
club=ae,
|
|
product=None,
|
|
seller=root,
|
|
customer=cust,
|
|
unit_price=float(cust.amount) - (r["montant_compte"] / 100.0),
|
|
quantity=1,
|
|
payment_method="SITH_ACCOUNT",
|
|
)
|
|
new.save()
|
|
except Exception as e:
|
|
print("FAIL to adjust user account: %s" % (repr(e)))
|
|
|
|
|
|
### 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_labels():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM cpta_libelle
|
|
WHERE id_asso IS NOT NULL
|
|
"""
|
|
)
|
|
Label.objects.all().delete()
|
|
print("Labels deleted")
|
|
for r in cur:
|
|
try:
|
|
club_accounts = ClubAccount.objects.filter(club__id=r["id_asso"]).all()
|
|
for ca in club_accounts:
|
|
new = Label(club_account=ca, name=to_unicode(r["nom_libelle"]))
|
|
new.save()
|
|
except Exception as e:
|
|
print("FAIL to migrate label: %s" % (repr(e)))
|
|
cur.close()
|
|
print("Labels 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
|
|
LEFT JOIN cpta_libelle lab
|
|
ON op.id_libelle = lab.id_libelle
|
|
"""
|
|
)
|
|
Operation.objects.all().delete()
|
|
print("Operation deleted")
|
|
for r in cur:
|
|
try:
|
|
simple_type = None
|
|
accounting_type = None
|
|
label = 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()
|
|
if r["id_libelle"]:
|
|
label = journal.club_account.labels.filter(
|
|
name=to_unicode(r["nom_libelle"])
|
|
).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="-",
|
|
label=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()
|
|
migrate_bank_accounts()
|
|
migrate_club_accounts()
|
|
migrate_labels()
|
|
migrate_journals()
|
|
migrate_operations()
|
|
make_operation_links()
|
|
|
|
|
|
def migrate_godfathers():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM parrains
|
|
"""
|
|
)
|
|
for r in cur:
|
|
try:
|
|
father = User.objects.filter(id=r["id_utilisateur"]).first()
|
|
child = User.objects.filter(id=r["id_utilisateur_fillot"]).first()
|
|
father.godchildren.add(child)
|
|
father.save()
|
|
except Exception as e:
|
|
print("FAIL to migrate godfathering: %s" % (repr(e)))
|
|
cur.close()
|
|
print("Godfathers migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
|
|
def migrate_etickets():
|
|
FILE_ROOT = "/data/files/"
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM cpt_etickets
|
|
"""
|
|
)
|
|
Eticket.objects.all().delete()
|
|
print("Etickets deleted")
|
|
for r in cur:
|
|
try:
|
|
p = Product.objects.filter(id=r["id_produit"]).first()
|
|
try:
|
|
f = File(open(FILE_ROOT + "/" + str(r["banner"]) + ".1", "rb"))
|
|
except:
|
|
f = None
|
|
e = Eticket(
|
|
product=p, secret=to_unicode(r["secret"]), banner=f, event_title=p.name
|
|
)
|
|
e.save()
|
|
e.secret = to_unicode(r["secret"])
|
|
e.save()
|
|
except Exception as e:
|
|
print("FAIL to migrate eticket: %s" % (repr(e)))
|
|
cur.close()
|
|
print("Etickets migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
|
|
def migrate_sas():
|
|
album_link = {}
|
|
picture_link = {}
|
|
FILE_ROOT = "/data/sas/"
|
|
SithFile.objects.filter(id__gte=18892).delete()
|
|
print("Album/Pictures deleted")
|
|
reset_index("core", "sas")
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM sas_cat_photos
|
|
"""
|
|
)
|
|
root = User.objects.filter(username="root").first()
|
|
for r in cur:
|
|
try:
|
|
a = Album(
|
|
name=to_unicode(r["nom_catph"]),
|
|
owner=root,
|
|
is_moderated=True,
|
|
parent=None,
|
|
)
|
|
a.save()
|
|
album_link[str(r["id_catph"])] = a.id
|
|
except Exception as e:
|
|
print("FAIL to migrate Album: %s" % (repr(e)))
|
|
print("Album moved, need to make the tree")
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM sas_cat_photos
|
|
"""
|
|
)
|
|
for r in cur:
|
|
try:
|
|
p = Album.objects.filter(id=album_link[str(r["id_catph_parent"])]).first()
|
|
a = Album.objects.filter(id=album_link[str(r["id_catph"])]).first()
|
|
a.parent = p
|
|
a.save()
|
|
except:
|
|
pass
|
|
print("Album migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
with open("albums.link", "w") as f:
|
|
f.write(str(album_link))
|
|
cur.close()
|
|
finished = False
|
|
chunk = 0
|
|
while not finished:
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM sas_photos
|
|
ORDER BY 'id_photo'
|
|
LIMIT %s, 1000
|
|
""",
|
|
(chunk * 1000,),
|
|
)
|
|
has_result = False
|
|
for r in cur:
|
|
try:
|
|
user = User.objects.filter(id=r["id_utilisateur"]).first() or root
|
|
parent = Album.objects.filter(id=album_link[str(r["id_catph"])]).first()
|
|
|
|
file_name = FILE_ROOT
|
|
if r["date_prise_vue"]:
|
|
file_name += r["date_prise_vue"].strftime("%Y/%m/%d")
|
|
else:
|
|
file_name += "/".join(["1970", "01", "01"])
|
|
file_name += "/" + str(r["id_photo"]) + ".jpg"
|
|
|
|
file = File(open(file_name, "rb"))
|
|
file.name = str(r["id_photo"]) + ".jpg"
|
|
|
|
p = Picture(
|
|
name=str(r["id_photo"]) + ".jpg",
|
|
owner=user,
|
|
is_moderated=True,
|
|
is_folder=False,
|
|
mime_type="image/jpeg",
|
|
parent=parent,
|
|
file=file,
|
|
)
|
|
if r["date_prise_vue"]:
|
|
p.date = r["date_prise_vue"].replace(
|
|
tzinfo=timezone("Europe/Paris")
|
|
)
|
|
else:
|
|
p.date = r["date_ajout_ph"].replace(tzinfo=timezone("Europe/Paris"))
|
|
for f in p._meta.local_fields:
|
|
if f.name == "date":
|
|
f.auto_now = False
|
|
p.generate_thumbnails()
|
|
p.save()
|
|
db2 = MySQLdb.connect(**settings.OLD_MYSQL_INFOS)
|
|
cur2 = db2.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur2.execute(
|
|
"""
|
|
SELECT *
|
|
FROM sas_personnes_photos
|
|
WHERE id_photo = %s
|
|
""",
|
|
(r["id_photo"],),
|
|
)
|
|
for r2 in cur2:
|
|
try:
|
|
u = User.objects.filter(id=r2["id_utilisateur"]).first()
|
|
if u:
|
|
PeoplePictureRelation(user=u, picture=p).save()
|
|
except:
|
|
print(
|
|
"Fail to associate user %d to picture %d"
|
|
% (r2["id_utilisateur"], p.id)
|
|
)
|
|
has_result = True
|
|
except Exception as e:
|
|
print("FAIL to migrate Picture: %s" % (repr(e)))
|
|
cur.close()
|
|
print("Chunk %d migrated at %s" % (chunk, str(datetime.datetime.now())))
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
chunk += 1
|
|
finished = not has_result
|
|
print("SAS migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
# try:
|
|
# f = File(open(FILE_ROOT + '/' + str(r['banner']) + ".1", 'rb'))
|
|
# except:
|
|
# f = None
|
|
|
|
|
|
def reset_sas_moderators():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM sas_photos
|
|
WHERE id_utilisateur_moderateur IS NOT NULL
|
|
"""
|
|
)
|
|
for r in cur:
|
|
try:
|
|
name = str(r["id_photo"]) + ".jpg"
|
|
pict = SithFile.objects.filter(name__icontains=name, is_in_sas=True).first()
|
|
user = User.objects.filter(id=r["id_utilisateur_moderateur"]).first()
|
|
if pict and user:
|
|
pict.moderator = user
|
|
pict.save()
|
|
else:
|
|
print(
|
|
"No pict %s (%s) or user %s (%s)"
|
|
% (pict, name, user, r["id_utilisateur_moderateur"])
|
|
)
|
|
except Exception as e:
|
|
print(repr(e))
|
|
|
|
|
|
def migrate_forum():
|
|
print("Migrating forum")
|
|
|
|
def migrate_forums():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
print(" Cleaning up forums")
|
|
Forum.objects.all().delete()
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM frm_forum
|
|
WHERE id_forum <> 1
|
|
"""
|
|
)
|
|
print(" Migrating forums")
|
|
for r in cur:
|
|
try:
|
|
# parent = Forum.objects.filter(id=r['id_forum_parent']).first()
|
|
club = Club.objects.filter(id=r["id_asso"]).first()
|
|
ae = Club.objects.filter(id=settings.SITH_MAIN_CLUB_ID).first()
|
|
forum = Forum(
|
|
id=r["id_forum"],
|
|
name=to_unicode(r["titre_forum"]),
|
|
description=to_unicode(r["description_forum"])[:511],
|
|
is_category=bool(r["categorie_forum"]),
|
|
# parent=parent,
|
|
owner_club=club or ae,
|
|
number=r["ordre_forum"],
|
|
)
|
|
forum.save()
|
|
except Exception as e:
|
|
print(" FAIL to migrate forum: %s" % (repr(e)))
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM frm_forum
|
|
WHERE id_forum_parent <> 1
|
|
"""
|
|
)
|
|
for r in cur:
|
|
parent = Forum.objects.filter(id=r["id_forum_parent"]).first()
|
|
forum = Forum.objects.filter(id=r["id_forum"]).first()
|
|
forum.parent = parent
|
|
forum.save()
|
|
cur.close()
|
|
print(" Forums migrated at %s" % datetime.datetime.now())
|
|
print(" Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
def migrate_topics():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
print(" Cleaning up topics")
|
|
ForumTopic.objects.all().delete()
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM frm_sujet
|
|
"""
|
|
)
|
|
print(" Migrating topics")
|
|
for r in cur:
|
|
try:
|
|
parent = Forum.objects.filter(id=r["id_forum"]).first()
|
|
saloon = Forum.objects.filter(id=3).first()
|
|
author = User.objects.filter(id=r["id_utilisateur"]).first()
|
|
root = User.objects.filter(id=0).first()
|
|
topic = ForumTopic(
|
|
id=r["id_sujet"],
|
|
author=author or root,
|
|
forum=parent or saloon,
|
|
_title=to_unicode(r["titre_sujet"])[:64],
|
|
description=to_unicode(r["soustitre_sujet"]),
|
|
)
|
|
topic.save()
|
|
except Exception as e:
|
|
print(" FAIL to migrate topic: %s" % (repr(e)))
|
|
cur.close()
|
|
print(" Topics migrated at %s" % datetime.datetime.now())
|
|
print(" Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
def migrate_messages():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
print(" Cleaning up messages")
|
|
ForumMessage.objects.all().delete()
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM frm_message
|
|
"""
|
|
)
|
|
print(" Migrating messages")
|
|
for r in cur:
|
|
try:
|
|
topic = ForumTopic.objects.filter(id=r["id_sujet"]).first()
|
|
author = User.objects.filter(id=r["id_utilisateur"]).first()
|
|
root = User.objects.filter(id=0).first()
|
|
msg = ForumMessage(
|
|
id=r["id_message"],
|
|
topic=topic,
|
|
author=author or root,
|
|
title=to_unicode(r["titre_message"])[:63],
|
|
date=r["date_message"].replace(tzinfo=timezone("Europe/Paris")),
|
|
)
|
|
try:
|
|
if r["syntaxengine_message"] == "doku":
|
|
msg.message = doku_to_markdown(to_unicode(r["contenu_message"]))
|
|
else:
|
|
msg.message = bbcode_to_markdown(
|
|
to_unicode(r["contenu_message"])
|
|
)
|
|
except:
|
|
msg.message = to_unicode(r["contenu_message"])
|
|
msg.save()
|
|
except Exception as e:
|
|
print(" FAIL to migrate message: %s" % (repr(e)))
|
|
cur.close()
|
|
print(" Messages migrated at %s" % datetime.datetime.now())
|
|
print(" Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
def migrate_message_infos():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
print(" Cleaning up message meta")
|
|
ForumMessageMeta.objects.all().delete()
|
|
cur.execute(
|
|
"""
|
|
SELECT *
|
|
FROM frm_modere_info
|
|
"""
|
|
)
|
|
print(" Migrating message meta")
|
|
ACTIONS = {
|
|
"EDIT": "EDIT",
|
|
"AUTOEDIT": "EDIT",
|
|
"UNDELETE": "UNDELETE",
|
|
"DELETE": "DELETE",
|
|
"DELETEFIRST": "DELETE",
|
|
"AUTODELETE": "DELETE",
|
|
}
|
|
for r in cur:
|
|
try:
|
|
msg = ForumMessage.objects.filter(id=r["id_message"]).first()
|
|
author = User.objects.filter(id=r["id_utilisateur"]).first()
|
|
root = User.objects.filter(id=0).first()
|
|
meta = ForumMessageMeta(
|
|
message=msg,
|
|
user=author or root,
|
|
date=r["modere_date"].replace(tzinfo=timezone("Europe/Paris")),
|
|
action=ACTIONS[r["modere_action"]],
|
|
)
|
|
meta.save()
|
|
except Exception as e:
|
|
print(" FAIL to migrate message meta: %s" % (repr(e)))
|
|
cur.close()
|
|
print(" Messages meta migrated at %s" % datetime.datetime.now())
|
|
print(" Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
migrate_forums()
|
|
migrate_topics()
|
|
migrate_messages()
|
|
migrate_message_infos()
|
|
print("Forum migrated at %s" % datetime.datetime.now())
|
|
print("Running time: %s" % (datetime.datetime.now() - start))
|
|
|
|
|
|
def migrate_mailings():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
|
|
print("Delete all mailings")
|
|
|
|
Mailing.objects.all().delete()
|
|
|
|
print("Migrating old mailing database")
|
|
|
|
cur.execute(
|
|
"""
|
|
SELECT * FROM mailing
|
|
"""
|
|
)
|
|
|
|
moderator = User.objects.get(id=0)
|
|
|
|
for mailing in cur:
|
|
club = Club.objects.filter(id=mailing["id_asso_parent"])
|
|
if club.exists():
|
|
print(mailing)
|
|
club = club.first()
|
|
if mailing["nom"]:
|
|
mailing["nom"] = "." + mailing["nom"]
|
|
Mailing(
|
|
id=mailing["id_mailing"],
|
|
club=club,
|
|
email=to_unicode(club.unix_name + mailing["nom"]),
|
|
moderator=moderator,
|
|
is_moderated=(mailing["is_valid"] > 0),
|
|
).save()
|
|
print("-------------------")
|
|
|
|
cur.execute(
|
|
"""
|
|
SELECT * FROM mailing_membres
|
|
"""
|
|
)
|
|
|
|
for mailing_sub in cur:
|
|
mailing = Mailing.objects.filter(id=mailing_sub["id_mailing"])
|
|
if mailing.exists():
|
|
print(mailing_sub)
|
|
mailing = mailing.first()
|
|
if (
|
|
mailing_sub["id_user"]
|
|
and User.objects.filter(id=mailing_sub["id_user"]).exists()
|
|
):
|
|
user = User.objects.get(id=mailing_sub["id_user"])
|
|
MailingSubscription(mailing=mailing, user=user, email=user.email).save()
|
|
elif mailing_sub["email"]:
|
|
MailingSubscription(
|
|
mailing=mailing, email=to_unicode(mailing_sub["email"])
|
|
).save()
|
|
|
|
|
|
def migrate_club_again():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
cur.execute("SELECT * FROM asso")
|
|
|
|
print("Migrating club is_active")
|
|
|
|
for club in cur:
|
|
try:
|
|
c = Club.objects.get(unix_name=club["nom_unix_asso"])
|
|
c.is_active = club["hidden"] == 0
|
|
c.save()
|
|
except:
|
|
pass
|
|
|
|
|
|
def migrate_pedagogy():
|
|
cur = db.cursor(MySQLdb.cursors.SSDictCursor)
|
|
|
|
print("Migrating UVs")
|
|
root = User.objects.get(id=0)
|
|
semester_conversion = {
|
|
"closed": "CLOSED",
|
|
"A": "AUTUMN",
|
|
"P": "SPRING",
|
|
"AP": "AUTUMN_AND_SPRING",
|
|
}
|
|
|
|
def department_conversion(department):
|
|
# Default of this enum is HUMA
|
|
if not department or department == "Humas":
|
|
return "HUMA"
|
|
return department
|
|
|
|
def convert_number(num, default=0):
|
|
if not num:
|
|
return default
|
|
return num
|
|
|
|
def convert_text(text):
|
|
if not text:
|
|
return ""
|
|
return doku_to_markdown(to_unicode(text))
|
|
|
|
cur.execute(
|
|
"""
|
|
SELECT * FROM pedag_uv
|
|
LEFT JOIN pedag_uv_dept dept
|
|
ON dept.id_uv = pedag_uv.id_uv
|
|
"""
|
|
)
|
|
for uv in cur:
|
|
UV(
|
|
id=uv["id_uv"],
|
|
code=uv["code"],
|
|
author=root,
|
|
credit_type=uv["type"],
|
|
semester=semester_conversion[uv["semestre"]],
|
|
language="FR", # No infos in previous guide about that
|
|
credits=convert_number(uv["guide_credits"]),
|
|
department=department_conversion(uv["departement"]),
|
|
title=convert_text(uv["intitule"]),
|
|
manager=convert_text(uv["responsable"]),
|
|
objectives=convert_text(uv["guide_objectifs"]),
|
|
program=convert_text(uv["guide_programme"]),
|
|
skills="", # No info in previous guide about that
|
|
key_concepts="", # No info either
|
|
hours_CM=convert_number(uv["guide_c"]),
|
|
hours_TD=convert_number(uv["guide_td"]),
|
|
hours_TP=convert_number(uv["guide_tp"]),
|
|
hours_THE=convert_number(uv["guide_the"]),
|
|
hours_TE=0, # No info either
|
|
).save()
|
|
|
|
print("Migrating UV Comments")
|
|
|
|
cur.execute("SELECT * FROM pedag_uv_commentaire")
|
|
|
|
for comment in cur:
|
|
author = User.objects.filter(id=comment["id_utilisateur"]).first()
|
|
uv = UV.objects.filter(id=comment["id_uv"]).first()
|
|
if not author or not uv:
|
|
continue
|
|
UVComment(
|
|
id=comment["id_commentaire"],
|
|
author=author,
|
|
uv=uv,
|
|
comment=convert_text(comment["content"]),
|
|
grade_global=convert_number(comment["note_generale"], -1),
|
|
grade_utility=convert_number(comment["note_utilite"], -1),
|
|
grade_interest=convert_number(comment["note_interet"], -1),
|
|
grade_teaching=convert_number(comment["note_enseignement"], -1),
|
|
grade_work_load=convert_number(comment["note_travail"], -1),
|
|
publish_date=comment["date"].replace(tzinfo=timezone("Europe/Paris")),
|
|
).save()
|
|
|
|
print("Migrating UV Results")
|
|
cur.execute("SELECT * FROM pedag_resultat")
|
|
|
|
for result in cur:
|
|
author = User.objects.filter(id=comment["id_utilisateur"]).first()
|
|
uv = UV.objects.filter(id=comment["id_uv"]).first()
|
|
if not author or not uv:
|
|
continue
|
|
UVResult(
|
|
id=result["id_resultat"],
|
|
uv=uv,
|
|
user=author,
|
|
grade=result["note"],
|
|
semester=result["semestre"],
|
|
).save()
|
|
|
|
|
|
def main():
|
|
print("Start at %s" % start)
|
|
# Core
|
|
# migrate_core()
|
|
# Club
|
|
# migrate_club()
|
|
# Subscriptions
|
|
# migrate_subscriptions()
|
|
# Counters
|
|
# migrate_counter()
|
|
# check_accounts()
|
|
# Accounting
|
|
# migrate_accounting()
|
|
# migrate_godfathers()
|
|
# migrate_etickets()
|
|
# reset_index('core', 'club', 'subscription', 'accounting', 'eboutic', 'launderette', 'counter')
|
|
# migrate_sas()
|
|
# reset_index('core', 'sas')
|
|
# reset_sas_moderators()
|
|
# migrate_forum()
|
|
# reset_index('forum')
|
|
# migrate_mailings()
|
|
# migrate_club_again()
|
|
migrate_pedagogy()
|
|
reset_index("pedagogy")
|
|
end = datetime.datetime.now()
|
|
print("End at %s" % end)
|
|
print("Running time: %s" % (end - start))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|