]> git.openstreetmap.org Git - osqa.git/blob - forum/models/base.py
deleting the test file
[osqa.git] / forum / models / base.py
1 import datetime\r
2 import hashlib\r
3 from urllib import quote_plus, urlencode\r
4 from django.db import models, IntegrityError, connection, transaction\r
5 from django.utils.http import urlquote  as django_urlquote\r
6 from django.utils.html import strip_tags\r
7 from django.core.urlresolvers import reverse\r
8 from django.contrib.auth.models import User\r
9 from django.contrib.contenttypes import generic\r
10 from django.contrib.contenttypes.models import ContentType\r
11 from django.template.defaultfilters import slugify\r
12 from django.db.models.signals import post_delete, post_save, pre_save\r
13 from django.utils.translation import ugettext as _\r
14 from django.utils.safestring import mark_safe\r
15 from django.contrib.sitemaps import ping_google\r
16 import django.dispatch\r
17 from django.conf import settings\r
18 import logging\r
19 \r
20 if settings.USE_SPHINX_SEARCH == True:\r
21     from djangosphinx.models import SphinxSearch\r
22 \r
23 from forum.const import *\r
24 \r
25 class MetaContent(models.Model):\r
26     """\r
27         Base class for Vote, Comment and FlaggedItem\r
28     """\r
29     content_type   = models.ForeignKey(ContentType)\r
30     object_id      = models.PositiveIntegerField()\r
31     content_object = generic.GenericForeignKey('content_type', 'object_id')\r
32     user           = models.ForeignKey(User, related_name='%(class)ss')\r
33 \r
34     class Meta:\r
35         abstract = True\r
36         app_label = 'forum'\r
37 \r
38 \r
39 class DeletableContent(models.Model):\r
40     deleted     = models.BooleanField(default=False)\r
41     deleted_at  = models.DateTimeField(null=True, blank=True)\r
42     deleted_by  = models.ForeignKey(User, null=True, blank=True, related_name='deleted_%(class)ss')\r
43 \r
44     class Meta:\r
45         abstract = True\r
46         app_label = 'forum'\r
47 \r
48 \r
49 class ContentRevision(models.Model):\r
50     """\r
51         Base class for QuestionRevision and AnswerRevision\r
52     """\r
53     revision   = models.PositiveIntegerField()\r
54     author     = models.ForeignKey(User, related_name='%(class)ss')\r
55     revised_at = models.DateTimeField()\r
56     summary    = models.CharField(max_length=300, blank=True)\r
57     text       = models.TextField()\r
58 \r
59     class Meta:\r
60         abstract = True\r
61         app_label = 'forum'\r
62 \r
63 \r
64 class AnonymousContent(models.Model):\r
65     """\r
66         Base class for AnonymousQuestion and AnonymousAnswer\r
67     """\r
68     session_key = models.CharField(max_length=40)  #session id for anonymous questions\r
69     wiki = models.BooleanField(default=False)\r
70     added_at = models.DateTimeField(default=datetime.datetime.now)\r
71     ip_addr = models.IPAddressField(max_length=21) #allow high port numbers\r
72     author = models.ForeignKey(User,null=True)\r
73     text = models.TextField()\r
74     summary = models.CharField(max_length=180)\r
75 \r
76     class Meta:\r
77         abstract = True\r
78         app_label = 'forum'\r
79 \r
80 \r
81 from meta import Comment, Vote, FlaggedItem\r
82 \r
83 class Content(models.Model):\r
84     """\r
85         Base class for Question and Answer\r
86     """\r
87     author               = models.ForeignKey(User, related_name='%(class)ss')\r
88     added_at             = models.DateTimeField(default=datetime.datetime.now)\r
89 \r
90     wiki                 = models.BooleanField(default=False)\r
91     wikified_at          = models.DateTimeField(null=True, blank=True)\r
92 \r
93     locked               = models.BooleanField(default=False)\r
94     locked_by            = models.ForeignKey(User, null=True, blank=True, related_name='locked_%(class)ss')\r
95     locked_at            = models.DateTimeField(null=True, blank=True)\r
96 \r
97     score                = models.IntegerField(default=0)\r
98     vote_up_count        = models.IntegerField(default=0)\r
99     vote_down_count      = models.IntegerField(default=0)\r
100 \r
101     comment_count        = models.PositiveIntegerField(default=0)\r
102     offensive_flag_count = models.SmallIntegerField(default=0)\r
103 \r
104     last_edited_at       = models.DateTimeField(null=True, blank=True)\r
105     last_edited_by       = models.ForeignKey(User, null=True, blank=True, related_name='last_edited_%(class)ss')\r
106 \r
107     html                 = models.TextField()\r
108     comments             = generic.GenericRelation(Comment)\r
109     votes                = generic.GenericRelation(Vote)\r
110     flagged_items        = generic.GenericRelation(FlaggedItem)\r
111 \r
112     class Meta:\r
113         abstract = True\r
114         app_label = 'forum'\r
115 \r
116     def save(self,**kwargs):\r
117         super(Content,self).save(**kwargs)\r
118         try:\r
119             ping_google()\r
120         except Exception:\r
121             logging.debug('problem pinging google did you register you sitemap with google?')\r
122 \r
123     def get_object_comments(self):\r
124         comments = self.comments.all().order_by('id')\r
125         return comments\r
126 \r
127     def post_get_last_update_info(self):\r
128             when = self.added_at\r
129             who = self.author\r
130             if self.last_edited_at and self.last_edited_at > when:\r
131                 when = self.last_edited_at\r
132                 who = self.last_edited_by\r
133             comments = self.comments.all()\r
134             if len(comments) > 0:\r
135                 for c in comments:\r
136                     if c.added_at > when:\r
137                         when = c.added_at\r
138                         who = c.user\r
139             return when, who