def save_graph(cls, fsmData, nodeData, edgeData, username, fsmGroups=(), oldLabel='OLD'): """Store FSM specification from node Store FSM specification from node, edge graph by renaming any existing FSM with the same name, and creating new FSM. Note that ongoing activities using the old FSM will continue to work (following the old FSM spec), but any new activities will be created using the new FSM spec (since they request it by name). """ user = User.objects.get(username=username) name = fsmData['name'] oldName = name + oldLabel with transaction.atomic(): # rollback if db error occurs try: # delete nameOLD FSM if any old = cls.objects.get(name=oldName) except cls.DoesNotExist: pass else: old.delete() try: # rename current to nameOLD old = cls.objects.get(name=name) except cls.DoesNotExist: pass else: old.name = oldName old.save() for group in old.fsmgroup_set.all(): group.delete() # old.fsmgroup_set.clear() # RelatedManager has no attribute clear fsm = cls(addedBy=user, **fsmData) # create new FSM fsm.save() for groupName in fsmGroups: # register in specified groups fsm.fsmgroup_set.create(group=groupName) nodes = {} for name, nodeDict in nodeData.items(): # save nodes node = FSMNode(name=name, fsm=fsm, addedBy=user, **nodeDict) if node.funcName: # make sure plugin imports successfully get_plugin(node.funcName) node.save() nodes[name] = node if name == 'START': fsm.startNode = node fsm.save() for edgeDict in edgeData: # save edges edgeDict = edgeDict.copy() # don't modify input dict! edgeDict['fromNode'] = nodes[edgeDict['fromNode']] edgeDict['toNode'] = nodes[edgeDict['toNode']] edge = FSMEdge(addedBy=user, **edgeDict) edge.save() return fsm
def __get__(self, obj, objtype): try: return obj._pluginData except AttributeError: if not obj.funcName: raise AttributeError('no plugin funcName') klass = get_plugin(obj.funcName) obj._pluginData = klass() return obj._pluginData