""" Import des mails de GestioCOF dans la base de donnée """ import json import os from custommail.models import Type, CustomMail, Variable from django.core.management.base import BaseCommand from django.contrib.contenttypes.models import ContentType DATA_LOCATION = os.path.join(os.path.dirname(__file__), "..", "data", "custommail.json") def dummy_log(__): pass # XXX. this should probably be in the custommail package def load_from_file(log=dummy_log, verbosity=1): with open(DATA_LOCATION, 'r') as jsonfile: mail_data = json.load(jsonfile) # On se souvient à quel objet correspond quel pk du json assoc = {'types': {}, 'mails': {}} status = {'synced': 0, 'unchanged': 0} for obj in mail_data: fields = obj['fields'] # Pour les trois types d'objets : # - On récupère les objets référencés par les clefs étrangères # - On crée l'objet si nécessaire # - On le stocke éventuellement dans les deux dictionnaires définis # plus haut # Variable types if obj['model'] == 'custommail.variabletype': fields['inner1'] = assoc['types'].get(fields['inner1']) fields['inner2'] = assoc['types'].get(fields['inner2']) if fields['kind'] == 'model': fields['content_type'] = ( ContentType.objects .get_by_natural_key(*fields['content_type']) ) var_type, _ = Type.objects.get_or_create(**fields) assoc['types'][obj['pk']] = var_type # Custom mails if obj['model'] == 'custommail.custommail': mail = None try: mail = CustomMail.objects.get(shortname=fields['shortname']) status['unchanged'] += 1 except CustomMail.DoesNotExist: mail = CustomMail.objects.create(**fields) status['synced'] += 1 if verbosity: log('SYNCED {:s}'.format(fields['shortname'])) assoc['mails'][obj['pk']] = mail # Variables if obj['model'] == 'custommail.custommailvariable': fields['custommail'] = assoc['mails'].get(fields['custommail']) fields['type'] = assoc['types'].get(fields['type']) try: Variable.objects.get( custommail=fields['custommail'], name=fields['name'] ) except Variable.DoesNotExist: Variable.objects.create(**fields) if verbosity: log( '{synced:d} mails synchronized {unchanged:d} unchanged' .format(**status) ) class Command(BaseCommand): help = ("Va chercher les données mails de GestioCOF stocké au format json " "dans /gestioncof/management/data/custommails.json. Le format des " "données est celui donné par la commande :" " `python manage.py dumpdata custommail --natural-foreign` " "La bonne façon de mettre à jour ce fichier est donc de le " "charger à l'aide de syncmails, le faire les modifications à " "l'aide de l'interface administration et/ou du shell puis de le " "remplacer par le nouveau résultat de la commande précédente.") def handle(self, *args, **options): load_from_file(log=self.stdout.write)