X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/1a949f7c97dc2f34c135f5cdf088df2927d3d652..c3d66e36e08b517f61b7f720e4a3b5a75f202cb6:/forum/models/base.py?ds=inline diff --git a/forum/models/base.py b/forum/models/base.py index 63ab1eb..7974af6 100644 --- a/forum/models/base.py +++ b/forum/models/base.py @@ -79,6 +79,7 @@ class BaseModel(models.Model): class ActiveObjectManager(models.Manager): + use_for_related_fields = True def get_query_set(self): return super(ActiveObjectManager, self).get_query_set().filter(canceled=False) @@ -86,7 +87,7 @@ class UndeletedObjectManager(models.Manager): def get_query_set(self): return super(UndeletedObjectManager, self).get_query_set().filter(deleted=False) -class MetaContent(BaseModel): +class GenericContent(BaseModel): """ Base class for Vote, Comment and FlaggedItem """ @@ -98,6 +99,24 @@ class MetaContent(BaseModel): abstract = True app_label = 'forum' +class MetaContent(BaseModel): + node = models.ForeignKey('Node', null=True, related_name='%(class)ss') + + def __init__(self, *args, **kwargs): + if 'content_object' in kwargs: + kwargs['node'] = kwargs['content_object'] + del kwargs['content_object'] + + super (MetaContent, self).__init__(*args, **kwargs) + + @property + def content_object(self): + return self.node.leaf + + class Meta: + abstract = True + app_label = 'forum' + from user import User class UserContent(models.Model): @@ -140,78 +159,44 @@ class DeletableContent(models.Model): else: return False +mark_canceled = django.dispatch.Signal(providing_args=['instance']) -class ContentRevision(models.Model): - """ - Base class for QuestionRevision and AnswerRevision - """ - revision = models.PositiveIntegerField() - author = models.ForeignKey(User, related_name='%(class)ss') - revised_at = models.DateTimeField() - summary = models.CharField(max_length=300, blank=True) - text = models.TextField() - - class Meta: - abstract = True - app_label = 'forum' +class CancelableContent(models.Model): + canceled = models.BooleanField(default=False) - -class AnonymousContent(models.Model): - """ - Base class for AnonymousQuestion and AnonymousAnswer - """ - session_key = models.CharField(max_length=40) #session id for anonymous questions - wiki = models.BooleanField(default=False) - added_at = models.DateTimeField(default=datetime.datetime.now) - ip_addr = models.IPAddressField(max_length=21) #allow high port numbers - author = models.ForeignKey(User,null=True) - text = models.TextField() - summary = models.CharField(max_length=180) + def cancel(self): + if not self.canceled: + self.canceled = True + self.save() + mark_canceled.send(sender=self.__class__, instance=self) + return True + + return False class Meta: abstract = True app_label = 'forum' -from meta import Comment, Vote, FlaggedItem -from user import activity_record - -class Content(BaseModel, DeletableContent): - """ - Base class for Question and Answer - """ - author = models.ForeignKey(User, related_name='%(class)ss') - added_at = models.DateTimeField(default=datetime.datetime.now) +from node import Node, NodeRevision +class QandA(Node): wiki = models.BooleanField(default=False) wikified_at = models.DateTimeField(null=True, blank=True) - #locked = models.BooleanField(default=False) - #locked_by = models.ForeignKey(User, null=True, blank=True, related_name='locked_%(class)ss') - #locked_at = models.DateTimeField(null=True, blank=True) - - score = models.IntegerField(default=0) - vote_up_count = models.IntegerField(default=0) - vote_down_count = models.IntegerField(default=0) - - comment_count = models.PositiveIntegerField(default=0) - offensive_flag_count = models.SmallIntegerField(default=0) - - last_edited_at = models.DateTimeField(null=True, blank=True) - last_edited_by = models.ForeignKey(User, null=True, blank=True, related_name='last_edited_%(class)ss') - - html = models.TextField() - comments = generic.GenericRelation(Comment) - votes = generic.GenericRelation(Vote) - flagged_items = generic.GenericRelation(FlaggedItem) - class Meta: abstract = True app_label = 'forum' + def wikify(self): + if not self.wiki: + self.wiki = True + self.wikified_at = datetime.datetime.now() + self.save() + def save(self, *args, **kwargs): self.__dict__['score'] = self.__dict__['vote_up_count'] - self.__dict__['vote_down_count'] - super(Content,self).save(*args, **kwargs) + super(QandA,self).save(*args, **kwargs) try: ping_google() @@ -219,16 +204,4 @@ class Content(BaseModel, DeletableContent): logging.debug('problem pinging google did you register you sitemap with google?') - def post_get_last_update_info(self): - when = self.added_at - who = self.author - if self.last_edited_at and self.last_edited_at > when: - when = self.last_edited_at - who = self.last_edited_by - comments = self.comments.all() - if len(comments) > 0: - for c in comments: - if c.added_at > when: - when = c.added_at - who = c.user - return when, who \ No newline at end of file +