RemoveLabel.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from flask import abort
  2. from flask import make_response
  3. from flask import request
  4. from flask.views import View
  5. from pycs import db
  6. from pycs.database.Label import Label
  7. from pycs.frontend.notifications.NotificationManager import NotificationManager
  8. class RemoveLabel(View):
  9. """
  10. remove a label from database
  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. def dispatch_request(self, user: str, project_id: int, label_id: int):
  18. # pylint: disable=unused-argument
  19. # extract request data
  20. data = request.get_json(force=True)
  21. if not data.get('remove', False):
  22. abort(400, "remove flag is missing")
  23. # find label
  24. label = Label.query.filter(
  25. Label.project_id == project_id,
  26. Label.id == label_id).one_or_none()
  27. if label is None:
  28. abort(404)
  29. # start transaction
  30. with db.session.begin_nested():
  31. children = label.children
  32. # remove label. because of cascade, parent_id is set ot NULL
  33. label_dump = label.delete(commit=False)
  34. label.flush()
  35. # notify about changes and reset the parent
  36. for child in children:
  37. child.parent_id = label.parent_id
  38. self.nm.edit_label(child)
  39. self.nm.remove_label(label_dump)
  40. # return success response
  41. return make_response()