Parent: [b8b246] (diff)

Child: [9652b9] (diff)

Download this file

forum.py    123 lines (104 with data), 4.2 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import shlex
import logging
from mimetypes import guess_type
from urllib import unquote
from tg import expose, validate, redirect, flash
from tg import request, response
from pylons import g, c
from ming.base import Object
from webob import exc
from pyforge.lib import helpers as h
from pyforge.lib.security import require, has_artifact_access
from pyforge.controllers import DiscussionController, ThreadController, PostController
from pyforge.lib.widgets import discuss as DW
from forgediscussion import model
from forgediscussion import widgets as FW
log = logging.getLogger(__name__)
class pass_validator(object):
def validate(self, v, s):
return v
pass_validator=pass_validator()
class ModelConfig(object):
Discussion=model.Forum
Thread=model.ForumThread
Post=model.ForumPost
Attachment=model.ForumAttachment
class WidgetConfig(object):
# Forms
subscription_form = DW.SubscriptionForm()
edit_post = DW.EditPost(show_subject=True)
moderate_post = FW.ModeratePost()
moderate_thread = FW.ModerateThread()
flag_post = DW.FlagPost()
post_filter = DW.PostFilter()
moderate_posts=DW.ModeratePosts()
# Other widgets
discussion = FW.Forum()
thread = FW.Thread()
post = FW.Post()
thread_header = FW.ThreadHeader()
announcements_table = FW.AnnouncementsTable()
class ForumController(DiscussionController):
M=ModelConfig
W=WidgetConfig
def _check_security(self):
require(has_artifact_access('read', self.discussion))
def __init__(self, forum_id):
self.ThreadController = ForumThreadController
self.PostController = ForumPostController
self.discussion = model.Forum.query.get(
app_config_id=c.app.config._id,
shortname=forum_id)
super(ForumController, self).__init__()
@expose()
def _lookup(self, id, *remainder):
return ForumController(self.discussion.shortname + '/' + id), remainder
@h.vardec
@expose()
@validate(W.edit_post)
def post(self, subject=None, text=None, **kw):
if 'new_topic' in kw:
subject = kw['new_topic']['subject']
text = kw['new_topic']['text']
require(has_artifact_access('post', self.discussion))
thd = self.discussion.discussion_thread(dict(
headers=dict(Subject=subject)))
post = thd.post(subject, text)
thd.first_post_id = post._id
flash('Message posted')
redirect(thd.url())
class ForumThreadController(ThreadController):
@expose('pyforge.templates.discussion.thread')
def index(self, **kw):
return super(ForumThreadController, self).index(**kw)
@h.vardec
@expose()
@validate(pass_validator, index)
def moderate(self, **kw):
require(has_artifact_access('moderate', self.thread))
args = self.W.moderate_thread.validate(kw, None)
g.publish('audit', 'Forum.forum_stats.%s' % self.thread.discussion.shortname.replace('/', '.'))
if args.pop('delete', None):
url = self.thread.discussion.url()
self.thread.delete()
redirect(url)
forum = args.pop('forum')
if forum != self.thread.discussion:
g.publish('audit', 'Forum.forum_stats.%s' % forum.shortname.replace('/', '.'))
self.thread.set_forum(forum)
self.thread.flags = args.pop('flags', [])
redirect(self.thread.url())
class ForumPostController(PostController):
@expose()
@validate(pass_validator, error_handler=PostController.index)
def moderate(self, **kw):
require(has_artifact_access('moderate', self.post.thread))
args = self.W.moderate_post.validate(kw, None)
g.publish('audit', 'Forum.thread_stats.%s' % self.post.thread._id)
g.publish('audit', 'Forum.forum_stats.%s' % self.post.discussion.shortname.replace('/', '.'))
if args.pop('promote', None):
self.post.subject = args['subject']
new_thread = self.post.promote()
g.publish('audit', 'Forum.thread_stats.%s' % new_thread._id)
redirect(request.referer)
super(ForumPostController, self).moderate(**kw)