diff --git a/apiserver/plane/app/serializers/workspace.py b/apiserver/plane/app/serializers/workspace.py index 0a80ce8b7..2720c177a 100644 --- a/apiserver/plane/app/serializers/workspace.py +++ b/apiserver/plane/app/serializers/workspace.py @@ -21,6 +21,22 @@ class WorkSpaceSerializer(BaseSerializer): total_members = serializers.IntegerField(read_only=True) total_issues = serializers.IntegerField(read_only=True) + def validated(self, data): + if data.get("slug") in [ + "404", + "accounts", + "api", + "create-workspace", + "god-mode", + "installations", + "invitations", + "onboarding", + "profile", + "spaces", + "workspace-invitations", + ]: + raise serializers.ValidationError({"slug": "Slug is not valid"}) + class Meta: model = Workspace fields = "__all__" diff --git a/apiserver/plane/bgtasks/webhook_task.py b/apiserver/plane/bgtasks/webhook_task.py index 144f2f267..c9e0ddceb 100644 --- a/apiserver/plane/bgtasks/webhook_task.py +++ b/apiserver/plane/bgtasks/webhook_task.py @@ -153,10 +153,6 @@ def webhook_task(self, webhook, slug, event, event_data, action): retry_count=str(self.request.retries), ) - # Retry logic - if self.request.retries >= self.max_retries: - Webhook.objects.filter(pk=webhook.id).update(is_active=False) - return raise requests.RequestException() except Exception as e: diff --git a/apiserver/plane/db/migrations/0052_alter_workspace_slug.py b/apiserver/plane/db/migrations/0052_alter_workspace_slug.py new file mode 100644 index 000000000..8126c1fa3 --- /dev/null +++ b/apiserver/plane/db/migrations/0052_alter_workspace_slug.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.5 on 2023-11-23 14:57 + +from django.db import migrations, models +import plane.db.models.workspace + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0051_fileasset_is_deleted'), + ] + + operations = [ + migrations.AlterField( + model_name='workspace', + name='slug', + field=models.SlugField(max_length=48, unique=True, validators=[plane.db.models.workspace.slug_validator]), + ), + ] diff --git a/apiserver/plane/db/models/workspace.py b/apiserver/plane/db/models/workspace.py index cbf4d97df..505bfbcfa 100644 --- a/apiserver/plane/db/models/workspace.py +++ b/apiserver/plane/db/models/workspace.py @@ -1,6 +1,7 @@ # Django imports from django.db import models from django.conf import settings +from django.core.exceptions import ValidationError # Module imports from . import BaseModel @@ -50,7 +51,7 @@ def get_default_props(): "state": True, "sub_issue_count": True, "updated_on": True, - } + }, } @@ -63,6 +64,23 @@ def get_issue_props(): } +def slug_validator(value): + if value in [ + "404", + "accounts", + "api", + "create-workspace", + "god-mode", + "installations", + "invitations", + "onboarding", + "profile", + "spaces", + "workspace-invitations", + ]: + raise ValidationError("Slug is not valid") + + class Workspace(BaseModel): name = models.CharField(max_length=80, verbose_name="Workspace Name") logo = models.URLField(verbose_name="Logo", blank=True, null=True) @@ -71,7 +89,7 @@ class Workspace(BaseModel): on_delete=models.CASCADE, related_name="owner_workspace", ) - slug = models.SlugField(max_length=48, db_index=True, unique=True) + slug = models.SlugField(max_length=48, db_index=True, unique=True, validators=[slug_validator,]) organization_size = models.CharField(max_length=20, blank=True, null=True) def __str__(self):