CreateProject.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from os import mkdir
  2. from os import path
  3. from shutil import copytree
  4. from uuid import uuid1
  5. from flask import make_response, request, abort
  6. from flask.views import View
  7. from pycs.database.Database import Database
  8. from pycs.frontend.endpoints.projects.ExecuteExternalStorage import ExecuteExternalStorage
  9. from pycs.frontend.endpoints.projects.ExecuteLabelProvider import ExecuteLabelProvider
  10. from pycs.frontend.notifications.NotificationManager import NotificationManager
  11. from pycs.jobs.JobRunner import JobRunner
  12. class CreateProject(View):
  13. """
  14. create a project, insert data into database and create directories
  15. """
  16. # pylint: disable=arguments-differ
  17. methods = ['POST']
  18. def __init__(self, db: Database, nm: NotificationManager, jobs: JobRunner):
  19. # pylint: disable=invalid-name
  20. self.db = db
  21. self.nm = nm
  22. self.jobs = jobs
  23. def dispatch_request(self):
  24. # extract request data
  25. data = request.get_json(force=True)
  26. name = data['name']
  27. description = data['description']
  28. # start transaction
  29. with self.db:
  30. # find model
  31. model_id = int(data['model'])
  32. model = self.db.model(model_id)
  33. if model is None:
  34. abort(404)
  35. # find label provider
  36. if data['label'] is None:
  37. label_provider = None
  38. else:
  39. label_provider_id = int(data['label'])
  40. label_provider = self.db.label_provider(label_provider_id)
  41. if label_provider is None:
  42. abort(404)
  43. # create project folder
  44. project_folder = path.join('projects', str(uuid1()))
  45. mkdir(project_folder)
  46. temp_folder = path.join(project_folder, 'temp')
  47. mkdir(temp_folder)
  48. # check project data directory
  49. if data['external'] is None:
  50. external_data = False
  51. data_folder = path.join(project_folder, 'data')
  52. mkdir(data_folder)
  53. else:
  54. external_data = True
  55. data_folder = data['external']
  56. # check if exists
  57. if not path.exists(data_folder):
  58. return abort(400)
  59. # copy model to project folder
  60. model_folder = path.join(project_folder, 'model')
  61. copytree(model.root_folder, model_folder)
  62. model, _ = model.copy_to(f'{model.name} ({name})', model_folder)
  63. # create entry in database
  64. created = self.db.create_project(name, description, model, label_provider,
  65. project_folder, external_data, data_folder)
  66. # execute label provider and add labels to project
  67. if label_provider is not None:
  68. ExecuteLabelProvider.execute_label_provider(self.db, self.nm, self.jobs, created,
  69. label_provider)
  70. # find media files
  71. if external_data:
  72. ExecuteExternalStorage.find_media_files(self.db, self.nm, self.jobs, created)
  73. # fire event
  74. self.nm.create_model(model)
  75. self.nm.create_project(created)
  76. # return success response
  77. return make_response()