From c49473dbdb00ad80dd21c779528e733180397b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Wed, 10 Sep 2014 15:43:19 +0200 Subject: [PATCH] Remove signals disconects on importing --- taiga/events/models.py | 4 + taiga/export_import/api.py | 116 +++++++++++++--------------- taiga/export_import/dump_service.py | 52 +++++-------- taiga/projects/references/models.py | 2 +- 4 files changed, 80 insertions(+), 94 deletions(-) diff --git a/taiga/events/models.py b/taiga/events/models.py index 287cc5e5..6958276f 100644 --- a/taiga/events/models.py +++ b/taiga/events/models.py @@ -24,6 +24,10 @@ def on_save_any_model(sender, instance, created, **kwargs): # Ignore any object that can not have project_id content_type = changes._get_type_for_model(instance) + # Ignore changes on import + if getattr(instance, '_importing', False): + return + # Ignore any other changes if content_type not in changes.watched_types: return diff --git a/taiga/export_import/api.py b/taiga/export_import/api.py index 21a98f71..b57de595 100644 --- a/taiga/export_import/api.py +++ b/taiga/export_import/api.py @@ -9,7 +9,6 @@ from django.db.models import signals from taiga.base.api.mixins import CreateModelMixin from taiga.base.api.viewsets import GenericViewSet from taiga.base.decorators import detail_route -from taiga.base.utils.signals import without_signals from taiga.projects.models import Project, Membership from . import serializers @@ -32,61 +31,60 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): data = request.DATA.copy() data['owner'] = data.get('owner', request.user.email) - with without_signals((signals.post_save, "project_post_save")): - project_serialized = service.store_project(data) + project_serialized = service.store_project(data) - if project_serialized is None: - raise Http400(service.get_errors()) + if project_serialized is None: + raise Http400(service.get_errors()) - if "points" in data: - service.store_choices(project_serialized.object, data, - "points", serializers.PointsExportSerializer) - if "issue_types" in data: - service.store_choices(project_serialized.object, data, - "issue_types", - serializers.IssueTypeExportSerializer) - if "issue_statuses" in data: - service.store_choices(project_serialized.object, data, - "issue_statuses", - serializers.IssueStatusExportSerializer,) - if "us_statuses" in data: - service.store_choices(project_serialized.object, data, - "us_statuses", - serializers.UserStoryStatusExportSerializer,) - if "task_statuses" in data: - service.store_choices(project_serialized.object, data, - "task_statuses", - serializers.TaskStatusExportSerializer) - if "priorities" in data: - service.store_choices(project_serialized.object, data, - "priorities", - serializers.PriorityExportSerializer) - if "severities" in data: - service.store_choices(project_serialized.object, data, - "severities", - serializers.SeverityExportSerializer) + if "points" in data: + service.store_choices(project_serialized.object, data, + "points", serializers.PointsExportSerializer) + if "issue_types" in data: + service.store_choices(project_serialized.object, data, + "issue_types", + serializers.IssueTypeExportSerializer) + if "issue_statuses" in data: + service.store_choices(project_serialized.object, data, + "issue_statuses", + serializers.IssueStatusExportSerializer,) + if "us_statuses" in data: + service.store_choices(project_serialized.object, data, + "us_statuses", + serializers.UserStoryStatusExportSerializer,) + if "task_statuses" in data: + service.store_choices(project_serialized.object, data, + "task_statuses", + serializers.TaskStatusExportSerializer) + if "priorities" in data: + service.store_choices(project_serialized.object, data, + "priorities", + serializers.PriorityExportSerializer) + if "severities" in data: + service.store_choices(project_serialized.object, data, + "severities", + serializers.SeverityExportSerializer) - if ("points" in data or "issues_types" in data or - "issues_statuses" in data or "us_statuses" in data or - "task_statuses" in data or "priorities" in data or - "severities" in data): - service.store_default_choices(project_serialized.object, data) + if ("points" in data or "issues_types" in data or + "issues_statuses" in data or "us_statuses" in data or + "task_statuses" in data or "priorities" in data or + "severities" in data): + service.store_default_choices(project_serialized.object, data) - if "roles" in data: - service.store_roles(project_serialized.object, data) + if "roles" in data: + service.store_roles(project_serialized.object, data) - if "memberships" in data: - service.store_memberships(project_serialized.object, data) + if "memberships" in data: + service.store_memberships(project_serialized.object, data) - if project_serialized.object.memberships.filter(user=project_serialized.object.owner).count() == 0: - if project_serialized.object.roles.all().count() > 0: - Membership.objects.create( - project=project_serialized.object, - email=project_serialized.object.owner.email, - user=project_serialized.object.owner, - role=project_serialized.object.roles.all().first(), - is_owner=True - ) + if project_serialized.object.memberships.filter(user=project_serialized.object.owner).count() == 0: + if project_serialized.object.roles.all().count() > 0: + Membership.objects.create( + project=project_serialized.object, + email=project_serialized.object.owner.email, + user=project_serialized.object.owner, + role=project_serialized.object.roles.all().first(), + is_owner=True + ) errors = service.get_errors() if errors: @@ -103,8 +101,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change", "refissue")): - issue = service.store_issue(project, request.DATA) + issue = service.store_issue(project, request.DATA) errors = service.get_errors() if errors: @@ -119,8 +116,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change", "reftask")): - task = service.store_task(project, request.DATA) + task = service.store_task(project, request.DATA) errors = service.get_errors() if errors: @@ -135,8 +131,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change", "refus")): - us = service.store_user_story(project, request.DATA) + us = service.store_user_story(project, request.DATA) errors = service.get_errors() if errors: @@ -151,8 +146,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change")): - milestone = service.store_milestone(project, request.DATA) + milestone = service.store_milestone(project, request.DATA) errors = service.get_errors() if errors: @@ -167,8 +161,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change")): - wiki_page = service.store_wiki_page(project, request.DATA) + wiki_page = service.store_wiki_page(project, request.DATA) errors = service.get_errors() if errors: @@ -183,8 +176,7 @@ class ProjectImporterViewSet(CreateModelMixin, GenericViewSet): project = self.get_object_or_none() self.check_permissions(request, 'import_item', project) - with without_signals((signals.post_save, "events_dispatcher_on_change")): - wiki_link = service.store_wiki_link(project, request.DATA) + wiki_link = service.store_wiki_link(project, request.DATA) errors = service.get_errors() if errors: diff --git a/taiga/export_import/dump_service.py b/taiga/export_import/dump_service.py index c972fa45..607de597 100644 --- a/taiga/export_import/dump_service.py +++ b/taiga/export_import/dump_service.py @@ -16,8 +16,6 @@ from django.db.models import signals -from taiga.base.utils.signals import without_signals - from . import serializers from . import service @@ -76,32 +74,30 @@ def dict_to_project(data, owner=None): if owner: data['owner'] = owner - with without_signals([signals.post_save, "project_post_save"]): - project_serialized = service.store_project(data) + project_serialized = service.store_project(data) - if not project_serialized: - raise TaigaImportError('error importing project') + if not project_serialized: + raise TaigaImportError('error importing project') - proj = project_serialized.object + proj = project_serialized.object - service.store_choices(proj, data, "points", serializers.PointsExportSerializer) - service.store_choices(proj, data, "issue_types", serializers.IssueTypeExportSerializer) - service.store_choices(proj, data, "issue_statuses", serializers.IssueStatusExportSerializer) - service.store_choices(proj, data, "us_statuses", serializers.UserStoryStatusExportSerializer) - service.store_choices(proj, data, "task_statuses", serializers.TaskStatusExportSerializer) - service.store_choices(proj, data, "priorities", serializers.PriorityExportSerializer) - service.store_choices(proj, data, "severities", serializers.SeverityExportSerializer) + service.store_choices(proj, data, "points", serializers.PointsExportSerializer) + service.store_choices(proj, data, "issue_types", serializers.IssueTypeExportSerializer) + service.store_choices(proj, data, "issue_statuses", serializers.IssueStatusExportSerializer) + service.store_choices(proj, data, "us_statuses", serializers.UserStoryStatusExportSerializer) + service.store_choices(proj, data, "task_statuses", serializers.TaskStatusExportSerializer) + service.store_choices(proj, data, "priorities", serializers.PriorityExportSerializer) + service.store_choices(proj, data, "severities", serializers.SeverityExportSerializer) - if service.get_errors(clear=False): - raise TaigaImportError('error importing choices') + if service.get_errors(clear=False): + raise TaigaImportError('error importing choices') - service.store_default_choices(proj, data) + service.store_default_choices(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing default choices') - with without_signals([signals.post_save, "role_post_save"]): - service.store_roles(proj, data) + service.store_roles(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing roles') @@ -121,38 +117,32 @@ def dict_to_project(data, owner=None): if service.get_errors(clear=False): raise TaigaImportError('error importing memberships') - with without_signals((signals.post_save, "events_dispatcher_on_change")): - store_milestones(proj, data) + store_milestones(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing milestones') - with without_signals((signals.post_save, "events_dispatcher_on_change")): - store_wiki_pages(proj, data) + store_wiki_pages(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing wiki pages') - with without_signals((signals.post_save, "events_dispatcher_on_change")): - store_wiki_links(proj, data) + store_wiki_links(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing wiki links') - with without_signals((signals.post_save, "events_dispatcher_on_change", "user_story_create_role_points_handler", "refus")): - store_user_stories(proj, data) + store_user_stories(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing user stories') - with without_signals((signals.post_save, "events_dispatcher_on_change", "refissue")): - store_issues(proj, data) + store_issues(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing issues') - with without_signals((signals.post_save, "events_dispatcher_on_change", "reftask")): - store_tasks(proj, data) + store_tasks(proj, data) if service.get_errors(clear=False): raise TaigaImportError('error importing issues') diff --git a/taiga/projects/references/models.py b/taiga/projects/references/models.py index 8dfbdd66..8832034c 100644 --- a/taiga/projects/references/models.py +++ b/taiga/projects/references/models.py @@ -81,7 +81,7 @@ def delete_sequence(sender, instance, **kwargs): def attach_sequence(sender, instance, created, **kwargs): - if created: + if created and not instance._importing: # Create a reference object. This operation should be # used in transaction context, otherwise it can # create a lot of phantom reference objects.