X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/617e60be3c7d2e0f17639f3487a721d4efdc02c0..3d835e01926aeec21f78df2012567cdd2f2f7f07:/forum/models/user.py diff --git a/forum/models/user.py b/forum/models/user.py index f5eb9a6..f3a0389 100644 --- a/forum/models/user.py +++ b/forum/models/user.py @@ -1,4 +1,5 @@ from base import * +from utils import PickledObjectField 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 @@ -124,11 +125,32 @@ class User(BaseModel, DjangoUser): def __unicode__(self): return self.username + @property + def prop(self): + prop = self.__dict__.get('_prop', None) + + if prop is None: + prop = UserPropertyDict(self) + self._prop = prop + + return prop + @property def is_siteowner(self): #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): + if settings.SHOW_STATUS_DIAMONDS: + if self.is_superuser: + return u"%s \u2666\u2666" % self.username + + if self.is_staff: + return u"%s \u2666" % self.username + + return self.username + @property def gravatar(self): return md5(self.email).hexdigest() @@ -164,6 +186,18 @@ class User(BaseModel, DjangoUser): def get_absolute_url(self): return self.get_profile_url() + @models.permalink + def get_asked_url(self): + return ('user_questions', (), {'mode': _('asked-by'), 'user': self.id, 'slug': slugify(self.username)}) + + @models.permalink + def get_answered_url(self): + return ('user_questions', (), {'mode': _('answered-by'), 'user': self.id, 'slug': slugify(self.username)}) + + @models.permalink + def get_subscribed_url(self): + return ('user_questions', (), {'mode': _('subscribed-by'), 'user': self.id, 'slug': slugify(self.username)}) + def get_profile_link(self): profile_link = u'%s' % (self.get_profile_url(), self.username) return mark_safe(profile_link) @@ -326,6 +360,64 @@ class User(BaseModel, DjangoUser): class Meta: app_label = 'forum' +class UserProperty(models.Model): + user = models.ForeignKey(User, related_name='properties') + key = models.CharField(max_length=16) + value = PickledObjectField() + + class Meta: + app_label = 'forum' + unique_together = ('user', 'key') + +class UserPropertyDict(object): + def __init__(self, user): + self.__dict__['_user'] = user + + def __get_property(self, name): + if self.__dict__.get('__%s__' % name, None): + return self.__dict__['__%s__' % name] + try: + user = self.__dict__['_user'] + prop = UserProperty.objects.get(user=user, key=name) + self.__dict__['__%s__' % name] = prop + self.__dict__[name] = prop.value + return prop + except: + return None + + + def __getattr__(self, name): + if self.__dict__.get(name, None): + return self.__dict__[name] + + prop = self.__get_property(name) + + if prop: + return prop.value + else: + return None + + def __setattr__(self, name, value): + current = self.__get_property(name) + + if value is not None: + if current: + current.value = value + self.__dict__[name] = value + current.save() + else: + user = self.__dict__['_user'] + prop = UserProperty(user=user, value=value, key=name) + prop.save() + self.__dict__[name] = value + self.__dict__['__%s__' % name] = prop + else: + if current: + current.delete() + del self.__dict__[name] + del self.__dict__['__%s__' % name] + + class SubscriptionSettings(models.Model): user = models.OneToOneField(User, related_name='subscription_settings') @@ -333,7 +425,7 @@ class SubscriptionSettings(models.Model): #notify if member_joins = models.CharField(max_length=1, default='n') - new_question = models.CharField(max_length=1, default='d') + new_question = models.CharField(max_length=1, default='n') new_question_watched_tags = models.CharField(max_length=1, default='i') subscribed_questions = models.CharField(max_length=1, default='i') @@ -352,6 +444,8 @@ class SubscriptionSettings(models.Model): notify_comments = models.BooleanField(default=False) notify_accepted = models.BooleanField(default=False) + send_digest = models.BooleanField(default=True) + class Meta: app_label = 'forum'