Fix import and deletion of projects
parent
8efeb406fd
commit
91c9056823
|
@ -53,6 +53,9 @@ def emit_event_for_model(obj, *, type:str="change", channel:str="events",
|
|||
Sends a model change event.
|
||||
"""
|
||||
|
||||
if obj._importing:
|
||||
return None
|
||||
|
||||
assert type in set(["create", "change", "delete"])
|
||||
assert hasattr(obj, "project_id")
|
||||
|
||||
|
|
|
@ -255,31 +255,37 @@ class ProjectViewSet(HistoryResourceMixin, ModelCrudViewSet):
|
|||
super().pre_save(obj)
|
||||
|
||||
def destroy(self, request, *args, **kwargs):
|
||||
from taiga.events.apps import connect_events_signals, disconnect_events_signals
|
||||
from taiga.projects.tasks.apps import connect_tasks_signals, disconnect_tasks_signals
|
||||
from taiga.projects.userstories.apps import connect_userstories_signals, disconnect_userstories_signals
|
||||
from taiga.projects.issues.apps import connect_issues_signals, disconnect_issues_signals
|
||||
from taiga.projects.apps import connect_memberships_signals, disconnect_memberships_signals
|
||||
|
||||
obj = self.get_object_or_none()
|
||||
self.check_permissions(request, 'destroy', obj)
|
||||
|
||||
signals.post_delete.disconnect(sender=UserStory,
|
||||
dispatch_uid="user_story_update_project_colors_on_delete")
|
||||
signals.post_delete.disconnect(sender=Issue,
|
||||
dispatch_uid="issue_update_project_colors_on_delete")
|
||||
signals.post_delete.disconnect(sender=Task,
|
||||
dispatch_uid="tasks_milestone_close_handler_on_delete")
|
||||
signals.post_delete.disconnect(sender=Task,
|
||||
dispatch_uid="tasks_us_close_handler_on_delete")
|
||||
signals.post_delete.disconnect(sender=Task,
|
||||
dispatch_uid="task_update_project_colors_on_delete")
|
||||
signals.post_delete.disconnect(dispatch_uid="refprojdel")
|
||||
signals.post_delete.disconnect(dispatch_uid='update_watchers_on_membership_post_delete')
|
||||
|
||||
obj.tasks.all().delete()
|
||||
obj.user_stories.all().delete()
|
||||
obj.issues.all().delete()
|
||||
obj.memberships.all().delete()
|
||||
obj.roles.all().delete()
|
||||
|
||||
if obj is None:
|
||||
raise Http404
|
||||
|
||||
disconnect_events_signals()
|
||||
disconnect_issues_signals()
|
||||
disconnect_tasks_signals()
|
||||
disconnect_userstories_signals()
|
||||
disconnect_memberships_signals()
|
||||
|
||||
try:
|
||||
obj.tasks.all().delete()
|
||||
obj.user_stories.all().delete()
|
||||
obj.issues.all().delete()
|
||||
obj.memberships.all().delete()
|
||||
obj.roles.all().delete()
|
||||
finally:
|
||||
connect_events_signals()
|
||||
connect_issues_signals()
|
||||
connect_tasks_signals()
|
||||
connect_userstories_signals()
|
||||
connect_memberships_signals()
|
||||
|
||||
self.pre_delete(obj)
|
||||
self.pre_conditions_on_delete(obj)
|
||||
obj.delete()
|
||||
|
|
|
@ -21,11 +21,7 @@ from django.db.models import signals
|
|||
from . import signals as handlers
|
||||
|
||||
|
||||
class ProjectsAppConfig(AppConfig):
|
||||
name = "taiga.projects"
|
||||
verbose_name = "Projects"
|
||||
|
||||
def ready(self):
|
||||
def connect_memberships_signals():
|
||||
# On membership object is deleted, update role-points relation.
|
||||
signals.pre_delete.connect(handlers.membership_post_delete,
|
||||
sender=apps.get_model("projects", "Membership"),
|
||||
|
@ -41,6 +37,8 @@ class ProjectsAppConfig(AppConfig):
|
|||
sender=apps.get_model("projects", "Membership"),
|
||||
dispatch_uid='create-notify-policy')
|
||||
|
||||
|
||||
def connect_projects_signals():
|
||||
# On project object is created apply template.
|
||||
signals.post_save.connect(handlers.project_post_save,
|
||||
sender=apps.get_model("projects", "Project"),
|
||||
|
@ -48,6 +46,29 @@ class ProjectsAppConfig(AppConfig):
|
|||
|
||||
# Tags
|
||||
signals.pre_save.connect(handlers.tags_normalization,
|
||||
sender=apps.get_model("projects", "Project"))
|
||||
sender=apps.get_model("projects", "Project"),
|
||||
dispatch_uid="tags_normalization_projects")
|
||||
signals.pre_save.connect(handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("projects", "Project"))
|
||||
sender=apps.get_model("projects", "Project"),
|
||||
dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_projects")
|
||||
|
||||
|
||||
def disconnect_memberships_signals():
|
||||
signals.pre_delete.disconnect(dispatch_uid='membership_pre_delete')
|
||||
signals.post_delete.disconnect(dispatch_uid='update_watchers_on_membership_post_delete')
|
||||
signals.post_save.disconnect(dispatch_uid='create-notify-policy')
|
||||
|
||||
|
||||
def disconnect_projects_signals():
|
||||
signals.post_save.disconnect(dispatch_uid='project_post_save')
|
||||
signals.pre_save.disconnect(dispatch_uid="tags_normalization_projects")
|
||||
signals.pre_save.disconnect(dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_projects")
|
||||
|
||||
|
||||
class ProjectsAppConfig(AppConfig):
|
||||
name = "taiga.projects"
|
||||
verbose_name = "Projects"
|
||||
|
||||
def ready(self):
|
||||
connect_memberships_signals()
|
||||
connect_projects_signals()
|
||||
|
|
|
@ -23,25 +23,39 @@ from taiga.projects.custom_attributes import signals as custom_attributes_handle
|
|||
from . import signals as handlers
|
||||
|
||||
|
||||
def connect_issues_signals():
|
||||
# Finished date
|
||||
signals.pre_save.connect(handlers.set_finished_date_when_edit_issue,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="set_finished_date_when_edit_issue")
|
||||
|
||||
# Tags
|
||||
signals.pre_save.connect(generic_handlers.tags_normalization,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="tags_normalization_issue")
|
||||
signals.post_save.connect(generic_handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_issue")
|
||||
signals.post_delete.connect(generic_handlers.update_project_tags_when_delete_taggable_item,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="update_project_tags_when_delete_taggable_item_issue")
|
||||
|
||||
# Custom Attributes
|
||||
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_issue,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="create_custom_attribute_value_when_create_issue")
|
||||
|
||||
def disconnect_issues_signals():
|
||||
signals.pre_save.disconnect(dispatch_uid="set_finished_date_when_edit_issue")
|
||||
signals.pre_save.disconnect(dispatch_uid="tags_normalization_issue")
|
||||
signals.post_save.disconnect(dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_issue")
|
||||
signals.post_delete.disconnect(dispatch_uid="update_project_tags_when_delete_taggable_item_issue")
|
||||
signals.post_save.disconnect(dispatch_uid="create_custom_attribute_value_when_create_issue")
|
||||
|
||||
|
||||
class IssuesAppConfig(AppConfig):
|
||||
name = "taiga.projects.issues"
|
||||
verbose_name = "Issues"
|
||||
|
||||
def ready(self):
|
||||
# Finished date
|
||||
signals.pre_save.connect(handlers.set_finished_date_when_edit_issue,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="set_finished_date_when_edit_issue")
|
||||
|
||||
# Tags
|
||||
signals.pre_save.connect(generic_handlers.tags_normalization,
|
||||
sender=apps.get_model("issues", "Issue"))
|
||||
signals.post_save.connect(generic_handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("issues", "Issue"))
|
||||
signals.post_delete.connect(generic_handlers.update_project_tags_when_delete_taggable_item,
|
||||
sender=apps.get_model("issues", "Issue"))
|
||||
|
||||
# Custom Attributes
|
||||
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_issue,
|
||||
sender=apps.get_model("issues", "Issue"),
|
||||
dispatch_uid="create_custom_attribute_value_when_create_issue")
|
||||
connect_issues_signals()
|
||||
|
|
|
@ -22,31 +22,49 @@ from taiga.projects import signals as generic_handlers
|
|||
from taiga.projects.custom_attributes import signals as custom_attributes_handlers
|
||||
from . import signals as handlers
|
||||
|
||||
def connect_tasks_signals():
|
||||
# Cached prev object version
|
||||
signals.pre_save.connect(handlers.cached_prev_task,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="cached_prev_task")
|
||||
|
||||
# Open/Close US and Milestone
|
||||
signals.post_save.connect(handlers.try_to_close_or_open_us_and_milestone_when_create_or_edit_task,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="try_to_close_or_open_us_and_milestone_when_create_or_edit_task")
|
||||
signals.post_delete.connect(handlers.try_to_close_or_open_us_and_milestone_when_delete_task,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="try_to_close_or_open_us_and_milestone_when_delete_task")
|
||||
|
||||
# Tags
|
||||
signals.pre_save.connect(generic_handlers.tags_normalization,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="tags_normalization_task")
|
||||
signals.post_save.connect(generic_handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="update_project_tags_when_create_or_edit_tagglabe_item_task")
|
||||
signals.post_delete.connect(generic_handlers.update_project_tags_when_delete_taggable_item,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="update_project_tags_when_delete_tagglabe_item_task")
|
||||
|
||||
# Custom Attributes
|
||||
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_task,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="create_custom_attribute_value_when_create_task")
|
||||
|
||||
def disconnect_tasks_signals():
|
||||
signals.pre_save.disconnect(dispatch_uid="cached_prev_task")
|
||||
signals.post_save.disconnect(dispatch_uid="try_to_close_or_open_us_and_milestone_when_create_or_edit_task")
|
||||
signals.post_delete.disconnect(dispatch_uid="try_to_close_or_open_us_and_milestone_when_delete_task")
|
||||
signals.pre_save.disconnect(dispatch_uid="tags_normalization")
|
||||
signals.post_save.disconnect(dispatch_uid="update_project_tags_when_create_or_edit_tagglabe_item")
|
||||
signals.post_delete.disconnect(dispatch_uid="update_project_tags_when_delete_tagglabe_item")
|
||||
signals.post_save.disconnect(dispatch_uid="create_custom_attribute_value_when_create_task")
|
||||
|
||||
|
||||
class TasksAppConfig(AppConfig):
|
||||
name = "taiga.projects.tasks"
|
||||
verbose_name = "Tasks"
|
||||
|
||||
def ready(self):
|
||||
# Cached prev object version
|
||||
signals.pre_save.connect(handlers.cached_prev_task,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
|
||||
# Open/Close US and Milestone
|
||||
signals.post_save.connect(handlers.try_to_close_or_open_us_and_milestone_when_create_or_edit_task,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
signals.post_delete.connect(handlers.try_to_close_or_open_us_and_milestone_when_delete_task,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
|
||||
# Tags
|
||||
signals.pre_save.connect(generic_handlers.tags_normalization,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
signals.post_save.connect(generic_handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
signals.post_delete.connect(generic_handlers.update_project_tags_when_delete_taggable_item,
|
||||
sender=apps.get_model("tasks", "Task"))
|
||||
|
||||
# Custom Attributes
|
||||
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_task,
|
||||
sender=apps.get_model("tasks", "Task"),
|
||||
dispatch_uid="create_custom_attribute_value_when_create_task")
|
||||
connect_tasks_signals()
|
||||
|
|
|
@ -23,38 +23,61 @@ from taiga.projects.custom_attributes import signals as custom_attributes_handle
|
|||
from . import signals as handlers
|
||||
|
||||
|
||||
class UserStoriesAppConfig(AppConfig):
|
||||
name = "taiga.projects.userstories"
|
||||
verbose_name = "User Stories"
|
||||
|
||||
def ready(self):
|
||||
def connect_userstories_signals():
|
||||
# Cached prev object version
|
||||
signals.pre_save.connect(handlers.cached_prev_us,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="cached_prev_us")
|
||||
|
||||
# Role Points
|
||||
signals.post_save.connect(handlers.update_role_points_when_create_or_edit_us,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="update_role_points_when_create_or_edit_us")
|
||||
|
||||
# Tasks
|
||||
signals.post_save.connect(handlers.update_milestone_of_tasks_when_edit_us,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="update_milestone_of_tasks_when_edit_us")
|
||||
|
||||
# Open/Close US and Milestone
|
||||
signals.post_save.connect(handlers.try_to_close_or_open_us_and_milestone_when_create_or_edit_us,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="try_to_close_or_open_us_and_milestone_when_create_or_edit_us")
|
||||
signals.post_delete.connect(handlers.try_to_close_milestone_when_delete_us,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="try_to_close_milestone_when_delete_us")
|
||||
|
||||
# Tags
|
||||
signals.pre_save.connect(generic_handlers.tags_normalization,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="tags_normalization_user_story")
|
||||
signals.post_save.connect(generic_handlers.update_project_tags_when_create_or_edit_taggable_item,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_user_story")
|
||||
signals.post_delete.connect(generic_handlers.update_project_tags_when_delete_taggable_item,
|
||||
sender=apps.get_model("userstories", "UserStory"))
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="update_project_tags_when_delete_taggable_item_user_story")
|
||||
|
||||
# Custom Attributes
|
||||
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_user_story,
|
||||
sender=apps.get_model("userstories", "UserStory"),
|
||||
dispatch_uid="create_custom_attribute_value_when_create_user_story")
|
||||
|
||||
def disconnect_userstories_signals():
|
||||
signals.pre_save.disconnect(dispatch_uid="cached_prev_us")
|
||||
signals.post_save.disconnect(dispatch_uid="update_role_points_when_create_or_edit_us")
|
||||
signals.post_save.disconnect(dispatch_uid="update_milestone_of_tasks_when_edit_us")
|
||||
signals.post_save.disconnect(dispatch_uid="try_to_close_or_open_us_and_milestone_when_create_or_edit_us")
|
||||
signals.post_delete.disconnect(dispatch_uid="try_to_close_milestone_when_delete_us")
|
||||
signals.pre_save.disconnect(dispatch_uid="tags_normalization_user_story")
|
||||
signals.post_save.disconnect(dispatch_uid="update_project_tags_when_create_or_edit_taggable_item_user_story")
|
||||
signals.post_delete.disconnect(dispatch_uid="update_project_tags_when_delete_taggable_item_user_story")
|
||||
signals.post_save.disconnect(dispatch_uid="create_custom_attribute_value_when_create_user_story")
|
||||
|
||||
|
||||
class UserStoriesAppConfig(AppConfig):
|
||||
name = "taiga.projects.userstories"
|
||||
verbose_name = "User Stories"
|
||||
|
||||
def ready(self):
|
||||
connect_userstories_signals()
|
||||
|
|
Loading…
Reference in New Issue