1+ import datetime
2+ import random
3+
4+ from django .core .management .base import BaseCommand , CommandError
5+
6+ from ietf .group .models import Group
7+ from ietf .meeting .factories import RoomFactory , TimeSlotFactory , SessionFactory
8+ from ietf .meeting .helpers import get_meeting
9+ from ietf .meeting .models import Room , Session
10+ from ietf .name .models import SessionPurposeName
11+
12+
13+ class Command (BaseCommand ):
14+ help = 'Set up a demo of the session purpose updates'
15+
16+ DEMO_PREFIX = 'PDemo' # used to identify things added by this command
17+
18+ def add_arguments (self , parser ):
19+ parser .add_argument ('--remove' , action = 'store_true' )
20+
21+ def handle (self , * args , ** options ):
22+ if options ['remove' ]:
23+ self .remove_demo ()
24+ else :
25+ self .install_demo ()
26+
27+ def remove_demo (self ):
28+ self .stdout .write (f'Removing rooms with "{ self .DEMO_PREFIX } " name prefix...\n ' )
29+ Room .objects .filter (name__startswith = self .DEMO_PREFIX ).delete ()
30+ self .stdout .write (f'Removing sessions with "{ self .DEMO_PREFIX } " name prefix...\n ' )
31+ Session .objects .filter (name__startswith = self .DEMO_PREFIX ).delete ()
32+
33+ def install_demo (self ):
34+ # get meeting
35+ try :
36+ meeting = get_meeting (days = 14 ) # matches how secr app finds meetings
37+ except :
38+ raise CommandError ('No upcoming meeting to modify' )
39+
40+ # create rooms
41+ self .stdout .write ('Creating rooms...\n ' )
42+ rooms = [
43+ RoomFactory (meeting = meeting , name = f'{ self .DEMO_PREFIX } 1' ),
44+ RoomFactory (meeting = meeting , name = f'{ self .DEMO_PREFIX } 2' ),
45+ RoomFactory (meeting = meeting , name = f'{ self .DEMO_PREFIX } 3' ),
46+ ]
47+
48+ # get all the timeslot types used by a session purpose
49+ type_ids = set ()
50+ for purpose in SessionPurposeName .objects .filter (used = True ):
51+ type_ids .update (purpose .timeslot_types )
52+
53+ # set up timeslots
54+ self .stdout .write ('Creating timeslots...\n ' )
55+ for room in rooms :
56+ for day in range (meeting .days ):
57+ date = meeting .get_meeting_date (day )
58+ for n , type_id in enumerate (type_ids ):
59+ TimeSlotFactory (
60+ type_id = type_id ,
61+ meeting = meeting ,
62+ location = room ,
63+ time = datetime .datetime .combine (date , datetime .time (10 , 0 , 0 )) + datetime .timedelta (hours = n ),
64+ duration = datetime .timedelta (hours = 1 ),
65+ )
66+
67+ # set up sessions
68+ self .stdout .write ('Creating sessions...' )
69+ groups_for_session_purpose = {
70+ purpose .slug : list (
71+ Group .objects .filter (
72+ type__features__session_purposes__contains = f'"{ purpose .slug } "' ,
73+ state_id = 'active' ,
74+ )
75+ )
76+ for purpose in SessionPurposeName .objects .filter (used = True )
77+ }
78+ for purpose in SessionPurposeName .objects .filter (used = True ):
79+ for type_id in purpose .timeslot_types :
80+ group = random .choice (groups_for_session_purpose [purpose .slug ])
81+ SessionFactory (
82+ meeting = meeting ,
83+ purpose = purpose ,
84+ type_id = type_id ,
85+ group = group ,
86+ name = f'{ self .DEMO_PREFIX } for { group .acronym } ' ,
87+ status_id = 'schedw' ,
88+ add_to_schedule = False ,
89+ )
90+
91+ self .stdout .write (f'\n Rooms and sessions created with "{ self .DEMO_PREFIX } " as name prefix\n ' )
0 commit comments