2012-08-10 11:12:52 +03:00
# coding: utf-8
2009-01-05 14:30:08 +02:00
from datetime import datetime
2012-04-23 14:28:40 +03:00
from hashlib import sha1
2012-08-10 11:12:52 +03:00
import os
2009-04-14 14:57:17 +03:00
2009-01-05 14:30:08 +02:00
from django . conf import settings
2012-08-10 11:12:52 +03:00
from django . contrib . auth . models import User , Group
from django . db import models
from django . db . models import aggregates
2011-08-18 10:42:44 +03:00
from django . db . models . signals import post_save
2012-08-10 11:12:52 +03:00
from django . utils . translation import ugettext_lazy as _
2009-01-05 14:30:08 +02:00
2009-12-23 17:06:48 +02:00
from djangobb_forum . fields import AutoOneToOneField , ExtendedImageField , JSONField
2010-11-28 17:57:54 +02:00
from djangobb_forum . util import smiles , convert_text_to_html
2009-12-23 17:06:48 +02:00
from djangobb_forum import settings as forum_settings
2009-01-05 14:30:08 +02:00
2010-11-06 19:54:22 +02:00
if ' south ' in settings . INSTALLED_APPS :
from south . modelsinspector import add_introspection_rules
add_introspection_rules ( [ ] , [ ' ^djangobb_forum \ .fields \ .AutoOneToOneField ' ,
' ^djangobb_forum \ .fields \ .JSONField ' ,
' ^djangobb_forum \ .fields \ .ExtendedImageField ' ] )
2009-01-05 14:30:08 +02:00
TZ_CHOICES = [ ( float ( x [ 0 ] ) , x [ 1 ] ) for x in (
( - 12 , ' -12 ' ) , ( - 11 , ' -11 ' ) , ( - 10 , ' -10 ' ) , ( - 9.5 , ' -09.5 ' ) , ( - 9 , ' -09 ' ) ,
( - 8.5 , ' -08.5 ' ) , ( - 8 , ' -08 PST ' ) , ( - 7 , ' -07 MST ' ) , ( - 6 , ' -06 CST ' ) ,
( - 5 , ' -05 EST ' ) , ( - 4 , ' -04 AST ' ) , ( - 3.5 , ' -03.5 ' ) , ( - 3 , ' -03 ADT ' ) ,
( - 2 , ' -02 ' ) , ( - 1 , ' -01 ' ) , ( 0 , ' 00 GMT ' ) , ( 1 , ' +01 CET ' ) , ( 2 , ' +02 ' ) ,
( 3 , ' +03 ' ) , ( 3.5 , ' +03.5 ' ) , ( 4 , ' +04 ' ) , ( 4.5 , ' +04.5 ' ) , ( 5 , ' +05 ' ) ,
( 5.5 , ' +05.5 ' ) , ( 6 , ' +06 ' ) , ( 6.5 , ' +06.5 ' ) , ( 7 , ' +07 ' ) , ( 8 , ' +08 ' ) ,
( 9 , ' +09 ' ) , ( 9.5 , ' +09.5 ' ) , ( 10 , ' +10 ' ) , ( 10.5 , ' +10.5 ' ) , ( 11 , ' +11 ' ) ,
( 11.5 , ' +11.5 ' ) , ( 12 , ' +12 ' ) , ( 13 , ' +13 ' ) , ( 14 , ' +14 ' ) ,
) ]
SIGN_CHOICES = (
( 1 , ' PLUS ' ) ,
( - 1 , ' MINUS ' ) ,
)
PRIVACY_CHOICES = (
( 0 , _ ( u ' Display your e-mail address. ' ) ) ,
( 1 , _ ( u ' Hide your e-mail address but allow form e-mail. ' ) ) ,
( 2 , _ ( u ' Hide your e-mail address and disallow form e-mail. ' ) ) ,
)
2010-11-28 17:57:54 +02:00
MARKUP_CHOICES = [ ( ' bbcode ' , ' bbcode ' ) ]
try :
import markdown
MARKUP_CHOICES . append ( ( " markdown " , " markdown " ) )
except ImportError :
pass
2009-01-05 14:30:08 +02:00
2011-12-22 11:18:48 +02:00
path = os . path . join ( settings . STATIC_ROOT , ' djangobb_forum ' , ' themes ' )
2011-11-09 14:22:58 +02:00
if os . path . exists ( path ) :
# fix for collectstatic
THEME_CHOICES = [ ( theme , theme ) for theme in os . listdir ( path )
if os . path . isdir ( os . path . join ( path , theme ) ) ]
else :
THEME_CHOICES = [ ]
2009-01-05 14:30:08 +02:00
class Category ( models . Model ) :
name = models . CharField ( _ ( ' Name ' ) , max_length = 80 )
2009-04-07 17:46:22 +03:00
groups = models . ManyToManyField ( Group , blank = True , null = True , verbose_name = _ ( ' Groups ' ) , help_text = _ ( ' Only users from these groups can see this category ' ) )
2009-01-05 14:30:08 +02:00
position = models . IntegerField ( _ ( ' Position ' ) , blank = True , default = 0 )
class Meta :
ordering = [ ' position ' ]
verbose_name = _ ( ' Category ' )
verbose_name_plural = _ ( ' Categories ' )
def __unicode__ ( self ) :
return self . name
def forum_count ( self ) :
return self . forums . all ( ) . count ( )
@property
def topics ( self ) :
2010-11-29 00:57:19 +02:00
return Topic . objects . filter ( forum__category__id = self . id ) . select_related ( )
2009-12-24 17:24:39 +02:00
2009-01-05 14:30:08 +02:00
@property
def posts ( self ) :
2010-11-29 00:57:19 +02:00
return Post . objects . filter ( topic__forum__category__id = self . id ) . select_related ( )
2009-01-05 14:30:08 +02:00
2009-04-07 17:46:22 +03:00
def has_access ( self , user ) :
2011-01-13 17:36:29 +02:00
if self . groups . exists ( ) :
2009-07-27 13:05:19 +03:00
if user . is_authenticated ( ) :
2011-01-13 17:36:29 +02:00
if not self . groups . filter ( user__pk = user . id ) . exists ( ) :
return False
2009-07-27 13:05:19 +03:00
else :
2009-04-07 18:43:04 +03:00
return False
return True
2009-01-05 14:30:08 +02:00
2009-07-27 13:05:19 +03:00
2009-01-05 14:30:08 +02:00
class Forum ( models . Model ) :
category = models . ForeignKey ( Category , related_name = ' forums ' , verbose_name = _ ( ' Category ' ) )
name = models . CharField ( _ ( ' Name ' ) , max_length = 80 )
position = models . IntegerField ( _ ( ' Position ' ) , blank = True , default = 0 )
description = models . TextField ( _ ( ' Description ' ) , blank = True , default = ' ' )
moderators = models . ManyToManyField ( User , blank = True , null = True , verbose_name = _ ( ' Moderators ' ) )
2009-12-24 17:24:39 +02:00
updated = models . DateTimeField ( _ ( ' Updated ' ) , auto_now = True )
2009-01-05 14:30:08 +02:00
post_count = models . IntegerField ( _ ( ' Post count ' ) , blank = True , default = 0 )
2009-05-24 18:50:57 +03:00
topic_count = models . IntegerField ( _ ( ' Topic count ' ) , blank = True , default = 0 )
2009-10-19 17:23:36 +03:00
last_post = models . ForeignKey ( ' Post ' , related_name = ' last_forum_post ' , blank = True , null = True )
2009-01-05 14:30:08 +02:00
class Meta :
ordering = [ ' position ' ]
verbose_name = _ ( ' Forum ' )
verbose_name_plural = _ ( ' Forums ' )
def __unicode__ ( self ) :
return self . name
2009-11-29 18:56:11 +02:00
@models.permalink
2009-01-05 14:30:08 +02:00
def get_absolute_url ( self ) :
2009-11-29 18:56:11 +02:00
return ( ' djangobb:forum ' , [ self . id ] )
2009-05-24 18:50:57 +03:00
2009-01-05 14:30:08 +02:00
@property
def posts ( self ) :
2010-11-29 00:57:19 +02:00
return Post . objects . filter ( topic__forum__id = self . id ) . select_related ( )
2009-01-05 14:30:08 +02:00
class Topic ( models . Model ) :
forum = models . ForeignKey ( Forum , related_name = ' topics ' , verbose_name = _ ( ' Forum ' ) )
name = models . CharField ( _ ( ' Subject ' ) , max_length = 255 )
2009-12-24 17:24:39 +02:00
created = models . DateTimeField ( _ ( ' Created ' ) , auto_now_add = True )
2009-12-29 16:32:14 +02:00
updated = models . DateTimeField ( _ ( ' Updated ' ) , null = True )
2009-01-05 14:30:08 +02:00
user = models . ForeignKey ( User , verbose_name = _ ( ' User ' ) )
views = models . IntegerField ( _ ( ' Views count ' ) , blank = True , default = 0 )
sticky = models . BooleanField ( _ ( ' Sticky ' ) , blank = True , default = False )
closed = models . BooleanField ( _ ( ' Closed ' ) , blank = True , default = False )
2009-01-14 17:31:10 +02:00
subscribers = models . ManyToManyField ( User , related_name = ' subscriptions ' , verbose_name = _ ( ' Subscribers ' ) , blank = True )
2009-01-05 14:30:08 +02:00
post_count = models . IntegerField ( _ ( ' Post count ' ) , blank = True , default = 0 )
2009-05-24 18:50:57 +03:00
last_post = models . ForeignKey ( ' Post ' , related_name = ' last_topic_post ' , blank = True , null = True )
2009-01-05 14:30:08 +02:00
class Meta :
2009-01-22 14:38:28 +02:00
ordering = [ ' -updated ' ]
2011-05-16 10:40:54 +03:00
get_latest_by = ' updated '
2009-01-05 14:30:08 +02:00
verbose_name = _ ( ' Topic ' )
verbose_name_plural = _ ( ' Topics ' )
def __unicode__ ( self ) :
return self . name
2009-12-24 17:24:39 +02:00
2011-05-16 10:40:54 +03:00
def delete ( self , * args , * * kwargs ) :
2011-07-05 16:37:00 +03:00
try :
last_post = self . posts . latest ( )
last_post . last_forum_post . clear ( )
except Post . DoesNotExist :
pass
else :
last_post . last_forum_post . clear ( )
2011-05-16 10:40:54 +03:00
forum = self . forum
super ( Topic , self ) . delete ( * args , * * kwargs )
try :
forum . last_post = Topic . objects . filter ( forum__id = forum . id ) . latest ( ) . last_post
except Topic . DoesNotExist :
forum . last_post = None
forum . topic_count = Topic . objects . filter ( forum__id = forum . id ) . count ( )
forum . post_count = Post . objects . filter ( topic__forum__id = forum . id ) . count ( )
forum . save ( )
2009-01-05 14:30:08 +02:00
@property
def head ( self ) :
2009-07-03 15:29:31 +03:00
try :
return self . posts . select_related ( ) . order_by ( ' created ' ) [ 0 ]
except IndexError :
return None
2009-01-05 14:30:08 +02:00
@property
def reply_count ( self ) :
return self . post_count - 1
2009-11-29 18:56:11 +02:00
@models.permalink
2009-01-05 14:30:08 +02:00
def get_absolute_url ( self ) :
2009-11-29 18:56:11 +02:00
return ( ' djangobb:topic ' , [ self . id ] )
2009-01-05 14:30:08 +02:00
def update_read ( self , user ) :
2009-10-22 15:19:26 +03:00
tracking = user . posttracking
#if last_read > last_read - don't check topics
if tracking . last_read and ( tracking . last_read > self . last_post . created ) :
return
if isinstance ( tracking . topics , dict ) :
#clear topics if len > 5Kb and set last_read to current time
if len ( tracking . topics ) > 5120 :
tracking . topics = None
tracking . last_read = datetime . now ( )
tracking . save ( )
#update topics if exist new post or does't exist in dict
2012-02-16 23:56:56 +02:00
if self . last_post_id > tracking . topics . get ( str ( self . id ) , 0 ) :
tracking . topics [ str ( self . id ) ] = self . last_post_id
2009-10-22 15:19:26 +03:00
tracking . save ( )
else :
#initialize topic tracking dict
2012-02-16 23:56:56 +02:00
tracking . topics = { self . id : self . last_post_id }
2009-10-22 15:19:26 +03:00
tracking . save ( )
2009-01-05 14:30:08 +02:00
class Post ( models . Model ) :
topic = models . ForeignKey ( Topic , related_name = ' posts ' , verbose_name = _ ( ' Topic ' ) )
user = models . ForeignKey ( User , related_name = ' posts ' , verbose_name = _ ( ' User ' ) )
2009-12-24 17:24:39 +02:00
created = models . DateTimeField ( _ ( ' Created ' ) , auto_now_add = True )
2009-01-05 14:30:08 +02:00
updated = models . DateTimeField ( _ ( ' Updated ' ) , blank = True , null = True )
2010-02-17 13:05:48 +02:00
updated_by = models . ForeignKey ( User , verbose_name = _ ( ' Updated by ' ) , blank = True , null = True )
2009-01-17 17:56:19 +02:00
markup = models . CharField ( _ ( ' Markup ' ) , max_length = 15 , default = forum_settings . DEFAULT_MARKUP , choices = MARKUP_CHOICES )
2009-01-05 14:30:08 +02:00
body = models . TextField ( _ ( ' Message ' ) )
body_html = models . TextField ( _ ( ' HTML version ' ) )
2009-11-16 14:50:39 +02:00
user_ip = models . IPAddressField ( _ ( ' User IP ' ) , blank = True , null = True )
2009-01-05 14:30:08 +02:00
class Meta :
ordering = [ ' created ' ]
2009-10-19 17:23:36 +03:00
get_latest_by = ' created '
2009-01-05 14:30:08 +02:00
verbose_name = _ ( ' Post ' )
verbose_name_plural = _ ( ' Posts ' )
def save ( self , * args , * * kwargs ) :
2010-11-28 17:57:54 +02:00
self . body_html = convert_text_to_html ( self . body , self . markup )
2010-11-08 19:15:48 +02:00
if forum_settings . SMILES_SUPPORT and self . user . forum_profile . show_smilies :
2009-05-25 14:08:24 +03:00
self . body_html = smiles ( self . body_html )
2009-05-24 18:50:57 +03:00
super ( Post , self ) . save ( * args , * * kwargs )
2009-01-05 14:30:08 +02:00
2010-02-17 12:41:01 +02:00
2009-01-05 14:30:08 +02:00
def delete ( self , * args , * * kwargs ) :
self_id = self . id
2009-10-21 13:35:14 +03:00
head_post_id = self . topic . posts . order_by ( ' created ' ) [ 0 ] . id
forum = self . topic . forum
topic = self . topic
2010-02-17 12:41:01 +02:00
profile = self . user . forum_profile
2009-10-19 17:23:36 +03:00
self . last_topic_post . clear ( )
self . last_forum_post . clear ( )
2009-01-05 14:30:08 +02:00
super ( Post , self ) . delete ( * args , * * kwargs )
2009-10-19 17:23:36 +03:00
#if post was last in topic - remove topic
2009-01-05 14:30:08 +02:00
if self_id == head_post_id :
2009-10-21 13:35:14 +03:00
topic . delete ( )
else :
try :
2010-11-29 00:57:19 +02:00
topic . last_post = Post . objects . filter ( topic__id = topic . id ) . latest ( )
2009-10-21 13:35:14 +03:00
except Post . DoesNotExist :
topic . last_post = None
2010-11-29 00:57:19 +02:00
topic . post_count = Post . objects . filter ( topic__id = topic . id ) . count ( )
2009-10-21 13:35:14 +03:00
topic . save ( )
try :
2010-11-29 00:57:19 +02:00
forum . last_post = Post . objects . filter ( topic__forum__id = forum . id ) . latest ( )
2009-10-21 13:35:14 +03:00
except Post . DoesNotExist :
forum . last_post = None
2010-02-17 13:05:48 +02:00
#TODO: for speedup - save/update only changed fields
2010-11-29 00:57:19 +02:00
forum . post_count = Post . objects . filter ( topic__forum__id = forum . id ) . count ( )
forum . topic_count = Topic . objects . filter ( forum__id = forum . id ) . count ( )
2009-10-21 13:35:14 +03:00
forum . save ( )
2010-11-29 00:57:19 +02:00
profile . post_count = Post . objects . filter ( user__id = self . user_id ) . count ( )
2010-02-17 12:41:01 +02:00
profile . save ( )
2009-10-21 13:35:14 +03:00
2009-11-29 18:56:11 +02:00
@models.permalink
def get_absolute_url ( self ) :
return ( ' djangobb:post ' , [ self . id ] )
def summary ( self ) :
LIMIT = 50
2011-11-09 14:22:58 +02:00
tail = len ( self . body ) > LIMIT and ' ... ' or ' '
2009-11-29 18:56:11 +02:00
return self . body [ : LIMIT ] + tail
__unicode__ = summary
2009-01-05 14:30:08 +02:00
class Reputation ( models . Model ) :
from_user = models . ForeignKey ( User , related_name = ' reputations_from ' , verbose_name = _ ( ' From ' ) )
to_user = models . ForeignKey ( User , related_name = ' reputations_to ' , verbose_name = _ ( ' To ' ) )
2010-02-23 14:19:20 +02:00
post = models . ForeignKey ( Post , related_name = ' post ' , verbose_name = _ ( ' Post ' ) )
time = models . DateTimeField ( _ ( ' Time ' ) , auto_now_add = True )
2009-01-05 14:30:08 +02:00
sign = models . IntegerField ( _ ( ' Sign ' ) , choices = SIGN_CHOICES , default = 0 )
2010-02-23 14:19:20 +02:00
reason = models . TextField ( _ ( ' Reason ' ) , max_length = 1000 )
2009-10-22 15:19:26 +03:00
2009-01-05 14:30:08 +02:00
class Meta :
verbose_name = _ ( ' Reputation ' )
verbose_name_plural = _ ( ' Reputations ' )
2010-02-23 14:19:20 +02:00
unique_together = ( ( ' from_user ' , ' post ' ) , )
2009-01-05 14:30:08 +02:00
def __unicode__ ( self ) :
2010-02-23 14:19:20 +02:00
return u ' T[ %d ], FU[ %d ], TU[ %d ]: %s ' % ( self . post . id , self . from_user . id , self . to_user . id , unicode ( self . time ) )
2009-07-02 16:59:07 +03:00
2012-03-03 23:24:39 +02:00
class ProfileManager ( models . Manager ) :
2012-03-04 13:35:02 +02:00
use_for_related_fields = True
2012-03-03 23:24:39 +02:00
def get_query_set ( self ) :
qs = super ( ProfileManager , self ) . get_query_set ( )
if forum_settings . REPUTATION_SUPPORT :
2012-03-04 13:35:02 +02:00
qs = qs . extra ( select = {
2012-03-04 22:10:32 +02:00
' reply_total ' : ' SELECT SUM(sign) FROM djangobb_forum_reputation WHERE to_user_id = djangobb_forum_profile.user_id GROUP BY to_user_id ' ,
' reply_count_minus ' : " SELECT SUM(sign) FROM djangobb_forum_reputation WHERE to_user_id = djangobb_forum_profile.user_id AND sign = ' -1 ' GROUP BY to_user_id " ,
' reply_count_plus ' : " SELECT SUM(sign) FROM djangobb_forum_reputation WHERE to_user_id = djangobb_forum_profile.user_id AND sign = ' 1 ' GROUP BY to_user_id " ,
2012-03-04 13:35:02 +02:00
} )
2012-03-03 23:24:39 +02:00
return qs
2009-01-05 14:30:08 +02:00
class Profile ( models . Model ) :
user = AutoOneToOneField ( User , related_name = ' forum_profile ' , verbose_name = _ ( ' User ' ) )
2009-11-15 00:01:26 +02:00
status = models . CharField ( _ ( ' Status ' ) , max_length = 30 , blank = True )
site = models . URLField ( _ ( ' Site ' ) , verify_exists = False , blank = True )
jabber = models . CharField ( _ ( ' Jabber ' ) , max_length = 80 , blank = True )
icq = models . CharField ( _ ( ' ICQ ' ) , max_length = 12 , blank = True )
msn = models . CharField ( _ ( ' MSN ' ) , max_length = 80 , blank = True )
aim = models . CharField ( _ ( ' AIM ' ) , max_length = 80 , blank = True )
yahoo = models . CharField ( _ ( ' Yahoo ' ) , max_length = 80 , blank = True )
location = models . CharField ( _ ( ' Location ' ) , max_length = 30 , blank = True )
2009-01-17 17:56:19 +02:00
signature = models . TextField ( _ ( ' Signature ' ) , blank = True , default = ' ' , max_length = forum_settings . SIGNATURE_MAX_LENGTH )
2012-02-17 00:52:33 +02:00
signature_html = models . TextField ( _ ( ' Signature ' ) , blank = True , default = ' ' , max_length = forum_settings . SIGNATURE_MAX_LENGTH )
2009-01-17 17:56:19 +02:00
time_zone = models . FloatField ( _ ( ' Time zone ' ) , choices = TZ_CHOICES , default = float ( forum_settings . DEFAULT_TIME_ZONE ) )
2010-02-26 17:12:49 +02:00
language = models . CharField ( _ ( ' Language ' ) , max_length = 5 , default = ' ' , choices = settings . LANGUAGES )
2009-01-17 17:56:19 +02:00
avatar = ExtendedImageField ( _ ( ' Avatar ' ) , blank = True , default = ' ' , upload_to = forum_settings . AVATARS_UPLOAD_TO , width = forum_settings . AVATAR_WIDTH , height = forum_settings . AVATAR_HEIGHT )
2009-04-21 21:55:10 +03:00
theme = models . CharField ( _ ( ' Theme ' ) , choices = THEME_CHOICES , max_length = 80 , default = ' default ' )
2009-01-05 14:30:08 +02:00
show_avatar = models . BooleanField ( _ ( ' Show avatar ' ) , blank = True , default = True )
show_signatures = models . BooleanField ( _ ( ' Show signatures ' ) , blank = True , default = True )
2010-11-08 19:15:48 +02:00
show_smilies = models . BooleanField ( _ ( ' Show smilies ' ) , blank = True , default = True )
2009-01-05 14:30:08 +02:00
privacy_permission = models . IntegerField ( _ ( ' Privacy permission ' ) , choices = PRIVACY_CHOICES , default = 1 )
2012-08-07 16:44:16 +03:00
auto_subscribe = models . BooleanField ( _ ( ' Auto subscribe ' ) , help_text = _ ( " Auto subscribe all topics you have created or reply. " ) , blank = True , default = False )
2009-01-17 17:56:19 +02:00
markup = models . CharField ( _ ( ' Default markup ' ) , max_length = 15 , default = forum_settings . DEFAULT_MARKUP , choices = MARKUP_CHOICES )
2009-01-19 21:23:53 +02:00
post_count = models . IntegerField ( _ ( ' Post count ' ) , blank = True , default = 0 )
2009-01-05 14:30:08 +02:00
2012-03-03 23:24:39 +02:00
objects = ProfileManager ( )
2009-01-05 14:30:08 +02:00
class Meta :
verbose_name = _ ( ' Profile ' )
verbose_name_plural = _ ( ' Profiles ' )
2009-01-22 14:38:28 +02:00
2009-01-05 14:30:08 +02:00
def last_post ( self ) :
2010-11-29 00:57:19 +02:00
posts = Post . objects . filter ( user__id = self . user_id ) . order_by ( ' -created ' )
2009-07-02 16:59:07 +03:00
if posts :
2009-01-05 14:30:08 +02:00
return posts [ 0 ] . created
else :
return None
2009-05-24 22:51:42 +03:00
2009-10-22 15:19:26 +03:00
class PostTracking ( models . Model ) :
2009-01-05 14:30:08 +02:00
"""
2009-10-22 15:19:26 +03:00
Model for tracking read / unread posts .
In topics stored ids of topics and last_posts as dict .
2009-01-05 14:30:08 +02:00
"""
2009-10-22 15:19:26 +03:00
user = AutoOneToOneField ( User )
topics = JSONField ( null = True )
last_read = models . DateTimeField ( null = True )
2009-01-05 14:30:08 +02:00
class Meta :
2009-10-22 15:19:26 +03:00
verbose_name = _ ( ' Post tracking ' )
verbose_name_plural = _ ( ' Post tracking ' )
2009-01-05 14:30:08 +02:00
def __unicode__ ( self ) :
2009-10-22 15:19:26 +03:00
return self . user . username
2009-01-05 14:30:08 +02:00
2009-07-02 16:59:07 +03:00
2009-01-05 14:30:08 +02:00
class Report ( models . Model ) :
reported_by = models . ForeignKey ( User , related_name = ' reported_by ' , verbose_name = _ ( ' Reported by ' ) )
post = models . ForeignKey ( Post , verbose_name = _ ( ' Post ' ) )
zapped = models . BooleanField ( _ ( ' Zapped ' ) , blank = True , default = False )
zapped_by = models . ForeignKey ( User , related_name = ' zapped_by ' , blank = True , null = True , verbose_name = _ ( ' Zapped by ' ) )
created = models . DateTimeField ( _ ( ' Created ' ) , blank = True )
reason = models . TextField ( _ ( ' Reason ' ) , blank = True , default = ' ' , max_length = ' 1000 ' )
class Meta :
verbose_name = _ ( ' Report ' )
verbose_name_plural = _ ( ' Reports ' )
def __unicode__ ( self ) :
return u ' %s %s ' % ( self . reported_by , self . zapped )
2009-04-08 20:43:29 +03:00
class Ban ( models . Model ) :
2009-10-20 14:01:50 +03:00
user = models . OneToOneField ( User , verbose_name = _ ( ' Banned user ' ) , related_name = ' ban_users ' )
2009-04-08 20:43:29 +03:00
ban_start = models . DateTimeField ( _ ( ' Ban start ' ) , default = datetime . now )
ban_end = models . DateTimeField ( _ ( ' Ban end ' ) , blank = True , null = True )
reason = models . TextField ( _ ( ' Reason ' ) )
2009-10-20 14:01:50 +03:00
2009-04-08 20:43:29 +03:00
class Meta :
verbose_name = _ ( ' Ban ' )
verbose_name_plural = _ ( ' Bans ' )
2009-11-29 18:56:11 +02:00
def __unicode__ ( self ) :
return self . user . username
2009-04-08 20:43:29 +03:00
def save ( self , * args , * * kwargs ) :
self . user . is_active = False
self . user . save ( )
super ( Ban , self ) . save ( * args , * * kwargs )
2009-10-20 14:01:50 +03:00
def delete ( self , * args , * * kwargs ) :
self . user . is_active = True
self . user . save ( )
super ( Ban , self ) . delete ( * args , * * kwargs )
2009-04-14 14:57:17 +03:00
class Attachment ( models . Model ) :
post = models . ForeignKey ( Post , verbose_name = _ ( ' Post ' ) , related_name = ' attachments ' )
size = models . IntegerField ( _ ( ' Size ' ) )
content_type = models . CharField ( _ ( ' Content type ' ) , max_length = 255 )
path = models . CharField ( _ ( ' Path ' ) , max_length = 255 )
name = models . TextField ( _ ( ' Name ' ) )
hash = models . CharField ( _ ( ' Hash ' ) , max_length = 40 , blank = True , default = ' ' , db_index = True )
2009-11-29 18:56:11 +02:00
def __unicode__ ( self ) :
return self . name
2009-04-14 14:57:17 +03:00
def save ( self , * args , * * kwargs ) :
super ( Attachment , self ) . save ( * args , * * kwargs )
if not self . hash :
2012-04-23 14:28:40 +03:00
self . hash = sha1 ( str ( self . id ) + settings . SECRET_KEY ) . hexdigest ( )
2009-04-14 14:57:17 +03:00
super ( Attachment , self ) . save ( * args , * * kwargs )
2009-11-29 18:56:11 +02:00
@models.permalink
2009-04-14 14:57:17 +03:00
def get_absolute_url ( self ) :
2009-11-29 18:56:11 +02:00
return ( ' djangobb:forum_attachment ' , [ self . hash ] )
2009-04-14 14:57:17 +03:00
def get_absolute_path ( self ) :
return os . path . join ( settings . MEDIA_ROOT , forum_settings . ATTACHMENT_UPLOAD_TO ,
self . path )
2011-08-18 10:42:44 +03:00
2012-08-10 11:12:52 +03:00
#------------------------------------------------------------------------------
class Poll ( models . Model ) :
topic = models . ForeignKey ( Topic )
question = models . CharField ( max_length = 200 )
choice_count = models . PositiveSmallIntegerField ( default = 1 ,
help_text = _ ( " How many choices are allowed simultaneously. " ) ,
)
active = models . BooleanField ( default = True ,
help_text = _ ( " Can users vote to this poll or just see the result? " ) ,
)
deactivate_date = models . DateTimeField ( null = True , blank = True ,
help_text = _ ( " Point of time after this poll would be automatic deactivated " ) ,
)
users = models . ManyToManyField ( User , blank = True , null = True ,
help_text = _ ( " Users who has voted this poll. " ) ,
)
def auto_deactivate ( self ) :
if self . active and self . deactivate_date :
now = datetime . now ( )
if now > self . deactivate_date :
self . active = False
self . save ( )
def __unicode__ ( self ) :
return self . question
class PollChoice ( models . Model ) :
poll = models . ForeignKey ( Poll , related_name = " choices " )
choice = models . CharField ( max_length = 200 )
votes = models . IntegerField ( default = 0 , editable = False )
def percent ( self ) :
if not self . votes :
return 0.0
result = PollChoice . objects . filter ( poll = self . poll ) . aggregate ( aggregates . Sum ( " votes " ) )
votes_sum = result [ " votes__sum " ]
return float ( self . votes ) / votes_sum * 100
def __unicode__ ( self ) :
return self . choice
#------------------------------------------------------------------------------
2011-08-18 10:42:44 +03:00
from . signals import post_saved , topic_saved
post_save . connect ( post_saved , sender = Post , dispatch_uid = ' djangobb_post_save ' )
post_save . connect ( topic_saved , sender = Topic , dispatch_uid = ' djangobb_topic_save ' )