datatracker/ietf/meeting/factories.py

125 lines
4.1 KiB
Python

import factory
import random
import datetime
from django.db.models import Max
from django.core.files.base import ContentFile
from ietf.meeting.models import Meeting, Session, Schedule, TimeSlot, SessionPresentation, FloorPlan
from ietf.group.factories import GroupFactory
from ietf.person.factories import PersonFactory
class MeetingFactory(factory.DjangoModelFactory):
class Meta:
model = Meeting
type_id = factory.Iterator(['ietf','interim'])
date = datetime.date(2010,1,1)+datetime.timedelta(days=random.randint(0,3652))
city = factory.Faker('city')
country = factory.Faker('country_code')
time_zone = factory.Faker('timezone')
idsubmit_cutoff_day_offset_00 = 13
idsubmit_cutoff_day_offset_01 = 13
idsubmit_cutoff_time_utc = datetime.timedelta(0, 86399)
idsubmit_cutoff_warning_days = 21
venue_name = factory.Faker('sentence')
venue_addr = factory.Faker('address')
break_area = factory.Faker('sentence')
reg_area = factory.Faker('sentence')
@factory.lazy_attribute_sequence
def number(self,n):
if self.type_id == 'ietf':
if Meeting.objects.filter(type='ietf').exists():
return '%02d'%(int(Meeting.objects.filter(type='ietf').aggregate(Max('number'))['number__max'])+1)
else:
return '%02d'%(n+80)
else:
return 'interim-%d-%s-%02d'%(self.date.year,GroupFactory().acronym,n)
@factory.post_generation
def populate_agenda(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
'''
Create a default agenda, unless the factory is called
with populate_agenda=False
'''
if extracted is None:
extracted = True
if create and extracted:
for x in range(3):
TimeSlotFactory(meeting=obj)
obj.agenda = ScheduleFactory(meeting=obj)
obj.save()
class SessionFactory(factory.DjangoModelFactory):
class Meta:
model = Session
meeting = factory.SubFactory(MeetingFactory)
type_id='session'
group = factory.SubFactory(GroupFactory)
requested_by = factory.SubFactory(PersonFactory)
status_id='sched'
@factory.post_generation
def add_to_schedule(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
'''
Put this session in a timeslot unless the factory is called
with add_to_schedule=False
'''
if extracted is None:
extracted = True
if create and extracted:
ts = obj.meeting.timeslot_set.all()
obj.timeslotassignments.create(timeslot=ts[random.randrange(len(ts))],schedule=obj.meeting.agenda)
class ScheduleFactory(factory.DjangoModelFactory):
class Meta:
model = Schedule
meeting = factory.SubFactory(MeetingFactory)
name = factory.Sequence(lambda n: 'schedule_%d'%n)
owner = factory.SubFactory(PersonFactory)
class TimeSlotFactory(factory.DjangoModelFactory):
class Meta:
model = TimeSlot
meeting = factory.SubFactory(MeetingFactory)
type_id = 'session'
@factory.lazy_attribute
def time(self):
return datetime.datetime.combine(self.meeting.date,datetime.time(11,0))
@factory.lazy_attribute
def duration(self):
return datetime.timedelta(minutes=30+random.randrange(9)*15)
class SessionPresentationFactory(factory.DjangoModelFactory):
class Meta:
model = SessionPresentation
session = factory.SubFactory(SessionFactory)
document = factory.SubFactory('ietf.doc.factories.DocumentFactory')
@factory.lazy_attribute
def rev(self):
return self.document.rev
class FloorPlanFactory(factory.DjangoModelFactory):
class Meta:
model = FloorPlan
name = factory.Sequence(lambda n: u'Venue Floor %d' % n)
meeting = factory.SubFactory(MeetingFactory)
order = factory.Sequence(lambda n: n)
image = factory.LazyAttribute(
lambda _: ContentFile(
factory.django.ImageField()._make_data(
{'width': 1024, 'height': 768}
), 'floorplan.jpg'
)
)