Source code for squaresdb.mailinglist.models
import logging
import re
from django.core.validators import RegexValidator
from django.db import models
import reversion
from .backend import MailmanList
logger = logging.getLogger(__name__)
LIST_TYPES = dict(
mailman=MailmanList
)
LIST_TYPE_CHOICES = ((name, name.capitalize()) for name in LIST_TYPES)
[docs]
@reversion.register
class ListCategory(models.Model):
# pylint:disable=duplicate-code
slug = models.SlugField(primary_key=True)
name = models.CharField(max_length=50)
order = models.IntegerField(db_index=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "list categories"
[docs]
@reversion.register
class MailingList(models.Model):
list_type = models.CharField(choices=LIST_TYPE_CHOICES, max_length=10)
category = models.ForeignKey(ListCategory, on_delete=models.CASCADE)
order = models.IntegerField(db_index=True)
LIST_NAME_RE = re.compile('^[a-z][a-z0-9-]*$')
name = models.CharField(max_length=50, unique=True,
validators=[RegexValidator(regex=LIST_NAME_RE)])
description = models.TextField()
[docs]
def get_list(self):
if not self.LIST_NAME_RE.match(self.name):
raise ValueError("invalid list name %s" % (self.name, ))
return LIST_TYPES[self.list_type](self.name)
[docs]
def join_url(self):
if self.list_type == 'mailman':
return 'https://mailman.mit.edu/mailman/listinfo/%s' % (self.name, )
return None
def __str__(self):
return f"{self.list_type}:{self.name}"
[docs]
@reversion.register
class ListMember(models.Model):
mail_list = models.ForeignKey(MailingList, on_delete=models.CASCADE)
email = models.EmailField()
class Meta:
constraints = [
models.UniqueConstraint(fields=['mail_list', 'email'], name='member'),
]