--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -23,6 +23,9 @@
from pyforge.lib.decorators import audit, react
from pyforge.lib.security import require, has_artifact_access
from pyforge.model import ProjectRole, User, TagEvent, UserTags, ArtifactReference, Tag, Feed
+from pyforge.model import Discussion, Thread, Post, Attachment
+from pyforge.controllers import AppDiscussionController
+from pyforge.lib import widgets as w
# Local imports
from forgewiki import model
@@ -33,10 +36,17 @@
# Will not be needed after _dispatch is fixed in tg 2.1
from pyforge.lib.dispatch import _dispatch
+class W:
+ thread=w.Thread(
+ offset=None, limit=None, page_size=None, total=None,
+ style='linear')
+
+
class ForgeWikiApp(Application):
'''This is the Wiki app for PyForge'''
__version__ = version.__version__
- permissions = [ 'configure', 'read', 'create', 'edit', 'delete', 'comment', 'edit_page_permissions' ]
+ permissions = [ 'configure', 'read', 'create', 'edit', 'delete', 'edit_page_permissions',
+ 'unmoderated_post', 'post', 'moderate', 'admin']
config_options = Application.config_options + [
ConfigOption('project_name', str, 'pname'),
ConfigOption('message', str, 'Custom message goes here'),
@@ -47,33 +57,20 @@
self.root = RootController()
def has_access(self, user, topic):
- return user != User.anonymous()
-
- @audit('Wiki.#')
- def auditor(self, routing_key, data):
- '''Attach a comment to the named page'''
+ return has_artifact_access('post', user=user)
+
+ @audit('Wiki.msg.#')
+ def message_auditor(self, routing_key, data):
log.info('Auditing data from %s (%s)',
routing_key, self.config.options.mount_point)
log.info('Headers are: %s', data['headers'])
try:
- elements = routing_key.split('.')
- count = len(elements)
- log.info('Audit applies to page ' + elements[1])
- p = model.Page.upsert(elements[1])
+ title = routing_key.split('.')[-1]
+ p = model.Page.upsert(title)
except:
- root_name = self.root_page_name
- log.info('Audit applies to page %s.' % root_name)
- p = model.Page.upsert(root_name)
- # Find ancestor comment
- parent = model.Comment.query.get(message_id=data['headers'].get('In-Reply-To'))
- if parent is None: parent = p
- comment = parent.reply()
- if 'Message-ID' in data['headers']:
- comment.message_id=data['headers']['Message-ID']
- comment.text = '*%s*\n\n%s' % (
- data['headers'].get('Subject'),
- data['payload'])
- log.info('Set subject to %s', data['headers'].get('Subject'))
+ log.info('Audit applies to page Root.')
+ p = model.Page.upsert('Root')
+ super(ForgeWikiApp, self).message_auditor(routing_key, data, p)
@react('Wiki.#')
def reactor(self, routing_key, data):
@@ -110,7 +107,8 @@
related_urls = []
page = request.path_info.split(self.url)[-1].split('/')[-2]
page = model.Page.query.find(dict(app_config_id=self.config._id,title=page)).first()
- links = [SitemapEntry('Home',c.app.url)]
+ links = [SitemapEntry('Home',c.app.url),
+ SitemapEntry('Discuss', c.app.url + '_discuss/') ]
if page:
links.append(SitemapEntry('Edit this page','edit'))
for aref in page.references+page.backreferences.values():
@@ -139,21 +137,22 @@
def install(self, project):
'Set up any default permissions and roles here'
-
self.config.options['project_name'] = project._id
self.uninstall(project)
+ super(ForgeWikiApp, self).install(project)
# Give the installing user all the permissions
pr = c.user.project_role()
for perm in self.permissions:
self.config.acl[perm] = [ pr._id ]
self.config.acl['read'].append(
ProjectRole.query.get(name='*anonymous')._id)
- self.config.acl['comment'].append(
+ self.config.acl['post'].append(
ProjectRole.query.get(name='*authenticated')._id)
p = model.Page.upsert(self.root_page_name)
p.viewable_by = ['all']
p.text = 'This is the root page.'
p.commit()
+
def uninstall(self, project):
"Remove all the plugin's artifacts from the database"
@@ -167,6 +166,7 @@
def __init__(self):
setattr(self, 'feed.atom', self.feed)
setattr(self, 'feed.rss', self.feed)
+ self._discuss = AppDiscussionController()
@expose('forgewiki.templates.index')
def index(self):
@@ -308,6 +308,7 @@
@validate(dict(version=validators.Int(if_empty=None)))
def index(self, version=None):
require(has_artifact_access('read', self.page))
+ c.thread = W.thread
page = self.get_version(version)
if 'all' not in page.viewable_by and str(c.user._id) not in page.viewable_by:
raise exc.HTTPForbidden(detail="You may not view this page.")