Skip to content

Commit a227813

Browse files
author
Sasha Romijn
committed
Add support for the timerange, wg_adjacent and time_relation constraints.
This adds three new constraints to the database and relevant UIs: - timerange: "This WG can't meet during these timeframes" - wg_adjacent: "Schedule adjacent to another WG (directly following, no breaks, same room)" - time_relation: schedule the two sessions of one WG on subsequent days or with at least one day seperation - Legacy-Id: 17289
1 parent 8f0eca5 commit a227813

File tree

15 files changed

+482
-25
lines changed

15 files changed

+482
-25
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Copyright The IETF Trust 2020, All Rights Reserved
2+
# -*- coding: utf-8 -*-
3+
# Generated by Django 1.11.27 on 2020-02-11 04:47
4+
from __future__ import unicode_literals
5+
6+
from django.db import migrations, models
7+
8+
9+
def forward(apps, schema_editor):
10+
ConstraintName = apps.get_model("name", "ConstraintName")
11+
ConstraintName.objects.create(slug="timerange", desc="", penalty=100000,
12+
name="Can't meet within timerange")
13+
ConstraintName.objects.create(slug="time_relation", desc="", penalty=1000,
14+
name="Preference for time between sessions")
15+
ConstraintName.objects.create(slug="wg_adjacent", desc="", penalty=10000,
16+
name="Request for adjacent scheduling with another WG")
17+
18+
19+
def reverse(apps, schema_editor):
20+
ConstraintName = apps.get_model("name", "ConstraintName")
21+
ConstraintName.objects.filter(slug__in=["timerange", "time_relation", "wg_adjacent"]).delete()
22+
23+
24+
class Migration(migrations.Migration):
25+
26+
dependencies = [
27+
('name', '0010_timerangename'),
28+
('meeting', '0025_rename_type_session_to_regular'),
29+
]
30+
31+
operations = [
32+
migrations.RemoveField(
33+
model_name='constraint',
34+
name='day',
35+
),
36+
migrations.AddField(
37+
model_name='constraint',
38+
name='time_relation',
39+
field=models.CharField(blank=True, choices=[('subsequent-days', 'Schedule the sessions on subsequent days'), ('one-day-seperation', 'Leave at least one free day in between the two sessions')], max_length=200),
40+
),
41+
migrations.AddField(
42+
model_name='constraint',
43+
name='timeranges',
44+
field=models.ManyToManyField(to='name.TimerangeName'),
45+
),
46+
migrations.RunPython(forward, reverse),
47+
]

ietf/meeting/models.py

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright The IETF Trust 2007-2019, All Rights Reserved
1+
# Copyright The IETF Trust 2007-2020, All Rights Reserved
22
# -*- coding: utf-8 -*-
33
from __future__ import absolute_import, print_function, unicode_literals
44

@@ -28,7 +28,7 @@
2828
from ietf.doc.models import Document
2929
from ietf.group.models import Group
3030
from ietf.group.utils import can_manage_materials
31-
from ietf.name.models import MeetingTypeName, TimeSlotTypeName, SessionStatusName, ConstraintName, RoomResourceName, ImportantDateName
31+
from ietf.name.models import MeetingTypeName, TimeSlotTypeName, SessionStatusName, ConstraintName, RoomResourceName, ImportantDateName, TimerangeName
3232
from ietf.person.models import Person
3333
from ietf.utils.decorators import memoize
3434
from ietf.utils.storage import NoLocationMigrationFileSystemStorage
@@ -810,35 +810,50 @@ def slug(self):
810810
class Constraint(models.Model):
811811
"""
812812
Specifies a constraint on the scheduling.
813-
One type (name=conflic?) of constraint is between source WG and target WG,
814-
e.g. some kind of conflict.
815-
Another type (name=bethere) of constraint is between source WG and
816-
availability of a particular Person, usually an AD.
817-
A third type (name=avoidday) of constraint is between source WG and
818-
a particular day of the week, specified in day.
813+
Available types are:
814+
- conflict/conflic2/conflic3: a conflict between source and target WG/session,
815+
with varying priority. The first is used for a chair conflict, the second for
816+
technology overlap, third for key person conflict
817+
- bethere: a constraint between source WG and a particular person
818+
- timerange: can not meet during these times
819+
- time_relation: preference for a time difference between sessions
820+
- wg_adjacent: request for source WG to be adjacent (directly before or after,
821+
no breaks, same room) the target WG
819822
"""
823+
TIME_RELATION_CHOICES = (
824+
('subsequent-days', 'Schedule the sessions on subsequent days'),
825+
('one-day-seperation', 'Leave at least one free day in between the two sessions'),
826+
)
820827
meeting = ForeignKey(Meeting)
821828
source = ForeignKey(Group, related_name="constraint_source_set")
822829
target = ForeignKey(Group, related_name="constraint_target_set", null=True)
823830
person = ForeignKey(Person, null=True, blank=True)
824-
day = models.DateTimeField(null=True, blank=True)
825831
name = ForeignKey(ConstraintName)
832+
time_relation = models.CharField(max_length=200, choices=TIME_RELATION_CHOICES, blank=True)
833+
timeranges = models.ManyToManyField(TimerangeName)
826834

827835
active_status = None
828836

829837
def __str__(self):
830838
return u"%s %s target=%s person=%s" % (self.source, self.name.name.lower(), self.target, self.person)
831839

832840
def brief_display(self):
833-
if self.target and self.person:
841+
if self.name.slug == "wg_adjacent":
842+
return "Adjacent with %s" % self.target.acronym
843+
elif self.name.slug == "time_relation":
844+
return self.get_time_relation_display()
845+
elif self.name.slug == "timerange":
846+
timeranges_str = ", ".join([t.desc for t in self.timeranges.all()])
847+
return "Can't meet %s" % timeranges_str
848+
elif self.target and self.person:
834849
return "%s ; %s" % (self.target.acronym, self.person)
835850
elif self.target and not self.person:
836851
return "%s " % (self.target.acronym)
837852
elif not self.target and self.person:
838853
return "%s " % (self.person)
839854

840855
def json_url(self):
841-
return "/meeting/%s/constraint/%s.json" % (self.meeting.number, self.id)
856+
return "/meeting/%s/constrai.nt/%s.json" % (self.meeting.number, self.id)
842857

843858
def json_dict(self, host_scheme):
844859
ct1 = dict()

ietf/name/admin.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright The IETF Trust 2016-2019, All Rights Reserved
1+
# Copyright The IETF Trust 2010-2020, All Rights Reserved
22
from django.contrib import admin
33

44
from ietf.name.models import (
@@ -10,7 +10,7 @@
1010
LiaisonStatementState, LiaisonStatementTagName, MeetingTypeName, NomineePositionStateName,
1111
ReviewRequestStateName, ReviewResultName, ReviewTypeName, RoleName, RoomResourceName,
1212
SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName, TopicAudienceName,
13-
DocUrlTagName, ReviewAssignmentStateName, ReviewerQueuePolicyName)
13+
DocUrlTagName, ReviewAssignmentStateName, ReviewerQueuePolicyName, TimerangeName)
1414

1515
from ietf.stats.models import CountryAlias
1616

@@ -79,5 +79,6 @@ class ImportantDateNameAdmin(NameAdmin):
7979
admin.site.register(StdLevelName, NameAdmin)
8080
admin.site.register(StreamName, NameAdmin)
8181
admin.site.register(TimeSlotTypeName, NameAdmin)
82+
admin.site.register(TimerangeName, NameAdmin)
8283
admin.site.register(TopicAudienceName, NameAdmin)
8384
admin.site.register(DocUrlTagName, NameAdmin)

ietf/name/fixtures/names.json

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5585,6 +5585,39 @@
55855585
"model": "name.constraintname",
55865586
"pk": "conflic3"
55875587
},
5588+
{
5589+
"fields": {
5590+
"desc": "",
5591+
"name": "Can't meet within timerange",
5592+
"order": 0,
5593+
"penalty": 100000,
5594+
"used": true
5595+
},
5596+
"model": "name.constraintname",
5597+
"pk": "timerange"
5598+
},
5599+
{
5600+
"fields": {
5601+
"desc": "",
5602+
"name": "Preference for time between sessions",
5603+
"order": 0,
5604+
"penalty": 100000,
5605+
"used": true
5606+
},
5607+
"model": "name.constraintname",
5608+
"pk": "time_relation"
5609+
},
5610+
{
5611+
"fields": {
5612+
"desc": "",
5613+
"name": "Request for adjacent scheduling with another WG",
5614+
"order": 0,
5615+
"penalty": 100000,
5616+
"used": true
5617+
},
5618+
"model": "name.constraintname",
5619+
"pk": "wg_adjacent"
5620+
},
55885621
{
55895622
"fields": {
55905623
"desc": "",
@@ -11678,6 +11711,156 @@
1167811711
"model": "name.streamname",
1167911712
"pk": "legacy"
1168011713
},
11714+
{
11715+
"model": "name.timerangename",
11716+
"pk": "friday-afternoon-early",
11717+
"fields": {
11718+
"name": "friday-afternoon-early",
11719+
"desc": "Friday early afternoon",
11720+
"used": true,
11721+
"order": 13
11722+
}
11723+
},
11724+
{
11725+
"model": "name.timerangename",
11726+
"pk": "friday-afternoon-late",
11727+
"fields": {
11728+
"name": "friday-afternoon-late",
11729+
"desc": "Friday late afternoon",
11730+
"used": true,
11731+
"order": 14
11732+
}
11733+
},
11734+
{
11735+
"model": "name.timerangename",
11736+
"pk": "friday-morning",
11737+
"fields": {
11738+
"name": "friday-morning",
11739+
"desc": "Friday morning",
11740+
"used": true,
11741+
"order": 12
11742+
}
11743+
},
11744+
{
11745+
"model": "name.timerangename",
11746+
"pk": "monday-afternoon-early",
11747+
"fields": {
11748+
"name": "monday-afternoon-early",
11749+
"desc": "Monday early afternoon",
11750+
"used": true,
11751+
"order": 1
11752+
}
11753+
},
11754+
{
11755+
"model": "name.timerangename",
11756+
"pk": "monday-afternoon-late",
11757+
"fields": {
11758+
"name": "monday-afternoon-late",
11759+
"desc": "Monday late afternoon",
11760+
"used": true,
11761+
"order": 2
11762+
}
11763+
},
11764+
{
11765+
"model": "name.timerangename",
11766+
"pk": "monday-morning",
11767+
"fields": {
11768+
"name": "monday-morning",
11769+
"desc": "Monday morning",
11770+
"used": true,
11771+
"order": 0
11772+
}
11773+
},
11774+
{
11775+
"model": "name.timerangename",
11776+
"pk": "thursday-afternoon-early",
11777+
"fields": {
11778+
"name": "thursday-afternoon-early",
11779+
"desc": "Thursday early afternoon",
11780+
"used": true,
11781+
"order": 10
11782+
}
11783+
},
11784+
{
11785+
"model": "name.timerangename",
11786+
"pk": "thursday-afternoon-late",
11787+
"fields": {
11788+
"name": "thursday-afternoon-late",
11789+
"desc": "Thursday late afternoon",
11790+
"used": true,
11791+
"order": 11
11792+
}
11793+
},
11794+
{
11795+
"model": "name.timerangename",
11796+
"pk": "thursday-morning",
11797+
"fields": {
11798+
"name": "thursday-morning",
11799+
"desc": "Thursday morning",
11800+
"used": true,
11801+
"order": 9
11802+
}
11803+
},
11804+
{
11805+
"model": "name.timerangename",
11806+
"pk": "tuesday-afternoon-early",
11807+
"fields": {
11808+
"name": "tuesday-afternoon-early",
11809+
"desc": "Tuesday early afternoon",
11810+
"used": true,
11811+
"order": 4
11812+
}
11813+
},
11814+
{
11815+
"model": "name.timerangename",
11816+
"pk": "tuesday-afternoon-late",
11817+
"fields": {
11818+
"name": "tuesday-afternoon-late",
11819+
"desc": "Tuesday late afternoon",
11820+
"used": true,
11821+
"order": 5
11822+
}
11823+
},
11824+
{
11825+
"model": "name.timerangename",
11826+
"pk": "tuesday-morning",
11827+
"fields": {
11828+
"name": "tuesday-morning",
11829+
"desc": "Tuesday morning",
11830+
"used": true,
11831+
"order": 3
11832+
}
11833+
},
11834+
{
11835+
"model": "name.timerangename",
11836+
"pk": "wednesday-afternoon-early",
11837+
"fields": {
11838+
"name": "wednesday-afternoon-early",
11839+
"desc": "Wednesday early afternoon",
11840+
"used": true,
11841+
"order": 7
11842+
}
11843+
},
11844+
{
11845+
"model": "name.timerangename",
11846+
"pk": "wednesday-afternoon-late",
11847+
"fields": {
11848+
"name": "wednesday-afternoon-late",
11849+
"desc": "Wednesday late afternoon",
11850+
"used": true,
11851+
"order": 8
11852+
}
11853+
},
11854+
{
11855+
"model": "name.timerangename",
11856+
"pk": "wednesday-morning",
11857+
"fields": {
11858+
"name": "wednesday-morning",
11859+
"desc": "Wednesday morning",
11860+
"used": true,
11861+
"order": 6
11862+
}
11863+
},
1168111864
{
1168211865
"fields": {
1168311866
"desc": "",

0 commit comments

Comments
 (0)