docker compose -f docker-compose-local.yml exec -T api python - <<'PY'
import os, uuid
from django.utils import timezone
from django.contrib.auth.hashers import make_password
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "plane.settings.local")
import django; django.setup()
from plane.db.models.api import APIToken
from plane.db.models.project import Project, ProjectIdentifier, ProjectMember
from plane.db.models.state import State
from plane.db.models.user import User
from plane.db.models.workspace import Workspace, WorkspaceMember
from plane.db.models.webhook import Webhook, ProjectWebhook
from plane.db.models.issue_type import IssueType, ProjectIssueType
from plane.license.models import Instance, InstanceAdmin
email, password, slug, identifier = "admin@example.com", "Passw0rd!", "test-workspace", "TST"
instance, _ = Instance.objects.get_or_create(
defaults={
"instance_name": "Local Instance",
"instance_id": uuid.uuid4().hex,
"current_version": "0.0.0",
"last_checked_at": timezone.now(),
}
)
instance.is_setup_done = True
instance.save()
user, _ = User.objects.get_or_create(
email=email,
defaults={
"username": uuid.uuid4().hex,
"first_name": "Admin",
"last_name": "User",
"password": make_password(password),
"is_active": True,
"is_superuser": True,
},
)
InstanceAdmin.objects.get_or_create(user=user, instance=instance)
workspace, _ = Workspace.objects.get_or_create(
slug=slug,
defaults={"name": "Test Workspace", "owner": user},
)
WorkspaceMember.objects.get_or_create(workspace=workspace, member=user, defaults={"role": 20})
project, _ = Project.objects.get_or_create(
workspace=workspace,
identifier=identifier,
defaults={"name": "Test Project"},
)
ProjectIdentifier.objects.get_or_create(project=project, defaults={"workspace": workspace, "name": identifier})
ProjectMember.objects.get_or_create(project=project, member=user, defaults={"role": 20})
state, _ = State.objects.get_or_create(
workspace=workspace,
project=project,
name="Todo",
defaults={"color": "#FF0000", "group": "backlog", "default": True},
)
if project.default_state_id != state.id:
project.default_state = state
project.save(update_fields=["default_state"])
issue_type, _ = IssueType.objects.get_or_create(
workspace=workspace,
name="Task",
defaults={"is_default": True},
)
ProjectIssueType.objects.get_or_create(project=project, issue_type=issue_type, defaults={"is_default": True})
webhook, _ = Webhook.objects.get_or_create(
workspace=workspace,
url="http://plane-webhook-receiver:8888/webhook",
defaults={"is_active": True, "issue": True, "is_internal": True},
)
ProjectWebhook.objects.get_or_create(project=project, webhook=webhook)
token, _ = APIToken.objects.get_or_create(
user=user,
workspace=workspace,
defaults={"label": "local-test"},
)
print("API_TOKEN:", token.token)
print("WORKSPACE_SLUG:", slug)
print("PROJECT_ID:", project.id)
PY
Is there an existing issue for this?
Current behavior
Issue deletion webhooks never fire (create/update work). External integrations such as Mattermost only receive the
issue.createdevent; the delete action is missing. Confirmed on branche8bdc47d6af6c39454a795a59098c0f2c34330a8using the Docker local stack (docker-compose-local.yml). Databasewebhook_logsshows onlyaction = 'created'; the delete event is absent.Verification query:
Output:
Steps to reproduce
Checkout a fresh workspace
Seed a minimal workspace/project/webhook (inside
apicontainer)Note the
API_TOKEN,WORKSPACE_SLUG, andPROJECT_IDprinted here.Run a simple webhook receiver (new terminal)
Create / update / delete an issue via API
Inspect the webhook receiver
It prints a payload for the create; nothing arrives for the delete.
Double-check
webhook_logsOutput only shows
action = 'created', nodeletedrow.Environment
Production
Browser
Google Chrome
Variant
Self-hosted
Version
v1.0.0