81
85
sites = models.ManyToManyField(Site)
82
86
location = models.CharField(max_length=100, blank=True)
83
87
description = models.TextField(max_length=2047, blank=True)
84
etherpad = models.URLField(verify_exists=False, max_length=75, blank=False, default='http://pad.ubuntu.com/', help_text="Enter the URL of the etherpad server you would like to use")
85
qr = models.URLField(verify_exists=False, max_length=100, blank=True, default='', help_text="Enter the URL of the QR code for mobile device application")
88
etherpad = models.URLField(
92
default='http://pad.ubuntu.com/',
93
help_text="Enter the URL of the etherpad server you would like to use"
100
help_text="Enter the URL of the QR code for mobile device application"
86
102
hashtag = models.CharField(max_length=25, blank=True)
87
timezone = models.CharField(max_length=50,
88
choices=[(x, x) for x in pytz.common_timezones])
103
timezone = models.CharField(
105
choices=[(x, x) for x in pytz.common_timezones]
89
107
last_update = models.DateTimeField(null=True, blank=True)
90
state = models.CharField(max_length=10, choices=STATE_CHOICES,
91
default=STATE_CHOICES[0][0])
108
state = models.CharField(
110
choices=STATE_CHOICES,
111
default=STATE_CHOICES[0][0]
92
113
date_start = models.DateField(blank=False, null=True)
93
114
date_end = models.DateField(blank=False, null=True)
94
managers = models.ManyToManyField(User, blank=True, related_name='managers')
95
schedulers = models.ManyToManyField(User, blank=True, related_name='schedulers')
115
managers = models.ManyToManyField(
118
related_name='managers'
120
schedulers = models.ManyToManyField(
123
related_name='schedulers'
96
125
virtual_summit = models.BooleanField(
97
126
help_text="Check this if the entire sprint is virtual"
99
help_text = models.TextField(null=True, blank=True, help_text='Summit specific instructions and links for getting help during the event')
128
help_text = models.TextField(
131
help_text='Instructions and links for getting help during the event'
101
134
objects = models.Manager()
102
135
on_site = SummitManager()
111
144
def get_absolute_url(self):
112
return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.summit', args=(self.name,))
148
'http://summit.ubuntu.com'
150
'summit.schedule.views.summit',
114
154
def localize(self, datetime):
115
155
"""Convert a datetime to the summit-local timezone.
172
212
return sorted(dates)
174
214
def ical_url(self):
175
return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.ical', args=(self.name,))
218
'http://summit.ubuntu.com'
220
'summit.schedule.views.ical',
177
224
def public_rooms(self):
178
225
"""List of public rooms for this summit.
193
240
return cmp(a.track.title, b.track.title)
195
rooms = self.room_set.exclude(Q(type__exact='closed') | Q(type__exact='private'))
242
rooms = self.room_set.exclude(
243
Q(type__exact='closed') | Q(type__exact='private')
196
245
return sorted(rooms, cmp=by_title)
198
247
def open_rooms(self):
253
306
while trycounter <= retrytotal:
254
307
req = urllib2.Request(url)
255
308
req.add_header("Cache-Control", "no-cache")
256
req.add_header("Cookie", "lp=%s" % getattr(settings, "LP_AUTH_COOKIE", "please-don't-cache-me"))
314
"please-don't-cache-me"
258
export = urllib2.urlopen(req)
318
export = urllib2.urlopen(req)
259
319
except urllib2.HTTPError, e:
261
321
if trycounter >= retrytotal:
278
338
in_lp |= self.update_from_launchpad_response(sprint_info, options)
280
340
if not options.get('skip_meetings', False):
281
in_db = set(m for m in self.meeting_set.exclude(launchpad_blueprint_id__isnull=True))
342
m for m in self.meeting_set.exclude(
343
launchpad_blueprint_id__isnull=True
283
347
for extra in in_db.difference(in_lp):
284
348
print "Marking %s as removed" % extra.name
285
349
extra.agenda_set.all().delete()
286
extra.approved='REMOVED'
350
extra.approved = 'REMOVED'
289
353
self.last_update = datetime.utcnow()
299
363
print "user %s" % username
301
attendee = self.attendee_set.get(user__username__exact=username[:30])
365
attendee = self.attendee_set.get(
366
user__username__exact=username[:30]
302
368
except ObjectDoesNotExist:
304
370
user = User.objects.get(username__exact=username[:30])
305
371
except ObjectDoesNotExist:
306
user = User.objects.create_user(username[:30], '', password=None)
372
user = User.objects.create_user(
307
377
launchpad.set_user_openid(user)
309
379
# Create with any start/end time since we overwrite shortly
310
attendee = self.attendee_set.create(user=user,
311
start=datetime.utcnow(),
312
end=datetime.utcnow())
380
attendee = self.attendee_set.create(
382
start=datetime.utcnow(),
383
end=datetime.utcnow()
315
386
attendee.update_from_launchpad(elem)
334
405
meeting = self.meeting_set.get(launchpad_blueprint_id=bp_id)
335
406
except ObjectDoesNotExist:
336
meeting = self.meeting_set.create(name=name, title=full_name[:100], slots=slot_length, launchpad_blueprint_id=bp_id)
407
meeting = self.meeting_set.create(
409
title=full_name[:100],
411
launchpad_blueprint_id=bp_id
347
423
This is a pretty simple best-fit/first-come-first-served scheduler,
350
for meeting in self.meeting_set.filter(approved='APPROVED', agenda__isnull=True).order_by('id'):
351
meeting.try_schedule(with_interested = True)
426
for meeting in self.meeting_set.filter(
430
meeting.try_schedule(with_interested=True)
353
for meeting in self.meeting_set.filter(approved='APPROVED', agenda__isnull=True).order_by('id'):
432
for meeting in self.meeting_set.filter(
354
436
meeting.try_schedule()
357
438
def check_schedule(self):
358
439
"""Check the schedule for existant errors."""
359
440
for meeting in self.meeting_set.all():
362
443
missing = meeting.check_schedule(agenda.slot, agenda.room)
364
print "Warning: required people not available: %s at %s in %s: %s" % (
365
meeting, agenda.slot, agenda.room,
366
', '.join(m.user.username for m in missing))
445
print "Warning: required people not available:"
446
"%s at %s in %s: %s" % (
450
', '.join(m.user.username for m in missing)
367
452
except meeting.SchedulingError, e:
368
print "Error: %s at %s in %s: %s" % (meeting,
453
print "Error: %s at %s in %s: %s" % (
373
460
def reschedule(self):
374
461
"""Delete any automatically created agenda items that have problems."""