From 7a2530a0a6c7024b1df36f351ac749f8be986382 Mon Sep 17 00:00:00 2001
From: Jennifer Richards <jennifer@painless-security.com>
Date: Sat, 16 Oct 2021 20:09:00 +0000
Subject: [PATCH] Add management command to set up timeslots/sessions for
 testing/demoing 'purpose' field  - Legacy-Id: 19430

---
 .../commands/session_purpose_demo.py          | 91 +++++++++++++++++++
 1 file changed, 91 insertions(+)
 create mode 100644 ietf/meeting/management/commands/session_purpose_demo.py

diff --git a/ietf/meeting/management/commands/session_purpose_demo.py b/ietf/meeting/management/commands/session_purpose_demo.py
new file mode 100644
index 000000000..624e89794
--- /dev/null
+++ b/ietf/meeting/management/commands/session_purpose_demo.py
@@ -0,0 +1,91 @@
+import datetime
+import random
+
+from django.core.management.base import BaseCommand, CommandError
+
+from ietf.group.models import Group
+from ietf.meeting.factories import RoomFactory, TimeSlotFactory, SessionFactory
+from ietf.meeting.helpers import get_meeting
+from ietf.meeting.models import Room, Session
+from ietf.name.models import SessionPurposeName
+
+
+class Command(BaseCommand):
+    help = 'Set up a demo of the session purpose updates'
+
+    DEMO_PREFIX='PDemo'  # used to identify things added by this command
+
+    def add_arguments(self, parser):
+        parser.add_argument('--remove', action='store_true')
+
+    def handle(self, *args, **options):
+        if options['remove']:
+            self.remove_demo()
+        else:
+            self.install_demo()
+
+    def remove_demo(self):
+        self.stdout.write(f'Removing rooms with "{self.DEMO_PREFIX}" name prefix...\n')
+        Room.objects.filter(name__startswith=self.DEMO_PREFIX).delete()
+        self.stdout.write(f'Removing sessions with "{self.DEMO_PREFIX}" name prefix...\n')
+        Session.objects.filter(name__startswith=self.DEMO_PREFIX).delete()
+
+    def install_demo(self):
+        # get meeting
+        try:
+            meeting = get_meeting(days=14)  # matches how secr app finds meetings
+        except:
+            raise CommandError('No upcoming meeting to modify')
+
+        # create rooms
+        self.stdout.write('Creating rooms...\n')
+        rooms = [
+            RoomFactory(meeting=meeting, name=f'{self.DEMO_PREFIX} 1'),
+            RoomFactory(meeting=meeting, name=f'{self.DEMO_PREFIX} 2'),
+            RoomFactory(meeting=meeting, name=f'{self.DEMO_PREFIX} 3'),
+        ]
+
+        # get all the timeslot types used by a session purpose
+        type_ids = set()
+        for purpose in SessionPurposeName.objects.filter(used=True):
+            type_ids.update(purpose.timeslot_types)
+
+        # set up timeslots
+        self.stdout.write('Creating timeslots...\n')
+        for room in rooms:
+            for day in range(meeting.days):
+                date = meeting.get_meeting_date(day)
+                for n, type_id in enumerate(type_ids):
+                    TimeSlotFactory(
+                        type_id=type_id,
+                        meeting=meeting,
+                        location=room,
+                        time=datetime.datetime.combine(date, datetime.time(10, 0, 0)) + datetime.timedelta(hours=n),
+                        duration=datetime.timedelta(hours=1),
+                    )
+
+        # set up sessions
+        self.stdout.write('Creating sessions...')
+        groups_for_session_purpose = {
+            purpose.slug: list(
+                Group.objects.filter(
+                    type__features__session_purposes__contains=f'"{purpose.slug}"',
+                    state_id='active',
+                )
+            )
+            for purpose in SessionPurposeName.objects.filter(used=True)
+        }
+        for purpose in SessionPurposeName.objects.filter(used=True):
+            for type_id in purpose.timeslot_types:
+                group=random.choice(groups_for_session_purpose[purpose.slug])
+                SessionFactory(
+                    meeting=meeting,
+                    purpose=purpose,
+                    type_id=type_id,
+                    group=group,
+                    name=f'{self.DEMO_PREFIX} for {group.acronym}',
+                    status_id='schedw',
+                    add_to_schedule=False,
+                )
+
+        self.stdout.write(f'\nRooms and sessions created with "{self.DEMO_PREFIX}" as name prefix\n')
\ No newline at end of file