diff --git a/taiga/projects/tagging/services.py b/taiga/projects/tagging/services.py index 747a3ecf..4e7fe1f7 100644 --- a/taiga/projects/tagging/services.py +++ b/taiga/projects/tagging/services.py @@ -36,24 +36,23 @@ def create_tag(project, tag, color): def edit_tag(project, from_tag, to_tag, color): sql = """ UPDATE userstories_userstory - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE tasks_task - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE issues_issue - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE epics_epic - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; """ - sql = sql.format(project_id=project.id, from_tag=from_tag, to_tag=to_tag) cursor = connection.cursor() - cursor.execute(sql) + cursor.execute(sql, params={"from_tag": from_tag, "to_tag": to_tag, "project_id": project.id}) tags_colors = dict(project.tags_colors) tags_colors.pop(from_tag) @@ -71,24 +70,23 @@ def rename_tag(project, from_tag, to_tag, **kwargs): color = dict(project.tags_colors)[from_tag] sql = """ UPDATE userstories_userstory - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE tasks_task - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE issues_issue - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; UPDATE epics_epic - SET tags = array_distinct(array_replace(tags, '{from_tag}', '{to_tag}')) - WHERE project_id = {project_id}; + SET tags = array_distinct(array_replace(tags, %(from_tag)s, %(to_tag)s)) + WHERE project_id = %(project_id)s; """ - sql = sql.format(project_id=project.id, from_tag=from_tag, to_tag=to_tag, color=color) cursor = connection.cursor() - cursor.execute(sql) + cursor.execute(sql, params={"from_tag": from_tag, "to_tag": to_tag, "project_id": project.id}) tags_colors = dict(project.tags_colors) tags_colors.pop(from_tag) @@ -100,24 +98,23 @@ def rename_tag(project, from_tag, to_tag, **kwargs): def delete_tag(project, tag): sql = """ UPDATE userstories_userstory - SET tags = array_remove(tags, '{tag}') - WHERE project_id = {project_id}; + SET tags = array_remove(tags, %(tag)s) + WHERE project_id = %(project_id)s; UPDATE tasks_task - SET tags = array_remove(tags, '{tag}') - WHERE project_id = {project_id}; + SET tags = array_remove(tags, %(tag)s) + WHERE project_id = %(project_id)s; UPDATE issues_issue - SET tags = array_remove(tags, '{tag}') - WHERE project_id = {project_id}; + SET tags = array_remove(tags, %(tag)s) + WHERE project_id = %(project_id)s; UPDATE epics_epic - SET tags = array_remove(tags, '{tag}') - WHERE project_id = {project_id}; + SET tags = array_remove(tags, %(tag)s) + WHERE project_id = %(project_id)s; """ - sql = sql.format(project_id=project.id, tag=tag) cursor = connection.cursor() - cursor.execute(sql) + cursor.execute(sql, params={"tag": tag, "project_id": project.id}) tags_colors = dict(project.tags_colors) del tags_colors[tag] diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index 7d90d7b0..bd4fbac8 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -1915,19 +1915,19 @@ def test_create_tag_without_color(client, settings): def test_edit_tag_only_name(client, settings): user = f.UserFactory.create() - project = f.ProjectFactory.create(owner=user, tags_colors=[("tag", "#123123")]) - user_story = f.UserStoryFactory.create(project=project, tags=["tag"]) - task = f.TaskFactory.create(project=project, tags=["tag"]) - issue = f.IssueFactory.create(project=project, tags=["tag"]) - epic = f.EpicFactory.create(project=project, tags=["tag"]) + project = f.ProjectFactory.create(owner=user, tags_colors=[("tag'1", "#123123")]) + user_story = f.UserStoryFactory.create(project=project, tags=["tag'1"]) + task = f.TaskFactory.create(project=project, tags=["tag'1"]) + issue = f.IssueFactory.create(project=project, tags=["tag'1"]) + epic = f.EpicFactory.create(project=project, tags=["tag'1"]) role = f.RoleFactory.create(project=project, permissions=["view_project"]) membership = f.MembershipFactory.create(project=project, user=user, role=role, is_admin=True) url = reverse("projects-edit-tag", args=(project.id,)) client.login(user) data = { - "from_tag": "tag", - "to_tag": "renamed_tag" + "from_tag": "tag'1", + "to_tag": "renamed_tag'1" } client.login(user) @@ -1935,15 +1935,15 @@ def test_edit_tag_only_name(client, settings): assert response.status_code == 200 project = Project.objects.get(id=project.pk) - assert project.tags_colors == [["renamed_tag", "#123123"]] + assert project.tags_colors == [["renamed_tag'1", "#123123"]] user_story = UserStory.objects.get(id=user_story.pk) - assert user_story.tags == ["renamed_tag"] + assert user_story.tags == ["renamed_tag'1"] task = Task.objects.get(id=task.pk) - assert task.tags == ["renamed_tag"] + assert task.tags == ["renamed_tag'1"] issue = Issue.objects.get(id=issue.pk) - assert issue.tags == ["renamed_tag"] + assert issue.tags == ["renamed_tag'1"] epic = Epic.objects.get(id=epic.pk) - assert epic.tags == ["renamed_tag"] + assert epic.tags == ["renamed_tag'1"] def test_edit_tag_only_color(client, settings): @@ -2013,18 +2013,18 @@ def test_edit_tag(client, settings): def test_delete_tag(client, settings): user = f.UserFactory.create() - project = f.ProjectFactory.create(owner=user, tags_colors=[("tag", "#123123")]) - user_story = f.UserStoryFactory.create(project=project, tags=["tag"]) - task = f.TaskFactory.create(project=project, tags=["tag"]) - issue = f.IssueFactory.create(project=project, tags=["tag"]) - epic = f.EpicFactory.create(project=project, tags=["tag"]) + project = f.ProjectFactory.create(owner=user, tags_colors=[("tag'1", "#123123")]) + user_story = f.UserStoryFactory.create(project=project, tags=["tag'1"]) + task = f.TaskFactory.create(project=project, tags=["tag'1"]) + issue = f.IssueFactory.create(project=project, tags=["tag'1"]) + epic = f.EpicFactory.create(project=project, tags=["tag'1"]) role = f.RoleFactory.create(project=project, permissions=["view_project"]) membership = f.MembershipFactory.create(project=project, user=user, role=role, is_admin=True) url = reverse("projects-delete-tag", args=(project.id,)) client.login(user) data = { - "tag": "tag" + "tag": "tag'1" } client.login(user) @@ -2044,18 +2044,18 @@ def test_delete_tag(client, settings): def test_mix_tags(client, settings): user = f.UserFactory.create() - project = f.ProjectFactory.create(owner=user, tags_colors=[("tag1", "#123123"), ("tag2", "#123123"), ("tag3", "#123123")]) - user_story = f.UserStoryFactory.create(project=project, tags=["tag1", "tag3"]) + project = f.ProjectFactory.create(owner=user, tags_colors=[("tag'1", "#123123"), ("tag2", "#123123"), ("tag3", "#123123")]) + user_story = f.UserStoryFactory.create(project=project, tags=["tag'1", "tag3"]) task = f.TaskFactory.create(project=project, tags=["tag2", "tag3"]) - issue = f.IssueFactory.create(project=project, tags=["tag1", "tag2", "tag3"]) - epic = f.EpicFactory.create(project=project, tags=["tag1", "tag2", "tag3"]) + issue = f.IssueFactory.create(project=project, tags=["tag'1", "tag2", "tag3"]) + epic = f.EpicFactory.create(project=project, tags=["tag'1", "tag2", "tag3"]) role = f.RoleFactory.create(project=project, permissions=["view_project"]) membership = f.MembershipFactory.create(project=project, user=user, role=role, is_admin=True) url = reverse("projects-mix-tags", args=(project.id,)) client.login(user) data = { - "from_tags": ["tag1", "tag2"], + "from_tags": ["tag'1", "tag2"], "to_tag": "tag2" }