kpsul/gestioncof/management/base.py
Martin Pépin 18b186929c Dev data loaded using a django admin command
- Sites, surveys, events and petits cours demands/subjects are still
  loaded from fixtures
- The users and their subscriptions to petits cours are loaded using the
  `loaddevdata` command
- The sub command `loadbdadevdata` is called by `loaddevdata` and
  populates the database with BdA related stuff :
  - 2 tirages
  - Show places
  - Shows
  - subscriptions
2017-02-03 14:33:10 +01:00

42 lines
1.4 KiB
Python

"""
Un mixin à utiliser avec BaseCommand pour charger des objets depuis un json
"""
import os
import json
from django.core.management.base import BaseCommand
class MyBaseCommand(BaseCommand):
"""
Ajoute une méthode ``from_json`` qui charge des objets à partir d'un json.
"""
def from_json(self, filename, data_dir, klass,
callback=lambda obj: obj):
"""
Charge les objets contenus dans le fichier json référencé par
``filename`` dans la base de donnée. La fonction callback est appelées
sur chaque objet avant enregistrement.
"""
self.stdout.write("Chargement de {:s}".format(filename))
with open(os.path.join(data_dir, filename), 'r') as file:
descriptions = json.load(file)
objects = []
nb_new = 0
for description in descriptions:
qset = klass.objects.filter(**description)
try:
objects.append(qset.get())
except klass.DoesNotExist:
obj = klass(**description)
obj = callback(obj)
obj.save()
objects.append(obj)
nb_new += 1
self.stdout.write("- {:d} objets créés".format(nb_new))
self.stdout.write("- {:d} objets gardés en l'état"
.format(len(objects)-nb_new))
return objects