From 91c9056823b5ecccea1c81def7f714a9a320e5cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Sat, 20 Jun 2015 09:12:46 +0200 Subject: [PATCH] Fix import and deletion of projects --- taiga/events/events.py | 3 ++ taiga/projects/api.py | 44 ++++++++++++--------- taiga/projects/apps.py | 35 +++++++++++++---- taiga/projects/issues/apps.py | 48 +++++++++++++++-------- taiga/projects/tasks/apps.py | 62 +++++++++++++++++++----------- taiga/projects/userstories/apps.py | 49 ++++++++++++++++------- 6 files changed, 163 insertions(+), 78 deletions(-) diff --git a/taiga/events/events.py b/taiga/events/events.py index 8e32dcf7..26343694 100644 --- a/taiga/events/events.py +++ b/taiga/events/events.py @@ -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") diff --git a/taiga/projects/api.py b/taiga/projects/api.py index e0761db2..975dd4ea 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -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() diff --git a/taiga/projects/apps.py b/taiga/projects/apps.py index b59c0137..a57f2f5a 100644 --- a/taiga/projects/apps.py +++ b/taiga/projects/apps.py @@ -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() diff --git a/taiga/projects/issues/apps.py b/taiga/projects/issues/apps.py index 3972ef48..7333d934 100644 --- a/taiga/projects/issues/apps.py +++ b/taiga/projects/issues/apps.py @@ -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() diff --git a/taiga/projects/tasks/apps.py b/taiga/projects/tasks/apps.py index a6597339..f8426dcc 100644 --- a/taiga/projects/tasks/apps.py +++ b/taiga/projects/tasks/apps.py @@ -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() diff --git a/taiga/projects/userstories/apps.py b/taiga/projects/userstories/apps.py index f6b1bb77..868074c1 100644 --- a/taiga/projects/userstories/apps.py +++ b/taiga/projects/userstories/apps.py @@ -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()