datatracker/ietf/mailinglists/models.py
Bill Fenner 89a8834177 Rename "initial" to "initial_members" so that it doesn't shadow
the form attribute "initial" (as in initial data)

Render the form field-by-field for MailingListForm, so that
we can render the mailing list name conditionally as a text input
box or as a hidden field with the value in the page.  We can also
insert the domain name here too.  (Note that this means that
hidden fields in this form other than domain name have to be
treated specially!)
 - Legacy-Id: 270
2007-06-08 19:54:59 +00:00

158 lines
6.8 KiB
Python

from django.db import models
from ietf.idtracker.models import Acronym, Area, PersonOrOrgInfo
from ietf.idtracker.models import Role
import random
from datetime import datetime
class ImportedMailingList(models.Model):
group_acronym = models.ForeignKey(Acronym, null=True)
acronym = models.CharField(maxlength=255, db_column='list_acronym')
name = models.CharField(blank=True, maxlength=255, db_column='list_name')
domain = models.CharField(blank=True, maxlength=25, db_column='list_domain')
def __str__(self):
return self.acronym or self.group_acronym.acronym
def choices(dname):
objects = ImportedMailingList.objects.all().filter(domain__icontains=dname).exclude(acronym__iendswith='announce')
if dname == "ietf.org":
objects = objects.exclude(acronym__istartswith='ietf').exclude(acronym__icontains='iesg')
return objects
#return [(list.acronym, list.acronym) for list in objects]
choices = staticmethod(choices)
class Meta:
db_table = 'imported_mailing_list'
class Admin:
pass
class Domain(models.Model):
domain = models.CharField("Mailing List Domain Name", maxlength=100)
approvers = models.ManyToManyField(Role, filter_interface=models.HORIZONTAL)
def __str__(self):
return self.domain
class Admin:
pass
class MailingList(models.Model):
SUBSCRIPTION_CHOICES = (
(1, 'Confirm'),
(2, 'Approval'),
(3, 'Confirm+Approval'),
)
MAILTYPE_MAP = {
'newwg': 1,
'movewg': 2,
'closewg': 5,
'newnon': 4,
'movenon': 3,
'closenon': 6,
}
MAILTYPE_CHOICES = (
(1, 'Create new WG email list at ietf.org'),
(2, 'Move existing WG email list to ietf.org'),
(3, 'Move existing non-WG email list to selected domain'),
(4, 'Create new non-WG email list at selected domain'),
(5, 'Close existing WG email list at ietf.org'),
(6, 'Close existing non-WG email list at selected domain'),
)
# I don't understand the reasoning behind 2 vs 3.
# this is set in the javascript and not editable,
# so I think there's a 1:1 mapping from mail_type -> mail_cat.
# The existing database doesn't help much since many
# mail_cat values are NULL.
MAILCAT_CHOICES = (
(1, 'WG Mailing List'),
(2, 'Non-WG Mailing List'),
(3, 'Close Non-WG Mailing List'),
)
POSTWHO_CHOICES = (
(1, 'List members only'),
(2, 'Open'),
)
YESNO_CHOICES = (
(0, 'NO'),
(1, 'YES'),
) # for integer "boolean" fields
mailing_list_id = models.CharField('Unique ID', primary_key=True, maxlength=25, editable=False)
request_date = models.DateField(default=datetime.now, editable=False)
requestor = models.CharField("Requestor's full name", maxlength=250)
requestor_email = models.EmailField("Requestor's email address", maxlength=250)
mlist_name = models.CharField('Email list name', maxlength=250)
short_desc = models.CharField('Short description of the email list', maxlength=250)
long_desc = models.TextField('Long description of the email list')
# admins is a VARCHAR but can have multiple lines.
admins = models.TextField('Mailing list administrators (one address per line)', maxlength=250)
initial_members = models.TextField('Enter email address(es) of initial subscriber(s) (one address per line) (optional)', blank=True, db_column='initial')
welcome_message = models.TextField('Provide a welcome message for initial subscriber(s)(optional)', blank=True)
welcome_new = models.TextField('Provide a welcome message for new subscriber(s)(optional)', blank=True)
subscription = models.IntegerField('What steps are required for subscription?', choices=SUBSCRIPTION_CHOICES)
post_who = models.IntegerField('Messages to this list can be posted by', choices=POSTWHO_CHOICES)
post_admin = models.IntegerField('Do postings need to be approved by an administrator?', default=0, choices=YESNO_CHOICES)
archive_private = models.IntegerField('Are the archives private?', default=0, choices=YESNO_CHOICES)
archive_remote = models.TextField('Provide specific information about how to access and move the existing archive (optional)', blank=True)
add_comment = models.TextField(blank=True)
mail_type = models.IntegerField(choices=MAILTYPE_CHOICES)
mail_cat = models.IntegerField(choices=MAILCAT_CHOICES)
auth_person = models.ForeignKey(PersonOrOrgInfo, db_column='auth_person_or_org_tag', raw_id_admin=True)
approved = models.BooleanField()
approved_date = models.DateField(null=True, blank=True)
reason_to_delete = models.TextField(blank=True)
domain_name = models.CharField(maxlength=10)
def __str__(self):
return self.mlist_name
def save(self, *args, **kwargs):
if self.mailing_list_id is None:
generate = True
while generate:
self.mailing_list_id = ''.join([random.choice('0123456789abcdefghijklmnopqrstuvwxyz') for i in range(25)])
try:
MailingList.objects.get(pk=self.mailing_list_id)
except MailingList.DoesNotExist:
generate = False
super(MailingList, self).save(*args, **kwargs)
def domain(self):
if self.domain_name:
return self.domain_name
return 'ietf.org'
class Meta:
db_table = 'mailing_list'
class Admin:
pass
class NonWgMailingList(models.Model):
id = models.CharField(primary_key=True, maxlength=35)
s_name = models.CharField("Submitter's Name", blank=True, maxlength=255)
s_email = models.EmailField("Submitter's Email Address", blank=True, maxlength=255)
list_name = models.CharField("Mailing List Name", unique=True, maxlength=255)
list_url = models.CharField("List URL", maxlength=255)
admin = models.TextField("Administrator(s)' Email Address(es)", blank=True)
purpose = models.TextField(blank=True)
area = models.ForeignKey(Area, db_column='area_acronym_id')
subscribe_url = models.CharField("Subscribe URL", blank=True, maxlength=255)
subscribe_other = models.TextField("Subscribe Other", blank=True)
# Can be 0, 1, -1, or what looks like a person_or_org_tag, positive or neg.
# The values less than 1 don't get displayed on the list of lists.
status = models.IntegerField()
ds_name = models.CharField(blank=True, maxlength=255)
ds_email = models.EmailField(blank=True, maxlength=255)
msg_to_ad = models.TextField(blank=True)
def __str__(self):
return self.list_name
def save(self, *args, **kwargs):
if self.id is None:
generate = True
while generate:
self.id = ''.join([random.choice('0123456789abcdefghijklmnopqrstuvwxyz') for i in range(35)])
try:
NonWgMailingList.objects.get(pk=self.id)
except NonWgMailingList.DoesNotExist:
generate = False
super(NonWgMailingList, self).save(*args, **kwargs)
def choices():
return [(list.id, list.list_name) for list in NonWgMailingList.objects.all().filter(status__gt=0)]
choices = staticmethod(choices)
class Meta:
db_table = 'none_wg_mailing_list'
ordering = ['list_name']
class Admin:
pass