def save_form(self, *args, **kwargs): properties = get_internal_attributes(self.data["_slug"], nodetype.name, nodetype.graph.id, "", False) node_properties = nodetype.nodeproperty_set.all().values("key") keys = [p["key"] for p in node_properties] for key in keys: if key in self.data and len(self.data[key]) > 0: properties[key] = self.data[key] properties["_slug"] = self.data["_slug"] properties["_type"] = nodetype.name properties["_graph"] = unicode(nodetype.graph.id) node = create_node(gdb, properties, nodetype.graph) if node: # Create relationships only if everything was OK with node creation for relationship in nodetype.get_edges(): rel_name = relationship.relation.name if rel_name in self.data and len(self.data[rel_name]) > 0: idx = gdb.relationships.indexes.get('sylva_relationships') for node_id in self.data.getlist(rel_name): node_to = gdb.nodes.get(node_id) if node_to: rel = node.relationships.create(rel_name, to=node_to) slug = "%s:%s:%s" % (rel.start.properties['_slug'], rel_name, rel.end.properties['_slug']) gid = str(nodetype.graph.id) inner_props = get_internal_attributes(slug, rel_name, gid, "", True) for key, value in inner_props.iteritems(): rel.set(key, value) rel.set('_url', "/".join(rel.url.split('/')[-2:])) idx['_slug'][slug] = rel idx['_type'][rel_name] = rel idx['_graph'][gid] = rel
def add_node_ajax(request, graph_id): graph = GraphDB.objects.get(pk=graph_id) if not request.user.has_perm('schema.%s_can_add_data' % graph.name): return unauthorized_user(request) if request.method == 'GET': gdb = neo4jclient.GraphDatabase(GRAPHDB_HOST) tmp_node = simplejson.loads(request.GET['json_node']) collapse = simplejson.loads(request.GET['collapse']) node = get_internal_attributes(tmp_node['id'], tmp_node['type'], graph_id, request.user) if collapse: new_node = get_or_create_node(gdb, node, graph) else: new_node = create_node(gdb, node, graph) if new_node: success = True else: success = False return HttpResponse(simplejson.dumps({'success': success}))
def set_relationship_properties(gdb, rel_obj, edge_type, graph_id, user): edge_type_obj = EdgeType.objects.filter(name=edge_type) if edge_type_obj: default_properties = edge_type_obj[0].edgeproperty_set.all() for dp in default_properties: rel_obj.set(dp.key, dp.value) slug = "%s:%s:%s" % (rel_obj.start.properties['_slug'], edge_type, rel_obj.end.properties['_slug']) inner_properties = get_internal_attributes(slug, edge_type, graph_id, user, True) for key, value in inner_properties.iteritems(): rel_obj.set(key, value) rel_obj.set('_url', "/".join(rel_obj.url.split('/')[-2:])) idx = gdb.relationships.indexes.get('sylva_relationships') idx['_slug'][slug] = rel_obj idx['_type'][edge_type] = rel_obj idx['_graph'][graph_id] = rel_obj
def editor(request, graph_id): graph = GraphDB.objects.get(pk=graph_id) if not request.user.has_perm("schema.%s_can_edit" % graph.name): return unauthorized_user(request) if not ValidRelation.objects.filter(graph=graph): error_message = 'Graph %s has no valid relations' % graph.name return index(request, error_message) if request.method == 'POST': gdb = neo4jclient.GraphDatabase(GRAPHDB_HOST) if gdb: data = request.POST.copy() if data['mode'] == 'node': n = get_internal_attributes(data['node_id'], data['node_type'], graph_id, request.user) properties = simplejson.loads(data['node_properties']) n.update(properties) node, new = get_or_create_node(gdb, n, graph, True) if new: add_message(request, title='Created %s' % data['node_id'], action_type='add', element_id=node.id, element_type='node', text='%s node' % data['node_type']) else: add_message(request, title='Modified %s' % data['node_id'], action_type='add', element_id=node.id, element_type='node', text='%s node' % data['node_type']) elif data['mode'] == 'relation': # Check if it is a valid relationship if not graph.is_valid_relationship(data['node_from_type'], data['relation_type'], data['node_to_type']): raise Exception('Relationship invalid for %s graph' % \ graph.name) #Create data in Neo4j server node_from = get_internal_attributes(data['node_from_id'], data['node_from_type'], graph_id, request.user) properties = simplejson.loads(data['node_from_properties']) node_from.update(properties) relation = {'_type': data['relation_type']} properties = simplejson.loads(data['relation_properties']) relation.update(properties) node_to = get_internal_attributes(data['node_to_id'], data['node_to_type'], graph_id, request.user) properties = simplejson.loads(data['node_to_properties']) node_to.update(properties) edge_type = relation['_type'] start_node = get_or_create_node(gdb, node_from, graph) end_node = get_or_create_node(gdb, node_to, graph) rel_obj, new = get_or_create_relationship(gdb, start_node, end_node, edge_type, True) if new: # Relation default and inner properties set_relationship_properties(gdb, rel_obj, data['relation_type'], graph_id, request.user) for key, value in relation.iteritems(): rel_obj.set(key, value) if new: add_message(request, title='Created %s' % edge_type, action_type='add', element_type='edge', element_id=rel_obj.id, text='%s(%s) %s %s(%s) relation' % (data['node_from_id'], data['node_from_type'], edge_type, data['node_to_id'], data['node_to_type'])) else: add_message(request, title='Modified %s' % edge_type, action_type='change', element_type='edge', element_id=rel_obj.id, text='%s(%s) %s %s(%s) relation' % (data['node_from_id'], data['node_from_type'], edge_type, data['node_to_id'], data['node_to_type'])) else: # Check connection try: gdb = neo4jclient.GraphDatabase(GRAPHDB_HOST) request.session["GRAPHDB_HOST"] = GRAPHDB_HOST except: error_message = "The host %s is not available" % GRAPHDB_HOST return index(request, error_message) node_types = simplejson.dumps([n.name for n in graph.nodetype_set.all()]) form_structure = simplejson.dumps(graph.get_dictionaries()) messages = request.session.get('messages', []) json_graph = graph.get_json_schema_graph() return render_to_response('graphgamel/editor.html', RequestContext(request, { 'graph': graph, 'history_list': messages, 'form_structure': form_structure, 'node_types': node_types, 'json_graph': json_graph, 'graph_id': graph_id}))