# Copyright (c) 2023-present Plane Software, Inc. and contributors # SPDX-License-Identifier: AGPL-3.0-only # See the LICENSE file for details. import logging import os import uuid from typing import Dict, Any # third party imports from celery import shared_task from posthog import Posthog # module imports from plane.license.utils.instance_value import get_configuration_value from plane.utils.exception_logger import log_exception from plane.db.models import Workspace from plane.utils.analytics_events import USER_INVITED_TO_WORKSPACE, WORKSPACE_DELETED logger = logging.getLogger("plane.worker") def posthogConfiguration(): POSTHOG_API_KEY, POSTHOG_HOST = get_configuration_value( [ { "key": "POSTHOG_API_KEY", "default": os.environ.get("POSTHOG_API_KEY", None), }, { "key": "POSTHOG_HOST", "default": os.environ.get("POSTHOG_HOST", None), }, ] ) if POSTHOG_API_KEY and POSTHOG_HOST: return POSTHOG_API_KEY, POSTHOG_HOST else: return None, None def preprocess_data_properties( user_id: uuid.UUID, event_name: str, slug: str, data_properties: Dict[str, Any] ) -> Dict[str, Any]: if event_name == USER_INVITED_TO_WORKSPACE or event_name == WORKSPACE_DELETED: try: # Check if the current user is the workspace owner workspace = Workspace.objects.get(slug=slug) if str(workspace.owner_id) == str(user_id): data_properties["role"] = "owner" else: data_properties["role"] = "admin" except Workspace.DoesNotExist: logger.warning(f"Workspace {slug} does not exist while sending event {event_name} for user {user_id}") data_properties["role"] = "unknown" return data_properties @shared_task def track_event(user_id: uuid.UUID, event_name: str, slug: str, event_properties: Dict[str, Any]): POSTHOG_API_KEY, POSTHOG_HOST = posthogConfiguration() if not (POSTHOG_API_KEY and POSTHOG_HOST): logger.warning("Event tracking is not configured") return try: # preprocess the data properties for massaging the payload # in the correct format for posthog data_properties = preprocess_data_properties(user_id, event_name, slug, event_properties) groups = { "workspace": slug, } # track the event using posthog posthog = Posthog(POSTHOG_API_KEY, host=POSTHOG_HOST) posthog.capture(distinct_id=str(user_id), event=event_name, properties=data_properties, groups=groups) except Exception as e: log_exception(e) return False