From a3f642d160820470d96ed5ff898fa3383b769122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 17 Jun 2016 11:41:58 +0200 Subject: [PATCH] [Backport] Fixing timeline exportation --- taiga/export_import/serializers/fields.py | 16 ++++++++++++++++ taiga/export_import/serializers/serializers.py | 5 +++-- taiga/export_import/services/store.py | 3 ++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/taiga/export_import/serializers/fields.py b/taiga/export_import/serializers/fields.py index f2ca8841..64c01436 100644 --- a/taiga/export_import/serializers/fields.py +++ b/taiga/export_import/serializers/fields.py @@ -25,6 +25,7 @@ from django.core.files.base import ContentFile from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ValidationError from django.utils.translation import ugettext as _ +from django.contrib.contenttypes.models import ContentType from taiga.base.api import serializers from taiga.base.fields import JsonField @@ -68,6 +69,21 @@ class FileField(serializers.WritableField): return ContentFile(decoded_data, name=data['name']) +class ContentTypeField(serializers.RelatedField): + read_only = False + + def to_native(self, obj): + if obj: + return [obj.app_label, obj.model] + return None + + def from_native(self, data): + try: + return ContentType.objects.get_by_natural_key(*data) + except Exception: + return None + + class RelatedNoneSafeField(serializers.RelatedField): def field_from_native(self, data, files, field_name, into): if self.read_only: diff --git a/taiga/export_import/serializers/serializers.py b/taiga/export_import/serializers/serializers.py index e7a2af76..7cf46cba 100644 --- a/taiga/export_import/serializers/serializers.py +++ b/taiga/export_import/serializers/serializers.py @@ -40,7 +40,7 @@ from taiga.projects.votes import services as votes_service from .fields import (FileField, RelatedNoneSafeField, UserRelatedField, UserPkField, CommentField, ProjectRelatedField, HistoryUserField, HistoryValuesField, HistoryDiffField, - TimelineDataField) + TimelineDataField, ContentTypeField) from .mixins import (HistoryExportSerializerMixin, AttachmentExportSerializerMixin, CustomAttributesValuesExportSerializerMixin, @@ -317,9 +317,10 @@ class WikiLinkExportSerializer(serializers.ModelSerializer): class TimelineExportSerializer(serializers.ModelSerializer): data = TimelineDataField() + data_content_type = ContentTypeField() class Meta: model = timeline_models.Timeline - exclude = ('id', 'project', 'namespace', 'object_id') + exclude = ('id', 'project', 'namespace', 'object_id', 'content_type') class ProjectExportSerializer(WatcheableObjectModelSerializerMixin): diff --git a/taiga/export_import/services/store.py b/taiga/export_import/services/store.py index c7888ce4..5d71c445 100644 --- a/taiga/export_import/services/store.py +++ b/taiga/export_import/services/store.py @@ -577,6 +577,7 @@ def _store_timeline_entry(project, timeline): serialized.object.project = project serialized.object.namespace = build_project_namespace(project) serialized.object.object_id = project.id + serialized.object.content_type = ContentType.objects.get_for_model(project.__class__) serialized.object._importing = True serialized.save() return serialized @@ -725,7 +726,7 @@ def store_project_from_dict(data, owner=None): except err.TaigaImportError: # reraise known inport errors raise - except: + except Exception: # reise unknown errors as import error raise err.TaigaImportError(_("unexpected error importing project"), project)