diff --git a/applications/graphs/urls.py b/applications/graphs/urls.py index 297f92ab..1b1db03c 100644 --- a/applications/graphs/urls.py +++ b/applications/graphs/urls.py @@ -8,6 +8,7 @@ url(r'^graphs/(?P[^/]+)$', views.graph_page, name='graph'), url(r'^graphs/(?P[^/]+)/(?P[^/]+)$', views.graph_page_by_name, name='graph_by_name'), url(r'^upload$', views.upload_graph_page, name='upload_graph'), + url(r'^fork_graph$', views.fork_graph, name='fork_graph'), # AJAX APIs Endpoints diff --git a/applications/graphs/views.py b/applications/graphs/views.py index 772639c5..afb9b743 100644 --- a/applications/graphs/views.py +++ b/applications/graphs/views.py @@ -34,6 +34,22 @@ def upload_graph_page(request): else: return render(request, 'upload_graph/index.html', context) +@csrf_exempt +def fork_graph(request): + response='' + if request.method == 'POST': + try: + graph = _add_graph(request, graph={ + 'name': request.POST.get('name', None), + 'owner_email': request.POST.get('owner_email', None), + 'is_public': request.POST.get('is_public', None), + 'graph_json': json.loads(request.POST.get('graph_json', None)), + 'style_json': json.loads(request.POST.get('style_json', None)) + }) + response = 'Success' + except Exception as e: + response = str(e) + return HttpResponse(json.dumps({'result':response}), content_type="application/json") def graphs_page(request): """ diff --git a/static/js/graphs_page.js b/static/js/graphs_page.js index a7f4c57a..47e4af77 100644 --- a/static/js/graphs_page.js +++ b/static/js/graphs_page.js @@ -441,6 +441,13 @@ var graphPage = { utils.initializeTabs(); + $("#ForkGraph").click(function (e) { + e.preventDefault(); + if (!$(this).hasClass('disabled')){ + graphPage.fork($(this).data()); // Passing data about parent graph to fork() as argument + } + }); + $('#saveOnExitLayoutBtn').click(function () { graphPage.cyGraph.contextMenus('get').destroy(); // Destroys the cytocscape context menu extension instance. @@ -516,6 +523,34 @@ var graphPage = { graphPage.defaultLayoutWidget.init(); }, + fork: function (data) { + //Read the meta_data object and add 'parent_id' & 'parent_email' to the data field. + graph_meta_data = cytoscapeGraph.getNetworkAndViewJSON(graphPage.cyGraph); + graph_meta_data.data['parent_id'] = data.graph_id; + graph_meta_data.data['parent_email'] = data.owner_email; + var graphData = { + 'name':data.graph_name, + 'is_public':0, + 'owner_email':data.uid, + 'graph_json':JSON.stringify(graph_meta_data, null, 4), + 'style_json':JSON.stringify(cytoscapeGraph.getStyleJSON(graphPage.cyGraph), null, 4) + } + $.ajax({ + "type": "POST", + "dataType": "json", + "url": "/fork_graph", + "data": graphData, + "success": function (data) { + if(data.result=='Success'){ + $("#ForkGraph span").text('Forked Successfully'); + $("#ForkGraph").addClass('disabled'); + } + else{ + alert('Could not fork the Graph due to the following error : ' + data.result); + } + }, + }); + }, export: function (format) { cytoscapeGraph.export(graphPage.cyGraph, format, $('#GraphName').val()); }, diff --git a/templates/graph/index.html b/templates/graph/index.html index 830d44f3..e76b81f7 100644 --- a/templates/graph/index.html +++ b/templates/graph/index.html @@ -144,7 +144,7 @@
-
+

{{ title }}

@@ -169,16 +169,40 @@

{% endfor %}

{% endif %} + {% if 'data' in graph.graph_json and 'parent_email' in graph.graph_json.data%} +

+ forked from {{ graph.graph_json.data.parent_email }}/ {{ graph.name }} +

+ {% endif %}
-
+
+ {% if isForked %} +
+ + +
+ {% elif uid != graph.owner_email %} +
+ + +
+ {% endif %} {% if uid and uid == graph.owner_email %} Share {% endif %} -
+