From 5e5309007ab13260e1635b8c78d2d0b699c1cf5f Mon Sep 17 00:00:00 2001 From: Ambrus Simon <ambrussimon@invenshure.com> Date: Mon, 26 Jun 2017 15:26:05 +0200 Subject: [PATCH] analysis GET, DELETE and /notes working --- api/api.py | 4 +-- api/dao/containerstorage.py | 20 ++++++----- api/handlers/refererhandler.py | 65 ++++++++++------------------------ bin/database.py | 2 ++ 4 files changed, 33 insertions(+), 58 deletions(-) diff --git a/api/api.py b/api/api.py index d80ea88c..19ae8c42 100644 --- a/api/api.py +++ b/api/api.py @@ -248,7 +248,7 @@ endpoints = [ route('/<list_name:files>/<name:{fname}>', FileListHandler, m=['GET', 'DELETE']), route('/<list_name:files>/<name:{fname}>/info', FileListHandler, h='get_info', m=['GET']), - route( '/analyses', AnalysesHandler, m=['POST']), + route( '/analyses', AnalysesHandler, m=['POST']), prefix('/analyses', [ route('/<_id:{cid}>', AnalysesHandler, m=['GET', 'DELETE']), route('/<_id:{cid}>/files', AnalysesHandler, h='download', m=['GET']), @@ -263,7 +263,7 @@ endpoints = [ # Analysis notes - prefix('/{cname}/{cid}/<cont_name:analyses>/<cid:{cid}>', [ + prefix('/<:{cname}>/<:{cid}>/<cont_name:analyses>/<cid:{cid}>', [ route('/<list_name:notes>', NotesListHandler, m=['POST']), route('/<list_name:notes>/<_id:{nid}>', NotesListHandler, name='notes', m=['GET', 'PUT', 'DELETE']), ]), diff --git a/api/dao/containerstorage.py b/api/dao/containerstorage.py index ccd2cb00..0fd27d88 100644 --- a/api/dao/containerstorage.py +++ b/api/dao/containerstorage.py @@ -460,20 +460,22 @@ class AnalysisStorage(ContainerStorage): return files - @staticmethod - def fill_values(analysis, cont_name, cid, origin): + def fill_values(self, analysis, cont_name, cid, origin): + parent = self.get_parent(cont_name, cid) defaults = { - 'parent': { + 'parent': { 'type': containerutil.singularize(cont_name), - 'id': bson.objectid.ObjectId(cid) + 'id': bson.objectid.ObjectId(cid) }, - '_id': bson.objectid.ObjectId(), - 'created': datetime.datetime.utcnow(), + '_id': bson.objectid.ObjectId(), + 'created': datetime.datetime.utcnow(), 'modified': datetime.datetime.utcnow(), - 'user': origin.get('id'), + 'user': origin.get('id'), + 'permissions': parent['permissions'], + 'public': parent.get('public', False), } - defaults.update(analysis) - return defaults + for key in defaults: + analysis.setdefault(key, defaults[key]) def create_job_and_analysis(self, cont_name, cid, analysis, job, origin): diff --git a/api/handlers/refererhandler.py b/api/handlers/refererhandler.py index d1675f8f..4d0ff7d7 100644 --- a/api/handlers/refererhandler.py +++ b/api/handlers/refererhandler.py @@ -16,7 +16,7 @@ from .. import upload from .. import util from .. import validators from ..auth import containerauth, always_ok -from ..dao import containerstorage, noop +from ..dao import APIStorageException, containerstorage, noop from ..web import base from ..web.request import log_access, AccessType @@ -59,6 +59,7 @@ class AnalysesHandler(RefererHandler): storage_schema_file = 'analysis.json' payload_schema_file = 'analysis.json' + def post(self, cont_name, cid): """ Default behavior: @@ -88,7 +89,6 @@ class AnalysesHandler(RefererHandler): analysis = upload.process_upload(self.request, upload.Strategy.analysis, origin=self.origin) self.storage.fill_values(analysis, cont_name, cid, self.origin) - self.input_validator(analysis, 'POST') result = self.storage.create_el(analysis) if result.acknowledged: @@ -97,57 +97,28 @@ class AnalysesHandler(RefererHandler): self.abort(500, 'Analysis not added for container {} {}'.format(cont_name, cid)) + def get(self, cont_name, cid, _id): + parent = self.storage.get_parent(cont_name, cid) + permchecker = self.get_permchecker(parent) + permchecker(noop)('GET') + return self._get_container(_id) + + @log_access(AccessType.delete_analysis) - def delete(self, **kwargs): - # Overriding base class delete to audit action before completion - _id = kwargs.pop('cid') - permchecker, storage, _, _, keycheck = self._initialize_request(cont_name, list_name, _id, query_params=kwargs) + def delete(self, cont_name, cid, _id): + parent = self.storage.get_parent(cont_name, cid) + permchecker = self.get_permchecker(parent) + permchecker(noop)('DELETE') + self.log_user_access(AccessType.delete_file, cont_name=cont_name, cont_id=cid) - permchecker(noop)('DELETE', _id=_id, query_params=kwargs) - self.log_user_access(AccessType.delete_file, cont_name=cont_name, cont_id=_id) try: - result = keycheck(storage.exec_op)('DELETE', _id, query_params=kwargs) + result = self.storage.delete_el(_id) except APIStorageException as e: self.abort(400, e.message) - if result.modified_count == 1: - return {'modified': result.modified_count} - else: - self.abort(404, 'Element not removed from list {} in container {} {}'.format(storage.list_name, storage.cont_name, _id)) - - - def add_note(self, cont_name, cid, child_name, _id): - _id = kwargs.pop('cid') - analysis_id = kwargs.get('_id') - permchecker, storage, _, _, _ = self._initialize_request(cont_name, list_name, _id) - payload = self.request.json_body - - notes_schema_file = list_handler_configurations[cont_name]['notes']['storage_schema_file'] - input_schema_uri = validators.schema_uri('input', notes_schema_file) - input_validator = validators.from_schema_path(input_schema_uri) - input_validator(payload, 'POST') - - payload['_id'] = str(bson.objectid.ObjectId()) - payload['user'] = payload.get('user', self.uid) - payload['created'] = datetime.datetime.utcnow() - permchecker(noop)('POST', _id=_id) - result = storage.add_note(_id=_id, analysis_id=analysis_id, payload=payload) - if result.modified_count == 1: - return {'modified':result.modified_count} - else: - self.abort(404, 'Element not added in list {} of container {} {}'.format(storage.list_name, storage.cont_name, _id)) - - - def delete_note(self, cont_name, list_name, **kwargs): - _id = kwargs.pop('cid') - analysis_id = kwargs.pop('_id') - permchecker, storage, _, _, _ = self._initialize_request(cont_name, list_name, _id) - note_id = kwargs.get('note_id') - permchecker(noop)('DELETE', _id=_id) - result = storage.delete_note(_id=_id, analysis_id=analysis_id, note_id=note_id) - if result.modified_count == 1: - return {'modified': result.modified_count} + if result.deleted_count == 1: + return {'deleted': result.deleted_count} else: - self.abort(404, 'Note not removed from analysis {}'.format(analysis_id)) + self.abort(404, 'Analysis {} not removed from container {} {}'.format(_id, cont_name, cid)) def download(self, **kwargs): diff --git a/bin/database.py b/bin/database.py index 30e7005b..baee1ac3 100755 --- a/bin/database.py +++ b/bin/database.py @@ -1121,6 +1121,8 @@ def upgrade_to_32_closure(cont, cont_name): for analysis in cont['analyses']: analysis['_id'] = bson.ObjectId(analysis['_id']) analysis['parent'] = {'type': cont_type, 'id': cont['_id']} + analysis['permissions'] = cont['permissions'] + analysis['public'] = cont.get('public', False) config.db['analyses'].insert_many(cont['analyses']) config.db[cont_name].update_one( {'_id': cont['_id']}, -- GitLab