CVS commit (wiking): cms.py
Milan Zamazal
pdm at devel.brailcom.org
Fri May 15 21:46:30 CEST 2009
Update of /var/lib/cvs/wiking/lib/wiking/cms
In directory devel:/tmp/cvs-serv20999/lib/wiking/cms
Modified Files:
cms.py
Log Message:
Texts module reworked
/var/www/hosts/cvs.freebsoft.org/src/wiking:
Index: lib/wiking/cms/cms.py
===================================================================
RCS file: /var/lib/cvs/wiking/lib/wiking/cms/cms.py,v
retrieving revision 1.166
retrieving revision 1.165
diff -u -r1.166 -r1.165
--- lib/wiking/cms/cms.py 14 May 2009 20:45:48 -0000 1.165
+++ lib/wiking/cms/cms.py 15 May 2009 19:46:28 -0000 1.166
@@ -34,6 +34,7 @@
import mx.DateTime
from mx.DateTime import today, TimeDelta
+from pytis.util import *
import pytis.data
from pytis.presentation import computer, Computer, CbComputer, Fields, HGroup, CodebookSpec, Field
from lcg import log as debug
@@ -2376,36 +2377,12 @@
_TITLE_COLUMN = 'name'
-class TextLabels(PytisModule):
- """Internal module for managing identifiers of the texts accessed through the 'Text' module.
- """
-
- class Spec(Specification):
-
- _ID_COLUMN = 'label'
-
- table = 'text_labels'
-
- def fields(self): return (
- Field(self._ID_COLUMN),
- )
-
- def register_label(self, label):
- """Register text identified by 'label'.
-
- This ensures 'label' is present in the database and thus it can be
- accessed and managed in CMS.
-
- Arguments:
-
- label -- text identifier as a string
-
- """
- data = self._data
- if not data.get_row(label=label):
- label_value = pytis.data.Value(pytis.data.String(), label)
- row = pytis.data.Row((('label', label_value,),))
- data.insert(row)
+class Text(Structure):
+ _attributes = (Attribute('label', str),
+ Attribute('description', basestring),
+ Attribute('text', basestring),)
+ def __init__(self, label, description, text):
+ super(Text, self).__init__(label=label, description=description, text=text)
class Texts(CMSModule):
@@ -2431,53 +2408,64 @@
class Spec(Specification):
+ table = 'texts'
+ title = _("System Texts")
+ help = _("Edit miscellaneous system texts.")
+
_texts = {}
-
# This must be a private method, otherwise Wiking handles it in a special way
@classmethod
- def _register_text(class_, label, description, module):
+ def _register_text(class_, text):
texts = class_._texts
+ label = text.label()
if not texts.has_key(label):
- texts[label] = description
- module._module('TextLabels').register_label(label)
-
- _ID_COLUMN = 'text_id'
-
- table = 'texts'
- title = _("System Texts")
- help = _("Edit miscellaneous system texts.")
+ texts[label] = text
def fields(self): return (
- Field(self._ID_COLUMN, editable=NEVER),
+ Field('text_id', editable=NEVER),
Field('label', _("Label"), width=32, editable=NEVER),
Field('lang', editable=NEVER),
Field('descr', _("Purpose"), type=pytis.data.String(), width=64, editable=NEVER, virtual=True,
- computer=Computer(self._description, depends=('label',))),
+ computer=computer(self._description)),
Field('content', _("Text"), width=80, height=10,
descr=_("Edit the given text as needed, in accordance with structured text rules.")),
)
- columns = ('text_id', 'descr',)
- sorting = (('text_id', ASC,),)
- layout = ('text_id', 'descr', 'content',)
+ columns = ('label', 'descr',)
+ sorting = (('label', ASC,),)
+ layout = ('label', 'descr', 'content',)
+
+ def _description(self, row, label):
+ try:
+ description = self._texts[label].description()
+ except KeyError:
+ # May happen only for obsolete texts in the database
+ description = ''
+ return description
- def _description(self, record):
- return self._texts.get(record['label'].value(), "")
-
+ _DB_FUNCTIONS = {'add_text_label': (('1', pd.String(),),)}
+
_LIST_BY_LANGUAGE = True
+ _TEXT_MODULES = ()
RIGHTS_insert = ()
RIGHTS_update = (Roles.ADMIN,)
RIGHTS_delete = ()
WMI_SECTION = WikingManagementInterface.SECTION_SETUP
WMI_ORDER = 900
- def _text_identifier(self, namespace, label, lang=None):
- identifier = '%s.%s' % (namespace, label,)
- if lang is not None:
- identifier = '%s@%s' % (identifier, lang,)
- return identifier
+ def _delayed_init(self):
+ super(Texts, self)._delayed_init()
+ self._register_texts()
+
+ def _register_texts(self):
+ for module in self._TEXT_MODULES:
+ for identifier in dir(module):
+ text = getattr(module, identifier)
+ if isinstance(text, Text):
+ self._call_db_function('add_text_label', text.label())
+ self.Spec._register_text(text)
- def text(self, namespace, label, lang='en'):
+ def text(self, req, text, lang=None):
"""Return text identified by 'namespace' and 'label'.
If there is no such text, return 'None'.
@@ -2493,20 +2481,21 @@
language, 'None' is returned.
"""
- assert isinstance(namespace, str)
- assert isinstance(label, str)
- assert isinstance(lang, str)
- identifier = self._text_identifier(namespace, label, lang=lang)
+ if lang is None:
+ lang = req.prefered_language()
+ if lang is None:
+ lang = 'en'
+ identifier = text.label() + '@' + lang
row = self._data.get_row(text_id=identifier)
- if row is None and lang != 'en':
- identifier = self._text_identifier(namespace, label, lang='en')
- row = self._data.get_row(text_id=identifier)
if row is None:
- return None
- text = row['content'].value()
+ text = None
+ else:
+ text = row['content'].value()
+ if not text:
+ text = text.text()
return text
- def parsed_text(self, namespace, label, lang='en'):
+ def parsed_text(self, req, text, lang=None):
"""Return parsed text identified by 'namespace' and 'label'.
This method is the same as 'text' but instead of returning LCG
@@ -2515,33 +2504,13 @@
sequence is returned.
"""
- text = self.text(namespace, label, lang=lang)
+ text = self.text(req, text, lang=lang)
if text:
sections = lcg.Parser().parse(text)
else:
sections = ()
return sections
- def register_text(self, namespace, label, description):
- """Register text with given 'label'.
-
- All texts must be registered using this module method before their
- first use.
-
- Arguments:
-
- namespace -- string identifying Wiking extension name space
- label -- identifier of the text as a string
- description -- human description of the purpose of the text as a
- string or unicode
-
- """
- assert isinstance(namespace, str)
- assert isinstance(label, str)
- assert isinstance(description, basestring)
- identifier = self._text_identifier(namespace, label)
- self.Spec._register_text(identifier, description, self)
-
class TextReferrer(object):
"""Class of modules using 'Text' module.
@@ -2564,34 +2533,7 @@
"""
- _TEXTS_NAMESPACE = ''
- _TEXTS = ()
-
- def __init__(self, *args, **kwargs):
- super(TextReferrer, self).__init__(*args, **kwargs)
- self._register_texts()
-
- def _register_texts(self):
- # Check text specification
- assert isinstance(self._TEXTS_NAMESPACE, str)
- assert self._TEXTS_NAMESPACE, "Name space of registered texts may not be empty"
- assert isinstance(self._TEXTS, tuple)
- if __debug__:
- for definition in self._TEXTS:
- assert isinstance(definition, tuple)
- try:
- label, description = definition
- except ValueError:
- raise AssertionError("Invalid _TEXTS entry", definition)
- assert isinstance(label, str), ("Invalid text label in _TEXTS", label,)
- assert isinstance(description, basestring), ("Invalid text description in _TEXTS", description,)
- # Perform registration
- text_module = self._module('Texts')
- namespace = self._TEXTS_NAMESPACE
- for label, description in self._TEXTS:
- text_module.register_text(namespace, label, description)
-
- def text(self, label, lang='en', _method=Texts.text):
+ def text(self, req, text, lang=None, _method=Texts.text):
"""Return text identified by 'label'.
If there is no such text, return 'None'.
@@ -2606,11 +2548,9 @@
rules documented in 'Text.text'.
"""
- assert label in [t[0] for t in self._TEXTS], ("Unregistered text referred", label,)
- assert isinstance(lang, str)
- return _method(self._module('Texts'), self._TEXTS_NAMESPACE, label, lang=lang)
+ return _method(self._module('Texts'), req, text, lang=lang)
- def parsed_text(self, label, lang='en'):
+ def parsed_text(self, req, text, lang='en'):
"""Return parsed text identified by 'label'.
This method is the same as 'text' but instead of returning LCG
@@ -2619,6 +2559,4 @@
sequence is returned.
"""
- return self.text(label, lang=lang, _method=Texts.parsed_text)
-
-
+ return self.text(req, text, lang=lang, _method=Texts.parsed_text)
More information about the Wiking-cvs
mailing list