web/formfields.py
branchstable
changeset 5057 d1bd50ae0edd
parent 5038 90493551b1eb
child 5085 981e85b14b47
equal deleted inserted replaced
5056:5de07c77d73f 5057:d1bd50ae0edd
    19 from yams.constraints import (SizeConstraint, StaticVocabularyConstraint,
    19 from yams.constraints import (SizeConstraint, StaticVocabularyConstraint,
    20                               FormatConstraint)
    20                               FormatConstraint)
    21 
    21 
    22 from cubicweb import Binary, tags, uilib
    22 from cubicweb import Binary, tags, uilib
    23 from cubicweb.web import INTERNAL_FIELD_VALUE, ProcessFormError, eid_param, \
    23 from cubicweb.web import INTERNAL_FIELD_VALUE, ProcessFormError, eid_param, \
    24      formwidgets as fw
    24      formwidgets as fw, uicfg
    25 
    25 
    26 
    26 
    27 class UnmodifiedField(Exception):
    27 class UnmodifiedField(Exception):
    28     """raise this when a field has not actually been edited and you want to skip
    28     """raise this when a field has not actually been edited and you want to skip
    29     it
    29     it
   878 
   878 
   879     def actual_fields(self, form):
   879     def actual_fields(self, form):
   880         return [self] + list(self.fields)
   880         return [self] + list(self.fields)
   881 
   881 
   882 
   882 
       
   883 _AFF_KWARGS = uicfg.autoform_field_kwargs
       
   884 
   883 def guess_field(eschema, rschema, role='subject', skip_meta_attr=True, **kwargs):
   885 def guess_field(eschema, rschema, role='subject', skip_meta_attr=True, **kwargs):
   884     """return the most adapated widget to edit the relation
   886     """return the most adapated widget to edit the relation
   885     'subjschema rschema objschema' according to information found in the schema
   887     'subjschema rschema objschema' according to information found in the schema
   886     """
   888     """
   887     fieldclass = None
   889     fieldclass = None
   892             if rdef.get('internationalizable'):
   894             if rdef.get('internationalizable'):
   893                 kwargs.setdefault('internationalizable', True)
   895                 kwargs.setdefault('internationalizable', True)
   894     else:
   896     else:
   895         targetschema = rdef.subject
   897         targetschema = rdef.subject
   896     card = rdef.role_cardinality(role)
   898     card = rdef.role_cardinality(role)
   897     kwargs['required'] = card in '1+'
       
   898     kwargs['name'] = rschema.type
   899     kwargs['name'] = rschema.type
   899     kwargs['role'] = role
   900     kwargs['role'] = role
       
   901     kwargs['eidparam'] = True
       
   902     kwargs.setdefault('required', card in '1+')
   900     if role == 'object':
   903     if role == 'object':
   901         kwargs.setdefault('label', (eschema.type, rschema.type + '_object'))
   904         kwargs.setdefault('label', (eschema.type, rschema.type + '_object'))
   902     else:
   905     else:
   903         kwargs.setdefault('label', (eschema.type, rschema.type))
   906         kwargs.setdefault('label', (eschema.type, rschema.type))
   904     kwargs['eidparam'] = True
       
   905     kwargs.setdefault('help', rdef.description)
   907     kwargs.setdefault('help', rdef.description)
   906     if rschema.final:
   908     if rschema.final:
   907         if skip_meta_attr and rschema in eschema.meta_attributes():
   909         if skip_meta_attr and rschema in eschema.meta_attributes():
   908             return None
   910             return None
   909         fieldclass = FIELDS[targetschema]
   911         fieldclass = FIELDS[targetschema]
   927             return StringField(**kwargs)
   929             return StringField(**kwargs)
   928         if fieldclass is FileField:
   930         if fieldclass is FileField:
   929             for metadata in KNOWN_METAATTRIBUTES:
   931             for metadata in KNOWN_METAATTRIBUTES:
   930                 metaschema = eschema.has_metadata(rschema, metadata)
   932                 metaschema = eschema.has_metadata(rschema, metadata)
   931                 if metaschema is not None:
   933                 if metaschema is not None:
       
   934                     metakwargs = _AFF_KWARGS.etype_get(eschema, metaschema, 'subject')
   932                     kwargs['%s_field' % metadata] = guess_field(eschema, metaschema,
   935                     kwargs['%s_field' % metadata] = guess_field(eschema, metaschema,
   933                                                                 skip_meta_attr=False)
   936                                                                 skip_meta_attr=False,
       
   937                                                                 **metakwargs)
   934         return fieldclass(**kwargs)
   938         return fieldclass(**kwargs)
   935     return RelationField.fromcardinality(card, **kwargs)
   939     return RelationField.fromcardinality(card, **kwargs)
   936 
   940 
   937 
   941 
   938 FIELDS = {
   942 FIELDS = {