X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/cf523df2eb6e7b696c693e68b449a2c541bbaa67..f092d2a066bd98474491e85f3661b9b5d76ebd16:/forum/models/user.py?ds=sidebyside diff --git a/forum/models/user.py b/forum/models/user.py index 84801fb..cf47c66 100644 --- a/forum/models/user.py +++ b/forum/models/user.py @@ -1,9 +1,10 @@ from base import * from utils import PickledObjectField +from django.conf import settings as django_settings from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User as DjangoUser, AnonymousUser as DjangoAnonymousUser -from django.db.models import Q +from django.db.models import Q, Manager from django.utils.encoding import smart_unicode @@ -109,6 +110,20 @@ def false_if_validation_required_to(item): return decorated return decorator +class UserManager(CachedManager): + def get(self, *args, **kwargs): + if not len(args) and len(kwargs) == 1 and 'username' in kwargs: + matching_users = self.filter(username=kwargs['username']) + + if len(matching_users) == 1: + return matching_users[0] + elif len(matching_users) > 1: + for user in matching_users: + if user.username == kwargs['username']: + return user + return matching_users[0] + return super(UserManager, self).get(*args, **kwargs) + class User(BaseModel, DjangoUser): is_approved = models.BooleanField(default=False) email_isvalid = models.BooleanField(default=False) @@ -130,6 +145,8 @@ class User(BaseModel, DjangoUser): vote_up_count = DenormalizedField("actions", canceled=False, action_type="voteup") vote_down_count = DenormalizedField("actions", canceled=False, action_type="votedown") + objects = UserManager() + def __unicode__(self): return smart_unicode(self.username) @@ -148,8 +165,8 @@ class User(BaseModel, DjangoUser): #todo: temporary thing, for now lets just assume that the site owner will always be the first user of the application return self.id == 1 - @property - def decorated_name(self): + + def _decorated_name(self): username = smart_unicode(self.username) if len(username) > TRUNCATE_USERNAMES_LONGER_THAN and TRUNCATE_LONG_USERNAMES: @@ -164,6 +181,10 @@ class User(BaseModel, DjangoUser): return username + @property + def decorated_name(self): + return self._decorated_name() + @property def last_activity(self): try: @@ -199,7 +220,14 @@ class User(BaseModel, DjangoUser): @models.permalink def get_profile_url(self): - return ('user_profile', (), {'id': self.id, 'slug': slugify(smart_unicode(self.username))}) + keyword_arguments = { + 'slug': slugify(smart_unicode(self.username)) + } + if settings.INCLUDE_ID_IN_USER_URLS: + keyword_arguments.update({ + 'id': self.id, + }) + return ('user_profile', (), keyword_arguments) def get_absolute_url(self): return self.get_profile_url() @@ -210,7 +238,14 @@ class User(BaseModel, DjangoUser): @models.permalink def get_user_subscriptions_url(self): - return ('user_subscriptions', (), { 'id': self.id, 'slug': slugify(smart_unicode(self.username))}) + keyword_arguments = { + 'slug': slugify(smart_unicode(self.username)) + } + if settings.INCLUDE_ID_IN_USER_URLS: + keyword_arguments.update({ + 'id': self.id, + }) + return ('user_subscriptions', (), keyword_arguments) @models.permalink def get_answered_url(self): @@ -410,7 +445,7 @@ class User(BaseModel, DjangoUser): except MultipleObjectsReturned: logging.error("Multiple suspension actions found for user %s (%s)" % (self.username, self.id)) self.__dict__['_suspension_dencache_'] = self.reputes.filter(action__action_type="suspend", action__canceled=False - ).order_by('-action__action_date')[0] + ).order_by('-action__action_date')[0].action return self.__dict__['_suspension_dencache_'] @@ -448,7 +483,10 @@ class UserProperty(BaseModel): @classmethod def infer_cache_key(cls, querydict): if 'user' in querydict and 'key' in querydict: - return cls._generate_cache_key("%s:%s" % (querydict['user'].id, querydict['key'])) + cache_key = cls._generate_cache_key("%s:%s" % (querydict['user'].id, querydict['key'])) + if len(cache_key) > django_settings.CACHE_MAX_KEY_LENGTH: + cache_key = cache_key[:django_settings.CACHE_MAX_KEY_LENGTH] + return cache_key return None