def update(self):
      self.mode = self.request.form.get('mode')
      setobject_id = self.request.form.get('setobject_id')
      self.graph_xml = self.request.form.get('graph')
      if self.graph_xml != None:
          del(self.request.form['graph'])
      self.source_id = self.request.form.get('source_id')
      if self.source_id != None:
          # Delete request's source_id, as subforms should not see it.
          del(self.request.form['source_id'])
  	self.linked = self.request.form.get('linked')
      if self.linked != None:
          del(self.request.form['linked'])
      if self.linked != None and self.linked != 'true' and self.linked != 'false':
  	    raise Exception("Invalid value for parameter linked")
  	if self.source_id != None and self.linked == None:
  		raise Exception("source_id parameter must be accompanied by linked parameter")
  	if self.linked != None and self.source_id == None:
          raise Exception("linked parameter must be accompanied by linked source_id parameter.")
  	self.relation_source_id = self.request.form.get('relation_source_id')
      
      db_utility = getUtility(IDbUtility)
      session = db_utility.Session()
    
      if self.mode == 'OPERATIONAL':
          classname = self.context.op_setobject_type.__name__
      elif self.mode == 'DESIGNER' or self.mode == 'ARCHETYPE':
          classname = self.context.__class__.__name__
      else:
           raise Exception("Mode must have one of the values ARCHETYPE, DESIGNER, OPERATIONAL")
      
      self.klass = setobject_type_registry.lookup(classname)
      if not setobject_id:
          setobject = self.klass()
          session.add(setobject)
          setobject_id = setobject.id
          session.flush()
      
      if self.graph_xml != None and self.graph_xml != '':
          graph = SetobjectGraph(self.request, self.graph_xml)        
          graph.link(self.source_id, classname, setobject_id, self.linked)
          
      if setobject_id != None:
          self.setobject = session.query(self.klass).filter(self.klass.get_primary_key_attr() == setobject_id).one()
      
      relation_id = self.request.get('relation_id')
      if relation_id != None:
          if self.relation_source_id == None:
              raise Exception("relation_id parameter must be accompanied by relation_source_id.")
          self.relation = session.query(EmbeddedForm).filter_by(span_identifier=relation_id).one()
          source_type = setobject_type_registry.lookup(self.relation.linkage.source_model.klass)
          self.relation_source = session.query(source_type).filter(source_type.get_primary_key_attr() == self.relation_source_id).one()   
      
      if self.graph_xml != None and self.graph_xml != '':
          # Each query after graph.link() call might generate new dynamic linkage id's. Correct them if necessary.
          graph.update_collections()
 
      self.context = self.setobject
 def __call__(self, form):
     graph_xml = form.request.form['data']
     graph = SetobjectGraph(form.request, graph_xml)
     graph.save()
     plan_id = form.request.form['plan_identifier']
     obj = GenericSet()
     obj.plan_identifier = str(plan_id)
     obj.title = plan_id
     obj.klass = str(form.request.form['klass'])
     obj.table_identifier = str(form.request.form['table_identifier'])
     form.adder.add(obj)
     return form.redirect(form.url(obj))
        def __call__(self, form):
            jsonresponse = dict()

            graph_xml = form.request.form['data']

            try:
                graph = SetobjectGraph(form.request, graph_xml)
                graph.save()
                jsonresponse['result'] = 'OK'
            except SetobjectGraphException, ex:
                jsonresponse['error'] = {'title': 'Save failed',
                                          'message': ex.reason,
                                          'data_node_id': ex.setobjectid}
 def __call__(self, form):
     graph_xml = form.request.form['data']
     graph = SetobjectGraph(form.request, graph_xml)
     result = graph.save()
     form.saved = True