diff --git a/taiga/projects/history/migrations/0010_historyentry_project.py b/taiga/projects/history/migrations/0010_historyentry_project.py new file mode 100644 index 00000000..0949a9a8 --- /dev/null +++ b/taiga/projects/history/migrations/0010_historyentry_project.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-06-24 12:19 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0048_auto_20160615_1508'), + ('history', '0009_auto_20160512_1110'), + ] + + operations = [ + migrations.AddField( + model_name='historyentry', + name='project', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='projects.Project'), + ), + ] diff --git a/taiga/projects/history/migrations/0011_auto_20160629_1036.py b/taiga/projects/history/migrations/0011_auto_20160629_1036.py new file mode 100644 index 00000000..d3f1eb02 --- /dev/null +++ b/taiga/projects/history/migrations/0011_auto_20160629_1036.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-06-29 10:36 +from __future__ import unicode_literals + +from django.db import migrations +from taiga.projects.history.services import get_instance_from_key + + +def forward_func(apps, schema_editor): + HistoryEntry = apps.get_model("history", "HistoryEntry") + db_alias = schema_editor.connection.alias + for entry in HistoryEntry.objects.using(db_alias).all().iterator(): + instance = get_instance_from_key(entry.key) + if type(instance) == apps.get_model("projects", "Project"): + entry.project_id = instance.id + else: + entry.project_id = getattr(instance, 'project_id', None) + entry.save() + + HistoryEntry.objects.using(db_alias).filter(project_id__isnull=True).delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('history', '0010_historyentry_project'), + ] + + operations = [ + migrations.RunPython(forward_func, atomic=False), + ] diff --git a/taiga/projects/history/migrations/0012_auto_20160629_1036.py b/taiga/projects/history/migrations/0012_auto_20160629_1036.py new file mode 100644 index 00000000..549d7076 --- /dev/null +++ b/taiga/projects/history/migrations/0012_auto_20160629_1036.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-06-29 10:36 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('history', '0011_auto_20160629_1036'), + ] + + operations = [ + migrations.AlterField( + model_name='historyentry', + name='project', + field=models.ForeignKey(on_delete=models.deletion.CASCADE, to='projects.Project'), + ), + ] diff --git a/taiga/projects/history/models.py b/taiga/projects/history/models.py index ee4868b1..558c5c25 100644 --- a/taiga/projects/history/models.py +++ b/taiga/projects/history/models.py @@ -49,6 +49,7 @@ class HistoryEntry(models.Model): """ id = models.CharField(primary_key=True, max_length=255, unique=True, editable=False, default=_generate_uuid) + project = models.ForeignKey("projects.Project") user = JsonField(null=True, blank=True, default=None) created_at = models.DateTimeField(default=timezone.now) diff --git a/taiga/projects/history/services.py b/taiga/projects/history/services.py index d4df56a5..71b5bcf8 100644 --- a/taiga/projects/history/services.py +++ b/taiga/projects/history/services.py @@ -314,6 +314,7 @@ def take_snapshot(obj:object, *, comment:str="", user=None, delete:bool=False): # Determine history type if delete: entry_type = HistoryType.delete + need_real_snapshot = True elif new_fobj and not old_fobj: entry_type = HistoryType.create elif new_fobj and old_fobj: @@ -340,6 +341,7 @@ def take_snapshot(obj:object, *, comment:str="", user=None, delete:bool=False): kwargs = { "user": {"pk": user_id, "name": user_name}, + "project_id": getattr(obj, 'project_id', getattr(obj, 'id', None)), "key": key, "type": entry_type, "snapshot": fdiff.snapshot if need_real_snapshot else None, diff --git a/tests/integration/resources_permissions/test_history_resources.py b/tests/integration/resources_permissions/test_history_resources.py index f9df4a0d..bf659f69 100644 --- a/tests/integration/resources_permissions/test_history_resources.py +++ b/tests/integration/resources_permissions/test_history_resources.py @@ -110,6 +110,7 @@ def data_us(data): m = type("Models", (object,), {}) m.public_user_story = f.UserStoryFactory(project=data.public_project, ref=1) m.public_history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.public_project, comment="testing public", key=make_key_from_model_object(m.public_user_story), diff={}, @@ -117,12 +118,14 @@ def data_us(data): m.private_user_story1 = f.UserStoryFactory(project=data.private_project1, ref=5) m.private_history_entry1 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project1, comment="testing 1", key=make_key_from_model_object(m.private_user_story1), diff={}, user={"pk": data.project_member_with_perms.pk}) m.private_user_story2 = f.UserStoryFactory(project=data.private_project2, ref=9) m.private_history_entry2 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project2, comment="testing 2", key=make_key_from_model_object(m.private_user_story2), diff={}, @@ -347,6 +350,7 @@ def data_task(data): m = type("Models", (object,), {}) m.public_task = f.TaskFactory(project=data.public_project, ref=2) m.public_history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.public_project, comment="testing public", key=make_key_from_model_object(m.public_task), diff={}, @@ -354,12 +358,14 @@ def data_task(data): m.private_task1 = f.TaskFactory(project=data.private_project1, ref=6) m.private_history_entry1 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project1, comment="testing 1", key=make_key_from_model_object(m.private_task1), diff={}, user={"pk": data.project_member_with_perms.pk}) m.private_task2 = f.TaskFactory(project=data.private_project2, ref=10) m.private_history_entry2 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project2, comment="testing 2", key=make_key_from_model_object(m.private_task2), diff={}, @@ -584,6 +590,7 @@ def data_issue(data): m = type("Models", (object,), {}) m.public_issue = f.IssueFactory(project=data.public_project, ref=3) m.public_history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.public_project, comment="testing public", key=make_key_from_model_object(m.public_issue), diff={}, @@ -591,12 +598,14 @@ def data_issue(data): m.private_issue1 = f.IssueFactory(project=data.private_project1, ref=7) m.private_history_entry1 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project1, comment="testing 1", key=make_key_from_model_object(m.private_issue1), diff={}, user={"pk": data.project_member_with_perms.pk}) m.private_issue2 = f.IssueFactory(project=data.private_project2, ref=11) m.private_history_entry2 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project2, comment="testing 2", key=make_key_from_model_object(m.private_issue2), diff={}, @@ -821,6 +830,7 @@ def data_wiki(data): m = type("Models", (object,), {}) m.public_wiki = f.WikiPageFactory(project=data.public_project, slug=4) m.public_history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.public_project, comment="testing public", key=make_key_from_model_object(m.public_wiki), diff={}, @@ -828,12 +838,14 @@ def data_wiki(data): m.private_wiki1 = f.WikiPageFactory(project=data.private_project1, slug=8) m.private_history_entry1 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project1, comment="testing 1", key=make_key_from_model_object(m.private_wiki1), diff={}, user={"pk": data.project_member_with_perms.pk}) m.private_wiki2 = f.WikiPageFactory(project=data.private_project2, slug=12) m.private_history_entry2 = f.HistoryEntryFactory.create(type=HistoryType.change, + project=data.private_project2, comment="testing 2", key=make_key_from_model_object(m.private_wiki2), diff={}, diff --git a/tests/integration/test_history.py b/tests/integration/test_history.py index f53c03b9..cc6d8d43 100644 --- a/tests/integration/test_history.py +++ b/tests/integration/test_history.py @@ -228,6 +228,7 @@ def test_delete_comment_by_project_owner(client): f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) key = make_key_from_model_object(us) history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=project, comment="testing", key=key, diff={}, @@ -246,6 +247,7 @@ def test_edit_comment(client): f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) key = make_key_from_model_object(us) history_entry = f.HistoryEntryFactory.create(type=HistoryType.change, + project=project, comment="testing", key=key, diff={}, @@ -278,6 +280,7 @@ def test_get_comment_versions(client): f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) key = make_key_from_model_object(us) history_entry = f.HistoryEntryFactory.create( + project=project, type=HistoryType.change, comment="testing", key=key, @@ -307,6 +310,7 @@ def test_get_comment_versions_from_history_entry_without_comment(client): f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) key = make_key_from_model_object(us) history_entry = f.HistoryEntryFactory.create( + project=project, type=HistoryType.change, key=key, diff={}, diff --git a/tests/integration/test_notifications.py b/tests/integration/test_notifications.py index 71126b0f..661b68ff 100644 --- a/tests/integration/test_notifications.py +++ b/tests/integration/test_notifications.py @@ -354,6 +354,7 @@ def test_send_notifications_using_services_method_for_user_stories(settings, mai us = f.UserStoryFactory.create(project=project, owner=member2.user) history_change = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.change, @@ -363,6 +364,7 @@ def test_send_notifications_using_services_method_for_user_stories(settings, mai ) history_create = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.create, @@ -372,6 +374,7 @@ def test_send_notifications_using_services_method_for_user_stories(settings, mai ) history_delete = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="test:delete", type=HistoryType.delete, @@ -446,6 +449,7 @@ def test_send_notifications_using_services_method_for_tasks(settings, mail): task = f.TaskFactory.create(project=project, owner=member2.user) history_change = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.change, @@ -455,6 +459,7 @@ def test_send_notifications_using_services_method_for_tasks(settings, mail): ) history_create = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.create, @@ -464,6 +469,7 @@ def test_send_notifications_using_services_method_for_tasks(settings, mail): ) history_delete = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="test:delete", type=HistoryType.delete, @@ -538,6 +544,7 @@ def test_send_notifications_using_services_method_for_issues(settings, mail): issue = f.IssueFactory.create(project=project, owner=member2.user) history_change = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.change, @@ -547,6 +554,7 @@ def test_send_notifications_using_services_method_for_issues(settings, mail): ) history_create = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.create, @@ -556,6 +564,7 @@ def test_send_notifications_using_services_method_for_issues(settings, mail): ) history_delete = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="test:delete", type=HistoryType.delete, @@ -630,6 +639,7 @@ def test_send_notifications_using_services_method_for_wiki_pages(settings, mail) wiki = f.WikiPageFactory.create(project=project, owner=member2.user) history_change = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.change, @@ -639,6 +649,7 @@ def test_send_notifications_using_services_method_for_wiki_pages(settings, mail) ) history_create = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="", type=HistoryType.create, @@ -648,6 +659,7 @@ def test_send_notifications_using_services_method_for_wiki_pages(settings, mail) ) history_delete = f.HistoryEntryFactory.create( + project=project, user={"pk": member1.user.id}, comment="test:delete", type=HistoryType.delete, diff --git a/tests/integration/test_totals_projects.py b/tests/integration/test_totals_projects.py index e46c1b21..8d29d950 100644 --- a/tests/integration/test_totals_projects.py +++ b/tests/integration/test_totals_projects.py @@ -39,6 +39,7 @@ def test_project_totals_updated_on_activity(client): totals_updated_datetime = project.totals_updated_datetime us = f.UserStoryFactory.create(project=project, owner=project.owner) f.HistoryEntryFactory.create( + project=project, user={"pk": project.owner.id}, comment="", type=HistoryType.change, @@ -57,6 +58,7 @@ def test_project_totals_updated_on_activity(client): totals_updated_datetime = project.totals_updated_datetime f.HistoryEntryFactory.create( + project=project, user={"pk": project.owner.id}, comment="", type=HistoryType.change, @@ -75,6 +77,7 @@ def test_project_totals_updated_on_activity(client): totals_updated_datetime = project.totals_updated_datetime f.HistoryEntryFactory.create( + project=project, user={"pk": project.owner.id}, comment="", type=HistoryType.change, @@ -93,6 +96,7 @@ def test_project_totals_updated_on_activity(client): totals_updated_datetime = project.totals_updated_datetime f.HistoryEntryFactory.create( + project=project, user={"pk": project.owner.id}, comment="", type=HistoryType.change,