Files
dify-plugin-sdks/python/examples/github_trigger/triggers/pull_request_unassigned.py
T
Harry c67ef57f10 feat(trigger): introduce new error class and enhance event payload handling
- Added `TriggerIgnoreEventError` to handle cases where events should be ignored based on filter criteria.
- Updated various GitHub trigger files to return relevant payload fields directly, improving data accessibility for event handling.
- Enhanced the handling of event filtering in triggers to ensure only relevant events are processed.

These changes improve the robustness and clarity of the GitHub trigger integration, allowing for better error management and data handling.
2025-09-19 13:17:59 +08:00

84 lines
3.3 KiB
Python

from collections.abc import Mapping
from typing import Any
from werkzeug import Request
from dify_plugin.entities.trigger import Event
from dify_plugin.errors.trigger import TriggerIgnoreEventError
from dify_plugin.interfaces.trigger import TriggerEvent
class PullRequestUnassignedTrigger(TriggerEvent):
"""
GitHub Pull Request Pull Request Unassigned Event Trigger
This trigger handles GitHub pull request unassigned events and extracts relevant
information from the webhook payload to provide as variables to the workflow.
"""
def _trigger(self, request: Request, parameters: Mapping[str, Any]) -> Event:
"""
Handle GitHub pull request unassigned event trigger
Parameters:
- pr_filter: Filter by specific PR number (optional)
"""
# Get the event payload
payload = request.get_json()
if not payload:
raise ValueError("No payload received")
# Verify this is a unassigned action
action = payload.get("action", "")
if action != "unassigned":
# This trigger only handles unassigned events
raise TriggerIgnoreEventError(f"Action \'{action}\' is not \'unassigned\'")
# Extract pull request information
pull_request = payload.get("pull_request", {})
repository = payload.get("repository", {})
sender = payload.get("sender", {})
# Apply PR number filter if specified
pr_filter = parameters.get("pr_filter")
if pr_filter is not None:
pr_number = pull_request.get("number")
if pr_number != int(pr_filter):
# Skip this event if it doesn't match the PR filter
raise TriggerIgnoreEventError("Event does not match filter criteria")
# Build variables for the workflow
variables = {
"pull_request": {
"number": pull_request.get("number"),
"title": pull_request.get("title", ""),
"body": pull_request.get("body", ""),
"state": pull_request.get("state", ""),
"html_url": pull_request.get("html_url", ""),
"author": {
"login": pull_request.get("user", {}).get("login", ""),
"avatar_url": pull_request.get("user", {}).get("avatar_url", ""),
"html_url": pull_request.get("user", {}).get("html_url", ""),
},
},
"repository": {
"name": repository.get("name", ""),
"full_name": repository.get("full_name", ""),
"html_url": repository.get("html_url", ""),
"description": repository.get("description", ""),
"private": repository.get("private", False),
"owner": {
"login": repository.get("owner", {}).get("login", ""),
"avatar_url": repository.get("owner", {}).get("avatar_url", ""),
"html_url": repository.get("owner", {}).get("html_url", ""),
},
},
"sender": {
"login": sender.get("login", ""),
"avatar_url": sender.get("avatar_url", ""),
"html_url": sender.get("html_url", ""),
"type": sender.get("type", ""),
},
}
return Event(variables=variables)