1 import logging
2 logger = logging.getLogger('camelot.view.controls.editors.embeddedmany2oneeditor')
3
4 from customeditor import CustomEditor, QtCore, QtGui
5 from wideeditor import WideEditor
6 from camelot.view.model_thread import post
7 from camelot.view.proxy import ValueLoading
8
10 """Widget for editing a many 2 one relation a a form embedded in another
11 form.
12 """
13
14 - def __init__( self, admin = None, parent = None, **kwargs ):
30
35
36 - def setEntity( self, entity_instance_getter, propagate = True ):
37
38 def create_instance_getter( entity_instance ):
39 return lambda:entity_instance
40
41 def set_entity_instance():
42 entity = entity_instance_getter()
43 current_entity_admin = None
44 if entity:
45 if entity!=ValueLoading:
46 self.entity_instance_getter = create_instance_getter( entity )
47 current_entity_admin = self.admin.get_related_entity_admin( entity.__class__ )
48 else:
49 return False, False, current_entity_admin
50 else:
51 try:
52 new_entity = self.admin.entity()
53 except Exception, e:
54 logger.error('ProgrammingError : could not create a new entity of type %s'%(self.admin.entity.__name__), exc_info=e)
55 self.entity_instance_getter = create_instance_getter( new_entity )
56 current_entity_admin = self.admin
57 return True, propagate, current_entity_admin
58
59 post( set_entity_instance, self.update_form )
60
70
71 if self.model==None or self.model.get_admin()!=current_entity_admin:
72
73 if self.form:
74 self.form.deleteLater()
75 self.layout.removeWidget( self.form )
76
77 self.model = CollectionProxy( current_entity_admin,
78 create_collection_getter( self.entity_instance_getter ),
79 current_entity_admin.get_fields )
80 self.form = current_entity_admin.create_form_view( '', self.model, 0, self )
81 self.layout.addWidget( self.form )
82 else:
83
84 self.model.set_collection_getter(create_collection_getter( self.entity_instance_getter ))
85
86 if propagate:
87 self.emit( QtCore.SIGNAL( 'editingFinished()' ) )
88