Skip to content

Commit 9e5d990

Browse files
committed
Added meeting FloorPlan model and added location parameters and ordering to the Room model.
- Legacy-Id: 11540
1 parent c84c189 commit 9e5d990

4 files changed

Lines changed: 129 additions & 3 deletions

File tree

ietf/meeting/admin.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from django.contrib import admin
22

3-
from ietf.meeting.models import Meeting, Room, Session, TimeSlot, Constraint, Schedule, SchedTimeSessAssignment, ResourceAssociation
3+
from ietf.meeting.models import (Meeting, Room, Session, TimeSlot, Constraint, Schedule,
4+
SchedTimeSessAssignment, ResourceAssociation, FloorPlan)
45

56
class RoomAdmin(admin.ModelAdmin):
6-
list_display = ["id", "meeting", "name", "capacity", ]
7+
list_display = ["id", "meeting", "name", "capacity", "x1", "y1", "x2", "y2", ]
78
list_filter = ["meeting"]
89
ordering = ["-meeting"]
910

@@ -98,3 +99,8 @@ class SchedTimeSessAssignmentAdmin(admin.ModelAdmin):
9899
class ResourceAssociationAdmin(admin.ModelAdmin):
99100
list_display = ["desc", "icon", "desc", ]
100101
admin.site.register(ResourceAssociation, ResourceAssociationAdmin)
102+
103+
class FloorPlanAdmin(admin.ModelAdmin):
104+
list_display = ['id', 'meeting', 'name', 'order', 'image', ]
105+
raw_id_fields = ['meeting', ]
106+
admin.site.register(FloorPlan, FloorPlanAdmin)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
import ietf.utils.storage
6+
import ietf.meeting.models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('meeting', '0024_migrate_interim_meetings'),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name='FloorPlan',
18+
fields=[
19+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
20+
('name', models.CharField(max_length=255)),
21+
('order', models.SmallIntegerField()),
22+
('image', models.ImageField(default=None, storage=ietf.utils.storage.NoLocationMigrationFileSystemStorage(location=None), upload_to=ietf.meeting.models.floorplan_path, blank=True)),
23+
('meeting', models.ForeignKey(to='meeting.Meeting')),
24+
],
25+
options={
26+
},
27+
bases=(models.Model,),
28+
),
29+
migrations.AddField(
30+
model_name='room',
31+
name='floorplan',
32+
field=models.ForeignKey(default=None, blank=True, to='meeting.FloorPlan', null=True),
33+
preserve_default=True,
34+
),
35+
migrations.AddField(
36+
model_name='room',
37+
name='x1',
38+
field=models.SmallIntegerField(default=None, null=True, blank=True),
39+
preserve_default=True,
40+
),
41+
migrations.AddField(
42+
model_name='room',
43+
name='x2',
44+
field=models.SmallIntegerField(default=None, null=True, blank=True),
45+
preserve_default=True,
46+
),
47+
migrations.AddField(
48+
model_name='room',
49+
name='y1',
50+
field=models.SmallIntegerField(default=None, null=True, blank=True),
51+
preserve_default=True,
52+
),
53+
migrations.AddField(
54+
model_name='room',
55+
name='y2',
56+
field=models.SmallIntegerField(default=None, null=True, blank=True),
57+
preserve_default=True,
58+
),
59+
]

ietf/meeting/models.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from ietf.group.utils import can_manage_materials
2626
from ietf.name.models import MeetingTypeName, TimeSlotTypeName, SessionStatusName, ConstraintName, RoomResourceName
2727
from ietf.person.models import Person
28+
from ietf.utils.storage import NoLocationMigrationFileSystemStorage
2829

2930
countries = pytz.country_names.items()
3031
countries.sort(lambda x,y: cmp(x[1], y[1]))
@@ -274,6 +275,8 @@ def updated(self):
274275
class Meta:
275276
ordering = ["-date", "id"]
276277

278+
# === Rooms, Resources, Floorplans =============================================
279+
277280
class ResourceAssociation(models.Model):
278281
name = models.ForeignKey(RoomResourceName)
279282
#url = models.UrlField() # not sure what this was for.
@@ -298,6 +301,15 @@ class Room(models.Model):
298301
capacity = models.IntegerField(null=True, blank=True)
299302
resources = models.ManyToManyField(ResourceAssociation, blank = True)
300303
session_types = models.ManyToManyField(TimeSlotTypeName, blank = True)
304+
# floorplan-related properties
305+
floorplan = models.ForeignKey('FloorPlan', null=True, blank=True, default=None)
306+
# floorplan: room pixel position : (0,0) is top left of image, (xd, yd)
307+
# is room width, height.
308+
x1 = models.SmallIntegerField(null=True, blank=True, default=None)
309+
y1 = models.SmallIntegerField(null=True, blank=True, default=None)
310+
x2 = models.SmallIntegerField(null=True, blank=True, default=None)
311+
y2 = models.SmallIntegerField(null=True, blank=True, default=None)
312+
# end floorplan-related stuff
301313

302314
def __unicode__(self):
303315
return "%s size: %s" % (self.name, self.capacity)
@@ -332,6 +344,36 @@ def json_dict(self, host_scheme):
332344
'capacity': self.capacity,
333345
}
334346

347+
def left(self):
348+
return min(self.x1, self.x2) if (self.x1 and self.x2) else 0
349+
def top(self):
350+
return min(self.y1, self.y2) if (self.y1 and self.y2) else 0
351+
def right(self):
352+
return max(self.x1, self.x2) if (self.x1 and self.x2) else 0
353+
def bottom(self):
354+
return max(self.y1, self.y2) if (self.y1 and self.y2) else 0
355+
def functional_display_name(self):
356+
if not self.functional_name:
357+
return ""
358+
if self.functional_name.lower().startswith('breakout'):
359+
return ""
360+
if self.functional_name[0].isdigit():
361+
return ""
362+
return self.functional_name
363+
class Meta:
364+
ordering = ["-meeting", "name"]
365+
366+
def floorplan_path(instance, filename):
367+
root, ext = os.path.splitext(filename)
368+
return u"%s/floorplan-%s-%s%s" % (settings.FLOORPLAN_MEDIA_DIR, instance.meeting.number, slugify(instance.name), ext)
369+
370+
class FloorPlan(models.Model):
371+
name = models.CharField(max_length=255)
372+
meeting = models.ForeignKey(Meeting)
373+
order = models.SmallIntegerField()
374+
image = models.ImageField(storage=NoLocationMigrationFileSystemStorage(), upload_to=floorplan_path, blank=True, default=None)
375+
376+
# === Schedules, Sessions, Timeslots and Assignments ===========================
335377

336378
class TimeSlot(models.Model):
337379
"""
@@ -1307,3 +1349,4 @@ def badness_fast(self, timeslot, scheduleslot, session_pk_list):
13071349
if self.badness_test(1):
13081350
self.badness_log(1, "badgroup: %s badness = %u\n" % (self.group.acronym, badness))
13091351
return badness
1352+

ietf/meeting/resources.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ietf import api
99

1010
from ietf.meeting.models import ( Meeting, ResourceAssociation, Constraint, Room, Schedule, Session,
11-
TimeSlot, SchedTimeSessAssignment, SessionPresentation )
11+
TimeSlot, SchedTimeSessAssignment, SessionPresentation, FloorPlan )
1212

1313
from ietf.name.resources import MeetingTypeNameResource
1414
class MeetingResource(ModelResource):
@@ -83,11 +83,28 @@ class Meta:
8383
}
8484
api.meeting.register(ConstraintResource())
8585

86+
class FloorPlanResource(ModelResource):
87+
meeting = ToOneField(MeetingResource, 'meeting')
88+
class Meta:
89+
queryset = FloorPlan.objects.all()
90+
serializer = api.Serializer()
91+
cache = SimpleCache()
92+
#resource_name = 'floorplan'
93+
filtering = {
94+
"id": ALL,
95+
"name": ALL,
96+
"order": ALL,
97+
"image": ALL,
98+
"meeting": ALL_WITH_RELATIONS,
99+
}
100+
api.meeting.register(FloorPlanResource())
101+
86102
from ietf.name.resources import TimeSlotTypeNameResource
87103
class RoomResource(ModelResource):
88104
meeting = ToOneField(MeetingResource, 'meeting')
89105
resources = ToManyField(ResourceAssociationResource, 'resources', null=True)
90106
session_types = ToManyField(TimeSlotTypeNameResource, 'session_types', null=True)
107+
floorplan = ToOneField(FloorPlanResource, 'floorplan', null=True)
91108
class Meta:
92109
cache = SimpleCache()
93110
queryset = Room.objects.all()
@@ -101,6 +118,7 @@ class Meta:
101118
"meeting": ALL_WITH_RELATIONS,
102119
"resources": ALL_WITH_RELATIONS,
103120
"session_types": ALL_WITH_RELATIONS,
121+
"floorplan": ALL_WITH_RELATIONS,
104122
}
105123
api.meeting.register(RoomResource())
106124

0 commit comments

Comments
 (0)