~mhall119/summit/add-auditing

« back to all changes in this revision

Viewing changes to summit/schedule/models/summitmodel.py

  • Committer: Tarmac
  • Author(s): Chris Johnston
  • Date: 2013-02-23 14:00:58 UTC
  • mfrom: (480.1.6 add-hangout-display)
  • Revision ID: tarmac@geekpad-20130223140058-c01k2zml6xealb6z
[r=mhall119] A bunch of pep8 fixes and a virt display

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
 
48
48
#Monkey patch for better use in the admin
49
49
User._meta.ordering = ['username']
 
50
 
 
51
 
50
52
def unicode_user(user):
51
53
    display = []
52
54
    if user.first_name:
56
58
    if len(display) == 0:
57
59
        return user.username
58
60
    else:
59
 
        return user.username + ' (' +' '.join(display) + ')'
 
61
        return user.username + ' (' + ' '.join(display) + ')'
60
62
User.__unicode__ = unicode_user
61
63
 
 
64
 
62
65
class SummitManager(CurrentSiteManager):
63
66
 
64
67
    def next(self):
68
71
            # No summits have been defined in the database yet
69
72
            return Summit(name="no_summits", title="No Summits Defined")
70
73
 
 
74
 
71
75
class Summit(models.Model):
72
76
    STATE_CHOICES = (
73
77
        (u'sponsor', u'Sponsorship Requests'),
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(
 
89
        verify_exists=False,
 
90
        max_length=75,
 
91
        blank=False,
 
92
        default='http://pad.ubuntu.com/',
 
93
        help_text="Enter the URL of the etherpad server you would like to use"
 
94
    )
 
95
    qr = models.URLField(
 
96
        verify_exists=False,
 
97
        max_length=100,
 
98
        blank=True,
 
99
        default='',
 
100
        help_text="Enter the URL of the QR code for mobile device application"
 
101
    )
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(
 
104
        max_length=50,
 
105
        choices=[(x, x) for x in pytz.common_timezones]
 
106
    )
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(
 
109
        max_length=10,
 
110
        choices=STATE_CHOICES,
 
111
        default=STATE_CHOICES[0][0]
 
112
    )
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(
 
116
        User,
 
117
        blank=True,
 
118
        related_name='managers'
 
119
    )
 
120
    schedulers = models.ManyToManyField(
 
121
        User,
 
122
        blank=True,
 
123
        related_name='schedulers'
 
124
    )
96
125
    virtual_summit = models.BooleanField(
97
126
        help_text="Check this if the entire sprint is virtual"
98
127
    )
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(
 
129
        null=True,
 
130
        blank=True,
 
131
        help_text='Instructions and links for getting help during the event'
 
132
    )
100
133
 
101
134
    objects = models.Manager()
102
135
    on_site = SummitManager()
109
142
        return self.name
110
143
 
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,))
 
145
        return getattr(
 
146
            settings,
 
147
            'SITE_ROOT',
 
148
            'http://summit.ubuntu.com'
 
149
        ) + reverse(
 
150
            'summit.schedule.views.summit',
 
151
            args=(self.name,)
 
152
        )
113
153
 
114
154
    def localize(self, datetime):
115
155
        """Convert a datetime to the summit-local timezone.
172
212
        return sorted(dates)
173
213
 
174
214
    def ical_url(self):
175
 
        return getattr(settings, 'SITE_ROOT', 'http://summit.ubuntu.com') + reverse('summit.schedule.views.ical', args=(self.name,))
 
215
        return getattr(
 
216
            settings,
 
217
            'SITE_ROOT',
 
218
            'http://summit.ubuntu.com'
 
219
        ) + reverse(
 
220
            'summit.schedule.views.ical',
 
221
            args=(self.name,)
 
222
        )
176
223
 
177
224
    def public_rooms(self):
178
225
        """List of public rooms for this summit.
192
239
            else:
193
240
                return cmp(a.track.title, b.track.title)
194
241
 
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')
 
244
        )
196
245
        return sorted(rooms, cmp=by_title)
197
246
 
198
247
    def open_rooms(self):
231
280
        if sprints.count() > 0:
232
281
            urls = [sprint.import_url for sprint in sprints]
233
282
        else:
234
 
            urls = [("https://launchpad.net/sprints/%s/+temp-meeting-export"
235
 
                   % self.name)]
 
283
            urls = [
 
284
                (
 
285
                    "https://launchpad.net/sprints/%s/+temp-meeting-export"
 
286
                    % self.name
 
287
                )
 
288
            ]
236
289
        return urls
237
290
 
238
291
    def update_from_launchpad_response(self, response, options={}):
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"))
 
309
            req.add_header(
 
310
                "Cookie",
 
311
                "lp=%s" % getattr(
 
312
                    settings,
 
313
                    "LP_AUTH_COOKIE",
 
314
                    "please-don't-cache-me"
 
315
                )
 
316
            )
257
317
            try:
258
 
                 export = urllib2.urlopen(req)
 
318
                export = urllib2.urlopen(req)
259
319
            except urllib2.HTTPError, e:
260
320
                trycounter += 1
261
321
                if trycounter >= retrytotal:
278
338
            in_lp |= self.update_from_launchpad_response(sprint_info, options)
279
339
 
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))
 
341
            in_db = set(
 
342
                m for m in self.meeting_set.exclude(
 
343
                    launchpad_blueprint_id__isnull=True
 
344
                )
 
345
            )
282
346
 
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'
287
351
                extra.save()
288
352
 
289
353
        self.last_update = datetime.utcnow()
298
362
 
299
363
        print "user %s" % username
300
364
        try:
301
 
            attendee = self.attendee_set.get(user__username__exact=username[:30])
 
365
            attendee = self.attendee_set.get(
 
366
                user__username__exact=username[:30]
 
367
            )
302
368
        except ObjectDoesNotExist:
303
369
            try:
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(
 
373
                    username[:30],
 
374
                    '',
 
375
                    password=None
 
376
                )
307
377
                launchpad.set_user_openid(user)
308
378
 
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())
313
 
 
 
380
            attendee = self.attendee_set.create(
 
381
                user=user,
 
382
                start=datetime.utcnow(),
 
383
                end=datetime.utcnow()
 
384
            )
314
385
 
315
386
        attendee.update_from_launchpad(elem)
316
387
 
333
404
        try:
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(
 
408
                name=name,
 
409
                title=full_name[:100],
 
410
                slots=slot_length,
 
411
                launchpad_blueprint_id=bp_id
 
412
            )
337
413
        except:
338
414
            pass
339
415
 
347
423
        This is a pretty simple best-fit/first-come-first-served scheduler,
348
424
        but it suffices.
349
425
        """
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(
 
427
            approved='APPROVED',
 
428
            agenda__isnull=True
 
429
        ).order_by('id'):
 
430
            meeting.try_schedule(with_interested=True)
352
431
 
353
 
        for meeting in self.meeting_set.filter(approved='APPROVED', agenda__isnull=True).order_by('id'):
 
432
        for meeting in self.meeting_set.filter(
 
433
            approved='APPROVED',
 
434
            agenda__isnull=True
 
435
        ).order_by('id'):
354
436
            meeting.try_schedule()
355
437
 
356
 
 
357
438
    def check_schedule(self):
358
439
        """Check the schedule for existant errors."""
359
440
        for meeting in self.meeting_set.all():
361
442
                try:
362
443
                    missing = meeting.check_schedule(agenda.slot, agenda.room)
363
444
                    if len(missing):
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" % (
 
447
                            meeting,
 
448
                            agenda.slot,
 
449
                            agenda.room,
 
450
                            ', '.join(m.user.username for m in missing)
 
451
                        )
367
452
                except meeting.SchedulingError, e:
368
 
                    print "Error: %s at %s in %s: %s" % (meeting,
369
 
                                                         agenda.slot,
370
 
                                                         agenda.room,
371
 
                                                         e)
 
453
                    print "Error: %s at %s in %s: %s" % (
 
454
                        meeting,
 
455
                        agenda.slot,
 
456
                        agenda.room,
 
457
                        e
 
458
                    )
372
459
 
373
460
    def reschedule(self):
374
461
        """Delete any automatically created agenda items that have problems."""
426
513
            return self.lead_set.filter(lead=attendee).exists()
427
514
        return False
428
515
 
 
516
 
429
517
class SummitSprint(models.Model):
430
518
 
431
519
    summit = models.ForeignKey(Summit, related_name='sprint_set')