source: mauRepo/MolesManager/trunk/cedaMoles/MolesManager/forms/formsFactory.py @ 8488

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/MolesManager/trunk/cedaMoles/MolesManager/forms/formsFactory.py@8488
Revision 8488, 3.2 KB checked in by mnagni, 7 years ago (diff)

Incomplete - # 22534: Add versiojn number to the gui page
 http://team.ceda.ac.uk/trac/ceda/ticket/22534

  • Property svn:executable set to *
Line 
1'''
2Created on Nov 3, 2011
3
4@author: mnagni
5'''
6from django.db import models
7from django.forms.fields import CharField, DecimalField, IntegerField,\
8    ChoiceField
9from ascore.asenumeration import EnumSymbol, ASEnumType
10from django.forms.formsets import formset_factory
11from sqlalchemy.orm.properties import ColumnProperty
12from sqlalchemy.types import Enum, String, Integer
13
14
15
16_fieldFactory = { 
17       'Text': CharField,
18       'TEXT': CharField,
19       'INTEGER': IntegerField,     
20       'Integer': IntegerField,       
21       'NUMERIC': DecimalField,
22     }   
23
24def createASEnumField(clazz, **kwargs):
25    sel = []
26    for attrName in clazz.enum.__dict__:
27        if (attrName.startswith('_')):
28            continue
29        attr = getattr(clazz.enum, attrName)
30        if (isinstance(attr, EnumSymbol)):
31            sel.append((attr.name, attr.value))
32    return models.CharField(choices=tuple(sel))
33
34
35def getTypeName(clazz):   
36    return type(clazz).__name__
37
38def createField(name):
39    return _fieldFactory.get(name)
40
41def _extractValue(self, property_name, instance):
42    kwargs = {}
43    if self._instance:
44        kwargs['initial'] = getattr(instance, property_name)
45        kwargs['instance'] = instance
46    return kwargs
47
48def createFieldInstance(clazz, fieldName, iinstance):
49    name = getTypeName(clazz)
50    if (name == 'ASEnumType'):
51        return createASEnumField(clazz)
52    elif (name == 'ARRAY'):
53        return formset_factory(createField(getTypeName(clazz.item_type)))   
54    elif _fieldFactory.has_key(name):
55        kwargs = _extractValue(fieldName, iinstance)
56        return createField(name)(**kwargs)
57
58def createField_(field, kwargs = None):
59    if not kwargs:
60        return field()
61    else:
62        return field(**kwargs)
63
64def extractInteger(column, kwargs = None):
65    return createField_(IntegerField, kwargs)
66   
67def extractChar(column, kwargs = None):
68    return createField_(CharField, kwargs)     
69
70def extractEnum(column, kwargs = None):
71    if not kwargs:
72        kwargs = {}
73    kwargs['choices'] = [(value, value) for value in column.enums]
74    return createField_(ChoiceField, kwargs) #ChoiceField(choices=values)
75   
76def convertColumnToFormField(columnToConvert):
77    if not isinstance(columnToConvert, ColumnProperty) or len(columnToConvert.columns) > 1:
78        raise
79       
80    # !!!NOTE!!!
81    #it returns a LIST but for now I use only the first one
82    column = columnToConvert.columns[0]
83    formField = None
84    ctype = type(column.type)
85    if column.type._type_affinity.__name__ == 'ARRAY':
86        print "Have not way to convert %s type" % (column.type._type_affinity.__name__)
87        return None
88    if (issubclass(ctype, Integer)):
89        formField = extractInteger(column)
90    elif (issubclass(ctype, ASEnumType)):
91        formField = extractEnum(column.type.impl)               
92    elif (issubclass(ctype, String)):
93        if (issubclass(ctype, Enum)):
94            formField = extractEnum(column)
95        else:
96            formField = extractChar(column)
97    if not formField:
98        print "Have not way to convert %s type" % (getTypeName(column.type))
99        return None
100       
101    #formField.primary_key = column.primary_key
102    formField.widget.attrs['readonly'] = column.primary_key
103    return formField     
Note: See TracBrowser for help on using the repository browser.