Merge pull request #361 from taigaio/import-delete-project-fix

Fix import and deletion of projects
remotes/origin/enhancement/email-actions
Alejandro 2015-06-24 00:54:07 -07:00
commit b22c5a671f
6 changed files with 163 additions and 78 deletions

View File

@ -53,6 +53,9 @@ def emit_event_for_model(obj, *, type:str="change", channel:str="events",
Sends a model change event. Sends a model change event.
""" """
if obj._importing:
return None
assert type in set(["create", "change", "delete"]) assert type in set(["create", "change", "delete"])
assert hasattr(obj, "project_id") assert hasattr(obj, "project_id")

View File

@ -255,31 +255,37 @@ class ProjectViewSet(HistoryResourceMixin, ModelCrudViewSet):
super().pre_save(obj) super().pre_save(obj)
def destroy(self, request, *args, **kwargs): 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() obj = self.get_object_or_none()
self.check_permissions(request, 'destroy', obj) 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: if obj is None:
raise Http404 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_delete(obj)
self.pre_conditions_on_delete(obj) self.pre_conditions_on_delete(obj)
obj.delete() obj.delete()

View File

@ -21,11 +21,7 @@ from django.db.models import signals
from . import signals as handlers from . import signals as handlers
class ProjectsAppConfig(AppConfig): def connect_memberships_signals():
name = "taiga.projects"
verbose_name = "Projects"
def ready(self):
# On membership object is deleted, update role-points relation. # On membership object is deleted, update role-points relation.
signals.pre_delete.connect(handlers.membership_post_delete, signals.pre_delete.connect(handlers.membership_post_delete,
sender=apps.get_model("projects", "Membership"), sender=apps.get_model("projects", "Membership"),
@ -41,6 +37,8 @@ class ProjectsAppConfig(AppConfig):
sender=apps.get_model("projects", "Membership"), sender=apps.get_model("projects", "Membership"),
dispatch_uid='create-notify-policy') dispatch_uid='create-notify-policy')
def connect_projects_signals():
# On project object is created apply template. # On project object is created apply template.
signals.post_save.connect(handlers.project_post_save, signals.post_save.connect(handlers.project_post_save,
sender=apps.get_model("projects", "Project"), sender=apps.get_model("projects", "Project"),
@ -48,6 +46,29 @@ class ProjectsAppConfig(AppConfig):
# Tags # Tags
signals.pre_save.connect(handlers.tags_normalization, 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, 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()

View File

@ -23,25 +23,39 @@ from taiga.projects.custom_attributes import signals as custom_attributes_handle
from . import signals as handlers 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): class IssuesAppConfig(AppConfig):
name = "taiga.projects.issues" name = "taiga.projects.issues"
verbose_name = "Issues" verbose_name = "Issues"
def ready(self): def ready(self):
# Finished date connect_issues_signals()
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")

View File

@ -22,31 +22,49 @@ from taiga.projects import signals as generic_handlers
from taiga.projects.custom_attributes import signals as custom_attributes_handlers from taiga.projects.custom_attributes import signals as custom_attributes_handlers
from . import signals as 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): class TasksAppConfig(AppConfig):
name = "taiga.projects.tasks" name = "taiga.projects.tasks"
verbose_name = "Tasks" verbose_name = "Tasks"
def ready(self): def ready(self):
# Cached prev object version connect_tasks_signals()
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")

View File

@ -23,38 +23,61 @@ from taiga.projects.custom_attributes import signals as custom_attributes_handle
from . import signals as handlers from . import signals as handlers
class UserStoriesAppConfig(AppConfig): def connect_userstories_signals():
name = "taiga.projects.userstories"
verbose_name = "User Stories"
def ready(self):
# Cached prev object version # Cached prev object version
signals.pre_save.connect(handlers.cached_prev_us, 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 # Role Points
signals.post_save.connect(handlers.update_role_points_when_create_or_edit_us, 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 # Tasks
signals.post_save.connect(handlers.update_milestone_of_tasks_when_edit_us, 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 # Open/Close US and Milestone
signals.post_save.connect(handlers.try_to_close_or_open_us_and_milestone_when_create_or_edit_us, 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, 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 # Tags
signals.pre_save.connect(generic_handlers.tags_normalization, 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, 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, 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 # Custom Attributes
signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_user_story, signals.post_save.connect(custom_attributes_handlers.create_custom_attribute_value_when_create_user_story,
sender=apps.get_model("userstories", "UserStory"), sender=apps.get_model("userstories", "UserStory"),
dispatch_uid="create_custom_attribute_value_when_create_user_story") 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()