[Backport] Fixing memory leak on export related to timeline

remotes/origin/issue/4795/notification_even_they_are_disabled
Alejandro Alonso 2016-03-08 14:46:51 +01:00 committed by David Barragán Merino
parent b68935fa1d
commit 709bee710e
2 changed files with 17 additions and 8 deletions

View File

@ -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.history import models as history_models
from taiga.projects.attachments import models as attachments_models from taiga.projects.attachments import models as attachments_models
from taiga.timeline import models as timeline_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.users import models as users_models
from taiga.projects.notifications import services as notifications_services from taiga.projects.notifications import services as notifications_services
from taiga.projects.votes import services as votes_service from taiga.projects.votes import services as votes_service
@ -674,12 +673,7 @@ class ProjectExportSerializer(WatcheableObjectModelSerializer):
issues = IssueExportSerializer(many=True, required=False) issues = IssueExportSerializer(many=True, required=False)
wiki_links = WikiLinkExportSerializer(many=True, required=False) wiki_links = WikiLinkExportSerializer(many=True, required=False)
wiki_pages = WikiPageExportSerializer(many=True, required=False) wiki_pages = WikiPageExportSerializer(many=True, required=False)
timeline = serializers.SerializerMethodField("get_timeline")
class Meta: class Meta:
model = projects_models.Project model = projects_models.Project
exclude = ('id', 'creation_template', 'members') 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

View File

@ -31,7 +31,7 @@ from django.core.files.storage import default_storage
from taiga.base.utils import json from taiga.base.utils import json
from taiga.projects.history.services import make_key_from_model_object, take_snapshot 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 sequences as seq
from taiga.projects.references import models as refs from taiga.projects.references import models as refs
from taiga.projects.userstories.models import RolePoints 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) value = field.field_to_native(project, field_name)
outfile.write('"{}": {}'.format(field_name, json.dumps(value))) 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): def store_project(data):