# Generated by Django 3.0.3 on 2020-04-12 18:17 import uuid import django.contrib.postgres.constraints import django.contrib.postgres.fields.ranges import django.db.models.deletion import django.db.models.expressions from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ("camps", "0034_add_team_permission_sets"), ("program", "0085_btree_gist_extension"), ] operations = [ migrations.CreateModel( name="EventSession", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ( "when", django.contrib.postgres.fields.ranges.DateTimeRangeField( help_text="A period of time where this type of event can be scheduled. Input format is YYYY-MM-DD HH:MM" ), ), ( "event_duration_minutes", models.PositiveIntegerField( blank=True, help_text="The duration of events in this EventSession. Defaults to the value from the EventType of this EventSession.", ), ), ( "description", models.TextField( blank=True, help_text="Description of this session (optional)." ), ), ], options={ "ordering": ["when", "event_type", "event_location"], }, ), migrations.CreateModel( name="EventSlot", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ( "when", django.contrib.postgres.fields.ranges.DateTimeRangeField( help_text="Start and end time of this slot" ), ), ( "autoscheduled", models.NullBooleanField( default=None, help_text="True if the Event was scheduled by the AutoScheduler, False if it was scheduled manually, None if there is nothing scheduled in this EventSlot.", ), ), ], options={ "ordering": ["when"], }, ), migrations.CreateModel( name="SpeakerAvailability", fields=[ ( "uuid", models.UUIDField( default=uuid.uuid4, editable=False, primary_key=True, serialize=False, ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ( "when", django.contrib.postgres.fields.ranges.DateTimeRangeField( db_index=True, help_text="The period when this speaker is available or unavailable. Must be 1 hour!", ), ), ( "available", models.BooleanField( db_index=True, help_text="Is the speaker available or unavailable during this hour? Check for available, uncheck for unavailable.", ), ), ], ), migrations.CreateModel( name="SpeakerEventConflict", fields=[ ( "uuid", models.UUIDField( default=uuid.uuid4, editable=False, primary_key=True, serialize=False, ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ], options={ "abstract": False, }, ), migrations.CreateModel( name="SpeakerProposalAvailability", fields=[ ( "uuid", models.UUIDField( default=uuid.uuid4, editable=False, primary_key=True, serialize=False, ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ( "when", django.contrib.postgres.fields.ranges.DateTimeRangeField( db_index=True, help_text="The period when this speaker is available or unavailable. Must be 1 hour!", ), ), ( "available", models.BooleanField( db_index=True, help_text="Is the speaker available or unavailable during this hour? Check for available, uncheck for unavailable.", ), ), ], ), migrations.CreateModel( name="SpeakerProposalEventConflict", fields=[ ( "uuid", models.UUIDField( default=uuid.uuid4, editable=False, primary_key=True, serialize=False, ), ), ("created", models.DateTimeField(auto_now_add=True)), ("updated", models.DateTimeField(auto_now=True)), ], options={ "abstract": False, }, ), migrations.AddField( model_name="event", name="demand", field=models.PositiveIntegerField( default=0, help_text="The estimated demand for this event. Used by the autoscheduler to pick the optimal location for events. Set to 0 to disable demand constraints for this event.", ), ), migrations.AddField( model_name="event", name="duration_minutes", field=models.PositiveIntegerField( null=True, blank=True, default=None, help_text="The duration of this event in minutes. Leave blank to use the default from the eventtype.", ), ), migrations.AddField( model_name="eventinstance", name="autoscheduled", field=models.BooleanField( default=False, help_text="True if this was created by the autoscheduler.", ), ), migrations.AddField( model_name="eventlocation", name="capacity", field=models.PositiveIntegerField( default=20, help_text="The capacity of this location. Used by the autoscheduler.", ), ), migrations.AddField( model_name="eventlocation", name="conflicts", field=models.ManyToManyField( help_text="Select the locations which this location conflicts with. Nothing can be scheduled in a location if a conflicting location has an EventInstance at the same time. Example: If one room can be split into two, then the big room would conflict with each of the two small rooms (but the small rooms would not conflict with eachother).", related_name="_eventlocation_conflicts_+", to="program.EventLocation", ), ), migrations.AddField( model_name="eventtype", name="event_duration_minutes", field=models.PositiveIntegerField( blank=True, help_text="The default duration of an event of this type, in minutes. Optional. This default can be overridden in individual EventSessions as needed.", null=True, ), ), migrations.AddField( model_name="eventtype", name="support_autoscheduling", field=models.BooleanField( default=False, help_text="Check to enable this EventType in the autoscheduler", ), ), migrations.AlterField( model_name="eventinstance", name="location", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="eventinstances", to="program.EventLocation", ), ), migrations.AlterField( model_name="eventinstance", name="when", field=django.contrib.postgres.fields.ranges.DateTimeRangeField( blank=True, null=True ), ), migrations.AlterField( model_name="eventproposal", name="event_type", field=models.ForeignKey( help_text="The type of event", on_delete=django.db.models.deletion.PROTECT, related_name="eventproposals", to="program.EventType", ), ), migrations.AddConstraint( model_name="eventinstance", constraint=django.contrib.postgres.constraints.ExclusionConstraint( expressions=[("when", "&&"), ("location", "=")], name="prevent_eventinstance_location_overlaps", ), ), migrations.AddField( model_name="speakerproposaleventconflict", name="events", field=models.ManyToManyField( help_text="The conflict events", related_name="speakerproposalconflicts", to="program.Event", ), ), migrations.AddField( model_name="speakerproposaleventconflict", name="speakerproposal", field=models.OneToOneField( help_text="The SpeakerProposal", on_delete=django.db.models.deletion.PROTECT, related_name="eventconflicts", to="program.SpeakerProposal", ), ), migrations.AddField( model_name="speakerproposalavailability", name="speakerproposal", field=models.ForeignKey( blank=True, help_text="The speaker proposal object this availability belongs to", null=True, on_delete=django.db.models.deletion.PROTECT, related_name="availabilities", to="program.SpeakerProposal", ), ), migrations.AddField( model_name="speakereventconflict", name="events", field=models.ManyToManyField( help_text="The conflict events", related_name="speakerconflicts", to="program.Event", ), ), migrations.AddField( model_name="speakereventconflict", name="speaker", field=models.OneToOneField( help_text="The Speaker", on_delete=django.db.models.deletion.PROTECT, related_name="eventconflicts", to="program.Speaker", ), ), migrations.AddField( model_name="speakeravailability", name="speaker", field=models.ForeignKey( blank=True, help_text="The speaker object this availability belongs to (if any)", null=True, on_delete=django.db.models.deletion.PROTECT, related_name="availabilities", to="program.Speaker", ), ), migrations.AddField( model_name="eventslot", name="event", field=models.ForeignKey( blank=True, help_text="The Event scheduled in this EventSlot", null=True, on_delete=django.db.models.deletion.PROTECT, related_name="event_slots", to="program.Event", ), ), migrations.AddField( model_name="eventslot", name="event_session", field=models.ForeignKey( help_text="The EventSession this EventSlot belongs to", on_delete=django.db.models.deletion.PROTECT, related_name="event_slots", to="program.EventSession", ), ), migrations.AddField( model_name="eventsession", name="camp", field=models.ForeignKey( help_text="The Camp this EventSession belongs to", on_delete=django.db.models.deletion.PROTECT, related_name="eventsessions", to="camps.Camp", ), ), migrations.AddField( model_name="eventsession", name="event_location", field=models.ForeignKey( help_text="The event location this session is for", on_delete=django.db.models.deletion.PROTECT, related_name="eventsessions", to="program.EventLocation", ), ), migrations.AddField( model_name="eventsession", name="event_type", field=models.ForeignKey( help_text="The type of event this session is for", on_delete=django.db.models.deletion.PROTECT, related_name="eventsessions", to="program.EventType", ), ), migrations.AddConstraint( model_name="speakerproposalavailability", constraint=django.contrib.postgres.constraints.ExclusionConstraint( expressions=[ (django.db.models.expressions.F("speakerproposal"), "="), ("when", "&&"), ], name="prevent_speakerproposalavailability_overlaps", ), ), migrations.AddConstraint( model_name="speakeravailability", constraint=django.contrib.postgres.constraints.ExclusionConstraint( expressions=[ (django.db.models.expressions.F("speaker"), "="), ("when", "&&"), ], name="prevent_speakeravailability_overlaps", ), ), migrations.AddConstraint( model_name="eventslot", constraint=django.contrib.postgres.constraints.ExclusionConstraint( expressions=[("when", "&&"), ("event_session", "=")], name="prevent_slot_session_overlaps", ), ), migrations.AddConstraint( model_name="eventsession", constraint=django.contrib.postgres.constraints.ExclusionConstraint( expressions=[ ("when", "&&"), ("event_location", "="), ("event_type", "="), ], name="prevent_eventsession_eventtype_eventlocation_overlaps", ), ), ]