Source code for collecting_society_web.views.forms.datatables.location_space_sequence

# For copyright and license terms, see COPYRIGHT.rst (top level of repository)
# Repository: https://github.com/C3S/collecting_society_web

import logging

import colander
import deform
from pyramid.i18n import get_localizer

from portal_web.views.forms.datatables import (
    DatatableSequence,
    DatatableSequenceWidget
)

from ....services import _
from ....models import (
    LocationSpace,
    LocationSpaceCategory
)

log = logging.getLogger(__name__)


[docs] def prepare_ignored(value): # workaround for conditinally required fields, as form validators are not # processed, if a normal required field is missing return value if value else "IGNORED"
[docs] def prepare_required(value): # oid required for add/edit if value['mode'] != "create" and value['oid'] == "IGNORED": value['oid'] = "" return value
# --- Fields ------------------------------------------------------------------ @colander.deferred def location_space_sequence_widget(node, kw): request = kw.get('request') # return widget return DatatableSequenceWidget( request=request, template='datatables/location_space_sequence', # source_data=source_data, # source_data_total=total ) @colander.deferred def location_space_sequence_widget_thomas(node, kw): request = kw.get('request') # translation strings request.name_translation = get_localizer( request).translate( _('Name', 'collecting_society_web')) request.category_translation = get_localizer( request).translate( _('Category', 'collecting_society_web')) locale = get_localizer(request) locale_domain = 'collecting_society_web' location_space_category = { 'Dancing': locale.translate(_('Dancing', locale_domain)), 'Concert': locale.translate(_('Concert', locale_domain)), 'Waiting': locale.translate(_('Waiting', locale_domain)), 'Shopping': locale.translate(_('Shopping', locale_domain)), 'Eating': locale.translate(_('Eating', locale_domain)), } # get initial source data source_data = [] location_spaces = LocationSpace.search_all( # domain=domain, # offset=0, # limit=10, # order=[('name', 'asc')] ) for location_space in location_spaces: source_data.append({ 'oid': location_space.oid, 'name': location_space.name, 'category': location_space_category[location_space.category.name]}) # get statistics total_domain = [ # ('entity_creator', '=', request.web_user.party.id), # only own # ('creation', '=', None) # only orphaned ] if getattr(node, 'category', None): total_domain.append(('category', '=', node.category)) total = LocationSpace.search_count(total_domain) # return widget return DatatableSequenceWidget( request=request, template='datatables/location_space_sequence', source_data=source_data, source_data_total=total ) @colander.deferred def deferred_location_space_category_widget(node, kw): values = [(sc.code, sc.name) for sc in LocationSpaceCategory.search_all()] return deform.widget.Select2Widget(values=values)
[docs] class ModeField(colander.SchemaNode): oid = "mode" schema_type = colander.String widget = deform.widget.HiddenWidget() validator = colander.OneOf( ['create', 'edit'])
[docs] class OidField(colander.SchemaNode): oid = "oid" schema_type = colander.String widget = deform.widget.HiddenWidget() preparer = [prepare_ignored] validator = colander.Any( colander.uuid, colander.Regex(r'^IGNORED\Z', '') )
[docs] class NameField(colander.SchemaNode): oid = "name" schema_type = colander.String widget = deform.widget.TextInputWidget()
[docs] class CategoryField(colander.SchemaNode): oid = "category" schema_type = colander.String widget = deferred_location_space_category_widget
[docs] class SizeField(colander.SchemaNode): oid = "size" schema_type = colander.Integer validator = colander.Range(1, 1000000) widget = deform.widget.TextInputWidget()
[docs] class SizeEstimatedField(colander.SchemaNode): oid = "size_estimated" schema_type = colander.Boolean missing = False
# --- Schemas -----------------------------------------------------------------
[docs] class LocationSpaceSchema(colander.Schema): mode = ModeField() oid = OidField() name = NameField() category = CategoryField() size = SizeField() size_estimated = SizeEstimatedField(title=_('Size only estimated')) preparer = [prepare_required] title = ""
[docs] class LocationSpaceSequence(DatatableSequence): location_space_sequence = LocationSpaceSchema() widget = location_space_sequence_widget actions = ['create', 'edit']