CreateResult.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from flask import abort
  2. from flask import jsonify
  3. from flask import request
  4. from flask.views import View
  5. from pycs import db
  6. from pycs.database.File import File
  7. from pycs.frontend.notifications.NotificationManager import NotificationManager
  8. class CreateResult(View):
  9. """
  10. create a result for a file
  11. """
  12. # pylint: disable=arguments-differ
  13. methods = ['POST']
  14. def __init__(self, nm: NotificationManager):
  15. # pylint: disable=invalid-name
  16. self.nm = nm
  17. @staticmethod
  18. def extract_request_data():
  19. """ get the data from the request and validate it """
  20. request_data = request.get_json(force=True)
  21. if 'type' not in request_data:
  22. abort(400, "result type argument is missing")
  23. result_type = request_data.get('type')
  24. if result_type not in ['labeled-image', 'bounding-box']:
  25. abort(400, "result type must be either 'labeled-image' or 'bounding-box'")
  26. label = None
  27. data = None
  28. if result_type == 'labeled-image':
  29. label = request_data.get('label')
  30. if label is None:
  31. abort(400, f"Could not find label argument ({result_type=})")
  32. elif result_type == 'bounding-box':
  33. data = request_data.get('data')
  34. if data is None:
  35. abort(400, f"Could not find data argument ({result_type=})")
  36. return result_type, label, data
  37. def dispatch_request(self, file_id: int):
  38. file = File.get_or_404(file_id)
  39. result_type, label, data = self.extract_request_data()
  40. # start transaction
  41. with db.session.begin_nested():
  42. # find full-image labels and remove them
  43. image_results = file.results.filter_by(type='labeled-image')
  44. removed = [result.serialize() for result in image_results.all()]
  45. image_results.delete()
  46. for result in removed:
  47. self.nm.remove_result(result)
  48. # insert into database
  49. result = file.create_result(
  50. origin='user',
  51. result_type=result_type,
  52. label=label,
  53. data=data)
  54. self.nm.create_result(result)
  55. return jsonify(result)