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 = { |