clean up formalchemy stuff
This commit is contained in:
parent
1934ff00e1
commit
65af2a1855
4 changed files with 332 additions and 218 deletions
|
@ -32,27 +32,26 @@ import datetime
|
||||||
import new
|
import new
|
||||||
|
|
||||||
from pyramid.renderers import render
|
from pyramid.renderers import render
|
||||||
from webhelpers import paginate
|
|
||||||
from webhelpers.html import tags
|
|
||||||
from webhelpers.html.builder import format_attrs
|
|
||||||
from webhelpers.html.tags import literal
|
from webhelpers.html.tags import literal
|
||||||
|
|
||||||
import formalchemy
|
import formalchemy
|
||||||
from formalchemy import fields
|
|
||||||
from formalchemy.validators import accepts_none
|
from formalchemy.validators import accepts_none
|
||||||
|
|
||||||
import edbob
|
import edbob
|
||||||
from edbob.lib import pretty
|
from edbob.lib import pretty
|
||||||
from edbob.util import prettify
|
|
||||||
from edbob.pyramid import Session, helpers
|
from edbob.pyramid import Session, helpers
|
||||||
|
|
||||||
from edbob.pyramid.forms.formalchemy.fieldset import *
|
from edbob.pyramid.forms.formalchemy.fieldset import *
|
||||||
|
from edbob.pyramid.forms.formalchemy.grid import *
|
||||||
|
from edbob.pyramid.forms.formalchemy.fields import *
|
||||||
|
from edbob.pyramid.forms.formalchemy.renderers import *
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['AlchemyGrid', 'ChildGridField', 'PropertyField',
|
__all__ = ['AlchemyGrid', 'ChildGridField', 'PropertyField',
|
||||||
'EnumFieldRenderer', 'PrettyDateTimeFieldRenderer',
|
'EnumFieldRenderer', 'PrettyDateTimeFieldRenderer',
|
||||||
'AutocompleteFieldRenderer', 'FieldSet',
|
'AutocompleteFieldRenderer', 'FieldSet',
|
||||||
'make_fieldset', 'required', 'pretty_datetime']
|
'make_fieldset', 'required', 'pretty_datetime',
|
||||||
|
'AssociationProxyField']
|
||||||
|
|
||||||
|
|
||||||
class TemplateEngine(formalchemy.templates.TemplateEngine):
|
class TemplateEngine(formalchemy.templates.TemplateEngine):
|
||||||
|
@ -70,193 +69,6 @@ engine = TemplateEngine()
|
||||||
formalchemy.config.engine = engine
|
formalchemy.config.engine = engine
|
||||||
|
|
||||||
|
|
||||||
class AlchemyGrid(formalchemy.Grid):
|
|
||||||
"""
|
|
||||||
This class defines the basic grid which you see in pretty much all
|
|
||||||
Rattail/Pyramid apps.
|
|
||||||
|
|
||||||
.. todo::
|
|
||||||
This needs to be documented more fully, along with the rest of
|
|
||||||
rattail.pyramid I suppose...
|
|
||||||
"""
|
|
||||||
|
|
||||||
prettify = staticmethod(prettify)
|
|
||||||
|
|
||||||
# uuid_key = None
|
|
||||||
|
|
||||||
# def __init__(self, cls, instances, config, url_kwargs={}, *args, **kwargs):
|
|
||||||
# formalchemy.Grid.__init__(self, cls, instances, *args, **kwargs)
|
|
||||||
# self.pager = instances if isinstance(instances, paginate.Page) else None
|
|
||||||
# self.config = config
|
|
||||||
# self.url_kwargs = url_kwargs
|
|
||||||
# self.sortable = config.get('sortable', False)
|
|
||||||
|
|
||||||
def __init__(self, cls, instances, config, gridurl=None, objurl=None,
|
|
||||||
delurl=None, **kwargs):
|
|
||||||
"""
|
|
||||||
Grid constructor.
|
|
||||||
|
|
||||||
``url`` must be the URL used to access the grid itself. This url/view
|
|
||||||
must accept a GET query string parameter of "partial=True", which will
|
|
||||||
indicate that the grid *only* is being requested, as opposed to the
|
|
||||||
full page in which the grid normally resides.
|
|
||||||
"""
|
|
||||||
|
|
||||||
formalchemy.Grid.__init__(self, cls, instances, **kwargs)
|
|
||||||
self.config = config
|
|
||||||
self.request = config['request']
|
|
||||||
self.gridurl = gridurl
|
|
||||||
self.objurl = objurl
|
|
||||||
self.delurl = delurl
|
|
||||||
self.sortable = config.get('sortable', False)
|
|
||||||
self.deletable = config.get('deletable', False)
|
|
||||||
self.pager = instances if isinstance(instances, paginate.Page) else None
|
|
||||||
|
|
||||||
def field_name(self, field):
|
|
||||||
return field.name
|
|
||||||
|
|
||||||
def iter_fields(self):
|
|
||||||
for field in self.render_fields.itervalues():
|
|
||||||
yield field
|
|
||||||
|
|
||||||
def render_field(self, field, readonly):
|
|
||||||
if readonly:
|
|
||||||
return field.render_readonly()
|
|
||||||
return field.render()
|
|
||||||
|
|
||||||
def row_attrs(self, i):
|
|
||||||
attrs = dict(class_='even' if i % 2 else 'odd')
|
|
||||||
if hasattr(self.model, 'uuid'):
|
|
||||||
attrs['uuid'] = self.model.uuid
|
|
||||||
return format_attrs(**attrs)
|
|
||||||
|
|
||||||
def url_attrs(self):
|
|
||||||
attrs = {}
|
|
||||||
url = self.request.route_url
|
|
||||||
if self.gridurl:
|
|
||||||
attrs['url'] = self.gridurl
|
|
||||||
if self.objurl:
|
|
||||||
attrs['objurl'] = url(self.objurl, uuid='{uuid}')
|
|
||||||
if self.delurl:
|
|
||||||
attrs['delurl'] = url(self.delurl, uuid='{uuid}')
|
|
||||||
return format_attrs(**attrs)
|
|
||||||
|
|
||||||
# def render(self, class_=None, **kwargs):
|
|
||||||
# """
|
|
||||||
# Renders the grid into HTML, and returns the result.
|
|
||||||
|
|
||||||
# ``class_`` (if provided) is used to define the class of the ``<div>``
|
|
||||||
# (wrapper) and ``<table>`` elements of the grid.
|
|
||||||
|
|
||||||
# Any remaining ``kwargs`` are passed directly to the underlying
|
|
||||||
# ``formalchemy.Grid.render()`` method.
|
|
||||||
# """
|
|
||||||
|
|
||||||
# kwargs['class_'] = class_
|
|
||||||
# # kwargs.setdefault('get_uuid', self.get_uuid)
|
|
||||||
# kwargs.setdefault('checkboxes', False)
|
|
||||||
# return formalchemy.Grid.render(self, **kwargs)
|
|
||||||
|
|
||||||
def render(self, **kwargs):
|
|
||||||
engine = self.engine or formalchemy.config.engine
|
|
||||||
if self.readonly:
|
|
||||||
return engine('grid_readonly', grid=self, **kwargs)
|
|
||||||
kwargs.setdefault('request', self._request)
|
|
||||||
return engine('grid', grid=self, **kwargs)
|
|
||||||
|
|
||||||
def th_sortable(self, field):
|
|
||||||
class_ = ''
|
|
||||||
label = field.label()
|
|
||||||
if self.sortable and field.key in self.config.get('sort_map', {}):
|
|
||||||
class_ = 'sortable'
|
|
||||||
if field.key == self.config['sort']:
|
|
||||||
class_ += ' sorted ' + self.config['dir']
|
|
||||||
label = literal('<a href="#">') + label + literal('</a>')
|
|
||||||
if class_:
|
|
||||||
class_ = ' class="%s"' % class_
|
|
||||||
return literal('<th' + class_ + ' field="' + field.key + '">') + label + literal('</th>')
|
|
||||||
|
|
||||||
# def url(self):
|
|
||||||
# # TODO: Probably clean this up somehow...
|
|
||||||
# if self.pager is not None:
|
|
||||||
# u = self.pager._url_generator(self.pager.page, partial=True)
|
|
||||||
# else:
|
|
||||||
# u = self._url or ''
|
|
||||||
# qs = self.query_string()
|
|
||||||
# if qs:
|
|
||||||
# if '?' not in u:
|
|
||||||
# u += '?'
|
|
||||||
# u += qs
|
|
||||||
# elif '?' not in u:
|
|
||||||
# u += '?partial=True'
|
|
||||||
# return u
|
|
||||||
|
|
||||||
# def query_string(self):
|
|
||||||
# # TODO: Probably clean this up somehow...
|
|
||||||
# qs = ''
|
|
||||||
# if self.url_kwargs:
|
|
||||||
# for k, v in self.url_kwargs.items():
|
|
||||||
# qs += '&%s=%s' % (urllib.quote_plus(k), urllib.quote_plus(v))
|
|
||||||
# return qs
|
|
||||||
|
|
||||||
def get_actions(self):
|
|
||||||
"""
|
|
||||||
Returns an HTML snippet containing ``<td>`` elements for each "action"
|
|
||||||
defined in the grid.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def get_class(text):
|
|
||||||
return text.lower().replace(' ', '-')
|
|
||||||
|
|
||||||
res = ''
|
|
||||||
for action in self.config['actions']:
|
|
||||||
if isinstance(action, basestring):
|
|
||||||
text = action
|
|
||||||
cls = get_class(text)
|
|
||||||
else:
|
|
||||||
text = action[0]
|
|
||||||
if len(action) == 2:
|
|
||||||
cls = action[1]
|
|
||||||
else:
|
|
||||||
cls = get_class(text)
|
|
||||||
res += literal(
|
|
||||||
'<td class="action %s"><a href="#">%s</a></td>' %
|
|
||||||
(cls, text))
|
|
||||||
return res
|
|
||||||
|
|
||||||
# def get_uuid(self):
|
|
||||||
# """
|
|
||||||
# .. highlight:: none
|
|
||||||
|
|
||||||
# Returns a unique identifier for a given record, in the form of an HTML
|
|
||||||
# attribute for direct inclusion in a ``<tr>`` element within a template.
|
|
||||||
# An example of what this function might return would be the string::
|
|
||||||
|
|
||||||
# 'uuid="420"'
|
|
||||||
|
|
||||||
# Rattail itself will tend to use *universally-unique* IDs (true UUIDs),
|
|
||||||
# but this method may be overridden to support legacy databases with
|
|
||||||
# auto-increment IDs, etc. Really the only important thing is that the
|
|
||||||
# value returned be unique across the relevant data set.
|
|
||||||
|
|
||||||
# If the concept is unsupported, the method should return an empty
|
|
||||||
# string.
|
|
||||||
# """
|
|
||||||
|
|
||||||
# def uuid():
|
|
||||||
# if self.uuid_key and hasattr(self.model, self.uuid_key):
|
|
||||||
# return getattr(self.model, self.uuid_key)
|
|
||||||
# if hasattr(self.model, 'uuid'):
|
|
||||||
# return getattr(self.model, 'uuid')
|
|
||||||
# if hasattr(self.model, 'id'):
|
|
||||||
# return getattr(self.model, 'id')
|
|
||||||
|
|
||||||
# uuid = uuid()
|
|
||||||
# if uuid:
|
|
||||||
# return literal('uuid="%s"' % uuid)
|
|
||||||
# return ''
|
|
||||||
|
|
||||||
|
|
||||||
class ChildGridField(formalchemy.Field):
|
class ChildGridField(formalchemy.Field):
|
||||||
"""
|
"""
|
||||||
Convenience class for including a child grid within a fieldset as a
|
Convenience class for including a child grid within a fieldset as a
|
||||||
|
@ -292,30 +104,6 @@ def required(value, field=None):
|
||||||
raise formalchemy.ValidationError(msg)
|
raise formalchemy.ValidationError(msg)
|
||||||
|
|
||||||
|
|
||||||
def EnumFieldRenderer(enum):
|
|
||||||
"""
|
|
||||||
Adds support for enumeration fields.
|
|
||||||
"""
|
|
||||||
|
|
||||||
class Renderer(formalchemy.fields.SelectFieldRenderer):
|
|
||||||
|
|
||||||
def render_readonly(self, **kwargs):
|
|
||||||
value = self.raw_value
|
|
||||||
if value is None:
|
|
||||||
return ''
|
|
||||||
if value in enum:
|
|
||||||
return enum[value]
|
|
||||||
return value
|
|
||||||
|
|
||||||
def render(self, **kwargs):
|
|
||||||
opts = []
|
|
||||||
for value in sorted(enum):
|
|
||||||
opts.append((enum[value], value))
|
|
||||||
return formalchemy.fields.SelectFieldRenderer.render(self, opts, **kwargs)
|
|
||||||
|
|
||||||
return Renderer
|
|
||||||
|
|
||||||
|
|
||||||
def pretty_datetime(value):
|
def pretty_datetime(value):
|
||||||
"""
|
"""
|
||||||
Formats a ``datetime.datetime`` instance and returns a "pretty"
|
Formats a ``datetime.datetime`` instance and returns a "pretty"
|
||||||
|
@ -389,7 +177,7 @@ def AutocompleteFieldRenderer(service_url, display, width='300px', callback=None
|
||||||
return Renderer
|
return Renderer
|
||||||
|
|
||||||
|
|
||||||
class _AutocompleteFieldRenderer(fields.FieldRenderer):
|
class _AutocompleteFieldRenderer(formalchemy.fields.FieldRenderer):
|
||||||
"""
|
"""
|
||||||
Implementation for :class:`AutocompleteFieldRenderer` class.
|
Implementation for :class:`AutocompleteFieldRenderer` class.
|
||||||
"""
|
"""
|
||||||
|
|
49
edbob/pyramid/forms/formalchemy/fields.py
Normal file
49
edbob/pyramid/forms/formalchemy/fields.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# edbob -- Pythonic Software Framework
|
||||||
|
# Copyright © 2010-2012 Lance Edgar
|
||||||
|
#
|
||||||
|
# This file is part of edbob.
|
||||||
|
#
|
||||||
|
# edbob is free software: you can redistribute it and/or modify it under the
|
||||||
|
# terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||||
|
# more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
``edbob.pyramid.forms.formalchemy.fields`` -- Field Classes
|
||||||
|
"""
|
||||||
|
|
||||||
|
import formalchemy
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['AssociationProxyField']
|
||||||
|
|
||||||
|
|
||||||
|
def AssociationProxyField(name, **kwargs):
|
||||||
|
"""
|
||||||
|
Returns a :class:`Field` class which is aware of SQLAlchemy association
|
||||||
|
proxies.
|
||||||
|
"""
|
||||||
|
|
||||||
|
class ProxyField(formalchemy.Field):
|
||||||
|
|
||||||
|
def sync(self):
|
||||||
|
if not self.is_readonly():
|
||||||
|
setattr(self.parent.model, self.name,
|
||||||
|
self.renderer.deserialize())
|
||||||
|
|
||||||
|
kwargs.setdefault('value', lambda x: getattr(x, name))
|
||||||
|
return ProxyField(name, **kwargs)
|
221
edbob/pyramid/forms/formalchemy/grid.py
Normal file
221
edbob/pyramid/forms/formalchemy/grid.py
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# edbob -- Pythonic Software Framework
|
||||||
|
# Copyright © 2010-2012 Lance Edgar
|
||||||
|
#
|
||||||
|
# This file is part of edbob.
|
||||||
|
#
|
||||||
|
# edbob is free software: you can redistribute it and/or modify it under the
|
||||||
|
# terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||||
|
# more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
``edbob.pyramid.forms.formalchemy.grid`` -- FormAlchemy Grid
|
||||||
|
"""
|
||||||
|
|
||||||
|
from webhelpers import paginate
|
||||||
|
from webhelpers.html.builder import format_attrs
|
||||||
|
from webhelpers.html.tags import literal
|
||||||
|
|
||||||
|
import formalchemy
|
||||||
|
|
||||||
|
from edbob.util import prettify
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['AlchemyGrid']
|
||||||
|
|
||||||
|
|
||||||
|
class AlchemyGrid(formalchemy.Grid):
|
||||||
|
"""
|
||||||
|
Provides an "enhanced" version of the :class:`formalchemy.Grid` class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
prettify = staticmethod(prettify)
|
||||||
|
|
||||||
|
# uuid_key = None
|
||||||
|
|
||||||
|
# def __init__(self, cls, instances, config, url_kwargs={}, *args, **kwargs):
|
||||||
|
# formalchemy.Grid.__init__(self, cls, instances, *args, **kwargs)
|
||||||
|
# self.pager = instances if isinstance(instances, paginate.Page) else None
|
||||||
|
# self.config = config
|
||||||
|
# self.url_kwargs = url_kwargs
|
||||||
|
# self.sortable = config.get('sortable', False)
|
||||||
|
|
||||||
|
def __init__(self, cls, instances, config, gridurl=None, objurl=None,
|
||||||
|
delurl=None, **kwargs):
|
||||||
|
"""
|
||||||
|
Grid constructor.
|
||||||
|
|
||||||
|
``url`` must be the URL used to access the grid itself. This url/view
|
||||||
|
must accept a GET query string parameter of "partial=True", which will
|
||||||
|
indicate that the grid *only* is being requested, as opposed to the
|
||||||
|
full page in which the grid normally resides.
|
||||||
|
"""
|
||||||
|
|
||||||
|
formalchemy.Grid.__init__(self, cls, instances, **kwargs)
|
||||||
|
self.config = config
|
||||||
|
self.request = config['request']
|
||||||
|
self.gridurl = gridurl
|
||||||
|
self.objurl = objurl
|
||||||
|
self.delurl = delurl
|
||||||
|
self.sortable = config.get('sortable', False)
|
||||||
|
self.clickable = config.get('clickable', False)
|
||||||
|
self.deletable = config.get('deletable', False)
|
||||||
|
self.pager = instances if isinstance(instances, paginate.Page) else None
|
||||||
|
|
||||||
|
def field_name(self, field):
|
||||||
|
return field.name
|
||||||
|
|
||||||
|
def iter_fields(self):
|
||||||
|
for field in self.render_fields.itervalues():
|
||||||
|
yield field
|
||||||
|
|
||||||
|
def render_field(self, field, readonly):
|
||||||
|
if readonly:
|
||||||
|
return field.render_readonly()
|
||||||
|
return field.render()
|
||||||
|
|
||||||
|
def row_attrs(self, i):
|
||||||
|
attrs = dict(class_='even' if i % 2 else 'odd')
|
||||||
|
if hasattr(self.model, 'uuid'):
|
||||||
|
attrs['uuid'] = self.model.uuid
|
||||||
|
return format_attrs(**attrs)
|
||||||
|
|
||||||
|
def url_attrs(self):
|
||||||
|
attrs = {}
|
||||||
|
url = self.request.route_url
|
||||||
|
if self.gridurl:
|
||||||
|
attrs['url'] = self.gridurl
|
||||||
|
if self.objurl:
|
||||||
|
attrs['objurl'] = url(self.objurl, uuid='{uuid}')
|
||||||
|
if self.delurl:
|
||||||
|
attrs['delurl'] = url(self.delurl, uuid='{uuid}')
|
||||||
|
return format_attrs(**attrs)
|
||||||
|
|
||||||
|
# def render(self, class_=None, **kwargs):
|
||||||
|
# """
|
||||||
|
# Renders the grid into HTML, and returns the result.
|
||||||
|
|
||||||
|
# ``class_`` (if provided) is used to define the class of the ``<div>``
|
||||||
|
# (wrapper) and ``<table>`` elements of the grid.
|
||||||
|
|
||||||
|
# Any remaining ``kwargs`` are passed directly to the underlying
|
||||||
|
# ``formalchemy.Grid.render()`` method.
|
||||||
|
# """
|
||||||
|
|
||||||
|
# kwargs['class_'] = class_
|
||||||
|
# # kwargs.setdefault('get_uuid', self.get_uuid)
|
||||||
|
# kwargs.setdefault('checkboxes', False)
|
||||||
|
# return formalchemy.Grid.render(self, **kwargs)
|
||||||
|
|
||||||
|
def render(self, **kwargs):
|
||||||
|
engine = self.engine or formalchemy.config.engine
|
||||||
|
if self.readonly:
|
||||||
|
return engine('grid_readonly', grid=self, **kwargs)
|
||||||
|
kwargs.setdefault('request', self._request)
|
||||||
|
return engine('grid', grid=self, **kwargs)
|
||||||
|
|
||||||
|
def th_sortable(self, field):
|
||||||
|
class_ = ''
|
||||||
|
label = field.label()
|
||||||
|
if self.sortable and field.key in self.config.get('sort_map', {}):
|
||||||
|
class_ = 'sortable'
|
||||||
|
if field.key == self.config['sort']:
|
||||||
|
class_ += ' sorted ' + self.config['dir']
|
||||||
|
label = literal('<a href="#">') + label + literal('</a>')
|
||||||
|
if class_:
|
||||||
|
class_ = ' class="%s"' % class_
|
||||||
|
return literal('<th' + class_ + ' field="' + field.key + '">') + label + literal('</th>')
|
||||||
|
|
||||||
|
# def url(self):
|
||||||
|
# # TODO: Probably clean this up somehow...
|
||||||
|
# if self.pager is not None:
|
||||||
|
# u = self.pager._url_generator(self.pager.page, partial=True)
|
||||||
|
# else:
|
||||||
|
# u = self._url or ''
|
||||||
|
# qs = self.query_string()
|
||||||
|
# if qs:
|
||||||
|
# if '?' not in u:
|
||||||
|
# u += '?'
|
||||||
|
# u += qs
|
||||||
|
# elif '?' not in u:
|
||||||
|
# u += '?partial=True'
|
||||||
|
# return u
|
||||||
|
|
||||||
|
# def query_string(self):
|
||||||
|
# # TODO: Probably clean this up somehow...
|
||||||
|
# qs = ''
|
||||||
|
# if self.url_kwargs:
|
||||||
|
# for k, v in self.url_kwargs.items():
|
||||||
|
# qs += '&%s=%s' % (urllib.quote_plus(k), urllib.quote_plus(v))
|
||||||
|
# return qs
|
||||||
|
|
||||||
|
def get_actions(self):
|
||||||
|
"""
|
||||||
|
Returns an HTML snippet containing ``<td>`` elements for each "action"
|
||||||
|
defined in the grid.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def get_class(text):
|
||||||
|
return text.lower().replace(' ', '-')
|
||||||
|
|
||||||
|
res = ''
|
||||||
|
for action in self.config['actions']:
|
||||||
|
if isinstance(action, basestring):
|
||||||
|
text = action
|
||||||
|
cls = get_class(text)
|
||||||
|
else:
|
||||||
|
text = action[0]
|
||||||
|
if len(action) == 2:
|
||||||
|
cls = action[1]
|
||||||
|
else:
|
||||||
|
cls = get_class(text)
|
||||||
|
res += literal(
|
||||||
|
'<td class="action %s"><a href="#">%s</a></td>' %
|
||||||
|
(cls, text))
|
||||||
|
return res
|
||||||
|
|
||||||
|
# def get_uuid(self):
|
||||||
|
# """
|
||||||
|
# .. highlight:: none
|
||||||
|
|
||||||
|
# Returns a unique identifier for a given record, in the form of an HTML
|
||||||
|
# attribute for direct inclusion in a ``<tr>`` element within a template.
|
||||||
|
# An example of what this function might return would be the string::
|
||||||
|
|
||||||
|
# 'uuid="420"'
|
||||||
|
|
||||||
|
# Rattail itself will tend to use *universally-unique* IDs (true UUIDs),
|
||||||
|
# but this method may be overridden to support legacy databases with
|
||||||
|
# auto-increment IDs, etc. Really the only important thing is that the
|
||||||
|
# value returned be unique across the relevant data set.
|
||||||
|
|
||||||
|
# If the concept is unsupported, the method should return an empty
|
||||||
|
# string.
|
||||||
|
# """
|
||||||
|
|
||||||
|
# def uuid():
|
||||||
|
# if self.uuid_key and hasattr(self.model, self.uuid_key):
|
||||||
|
# return getattr(self.model, self.uuid_key)
|
||||||
|
# if hasattr(self.model, 'uuid'):
|
||||||
|
# return getattr(self.model, 'uuid')
|
||||||
|
# if hasattr(self.model, 'id'):
|
||||||
|
# return getattr(self.model, 'id')
|
||||||
|
|
||||||
|
# uuid = uuid()
|
||||||
|
# if uuid:
|
||||||
|
# return literal('uuid="%s"' % uuid)
|
||||||
|
# return ''
|
56
edbob/pyramid/forms/formalchemy/renderers.py
Normal file
56
edbob/pyramid/forms/formalchemy/renderers.py
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
################################################################################
|
||||||
|
#
|
||||||
|
# edbob -- Pythonic Software Framework
|
||||||
|
# Copyright © 2010-2012 Lance Edgar
|
||||||
|
#
|
||||||
|
# This file is part of edbob.
|
||||||
|
#
|
||||||
|
# edbob is free software: you can redistribute it and/or modify it under the
|
||||||
|
# terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
|
||||||
|
# more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
``edbob.pyramid.forms.formalchemy.renderers`` -- Field Renderers
|
||||||
|
"""
|
||||||
|
|
||||||
|
import formalchemy
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ['EnumFieldRenderer']
|
||||||
|
|
||||||
|
|
||||||
|
def EnumFieldRenderer(enum):
|
||||||
|
"""
|
||||||
|
Adds support for enumeration fields.
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Renderer(formalchemy.fields.SelectFieldRenderer):
|
||||||
|
|
||||||
|
def render_readonly(self, **kwargs):
|
||||||
|
value = self.raw_value
|
||||||
|
if value is None:
|
||||||
|
return ''
|
||||||
|
if value in enum:
|
||||||
|
return enum[value]
|
||||||
|
return value
|
||||||
|
|
||||||
|
def render(self, **kwargs):
|
||||||
|
opts = []
|
||||||
|
for value in sorted(enum):
|
||||||
|
opts.append((enum[value], value))
|
||||||
|
return formalchemy.fields.SelectFieldRenderer.render(self, opts, **kwargs)
|
||||||
|
|
||||||
|
return Renderer
|
Loading…
Add table
Add a link
Reference in a new issue