Commit c7bed046 authored by Mathieu Rodic's avatar Mathieu Rodic

[FEAT] added a new resource to the API: `/api/nodes/(\d+)`

[FEAT] deletions now cascade
parent 89c93f35
......@@ -17,6 +17,6 @@ class Ngram(Base):
class NodeNgram(Base):
__tablename__ = 'nodes_ngrams'
id = Column(Integer)
node_id = Column(Integer, ForeignKey(Node.id), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id), primary_key=True)
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
weight = Column(Float)
......@@ -25,8 +25,9 @@ class Node(Base):
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
typename = Column(NodeType, index=True)
user_id = Column(Integer, ForeignKey(User.id))
parent_id = Column(Integer, ForeignKey('nodes.id'))
# foreign keys
user_id = Column(Integer, ForeignKey(User.id, ondelete='CASCADE'))
parent_id = Column(Integer, ForeignKey('nodes.id', ondelete='CASCADE'))
# main data
name = Column(String(255))
date = Column(DateTime(), default=datetime.now)
......
from gargantext.util.http import *
from gargantext.util.db import *
from gargantext.util.db_cache import *
from gargantext.models import *
from gargantext.constants import *
from gargantext.util.validation import validate
class NodesList(APIView):
class NodeListResource(APIView):
_fields = ['id', 'parent_id', 'name', 'typename', 'hyperdata']
_types = NODETYPES
......@@ -52,7 +53,6 @@ class NodesList(APIView):
# return the result!
return parameters, query, count
def get(self, request):
"""Displays the list of nodes corresponding to the query.
"""
......@@ -75,3 +75,32 @@ class NodesList(APIView):
'parameters': parameters,
'count': count,
}, 200)
class NodeResource(APIView):
def _query(self, request, node_id):
user = cache.User[request.user.username]
node = session.query(Node).filter(Node.id == node_id).first()
if node is None:
raise Http404()
if not user.owns(node):
raise HttpResponseForbidden()
return user, node
def get(self, request, node_id):
from sqlalchemy import delete
user, node = self._query(request, node_id)
return JsonHttpResponse({
'id': node.id,
'parent_id': node.parent_id,
'name': node.name,
'hyperdata': node.hyperdata,
})
def delete(self, request, node_id):
user, node = self._query(request, node_id)
result = session.execute(
delete(Node).where(Node.id == node_id)
)
session.commit()
return JsonHttpResponse({'deleted': result.rowcount})
......@@ -4,5 +4,6 @@ from . import nodes
urlpatterns = [
url(r'^nodes$', nodes.NodesList.as_view()),
url(r'^nodes$', nodes.NodeListResource.as_view()),
url(r'^nodes/(\d+)$', nodes.NodeResource.as_view()),
]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment