diff --git a/club/migrations/0003_auto_20160813_1448.py b/club/migrations/0003_auto_20160813_1448.py
new file mode 100644
index 00000000..801c7a25
--- /dev/null
+++ b/club/migrations/0003_auto_20160813_1448.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('club', '0002_club_home'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='club',
+ name='name',
+ field=models.CharField(verbose_name='name', max_length=64),
+ ),
+ ]
diff --git a/club/migrations/0004_auto_20160813_1551.py b/club/migrations/0004_auto_20160813_1551.py
new file mode 100644
index 00000000..8004b164
--- /dev/null
+++ b/club/migrations/0004_auto_20160813_1551.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('club', '0003_auto_20160813_1448'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='membership',
+ name='description',
+ field=models.CharField(verbose_name='description', blank=True, max_length=128),
+ ),
+ ]
diff --git a/club/models.py b/club/models.py
index a96612c1..44aeb373 100644
--- a/club/models.py
+++ b/club/models.py
@@ -15,7 +15,7 @@ class Club(models.Model):
"""
The Club class, made as a tree to allow nice tidy organization
"""
- name = models.CharField(_('name'), max_length=30)
+ name = models.CharField(_('name'), max_length=64)
parent = models.ForeignKey('Club', related_name='children', null=True, blank=True)
unix_name = models.CharField(_('unix name'), max_length=30, unique=True,
validators=[
@@ -72,10 +72,10 @@ class Club(models.Model):
def save(self, *args, **kwargs):
with transaction.atomic():
creation = False
- if self.id is None:
+ old = Club.objects.filter(id=self.id).first()
+ if not old:
creation = True
else:
- old = Club.objects.filter(id=self.id).first()
if old.unix_name != self.unix_name:
self._change_unixname(self.unix_name)
super(Club, self).save(*args, **kwargs)
@@ -148,7 +148,7 @@ class Membership(models.Model):
end_date = models.DateField(_('end date'), null=True, blank=True)
role = models.IntegerField(_('role'), choices=sorted(settings.SITH_CLUB_ROLES.items()),
default=sorted(settings.SITH_CLUB_ROLES.items())[0][0])
- description = models.CharField(_('description'), max_length=30, null=False, blank=True)
+ description = models.CharField(_('description'), max_length=128, null=False, blank=True)
def clean(self):
sub = Subscriber.objects.filter(pk=self.user.pk).first()
diff --git a/club/templates/club/club_detail.jinja b/club/templates/club/club_detail.jinja
index c5814da5..5e9e6384 100644
--- a/club/templates/club/club_detail.jinja
+++ b/club/templates/club/club_detail.jinja
@@ -16,7 +16,7 @@
{{ club.name }}
{{ club.address }}
- {% for m in club.members.all() %}
+ {% for m in club.members.filter(end_date=None).all() %}
- {{ m }}
{% endfor %}
diff --git a/club/templates/club/club_tools.jinja b/club/templates/club/club_tools.jinja
index 514c91b1..c8d49ee3 100644
--- a/club/templates/club/club_tools.jinja
+++ b/club/templates/club/club_tools.jinja
@@ -19,6 +19,9 @@
{% if object.club_account %}
Accouting: {{ object }}
{% endif %}
+ {% if object.unix_name == settings.SITH_LAUNDERETTE_MANAGER['unix_name'] %}
+ {% trans %}Launderette{% endtrans %}
+ {% endif %}
{% endblock %}
diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py
index cb5b30b5..7ec26c92 100644
--- a/core/management/commands/populate.py
+++ b/core/management/commands/populate.py
@@ -43,13 +43,13 @@ class Command(BaseCommand):
home_root.save()
club_root = SithFile(parent=None, name="clubs", is_folder=True, owner=root)
club_root.save()
- main_club = Club(name=settings.SITH_MAIN_CLUB['name'], unix_name=settings.SITH_MAIN_CLUB['unix_name'],
+ main_club = Club(id=1, name=settings.SITH_MAIN_CLUB['name'], unix_name=settings.SITH_MAIN_CLUB['unix_name'],
address=settings.SITH_MAIN_CLUB['address'])
main_club.save()
- bar_club = Club(name=settings.SITH_BAR_MANAGER['name'], unix_name=settings.SITH_BAR_MANAGER['unix_name'],
+ bar_club = Club(id=2, name=settings.SITH_BAR_MANAGER['name'], unix_name=settings.SITH_BAR_MANAGER['unix_name'],
address=settings.SITH_BAR_MANAGER['address'])
bar_club.save()
- launderette_club = Club(name=settings.SITH_LAUNDERETTE_MANAGER['name'],
+ launderette_club = Club(id=84, name=settings.SITH_LAUNDERETTE_MANAGER['name'],
unix_name=settings.SITH_LAUNDERETTE_MANAGER['unix_name'],
address=settings.SITH_LAUNDERETTE_MANAGER['address'])
launderette_club.save()
diff --git a/migrate.py b/migrate.py
index b3fc2a3a..d110ef9e 100644
--- a/migrate.py
+++ b/migrate.py
@@ -2,15 +2,20 @@ import MySQLdb
import os
import django
import random
+from io import StringIO
os.environ["DJANGO_SETTINGS_MODULE"] = "sith.settings"
+os.environ['DJANGO_COLORS'] = 'nocolor'
django.setup()
-from core.models import User, SithFile
from django.db import IntegrityError
from django.conf import settings
+from django.core.management import call_command
+from django.db import connection
-PROFILE_ROOT = "/data/matmatronch/"
+
+from core.models import User, SithFile
+from club.models import Club, Membership
db = MySQLdb.connect(
host="ae-db",
@@ -19,144 +24,225 @@ db = MySQLdb.connect(
db="ae2-taiste",
charset='utf8',
use_unicode=True)
-c = db.cursor(MySQLdb.cursors.DictCursor)
-c.execute("""
-SELECT *
-FROM utilisateurs utl
-JOIN utl_etu ue
-ON ue.id_utilisateur = utl.id_utilisateur
-JOIN utl_etu_utbm ueu
-ON ueu.id_utilisateur = utl.id_utilisateur
-JOIN utl_extra uxtra
-ON uxtra.id_utilisateur = utl.id_utilisateur
-JOIN loc_ville ville
-ON utl.id_ville = ville.id_ville
-WHERE utl.id_utilisateur > 9000
-""")
-User.objects.filter(id__gt=0).delete()
-print("Users deleted")
-# guy = c.fetchone()
-# for k,v in sorted(guy.items()):
-# print("%40s | %40s" % (k, v))
-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 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 get_random_free_email():
- id = random.randrange(4000)
- email = "no_email_%s@git.an" % random.randrange(4000, 40000)
- while User.objects.filter(email=email).exists():
+
+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():
+ id = random.randrange(4000)
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
-for u in c.fetchall():
- 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 "",
- )
- 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()
+ c = db.cursor(MySQLdb.cursors.DictCursor)
+ c.execute("""
+ SELECT *
+ FROM utilisateurs utl
+ JOIN utl_etu ue
+ ON ue.id_utilisateur = utl.id_utilisateur
+ JOIN utl_etu_utbm ueu
+ ON ueu.id_utilisateur = utl.id_utilisateur
+ JOIN utl_extra uxtra
+ ON uxtra.id_utilisateur = utl.id_utilisateur
+ JOIN loc_ville ville
+ ON utl.id_ville = ville.id_ville
+ -- WHERE utl.id_utilisateur > 9000
+ """)
+ User.objects.filter(id__gt=0).delete()
+ print("Users deleted")
-from os import listdir
-from django.core.files import File
-
-profile = SithFile.objects.filter(parent=None, name="profiles").first()
-for filename in listdir(PROFILE_ROOT):
- if filename.split('.')[-2] != "mini":
+ for u in c.fetchall():
try:
- uid = filename.split('.')[0].split('-')[0]
- user = User.objects.filter(id=int(uid)).first()
- if user:
- f = File(open(PROFILE_ROOT + '/' + filename, 'rb'))
- 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 "",
+ )
+ 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(repr(e))
+ print("FAIL for user %s: %s" % (u['id_utilisateur'], repr(e)))
+ c.close()
+ reset_index('core')
-# profile_pict = models.OneToOneField('SithFile', related_name='profile_of', verbose_name=_("profile"), null=True, blank=True)
-# avatar_pict = models.OneToOneField('SithFile', related_name='avatar_of', verbose_name=_("avatar"), null=True, blank=True)
-# scrub_pict = models.OneToOneField('SithFile', related_name='scrub_of', verbose_name=_("scrub"), null=True, blank=True)
+def migrate_profile_pict():
+ PROFILE_ROOT = "/data/matmatronch/"
+
+ from os import listdir
+ from django.core.files import File
+
+ 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))
+
+def migrate_clubs():
+ cur = db.cursor(MySQLdb.cursors.DictCursor)
+ 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.fetchall():
+ 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.fetchall():
+ 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()
+
+def migrate_club_memberships():
+ cur = db.cursor(MySQLdb.cursors.DictCursor)
+ cur.execute("""
+ SELECT *
+ FROM asso_membre
+ """)
+
+ Membership.objects.all().delete()
+ print("Memberships deleted")
+ for m in cur.fetchall():
+ 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()
+
+
+def main():
+ # migrate_users()
+ # migrate_profile_pict()
+ # migrate_clubs()
+ migrate_club_memberships()
+
+if __name__ == "__main__":
+ main()