From 4cffa7eeab10b46a00560efb9ad7da9f009e00b8 Mon Sep 17 00:00:00 2001 From: zhengxie Date: Mon, 14 Oct 2013 12:06:02 +0800 Subject: [PATCH] Add custom charfiled to lower email address --- seahub/api2/models.py | 3 ++- seahub/avatar/models.py | 4 +++- seahub/base/accounts.py | 10 ++-------- seahub/base/fields.py | 22 ++++++++++++++++++++++ seahub/contacts/models.py | 5 +++-- seahub/group/models.py | 5 +++-- seahub/group/views.py | 2 ++ seahub/message/models.py | 5 +++-- seahub/notifications/models.py | 4 +++- seahub/share/models.py | 11 ++++++----- seahub/share/views.py | 2 +- seahub/views/__init__.py | 2 +- seahub/views/sysadmin.py | 6 +++++- seahub/wiki/models.py | 4 +++- 14 files changed, 59 insertions(+), 26 deletions(-) create mode 100644 seahub/base/fields.py diff --git a/seahub/api2/models.py b/seahub/api2/models.py index a1189b06b2..7d08c574d3 100644 --- a/seahub/api2/models.py +++ b/seahub/api2/models.py @@ -4,13 +4,14 @@ from hashlib import sha1 from django.db import models from seahub.base.accounts import User +from seahub.base.fields import LowerCaseCharField class Token(models.Model): """ The default authorization token model. """ key = models.CharField(max_length=40, primary_key=True) - user = models.CharField(max_length=255, unique=True) + user = LowerCaseCharField(max_length=255, unique=True) created = models.DateTimeField(auto_now_add=True) def save(self, *args, **kwargs): diff --git a/seahub/avatar/models.py b/seahub/avatar/models.py index 8d925cd7af..582e4720f6 100644 --- a/seahub/avatar/models.py +++ b/seahub/avatar/models.py @@ -3,6 +3,8 @@ import datetime import hashlib import os +from seahub.base.fields import LowerCaseCharField + from django.db import models from django.core.files.base import ContentFile from django.utils.translation import ugettext as _ @@ -127,7 +129,7 @@ class AvatarBase(object): ) class Avatar(models.Model, AvatarBase): - emailuser = models.CharField(max_length=255) + emailuser = LowerCaseCharField(max_length=255) primary = models.BooleanField(default=False) avatar = models.ImageField(max_length=1024, upload_to=avatar_file_path, blank=True) date_uploaded = models.DateTimeField(default=datetime.datetime.now) diff --git a/seahub/base/accounts.py b/seahub/base/accounts.py index 29a0e15ad3..04013b9747 100644 --- a/seahub/base/accounts.py +++ b/seahub/base/accounts.py @@ -22,14 +22,8 @@ class UserManager(object): """ Creates and saves a User with given username and password. """ - # Normalize the address by lowercasing the domain part of the email - # address. - try: - email_name, domain_part = email.strip().split('@', 1) - except ValueError: - pass - else: - email = '@'.join([email_name, domain_part.lower()]) + # Lowercasing email address to avoid confusion. + email = email.lower() user = User(email=email) user.is_staff = is_staff diff --git a/seahub/base/fields.py b/seahub/base/fields.py new file mode 100644 index 0000000000..c55fc95d4e --- /dev/null +++ b/seahub/base/fields.py @@ -0,0 +1,22 @@ +from django.db.models import CharField + +class ModifyingFieldDescriptor(object): + """ Modifies a field when set using the field's (overriden) .to_python() method. """ + def __init__(self, field): + self.field = field + def __get__(self, instance, owner=None): + if instance is None: + raise AttributeError('Can only be accessed via an instance.') + return instance.__dict__[self.field.name] + def __set__(self, instance, value): + instance.__dict__[self.field.name] = self.field.to_python(value) + +class LowerCaseCharField(CharField): + def to_python(self, value): + value = super(LowerCaseCharField, self).to_python(value) + if isinstance(value, basestring): + return value.lower() + return value + def contribute_to_class(self, cls, name): + super(LowerCaseCharField, self).contribute_to_class(cls, name) + setattr(cls, self.name, ModifyingFieldDescriptor(self)) diff --git a/seahub/contacts/models.py b/seahub/contacts/models.py index c7d4d53be3..3b55b9b7ba 100644 --- a/seahub/contacts/models.py +++ b/seahub/contacts/models.py @@ -4,6 +4,7 @@ from django.db import models from django.forms import ModelForm from django.utils.translation import ugettext as _ +from seahub.base.fields import LowerCaseCharField from settings import CONTACT_EMAIL_LENGTH class ContactManager(models.Manager): @@ -33,8 +34,8 @@ class ContactManager(models.Manager): class Contact(models.Model): """Record user's contacts.""" - user_email = models.CharField(max_length=CONTACT_EMAIL_LENGTH, db_index=True) - contact_email = models.CharField(max_length=CONTACT_EMAIL_LENGTH) + user_email = LowerCaseCharField(max_length=CONTACT_EMAIL_LENGTH, db_index=True) + contact_email = LowerCaseCharField(max_length=CONTACT_EMAIL_LENGTH) contact_name = models.CharField(max_length=255, blank=True, null=True, \ default='') note = models.CharField(max_length=255, blank=True, null=True, default='') diff --git a/seahub/group/models.py b/seahub/group/models.py index 5c9e96d576..7f7ae06923 100644 --- a/seahub/group/models.py +++ b/seahub/group/models.py @@ -7,19 +7,20 @@ from django.dispatch import receiver from seaserv import get_group_members +from seahub.base.fields import LowerCaseCharField from seahub.shortcuts import get_first_object_or_none from seahub.notifications.models import UserNotification from seahub.profile.models import Profile class GroupMessage(models.Model): group_id = models.IntegerField(db_index=True) - from_email = models.EmailField() + from_email = LowerCaseCharField(max_length=255) message = models.CharField(max_length=2048) timestamp = models.DateTimeField(default=datetime.datetime.now) class MessageReply(models.Model): reply_to = models.ForeignKey(GroupMessage) - from_email = models.EmailField() + from_email = LowerCaseCharField(max_length=255) message = models.CharField(max_length=2048) timestamp = models.DateTimeField(default=datetime.datetime.now) diff --git a/seahub/group/views.py b/seahub/group/views.py index 243f23a99d..b5acffbfb2 100644 --- a/seahub/group/views.py +++ b/seahub/group/views.py @@ -556,6 +556,7 @@ def group_manage(request, group_id): member_name_str = request.POST.get('user_name', '') member_list = string2list(member_name_str) + member_list = [x.lower() for x in member_list] # Add users to contacts. for email in member_list: @@ -682,6 +683,7 @@ def group_add_admin(request, group_id): member_name_str = request.POST.get('user_name', '') member_list = string2list(member_name_str) + member_list = [x.lower() for x in member_list] for member_name in member_list: # Add user to contacts. diff --git a/seahub/message/models.py b/seahub/message/models.py index 288e533654..bc2fa0c454 100755 --- a/seahub/message/models.py +++ b/seahub/message/models.py @@ -8,6 +8,7 @@ from django.db.models import Q from django.forms import ModelForm from django.utils.translation import ugettext as _ +from seahub.base.fields import LowerCaseCharField class UserMessageManager(models.Manager): def get_messages_related_to_user(self, username): @@ -50,8 +51,8 @@ class UserMessageManager(models.Manager): class UserMessage(models.Model): message_id = models.AutoField(primary_key=True) message = models.CharField(max_length=512) - from_email = models.EmailField(db_index=True) - to_email = models.EmailField(db_index=True) + from_email = LowerCaseCharField(max_length=255, db_index=True) + to_email = LowerCaseCharField(max_length=255, db_index=True) timestamp = models.DateTimeField(default=datetime.datetime.now) ifread = models.BooleanField() objects = UserMessageManager() diff --git a/seahub/notifications/models.py b/seahub/notifications/models.py index 7e0dff14ed..2cc36655d3 100644 --- a/seahub/notifications/models.py +++ b/seahub/notifications/models.py @@ -2,12 +2,14 @@ import datetime from django.db import models from django.forms import ModelForm, Textarea +from seahub.base.fields import LowerCaseCharField + class Notification(models.Model): message = models.CharField(max_length=512) primary = models.BooleanField(default=False) class UserNotification(models.Model): - to_user = models.EmailField(db_index=True, max_length=255) + to_user = LowerCaseCharField(db_index=True, max_length=255) msg_type = models.CharField(db_index=True, max_length=30) detail = models.TextField() timestamp = models.DateTimeField(default=datetime.datetime.now) diff --git a/seahub/share/models.py b/seahub/share/models.py index efc25251c0..1d26f49c79 100644 --- a/seahub/share/models.py +++ b/seahub/share/models.py @@ -1,22 +1,23 @@ import datetime from django.db import models +from seahub.base.fields import LowerCaseCharField from seahub.utils import normalize_file_path, normalize_dir_path, gen_token class AnonymousShare(models.Model): """ Model used for sharing repo to unregistered email. """ - repo_owner = models.EmailField(max_length=255) + repo_owner = LowerCaseCharField(max_length=255) repo_id = models.CharField(max_length=36) - anonymous_email = models.EmailField(max_length=255) + anonymous_email = LowerCaseCharField(max_length=255) token = models.CharField(max_length=25, unique=True) class FileShare(models.Model): """ Model used for file or dir shared link. """ - username = models.EmailField(max_length=255, db_index=True) + username = LowerCaseCharField(max_length=255, db_index=True) repo_id = models.CharField(max_length=36, db_index=True) path = models.TextField() token = models.CharField(max_length=10, unique=True) @@ -102,8 +103,8 @@ class PrivateFileDirShareManager(models.Manager): class PrivateFileDirShare(models.Model): - from_user = models.CharField(max_length=255, db_index=True) - to_user = models.CharField(max_length=255, db_index=True) + from_user = LowerCaseCharField(max_length=255, db_index=True) + to_user = LowerCaseCharField(max_length=255, db_index=True) repo_id = models.CharField(max_length=36, db_index=True) path = models.TextField() token = models.CharField(max_length=10, unique=True) diff --git a/seahub/share/views.py b/seahub/share/views.py index 3fca63ef6d..7f190c95bf 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -186,7 +186,7 @@ def share_repo(request): elif share_to.find('@') == -1: share_to_group_names.append(share_to) else: - share_to_users.append(share_to) + share_to_users.append(share_to.lower()) share_to_groups = [] # get all personal groups diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index f26cb7a8a4..1cd4cf4be1 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -519,7 +519,7 @@ def repo_owner(request, repo_id): raise Http404 content_type = 'application/json; charset=utf-8' - repo_owner = request.POST.get('repo_owner', '') + repo_owner = request.POST.get('repo_owner', '').lower() try: User.objects.get(email=repo_owner) except User.DoesNotExist: diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 08fa0e75c5..7fc0df3e1e 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -366,7 +366,11 @@ def user_add(request): content_type = 'application/json; charset=utf-8' if request.method == 'POST': - form = AddUserForm(request.POST) + post_values = request.POST.copy() + post_email = request.POST.get('email', '') + post_values.update({'email': post_email.lower()}) + + form = AddUserForm(post_values) if form.is_valid(): email = form.cleaned_data['email'] password = form.cleaned_data['password1'] diff --git a/seahub/wiki/models.py b/seahub/wiki/models.py index 0802dcbc52..66942cb03a 100644 --- a/seahub/wiki/models.py +++ b/seahub/wiki/models.py @@ -1,5 +1,7 @@ from django.db import models +from seahub.base.fields import LowerCaseCharField + class WikiDoesNotExist(Exception): pass @@ -20,7 +22,7 @@ class PersonalWikiManager(models.Manager): return wiki class PersonalWiki(models.Model): - username = models.CharField(max_length=255, unique=True) + username = LowerCaseCharField(max_length=255, unique=True) repo_id = models.CharField(max_length=36) objects = PersonalWikiManager()