]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/models/user.py
Make RequestHolder thread-safe
[osqa.git] / forum / models / user.py
index e8871f4187b662532ed489121f6b3bcdc213ebc6..cf47c6653e78b2eaae6f68b5e8ae5039b5c5b8a4 100644 (file)
@@ -4,7 +4,7 @@ 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
 
@@ -110,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)
@@ -131,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)
 
@@ -149,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:
@@ -165,6 +181,10 @@ class User(BaseModel, DjangoUser):
 
         return username
 
+    @property
+    def decorated_name(self):
+        return self._decorated_name()
+
     @property
     def last_activity(self):
         try: