ExecuteLabelProvider.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from contextlib import closing
  2. from flask import make_response, request, abort
  3. from flask.views import View
  4. from pycs.database.Database import Database
  5. from pycs.database.LabelProvider import LabelProvider
  6. from pycs.database.Project import Project
  7. from pycs.frontend.notifications.NotificationManager import NotificationManager
  8. from pycs.jobs.JobGroupBusyException import JobGroupBusyException
  9. from pycs.jobs.JobRunner import JobRunner
  10. from pycs.util.LabelProviderUtil import load_from_root_folder as load_label_provider
  11. class ExecuteLabelProvider(View):
  12. """
  13. execute the label provider associated with a passed project identifier
  14. """
  15. # pylint: disable=arguments-differ
  16. methods = ['POST']
  17. def __init__(self, db: Database, nm: NotificationManager, jobs: JobRunner):
  18. # pylint: disable=invalid-name
  19. self.db = db
  20. self.nm = nm
  21. self.jobs = jobs
  22. def dispatch_request(self, identifier):
  23. # extract request data
  24. data = request.get_json(force=True)
  25. if 'execute' not in data or data['execute'] is not True:
  26. return abort(400)
  27. # find project
  28. project = self.db.project(identifier)
  29. if project is None:
  30. return abort(404)
  31. # get label provider
  32. label_provider = project.label_provider()
  33. if label_provider is None:
  34. return abort(400)
  35. # execute label provider and add labels to project
  36. try:
  37. self.execute_label_provider(self.db, self.nm, self.jobs, project, label_provider)
  38. except JobGroupBusyException:
  39. return abort(400)
  40. return make_response()
  41. @staticmethod
  42. def execute_label_provider(db: Database, nm: NotificationManager, jobs: JobRunner,
  43. project: Project, label_provider: LabelProvider):
  44. """
  45. start a job that loads and executes a label provider and saves its results to the
  46. database afterwards
  47. :param db: database object
  48. :param nm: notification manager object
  49. :param jobs: job runner object
  50. :param project: project
  51. :param label_provider: label provider
  52. :return:
  53. """
  54. # pylint: disable=invalid-name
  55. # receive loads and executes the given label provider
  56. def receive():
  57. with closing(load_label_provider(label_provider.root_folder)) as label_provider_impl:
  58. provided_labels = label_provider_impl.get_labels()
  59. return provided_labels
  60. # result adds the received labels to the database and fires events
  61. def result(provided_labels):
  62. with db:
  63. for label in provided_labels:
  64. created_label, insert = project.create_label(label['name'], label['id'])
  65. if insert:
  66. nm.create_label(created_label)
  67. else:
  68. nm.edit_label(created_label)
  69. # run job with given functions
  70. jobs.run(project,
  71. 'Label Provider',
  72. f'{project.name} ({label_provider.name})',
  73. f'{project.identifier}/label-provider',
  74. receive,
  75. result=result)