Esempio n. 1
0
 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
Esempio n. 2
0
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}))
Esempio n. 3
0
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
Esempio n. 4
0
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}))