diff --git a/bda/tests/test_views.py b/bda/tests/test_views.py index 125d5d57..038297d8 100644 --- a/bda/tests/test_views.py +++ b/bda/tests/test_views.py @@ -49,6 +49,10 @@ class BdATestHelpers: (None, Client()) ] + def require_custommails(self): + from gestioncof.management.commands import syncmails + syncmails.load_from_file() + def check_restricted_access(self, url, validate_user=user_is_cof, redirect_url=None): def craft_redirect_url(user): if redirect_url: @@ -154,11 +158,11 @@ class TestBdAViews(BdATestHelpers, TestCase): self.check_restricted_access(url, validate_user=user_is_staff) def test_send_reminders(self): + self.require_custommails() # Just get the page url = "/bda/mails-rappel/{}".format(self.tirage.id) self.check_restricted_access(url, validate_user=user_is_staff) # Actually send the reminder emails - # TODO: first load the emails into the database _, staff_c = self.client_matrix[0] resp = staff_c.post(url) self.assertEqual(200, resp.status_code) diff --git a/gestioncof/management/commands/syncmails.py b/gestioncof/management/commands/syncmails.py index 1d3dddb8..0308a949 100644 --- a/gestioncof/management/commands/syncmails.py +++ b/gestioncof/management/commands/syncmails.py @@ -11,6 +11,70 @@ 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): + 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 + 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) + + 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 " @@ -22,65 +86,4 @@ class Command(BaseCommand): "remplacer par le nouveau résultat de la commande précédente.") def handle(self, *args, **options): - path = os.path.join( - os.path.dirname(os.path.dirname(__file__)), - 'data', 'custommail.json') - with open(path, '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 - self.stdout.write( - '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) - - # C'est agréable d'avoir le résultat affiché - self.stdout.write( - '{synced:d} mails synchronized {unchanged:d} unchanged' - .format(**status) - ) + load_from_file(log=self.stdout.write)