source: mauRepo/MolesManager/trunk/src/MolesManager/forms/date.py @ 8480

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/mauRepo/MolesManager/trunk/src/MolesManager/forms/date.py@8480
Revision 8480, 3.7 KB checked in by mnagni, 8 years ago (diff)

Fixed a bug in objectEncoding

  • Property svn:executable set to *
Line 
1'''
2Created on Nov 1, 2011
3
4@author: mnagni
5'''
6from MolesManager.forms.formsFactory import createFieldInstance
7from django.forms.forms import Form
8from sqlalchemy.orm.properties import ColumnProperty, RelationshipProperty
9import inspect
10from sqlalchemy.orm.util import class_mapper
11from sqlalchemy.orm.collections import InstrumentedList
12
13   
14
15def createForm(obj = None, mapper = None):
16    #mvh = MapperViewHelper()
17    #return mvh.fillMapperView(obj, mapper)
18
19    form = Model2Form(obj, mapper)
20    return type('CoreForm', (CoreForm,), form._createFields()) 
21
22class CoreForm(Form):
23    pass
24   
25class Model2Form(object):
26    def __init__(self, obj = None, mapper = None):
27        self._coreFields = {}               
28        self._instance = None
29        self._clazz = None
30        self._mapper = mapper
31       
32        if inspect.isclass(obj):
33            self._clazz = object
34        else:
35            self._instance = obj
36            self._clazz = type(obj)
37
38
39    def _createFields(self):
40        if self._mapper is None:
41            self._mapper = class_mapper(self._clazz)
42        if self._mapper is None:
43            raise Exception("Class not mapped %s" % (self._clazz))
44        self._loopOnProperties(self._instance, self._mapper)
45        return self._coreFields
46   
47    def _loopOnProperties(self, instance, mapper):
48        for prop in mapper.iterate_properties:
49            if not prop.key.startswith('_'):
50                print prop.key
51       
52        for clazz_property in mapper.iterate_properties:
53            if clazz_property.key == 'relatedParty':
54                pass
55            try:
56                if isinstance(clazz_property, ColumnProperty):
57                    self._manageColumnProperty(clazz_property, instance)
58                if isinstance(clazz_property, RelationshipProperty):
59                    self._manageRelationshipProperty(clazz_property, instance)
60            except Exception as e:
61                print e
62               
63    def _manageColumnProperty(self, clazz_property, instance):
64        if hasattr(clazz_property, 'columns'):
65            columns = getattr(clazz_property, 'columns')
66            if len(columns) > 0:
67                self._coreFields[clazz_property.key] = createFieldInstance(columns[0].type, clazz_property.key, instance)                   
68 
69    def _manageRelationshipProperty(self, relationship_property, instance):
70        if relationship_property.key == 'relatedParty':
71            print relationship_property.key
72
73        prop = getattr(instance, relationship_property.key)                   
74        isInstrumentList = isinstance(prop, InstrumentedList)
75
76        if (relationship_property.direction is not None):
77            if (relationship_property.direction.name == 'MANYTOONE'):
78                pass
79            elif (relationship_property.direction.name == 'ONETOMANY'):
80                #is a subclass or property multiplicity?
81                if relationship_property.key.startswith('_'):                               
82                    self._loopOnProperties(prop, relationship_property.mapper)
83                else:
84                    if isInstrumentList:
85                        items = self._processInstrumentList(prop)
86                        self._coreFields[relationship_property.key] = items
87                    else:                           
88                        self._coreFields[relationship_property.key] = createForm(prop, relationship_property.mapper)
89   
90    def _processInstrumentList(self, items):
91        ret = []
92       
93        for item in items:
94            ret.append(createForm(item))
95        return ret
96   
97
98
99   
100
101   
102
103'''
104for className in getObjectsNames():
105    fa = CoreFormAdapter(getObject(className))
106    fa = CoreFormAdapter(createObjectInstance(getObject(className)))   
107    print className
108'''       
Note: See TracBrowser for help on using the repository browser.