]> git.0d.be Git - django-panik-emissions.git/commitdiff
add command to import from (custom) drupal export
authorFrédéric Péters <fpeters@0d.be>
Thu, 26 Dec 2019 10:38:51 +0000 (11:38 +0100)
committerFrédéric Péters <fpeters@0d.be>
Thu, 26 Dec 2019 10:38:51 +0000 (11:38 +0100)
emissions/management/commands/load-from-drupal-json.py [new file with mode: 0644]

diff --git a/emissions/management/commands/load-from-drupal-json.py b/emissions/management/commands/load-from-drupal-json.py
new file mode 100644 (file)
index 0000000..86d95e2
--- /dev/null
@@ -0,0 +1,77 @@
+import datetime
+import isodate
+import json
+import requests
+
+from django.conf import settings
+from django.core.files import File
+from django.core.files.base import ContentFile
+from django.core.files.storage import default_storage
+from django.core.management.base import BaseCommand, CommandError
+from django.utils.text import slugify
+from django.utils.timezone import make_naive
+
+from ...models import Emission, Episode, Diffusion
+
+
+class Command(BaseCommand):
+    def add_arguments(self, parser):
+        parser.add_argument('filename', metavar='FILENAME', type=str,
+                help='name of file to import')
+
+    def handle(self, filename, verbosity, **options):
+        self.verbose = (verbosity > 1)
+        for episode_data in json.load(open(filename)).get('episodes').values():
+            if not episode_data.get('title'):
+                continue
+            if not episode_data.get('emission'):
+                continue
+            if not episode_data.get('text') and not episode_data.get('sound'):
+                continue
+            emission, created = Emission.objects.get_or_create(
+                    slug=slugify(episode_data['emission']),
+                    defaults={'title': episode_data['emission']})
+            if created:
+                emission.save()
+            episode, created = Episode.objects.get_or_create(
+                    slug=episode_data['path'].split('/')[-1],
+                    emission=emission)
+            episode.title = episode_data['title']
+            episode.text = episode_data['text']
+            episode.creation_timestamp = isodate.parse_datetime(
+                    episode_data['pub_date'].replace(' ', 'T', 1).replace(' ', ''))
+            if not settings.USE_TZ:
+                episode.creation_timestamp = make_naive(episode.creation_timestamp)
+            start_datetime = datetime.datetime.combine(
+                    datetime.datetime.strptime(episode_data['start_date'], '%d/%m/%Y').date(),
+                    datetime.datetime.strptime(episode_data['start_time'], '%H:%M').time())
+            if episode_data['end_time']:
+                end_datetime = datetime.datetime.combine(
+                        start_datetime.date(),
+                        datetime.datetime.strptime(episode_data['end_time'], '%H:%M').time())
+            else:
+                end_datetime = start_datetime  # fake
+            if end_datetime < start_datetime:
+                end_datetime = end_datetime + datetime.timedelta(days=1)
+            episode.duration = (end_datetime - start_datetime).seconds // 60
+            episode.save()
+            if not episode.image and episode_data.get('image'):
+                orig_path = 'images/%s/%s' % (emission.slug, episode_data.get('image').split('/')[-1])
+                if default_storage.exists(orig_path):
+                    path = orig_path
+                else:
+                    path = default_storage.save(
+                            'images/%s/%s' % (
+                                emission.slug,
+                                episode_data.get('image').split('/')[-1]),
+                            ContentFile(requests.get(episode_data.get('image')).content))
+                episode.image = default_storage.open(path)
+                try:
+                    episode.save()
+                except OSError:  # OSError: cannot identify image file
+                    episode.image = None
+                    episode.save()
+            if episode.diffusion_set.count() == 0:
+                diffusion = Diffusion(episode=episode)
+                diffusion.datetime = start_datetime
+                diffusion.save()