diff --git a/VERSION b/VERSION index 34373618..edb52496 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.4.4-stable+timestamp.2013.03.15.10.05.12 +Version 2.4.4-stable+timestamp.2013.03.15.10.13.48 diff --git a/gluon/tools.py b/gluon/tools.py index c0d61d2f..913345f7 100644 --- a/gluon/tools.py +++ b/gluon/tools.py @@ -4899,7 +4899,7 @@ class Wiki(object): everybody = 'everybody' rows_page = 25 def markmin_base(self,body): - return MARKMIN(body, extra=self.extra, + return MARKMIN(body, extra=self.settings.extra, url=True, environment=self.env, autolinks=lambda link: expand_one(link, {})).xml() @@ -4933,29 +4933,43 @@ class Wiki(object): controller, function, args = items[0], items[1], items[2:] return LOAD(controller, function, args=args, ajax=True).xml() + def get_render(self): + if isinstance(self.settings.render, basestring): + r = getattr(self, "%s_render" % self.settings.render) + elif callable(self.settings.render): + r = self.settings.render + else: + raise ValueError("Invalid render type %s" % type(render)) + return r + def __init__(self, auth, env=None, render='markmin', manage_permissions=False, force_prefix='', restrict_search=False, extra=None, menu_groups=None, templates=None): + + settings = self.settings = Settings() + + # render: "markmin", "html", ..., + settings.render = render + perms = settings.manage_permissions = manage_permissions + + settings.force_prefix = force_prefix + settings.restrict_search = restrict_search + settings.extra = extra or {} + settings.menu_groups = menu_groups + settings.templates = templates + db = auth.db self.env = env or {} self.env['component'] = Wiki.component - if render == 'markmin': - render = self.markmin_render - elif render == 'html': - render = self.html_render - self.render = render self.auth = auth - self.menu_groups = menu_groups + if self.auth.user: - self.force_prefix = force_prefix % self.auth.user + self.settings.force_prefix = force_prefix % self.auth.user else: - self.force_prefix = force_prefix + self.settings.force_prefix = force_prefix + self.host = current.request.env.http_host - perms = self.manage_permissions = manage_permissions - self.restrict_search = restrict_search - self.extra = extra or {} - self.templates = templates table_definitions = [ ('wiki_page', { @@ -4975,7 +4989,8 @@ class Wiki(object): writable=perms, readable=perms, default=[Wiki.everybody]), Field('changelog'), - Field('html', 'text', compute=render, + Field('html', 'text', + compute=self.get_render(), readable=False, writable=False), auth.signature], 'vars':{'format':'%(title)s'}}), @@ -5008,8 +5023,9 @@ class Wiki(object): args += value['args'] db.define_table(key, *args, **value['vars']) - if self.templates is None and not self.manage_permissions: - self.templates = db.wiki_page.tags.contains('template')&\ + if self.settings.templates is None and not \ + self.settings.manage_permissions: + self.settings.templates = db.wiki_page.tags.contains('template')&\ db.wiki_page.can_read.contains('everybody') def update_tags_insert(page, id, db=db): @@ -5033,13 +5049,17 @@ class Wiki(object): gid = group.id if group else db.auth_group.insert( role='wiki_editor') auth.add_membership(gid) + + settings.lock_keys = True + # WIKI ACCESS POLICY def not_authorized(self, page=None): raise HTTP(401) def can_read(self, page): - if 'everybody' in page.can_read or not self.manage_permissions: + if 'everybody' in page.can_read or not \ + self.settings.manage_permissions: return True elif self.auth.user: groups = self.auth.user_groups.values() @@ -5069,11 +5089,11 @@ class Wiki(object): return True def can_see_menu(self): - if self.menu_groups is None: + if self.settings.menu_groups is None: return True if self.auth.user: groups = self.auth.user_groups.values() - if any(t in self.menu_groups for t in groups): + if any(t in self.settings.menu_groups for t in groups): return True return False @@ -5110,7 +5130,7 @@ class Wiki(object): elif zero == '_cloud': return self.cloud() elif zero == '_preview': - return self.preview(self.render) + return self.preview(self.get_render()) def first_paragraph(self, page): if not self.can_read(page): @@ -5178,9 +5198,9 @@ class Wiki(object): title_guess = ' '.join(c.capitalize() for c in slug.split('-')) if not page: if not (self.can_manage() or - slug.startswith(self.force_prefix)): + slug.startswith(self.settings.force_prefix)): current.session.flash = 'slug must have "%s" prefix' \ - % self.force_prefix + % self.settings.force_prefix redirect(URL(args=('_create'))) db.wiki_page.can_read.default = [Wiki.everybody] db.wiki_page.can_edit.default = [auth.user_group_role()] @@ -5282,14 +5302,15 @@ class Wiki(object): options=[OPTION(row.slug,_value=row.id) for row in slugs] options.insert(0, OPTION('',_value='')) fields = [Field("slug", default=current.request.args(1) or - self.force_prefix, + self.settings.force_prefix, requires=(IS_SLUG(), IS_NOT_IN_DB(db,db.wiki_page.slug))),] - if self.templates: + if self.settings.templates: fields.append( Field("from_template", "reference wiki_page", - requires=IS_EMPTY_OR(IS_IN_DB(db(self.templates), - db.wiki_page._id, - '%(slug)s')), + requires=IS_EMPTY_OR( + IS_IN_DB(db(self.settings.templates), + db.wiki_page._id, + '%(slug)s')), comment=current.T( "Choose Template or empty for new Page"))) form = SQLFORM.factory(*fields, **dict(_class="well span6")) @@ -5331,7 +5352,7 @@ class Wiki(object): request, db = current.request, self.auth.db media = db.wiki_media(id) if media: - if self.manage_permissions: + if self.settings.manage_permissions: page = db.wiki_page(media.wiki_page) if not self.can_read(page): return self.not_authorized(page) @@ -5430,7 +5451,7 @@ class Wiki(object): query = (db.wiki_page.id == db.wiki_tag.wiki_page) &\ (db.wiki_tag.name.belongs(tags)) query = query | db.wiki_page.title.contains(request.vars.q) - if self.restrict_search and not self.manage(): + if self.settings.restrict_search and not self.manage(): query = query & (db.wiki_page.created_by == self.auth.user_id) pages = db(query).select(count, *fields, **dict(orderby=orderby or ~count, @@ -5491,6 +5512,7 @@ class Wiki(object): request = current.request return render(request.post_vars) + if __name__ == '__main__': import doctest doctest.testmod()