белый / электронный список адресов электронной почты в python / django - PullRequest
1 голос
/ 13 апреля 2009

Я пишу приложение django, которое отслеживает, по каким адресам электронной почты разрешено публиковать контент в учетной записи пользователя. Пользователь может добавлять адреса в белый и черный список по своему усмотрению.

Любые адреса, которые не указаны, могут быть обработаны для каждого сообщения или просто по умолчанию включены в белый или черный список (опять же, указанный пользователем).

Вот модели Django, которые я написал ... Как вы думаете, это хороший способ сделать это? или я должен добавить поле белого и черного списков в модель профиля каждого пользователя?

class knownEmail(models.Model):
    # The user who set this address' permission, NOT
    # the user who the address belongs to...
    relatedUser = models.ManyToManyField(User)
    email = models.EmailField()

class whiteList(knownEmail):
    pass

class blackList(knownEmail):
    pass

Тогда я мог бы сделать что-то вроде:

def checkPermission(user, emailAddress):
    "Check if 'emailAddress' is allowed to post content to 'user's profile"
    if whiteList.objects.filter(relatedUser=user, email=emailAddress):
        return True
    elif blackList.objects.filter(relatedUser=user, email=emailAddress):
        return False
    else:
        return None

Есть ли лучший способ?

Ответы [ 3 ]

5 голосов
/ 14 апреля 2009

Я бы перестроил его так, чтобы оба списка содержались в одной модели.

class PermissionList(models.Model):
    setter = models.ManyToManyField(User)
    email = models.EmailField(unique=True) #don't want conflicting results
    permission = models.BooleanField()

Тогда ваши списки будут просто:

# whitelist
PermissionList.objects.filter(permission=True)
# blacklist
PermissionList.objects.filter(permission=False)

Чтобы проверить конкретного пользователя, вы просто добавляете пару функций к модели:

class PermissionList(...):
    ...
    @classmethod
    def is_on_whitelist(email):
        return PermissionList.objects.filter(email=email, permission=True).count() > 0

    @classmethod
    def is_on_blacklist(email):
        return PermissionList.objects.filter(email=email, permission=False).count() > 0

    @classmethod
    def has_permission(email):
        if PermissionList.is_on_whitelist(email):
            return True
        if PermissionList.is_on_blacklist(email):
            return False
        return None

Все проще в одном месте, и вы можете делать более интересные запросы с меньшими затратами труда.

3 голосов
/ 13 апреля 2009

[Пожалуйста, начните все имена классов с заглавных букв.]

Ваш код не очень хорошо использует различия между классами.

В частности, ваши классы не ведут себя по-разному. Поскольку оба класса имеют все одинаковые методы, неясно , почему это два разных класса. Если у них разные методы, значит ваше решение хорошее.

Если, однако, у них нет разных методов, вы можете посмотреть на предоставление настроенного менеджера для каждого из двух подмножеств KnownEmail

class WhiteList( models.Manager ):
    def get_query_set( self ):
        return super( WhiteList, self ).get_query_set().filter( status='W' )

class BlackList( models.Manager )
    def get_query_set( self ):
        return super( BlackList, self ).get_query_set().filter( status='B' )

class KnownEmail( models.Model ):
    relatedUser = models.ForeignKey(User)
    email = models.EmailField()
    status = models.CharField( max_length=1, choices=LIST_CHOICES )
    objects = models.Manager() # default manager shows all lists
    whiteList= WhiteList() # KnownEmail.whiteList.all() is whitelist subset
    blackList= BlackList() # KnownEmail.blackList.all() is blackList subset
0 голосов
/ 03 февраля 2015

Этот класс сравнивает адрес электронной почты с черным списком доменов электронной почты. Если вы предпочитаете, вы можете скачать этот модуль, используя pip install django-email-blacklist .

from django.conf import settings
import re

class DisposableEmailChecker():
"""
Check if an email is from a disposable
email service
"""

    def __init__(self):
        self.emails = [line.strip() for line in   open(settings.DISPOSABLE_EMAIL_DOMAINS)]

    def chunk(self, l, n):
        return (l[i:i + n] for i in range(0, len(l), n))

    def is_disposable(self, email):
        for email_group in self.chunk(self.emails, 20):
            regex = "(.*" + ")|(.*".join(email_group) + ")"
                if re.match(regex, email):
                    return True
                return False
...