diff --git a/taiga/export_import/serializers.py b/taiga/export_import/serializers.py index ceb8263f..74df0cbc 100644 --- a/taiga/export_import/serializers.py +++ b/taiga/export_import/serializers.py @@ -43,7 +43,6 @@ from taiga.projects.wiki import models as wiki_models from taiga.projects.history import models as history_models from taiga.projects.attachments import models as attachments_models from taiga.timeline import models as timeline_models -from taiga.timeline import service as timeline_service from taiga.users import models as users_models from taiga.projects.notifications import services as notifications_services from taiga.projects.votes import services as votes_service @@ -674,12 +673,7 @@ class ProjectExportSerializer(WatcheableObjectModelSerializer): issues = IssueExportSerializer(many=True, required=False) wiki_links = WikiLinkExportSerializer(many=True, required=False) wiki_pages = WikiPageExportSerializer(many=True, required=False) - timeline = serializers.SerializerMethodField("get_timeline") class Meta: model = projects_models.Project exclude = ('id', 'creation_template', 'members') - - def get_timeline(self, obj): - timeline_qs = timeline_service.get_project_timeline(obj) - return TimelineExportSerializer(timeline_qs, many=True).data diff --git a/taiga/export_import/service.py b/taiga/export_import/service.py index fe1fafec..f4f5326d 100644 --- a/taiga/export_import/service.py +++ b/taiga/export_import/service.py @@ -31,7 +31,7 @@ from django.core.files.storage import default_storage from taiga.base.utils import json from taiga.projects.history.services import make_key_from_model_object, take_snapshot -from taiga.timeline.service import build_project_namespace +from taiga.timeline.service import build_project_namespace, get_project_timeline from taiga.projects.references import sequences as seq from taiga.projects.references import models as refs from taiga.projects.userstories.models import RolePoints @@ -132,7 +132,22 @@ def render_project(project, outfile, chunk_size = 8190): value = field.field_to_native(project, field_name) outfile.write('"{}": {}'.format(field_name, json.dumps(value))) - outfile.write('}\n') + # Generate the timeline + outfile.write(',\n"timeline": [\n') + first_timeline = True + for timeline_item in get_project_timeline(project).iterator(): + # Avoid writing "," in the last element + if not first_timeline: + outfile.write(",\n") + else: + first_timeline = False + + dumped_value = json.dumps(serializers.TimelineExportSerializer(timeline_item).data) + outfile.write(dumped_value) + outfile.flush() + gc.collect() + + outfile.write(']}\n') def store_project(data):