Source code for grokcore.site.components
##############################################################################
#
# Copyright (c) 2006-2009 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.
#
##############################################################################
from persistent import Persistent
from zope.annotation.interfaces import IAttributeAnnotatable
from zope.container.contained import Contained
from zope.interface import implementer
from zope.site.site import SiteManagerContainer
from grokcore.component.interfaces import IContext
from grokcore.site.interfaces import IApplication
class BaseSite:
"""Mixin to grok sites in Grok applications.
It's used to let different implementation of sites to exists, and
still being grokked correctly.
"""
[docs]
class Site(BaseSite, SiteManagerContainer):
"""Mixin for creating sites in Grok applications.
When an application :class:`grok.Model` or :class:`grok.Container`
also inherits from :class:`grokcore.site.Site`, then it can
additionally support the registration of local Component
Architecture entities like :class:`grokcore.site.LocalUtility` and
:class:`grok.Indexes` objects; see those classes for more
information.
"""
[docs]
@implementer(IApplication)
class Application(Site):
"""Mixin for creating Grok application objects.
When a :class:`grokcore.content.Container` (or a
:class:`grokcore.content.Model`, though most developers
use containers) also inherits from :class:`grokcore.site.Application`,
it not only gains the component registration abilities of a
:class:`grokcore.site.site`, but will also be listed in the
Grok admin control panel as one of the applications
that the admin can install directly at the root of their Zope
database.
"""
[docs]
@implementer(IContext, IAttributeAnnotatable)
class LocalUtility(Contained, Persistent):
"""The base class for local utilities in Grok applications.
Defines a utility that will be registered local to a :class:`Site`
or :class:`grok.Application`.
Although application developers can create local utilies without
actually subclassing :class:`LocalUtility`, they gain three
benefits from doing so. First, their code is more readable
because their classes "look like" local utilities to casual
readers. Second, their utility will know how to persist itself to
the Zope database, which means that they can set its object
attributes and know that the values are getting automatically
saved. Third, they can omit the `grok.provides()` directive
naming the interface that the utility provides, if their class
only `grok.implements()` a single interface (unless the interface
is one that the `grok.LocalUtility` already implements, in which
case Grok cannot tell them apart, and `grok.provides()` must be
used explicitly anyway).
"""