mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
channel-folders: Update unique name constraint.
This commit updates code to require unique names for only non-archived folders in a realm, which means a folder can use a name which is being used by an archived folder.
This commit is contained in:
@@ -32,7 +32,7 @@ def check_channel_folder_name(name: str, realm: Realm) -> None:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ChannelFolder.objects.filter(name__iexact=name, realm=realm).exists():
|
if ChannelFolder.objects.filter(name__iexact=name, realm=realm, is_archived=False).exists():
|
||||||
raise JsonableError(_("Channel folder name already in use"))
|
raise JsonableError(_("Channel folder name already in use"))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 5.2.4 on 2025-07-29 09:55
|
||||||
|
|
||||||
|
import django.db.models.functions.text
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
("zerver", "0745_usersetting_web_left_sidebar_show_channel_folders"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name="channelfolder",
|
||||||
|
unique_together=set(),
|
||||||
|
),
|
||||||
|
migrations.AddConstraint(
|
||||||
|
model_name="channelfolder",
|
||||||
|
constraint=models.UniqueConstraint(
|
||||||
|
django.db.models.functions.text.Lower("name"),
|
||||||
|
models.F("realm"),
|
||||||
|
condition=models.Q(("is_archived", False)),
|
||||||
|
name="unique_realm_folder_name_when_not_archived",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import Q
|
||||||
|
from django.db.models.functions import Lower
|
||||||
from django.utils.timezone import now as timezone_now
|
from django.utils.timezone import now as timezone_now
|
||||||
|
|
||||||
from zerver.models.realms import Realm
|
from zerver.models.realms import Realm
|
||||||
@@ -19,4 +21,11 @@ class ChannelFolder(models.Model):
|
|||||||
is_archived = models.BooleanField(default=False)
|
is_archived = models.BooleanField(default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ("realm", "name")
|
constraints = [
|
||||||
|
models.UniqueConstraint(
|
||||||
|
Lower("name"),
|
||||||
|
"realm",
|
||||||
|
condition=Q(is_archived=False),
|
||||||
|
name="unique_realm_folder_name_when_not_archived",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from typing import Any
|
|||||||
|
|
||||||
import orjson
|
import orjson
|
||||||
|
|
||||||
from zerver.actions.channel_folders import check_add_channel_folder
|
from zerver.actions.channel_folders import check_add_channel_folder, do_archive_channel_folder
|
||||||
from zerver.actions.streams import do_change_stream_folder, do_deactivate_stream
|
from zerver.actions.streams import do_change_stream_folder, do_deactivate_stream
|
||||||
from zerver.lib.test_classes import ZulipTestCase
|
from zerver.lib.test_classes import ZulipTestCase
|
||||||
from zerver.models import ChannelFolder
|
from zerver.models import ChannelFolder
|
||||||
@@ -41,6 +41,14 @@ class ChannelFolderCreationTest(ZulipTestCase):
|
|||||||
result = self.client_post("/json/channel_folders/create", params)
|
result = self.client_post("/json/channel_folders/create", params)
|
||||||
self.assert_json_error(result, "Channel folder name already in use")
|
self.assert_json_error(result, "Channel folder name already in use")
|
||||||
|
|
||||||
|
# Archived folder names can be reused.
|
||||||
|
folder = ChannelFolder.objects.get(name="Frontend", realm=realm)
|
||||||
|
do_archive_channel_folder(folder, acting_user=self.example_user("iago"))
|
||||||
|
|
||||||
|
result = self.client_post("/json/channel_folders/create", params)
|
||||||
|
self.assert_json_success(result)
|
||||||
|
self.assertTrue(ChannelFolder.objects.filter(realm=realm, name="Frontend").exists())
|
||||||
|
|
||||||
# Folder names should be unique case-insensitively.
|
# Folder names should be unique case-insensitively.
|
||||||
params["name"] = "frontEND"
|
params["name"] = "frontEND"
|
||||||
result = self.client_post("/json/channel_folders/create", params)
|
result = self.client_post("/json/channel_folders/create", params)
|
||||||
|
|||||||
Reference in New Issue
Block a user