def lines_add(request, project_id=None, logged_in_user=None): p = Project.objects.get(pk=project_id) # FIXME: for the moment, just hardcode the user ID: user = User.objects.get(pk=3) neuron = get_object_or_404(ClassInstance, pk=request.POST["neuron_id"], project=p) # There's a race condition here, if two people try to add a line # with the same name at the same time. The normal way to deal # with this would be to make the `name` column unique in the # table, but since the class_instance table isn't just for driver # lines, we can't do that. (FIXME) try: line = ClassInstance.objects.get(name=request.POST["line_name"]) except ClassInstance.DoesNotExist: line = ClassInstance() line.name = request.POST["line_name"] line.project = p line.user = user line.class_column = Class.objects.get(class_name="driver_line", project=p) line.save() r = Relation.objects.get(relation_name="expresses_in", project=p) cici = ClassInstanceClassInstance() cici.class_instance_a = line cici.class_instance_b = neuron cici.relation = r cici.user = user cici.project = p cici.save() return HttpResponseRedirect(reverse("vncbrowser.views.view", kwargs={"neuron_id": neuron.id, "project_id": p.id}))
def lines_add(request, project_id=None, logged_in_user=None): p = Project.objects.get(pk=project_id) # FIXME: for the moment, just hardcode the user ID: user = User.objects.get(pk=3) neuron = get_object_or_404(ClassInstance, pk=request.POST['neuron_id'], project=p) # There's a race condition here, if two people try to add a line # with the same name at the same time. The normal way to deal # with this would be to make the `name` column unique in the # table, but since the class_instance table isn't just for driver # lines, we can't do that. (FIXME) try: line = ClassInstance.objects.get(name=request.POST['line_name']) except ClassInstance.DoesNotExist: line = ClassInstance() line.name = request.POST['line_name'] line.project = p line.user = user line.class_column = Class.objects.get(class_name='driver_line', project=p) line.save() r = Relation.objects.get(relation_name='expresses_in', project=p) cici = ClassInstanceClassInstance() cici.class_instance_a = line cici.class_instance_b = neuron cici.relation = r cici.user = user cici.project = p cici.save() return HttpResponseRedirect( reverse('vncbrowser.views.view', kwargs={ 'neuron_id': neuron.id, 'project_id': p.id }))
def split_skeleton(request, project_id=None, logged_in_user=None): treenode_id = request.POST['tnid'] p = get_object_or_404(Project, pk=project_id) # retrieve skeleton ci = ClassInstance.objects.get( project=project_id, class_column__class_name='skeleton', treenodeclassinstance__relation__relation_name='element_of', treenodeclassinstance__treenode__id=treenode_id) skeleton_id = ci.id # retrieve neuron id of this skeleton sk = get_object_or_404(ClassInstance, pk=skeleton_id, project=project_id) neuron = ClassInstance.objects.filter( project=p, cici_via_b__relation__relation_name='model_of', cici_via_b__class_instance_a=sk) # retrieve all nodes of the skeleton treenode_qs = Treenode.objects.filter( treenodeclassinstance__class_instance__id=skeleton_id, treenodeclassinstance__relation__relation_name='element_of', treenodeclassinstance__class_instance__class_column__class_name='skeleton', project=project_id).order_by('id') # build the networkx graph from it graph = nx.DiGraph() for e in treenode_qs: graph.add_node( e.id ) if e.parent_id: graph.add_edge( e.parent_id, e.id ) # find downstream nodes starting from target treenode_id # generate id list from it change_list = nx.bfs_tree(graph, int(treenode_id)).nodes() # create a new skeleton new_skeleton = ClassInstance() new_skeleton.name = 'Skeleton' new_skeleton.project = p new_skeleton.user = logged_in_user new_skeleton.class_column = Class.objects.get(class_name='skeleton', project=p) new_skeleton.save() new_skeleton.name = 'Skeleton {0}'.format( new_skeleton.id ) new_skeleton.save() r = Relation.objects.get(relation_name='model_of', project=p) cici = ClassInstanceClassInstance() cici.class_instance_a = new_skeleton cici.class_instance_b = neuron[0] cici.relation = r cici.user = logged_in_user cici.project = p cici.save() # update skeleton_id of list in treenode table tns = Treenode.objects.filter( id__in=change_list, project=project_id).update(skeleton=new_skeleton) # update treenodeclassinstance element_of relation tci = TreenodeClassInstance.objects.filter( relation__relation_name='element_of', treenode__id__in=change_list, project=project_id).update(class_instance=new_skeleton) # setting parent of target treenode to null tc = TreenodeConnector.objects.filter( project=project_id, relation__relation_name__endswith = 'synaptic_to', treenode__in=change_list, ).update(skeleton=new_skeleton) Treenode.objects.filter( id=treenode_id, project=project_id).update(parent=None) locations = Location.objects.filter( project=project_id, id=treenode_id ) if len(locations) > 0: location = locations[0].location insert_into_log( project_id, logged_in_user.id, "split_skeleton", location, "Split skeleton with ID {0} (neuron: {1})".format( skeleton_id, neuron[0].name ) ) return HttpResponse(json.dumps({}), mimetype='text/json')