133 lines
5.2 KiB
Python
133 lines
5.2 KiB
Python
# Copyright The IETF Trust 2007, All Rights Reserved
|
|
|
|
from django.db import models
|
|
from ietf.name.models import *
|
|
from ietf.person.models import Email, Person
|
|
|
|
import datetime
|
|
|
|
class GroupInfo(models.Model):
|
|
time = models.DateTimeField(default=datetime.datetime.now)
|
|
name = models.CharField(max_length=80)
|
|
state = models.ForeignKey(GroupStateName, null=True)
|
|
type = models.ForeignKey(GroupTypeName, null=True)
|
|
parent = models.ForeignKey('Group', blank=True, null=True)
|
|
ad = models.ForeignKey(Person, verbose_name="AD", blank=True, null=True)
|
|
list_email = models.CharField(max_length=64, blank=True)
|
|
list_subscribe = models.CharField(max_length=255, blank=True)
|
|
list_archive = models.CharField(max_length=255, blank=True)
|
|
comments = models.TextField(blank=True)
|
|
|
|
unused_states = models.ManyToManyField('doc.State', help_text="Document states that have been disabled for the group")
|
|
unused_tags = models.ManyToManyField(DocTagName, help_text="Document tags that have been disabled for the group")
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class GroupManager(models.Manager):
|
|
def active_wgs(self):
|
|
return self.get_query_set().filter(type='wg', state__in=('bof','proposed','active'))
|
|
|
|
class Group(GroupInfo):
|
|
objects = GroupManager()
|
|
|
|
acronym = models.CharField(max_length=40, unique=True, db_index=True)
|
|
charter = models.OneToOneField('doc.Document', related_name='chartered_group', blank=True, null=True)
|
|
|
|
def latest_event(self, *args, **filter_args):
|
|
"""Get latest event of optional Python type and with filter
|
|
arguments, e.g. g.latest_event(type="xyz") returns a GroupEvent
|
|
while g.latest_event(ChangeStateGroupEvent, type="xyz") returns a
|
|
ChangeStateGroupEvent event."""
|
|
model = args[0] if args else GroupEvent
|
|
e = model.objects.filter(group=self).filter(**filter_args).order_by('-time', '-id')[:1]
|
|
return e[0] if e else None
|
|
|
|
class GroupHistory(GroupInfo):
|
|
group = models.ForeignKey(Group, related_name='history_set')
|
|
acronym = models.CharField(max_length=40)
|
|
|
|
class Meta:
|
|
verbose_name_plural="group histories"
|
|
|
|
class GroupURL(models.Model):
|
|
group = models.ForeignKey(Group)
|
|
name = models.CharField(max_length=255)
|
|
url = models.URLField(verify_exists=False)
|
|
def __unicode__(self):
|
|
return u"%s (%s)" % (self.url, self.name)
|
|
|
|
class GroupMilestone(models.Model):
|
|
group = models.ForeignKey(Group)
|
|
desc = models.TextField()
|
|
expected_due_date = models.DateField()
|
|
done = models.BooleanField()
|
|
done_date = models.DateField(null=True, blank=True)
|
|
time = models.DateTimeField(auto_now=True)
|
|
def __unicode__(self):
|
|
return self.desc[:20] + "..."
|
|
class Meta:
|
|
ordering = ['expected_due_date']
|
|
|
|
class GroupStateTransitions(models.Model):
|
|
"""Captures that a group has overriden the default available
|
|
document state transitions for a certain state."""
|
|
group = models.ForeignKey(Group)
|
|
state = models.ForeignKey('doc.State', help_text="State for which the next states should be overridden")
|
|
next_states = models.ManyToManyField('doc.State', related_name='previous_groupstatetransitions_states')
|
|
|
|
def __unicode__(self):
|
|
return u'%s "%s" -> %s' % (self.group.acronym, self.state.name, [s.name for s in self.next_states.all()])
|
|
|
|
GROUP_EVENT_CHOICES = [
|
|
("changed_state", "Changed state"),
|
|
("added_comment", "Added comment"),
|
|
("info_changed", "Changed metadata"),
|
|
]
|
|
|
|
class GroupEvent(models.Model):
|
|
"""An occurrence for a group, used for tracking who, when and what."""
|
|
group = models.ForeignKey(Group)
|
|
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened")
|
|
type = models.CharField(max_length=50, choices=GROUP_EVENT_CHOICES)
|
|
by = models.ForeignKey(Person)
|
|
desc = models.TextField()
|
|
|
|
def __unicode__(self):
|
|
return u"%s %s at %s" % (self.by.plain_name(), self.get_type_display().lower(), self.time)
|
|
|
|
class Meta:
|
|
ordering = ['-time', 'id']
|
|
|
|
class ChangeStateGroupEvent(GroupEvent):
|
|
state = models.ForeignKey(GroupStateName)
|
|
|
|
class Role(models.Model):
|
|
name = models.ForeignKey(RoleName)
|
|
group = models.ForeignKey(Group)
|
|
person = models.ForeignKey(Person)
|
|
email = models.ForeignKey(Email, help_text="Email address used by person for this role")
|
|
def __unicode__(self):
|
|
return u"%s is %s in %s" % (self.person.plain_name(), self.name.name, self.group.acronym or self.group.name)
|
|
|
|
def formatted_email(self):
|
|
return u'"%s" <%s>' % (self.person.plain_name(), self.email.address)
|
|
|
|
class RoleHistory(models.Model):
|
|
# RoleHistory doesn't have a time field as it's not supposed to be
|
|
# used on its own - there should always be a GroupHistory
|
|
# accompanying a change in roles, so lookup the appropriate
|
|
# GroupHistory instead
|
|
name = models.ForeignKey(RoleName)
|
|
group = models.ForeignKey(GroupHistory)
|
|
person = models.ForeignKey(Person)
|
|
email = models.ForeignKey(Email, help_text="Email address used by person for this role")
|
|
def __unicode__(self):
|
|
return u"%s is %s in %s" % (self.person.plain_name(), self.name.name, self.group.acronym)
|
|
|
|
class Meta:
|
|
verbose_name_plural = "role histories"
|