CreateResult.py 2.1 KB

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