~daker/loco-team-portal/fix.1093113

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# -*- coding: utf-8 -*-
from django.db import models
from userprofiles.models import UserProfile
from teams.models import *
from django.utils.translation import ugettext_lazy as _
from common.mixins import LocalTimeMixin

import pytz
import datetime


class BaseMeeting(models.Model, LocalTimeMixin):
    """
    a simple basic meeting
    """
    name = models.CharField(max_length=150, verbose_name=_('Meeting Name'))
    date_begin = models.DateTimeField(help_text=_('Local date and time that the meeting starts'), verbose_name=_('Begins'), db_index=True)
    date_end = models.DateTimeField(help_text=_('Local date and time that the meeting ends'), verbose_name=_('Ends'), db_index=True)
    channel = models.CharField(max_length=150, verbose_name=_('Meeting Channel'), help_text=_('Channel that the meeting will be held in. Ex. #ubuntu-us-fl'), null=True)
    logs = models.URLField(verbose_name=_('Meeting Log'), help_text=_('After the meeting, add a link to the meeting log'), max_length=200, verify_exists=False, blank=True, null=True)
    minutes = models.URLField(verbose_name=_('Meeting Minutes'), help_text=_('After the meeting, add a link to the meeting minutes'), max_length=200, verify_exists=False, blank=True, null=True)
    date_created = models.DateTimeField(help_text=_('the date and time when the event was created'), default=datetime.datetime.now(), db_index=True)
    chair = models.ForeignKey(UserProfile, verbose_name=_('Meeting Chair'), blank=True, null=True)

    tz = 'UTC'

    def __unicode__(self):
        return self.name

    def get_local_begin(self):
        return self.tolocaltime(self.date_begin)

    def set_local_begin(self, local_begin):
        self.date_begin = self.fromlocaltime(local_begin)
    local_date_begin = property(get_local_begin)

    def get_local_end(self):
        return self.tolocaltime(self.date_end)

    def set_local_end(self, local_end):
        self.date_end = self.fromlocaltime(local_end)
    local_date_end = property(get_local_end, set_local_end)

    def as_ical(self, cal):
        """
        return a event as ical
        """
        event = cal.add('vevent')
        event.add('uid').value = str(self.id)
        event.add('dtstart').value = pytz.utc.localize(self.date_begin)
        event.add('dtend').value = pytz.utc.localize(self.date_end)
        event.add('categories').value = ['Ubuntu Team Meeting']
        event.add('summary').value = self.name or ''

    def is_past(self):
        return self.date_end < datetime.datetime.today()


class TeamMeetingManager(models.Manager):
    """ manager for a team event """
    def next_3_meetings(self):
        """ a list with the next 3 team meetings """
        return self.next_meetings()[:3]

    def next_5_meetings(self):
        """ a list with the next 5 team meetings """
        return self.next_meetings()[:5]

    def next_meetings(self):
        """ a list with all upcoming team meetings """
        return self.filter(date_end__gt=datetime.datetime.now()).order_by('date_end')

    def history_meetings(self):
        """ all team meetings in history """
        return self.filter(date_end__lt=datetime.datetime.now()).order_by('-date_end')


class TeamMeeting(BaseMeeting):
    """
    a meeting of one or more teams
    """
    teams = models.ManyToManyField(Team, help_text=_('team planning this meeting.'), verbose_name=_('Teams Participating'), db_index=True)
    meeting_tz = models.CharField(max_length=32, verbose_name=_('Timezone'), default='', choices=[('team', 'Team Default')] + [(tz, tz) for tz in pytz.all_timezones], blank=False, null=False)
    template = 'meetings/team_meeting_li.inc.html'

    objects = TeamMeetingManager()

    def __unicode__(self):
        return "%s %s" % (self.name, self.date_begin or "")

    @models.permalink
    def get_absolute_url(self):
        return ('team-meeting-detail', [getattr(self.first_team(), 'lp_name', 'no-team'), str(self.id)])

    def get_tz(self):
        if self.meeting_tz != 'team':
            return self.meeting_tz
        elif self.teams:
            first = None
            for t in self.teams.all():
                if not first:
                    first = t
                if t.tz != 'UTC':
                    return t.tz
            return first.tz
        else:
            return 'UTC'
    tz = property(get_tz)

    def first_team(self):
        try:
            return self.teams.all()[0]
        except:
            #print 'Meeting %s has no team' % self.id
            return {'lp_name': 'no-team'}


class AgendaItemNode(object):

    def __init__(self, item):
        self.item = item
        self.parent = None
        self.children = []

    def as_ol(self):
        if len(self.children) > 0:
            return '<li>%s - %s</li>\n<ol>\n%s</ol>\n' % (self.item.title, self.item.sig, '\n'.join([c.as_ol() for c in self.children]))
        else:
            return '<li>%s - %s</li>\n' % (self.item.title, self.item.sig)

    def as_ul(self):
        if len(self.children) > 0:
            return '<li>%s - %s</li>\n<ul>\n%s</ul>\n' % (self.item.title, self.item.sig, '\n'.join([c.as_ul() for c in self.children]))
        else:
            return '<li>%s - %s</li>\n' % (self.item.title, self.item.sig)

    def __unicode__(self):
        return self.item.title


class AgendaItemManager(models.Manager):

    def top(self):
        return self.filter(parent__isnull=True).order_by('order')

    def as_tree(self):
        cache = {}
        tree = []
        all_items = self.order_by('parent__id', 'order')
        for i in all_items:
            node = AgendaItemNode(i)
            cache[i.pk] = node
            if i.parent is None or i.parent.pk == 0:
                tree.append(node)
            else:
                node.parent = cache[i.parent.pk]
                node.parent.children.append(node)
        return tree


class AgendaItem(models.Model):

    meeting = models.ForeignKey(BaseMeeting, verbose_name=_('Meeting'), related_name='agenda', help_text=_('meeting during which this agenda item is to be discussed'))
    title = models.CharField(verbose_name=_('Title'), max_length=150, help_text=_('descriptive name for this agenda item'))
    owner = models.ForeignKey(UserProfile, verbose_name=_('Owner'), help_text=_('person proposing or responsible for this agenda item'))
    created_date = models.DateTimeField(verbose_name=_('Created Date'), auto_now_add=True, help_text=_('timestamp of when this agenda item was created'))
    description = models.TextField(verbose_name=_('Description'), help_text=_('detailed description of this agenda item'), blank=True, null=True)
    parent = models.ForeignKey('self', verbose_name=_('Parent Agenda Item'), related_name='children', help_text=_('agenda item that contains this agenda item'), blank=True, null=True)
    order = models.PositiveIntegerField(verbose_name=_('Order'), help_text=_('index number of where this agenda item falls in the agenda'), default=1)
    log = models.URLField(verbose_name=_('Log URL'), max_length=200, verify_exists=False, help_text=_('URL to this agenda item\'s discussion'), blank=True, null=True)

    objects = AgendaItemManager()

    class Meta:
        ordering = ('parent__id', 'order', 'created_date')

    def __unicode__(self):
        if self.parent is None:
            return u'%s' % self.title
        else:
            return u'%s->%s' % (self.parent, self.title)

    def save(self, *args, **kargs):
        if not self.created_date:
            self.created_date = datetime.datetime.now()
        return super(AgendaItem, self).save(*args, **kargs)

    def get_descendents(self):
        descendents = []
        if self.id is None:
            return descendents
        for child in self.children.all():
            descendents.append(child)
            descendents.extend(child.descendents)
        return descendents
    descendents = property(get_descendents)