Skip to content

Commit

Permalink
copy to keep the histroy
Browse files Browse the repository at this point in the history
  • Loading branch information
goschtl committed Dec 15, 2010
1 parent 9729221 commit 173553f
Showing 1 changed file with 133 additions and 0 deletions.
133 changes: 133 additions & 0 deletions src/grokcore/traverser/directive.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
##############################################################################
#
# Copyright (c) 2006-2007 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Grok directives.
This module defines Grok directives: the markers that users place
inside of their classes (and sometimes in their modules, too) to
direct how Grok registers their components. For example, the first
directive defined below is `site`, which people programming Grok
applications normally use like this::
class MyIndex(grok.Indexes):
grok.site(MySite)
...
If the set of directives in this module looks rather small, remember
that most of the directives available in Grok actually come from the
`grokcore` modules on which Grok depends, where they have been placed so
that other projects can use them without having to pull in all of Grok.
"""

import grok
import martian
import martian.util
from grokcore.view.directive import TaggedValueStoreOnce


class site(martian.Directive):
"""The `grok.site()` directive.
This directive is used when creating a `grok.Indexes` subclass, to
indicate the Grok site object for which the indexes should be built.
"""
scope = martian.CLASS
store = martian.ONCE
validate = martian.validateInterfaceOrClass


class permissions(martian.Directive):
"""The `grok.permissions()` directive.
This directive is used inside of a `grok.Role` subclass to list the
permissions which each member of the role should always possess.
Note that permissions should be passed as strings, and that several
permissions they can simply be supplied as multiple arguments; there
is no need to place them inside of a tuple or list::
class MyRole(grok.Role):
grok.permissions('page.CreatePage', 'page.EditPage')
...
"""
scope = martian.CLASS
store = martian.ONCE
default = []

def validate(self, *values):
for value in values:
if martian.util.check_subclass(value, grok.Permission):
continue
if martian.util.not_unicode_or_ascii(value):
raise grok.GrokImportError(
"You can only pass unicode values, ASCII values, or "
"subclasses of grok.Permission to the '%s' directive."
% self.name)

def factory(self, *values):
permission_ids = []
for value in values:
if martian.util.check_subclass(value, grok.Permission):
permission_ids.append(grok.name.bind().get(value))
else:
permission_ids.append(value)
return permission_ids


class traversable(martian.Directive):
"""The `grok.traversable()` directive.
Each time this directive is used inside of a class, it designates an
attribute of that class which URLs should be able to traverse. For
example, the declaration:
class Mammoth(grok.Model):
grok.traversable('thighbone')
means that if the URL `/app/mymammoth` designates a Mammoth, then
`/app/mymammoth/thighbone` will also be a valid URL (assuming that
the Mammoth instance, at runtime, indeed has an attribute by that
name)! By default, the name that must be appended to the URL should
simply be the same as the name of the attribute; but by providing a
`name` keyword argument, the programmer can designate another name
to appear in the URL instead of the raw attribute name.
"""
scope = martian.CLASS
store = martian.DICT

def factory(self, attr, name=None):
if name is None:
name = attr
return (name, attr)


class restskin(martian.Directive):
"""The `grok.restskin()` directive.
This directive is placed inside of `grok.IRESTLayer` subclasses to
indicate what their layer name will be within a REST URL. Giving
the skin ``grok.restskin('b')``, for example, will enable URLs that
look something like `http://localhost/++rest++b/app`.
"""
# We cannot do any better than to check for a class scope. Ideally we
# would've checked whether the context is indeed an Interface class.
scope = martian.CLASS
store = TaggedValueStoreOnce()
validate = martian.validateText

def factory(self, value=None):
return value

0 comments on commit 173553f

Please sign in to comment.