mirror of
https://github.com/mattermost/mattermost.git
synced 2026-02-03 20:40:00 -05:00
Go side: - Log hooks returned by Implemented() - Log each hook name -> ID mapping - Log OnActivate implementation status - Log OnActivate call flow Python side: - Log Implemented() return value - Log OnActivate gRPC receipt and handler invocation This is temporary debug logging to diagnose why OnActivate isn't being called for Python plugins. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
179 lines
5.2 KiB
Python
179 lines
5.2 KiB
Python
# Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
# See LICENSE.txt for license information.
|
|
|
|
"""
|
|
Preference API methods mixin for PluginAPIClient.
|
|
|
|
This module provides all user preference-related API methods including:
|
|
- Get preferences
|
|
- Update preferences
|
|
- Delete preferences
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import List, Optional, TYPE_CHECKING
|
|
|
|
import grpc
|
|
|
|
from mattermost_plugin._internal.wrappers import Preference
|
|
from mattermost_plugin.exceptions import convert_grpc_error, convert_app_error
|
|
|
|
if TYPE_CHECKING:
|
|
from mattermost_plugin.grpc import api_pb2_grpc
|
|
|
|
|
|
class PreferencesMixin:
|
|
"""Mixin providing preference-related API methods."""
|
|
|
|
# These will be provided by the main client class
|
|
_stub: Optional["api_pb2_grpc.PluginAPIStub"]
|
|
|
|
def _ensure_connected(self) -> "api_pb2_grpc.PluginAPIStub":
|
|
"""Ensure connected and return stub - implemented by main client."""
|
|
raise NotImplementedError
|
|
|
|
# =========================================================================
|
|
# Preference Methods
|
|
# =========================================================================
|
|
|
|
def get_preference_for_user(
|
|
self, user_id: str, category: str, name: str
|
|
) -> Preference:
|
|
"""
|
|
Get a specific preference for a user.
|
|
|
|
Args:
|
|
user_id: ID of the user.
|
|
category: Preference category.
|
|
name: Preference name.
|
|
|
|
Returns:
|
|
The Preference object.
|
|
|
|
Raises:
|
|
NotFoundError: If preference does not exist.
|
|
PluginAPIError: If the API call fails.
|
|
"""
|
|
stub = self._ensure_connected()
|
|
|
|
from mattermost_plugin.grpc import api_remaining_pb2
|
|
|
|
request = api_remaining_pb2.GetPreferenceForUserRequest(
|
|
user_id=user_id,
|
|
category=category,
|
|
name=name,
|
|
)
|
|
|
|
try:
|
|
response = stub.GetPreferenceForUser(request)
|
|
|
|
if response.HasField("error") and response.error.id:
|
|
raise convert_app_error(response.error)
|
|
|
|
return Preference.from_proto(response.preference)
|
|
|
|
except grpc.RpcError as e:
|
|
raise convert_grpc_error(e) from e
|
|
|
|
def get_preferences_for_user(self, user_id: str) -> List[Preference]:
|
|
"""
|
|
Get all preferences for a user.
|
|
|
|
Args:
|
|
user_id: ID of the user.
|
|
|
|
Returns:
|
|
List of Preference objects.
|
|
|
|
Raises:
|
|
NotFoundError: If user does not exist.
|
|
PluginAPIError: If the API call fails.
|
|
"""
|
|
stub = self._ensure_connected()
|
|
|
|
from mattermost_plugin.grpc import api_remaining_pb2
|
|
|
|
request = api_remaining_pb2.GetPreferencesForUserRequest(user_id=user_id)
|
|
|
|
try:
|
|
response = stub.GetPreferencesForUser(request)
|
|
|
|
if response.HasField("error") and response.error.id:
|
|
raise convert_app_error(response.error)
|
|
|
|
return [Preference.from_proto(p) for p in response.preferences]
|
|
|
|
except grpc.RpcError as e:
|
|
raise convert_grpc_error(e) from e
|
|
|
|
def update_preferences_for_user(
|
|
self, user_id: str, preferences: List[Preference]
|
|
) -> None:
|
|
"""
|
|
Update preferences for a user.
|
|
|
|
Args:
|
|
user_id: ID of the user.
|
|
preferences: List of preferences to update.
|
|
|
|
Raises:
|
|
NotFoundError: If user does not exist.
|
|
ValidationError: If preferences are invalid.
|
|
PluginAPIError: If the API call fails.
|
|
|
|
Example:
|
|
>>> prefs = [
|
|
... Preference(user_id="u1", category="theme", name="dark", value="true")
|
|
... ]
|
|
>>> client.update_preferences_for_user("u1", prefs)
|
|
"""
|
|
stub = self._ensure_connected()
|
|
|
|
from mattermost_plugin.grpc import api_remaining_pb2
|
|
|
|
request = api_remaining_pb2.UpdatePreferencesForUserRequest(
|
|
user_id=user_id,
|
|
preferences=[p.to_proto() for p in preferences],
|
|
)
|
|
|
|
try:
|
|
response = stub.UpdatePreferencesForUser(request)
|
|
|
|
if response.HasField("error") and response.error.id:
|
|
raise convert_app_error(response.error)
|
|
|
|
except grpc.RpcError as e:
|
|
raise convert_grpc_error(e) from e
|
|
|
|
def delete_preferences_for_user(
|
|
self, user_id: str, preferences: List[Preference]
|
|
) -> None:
|
|
"""
|
|
Delete preferences for a user.
|
|
|
|
Args:
|
|
user_id: ID of the user.
|
|
preferences: List of preferences to delete (category and name required).
|
|
|
|
Raises:
|
|
NotFoundError: If user does not exist.
|
|
PluginAPIError: If the API call fails.
|
|
"""
|
|
stub = self._ensure_connected()
|
|
|
|
from mattermost_plugin.grpc import api_remaining_pb2
|
|
|
|
request = api_remaining_pb2.DeletePreferencesForUserRequest(
|
|
user_id=user_id,
|
|
preferences=[p.to_proto() for p in preferences],
|
|
)
|
|
|
|
try:
|
|
response = stub.DeletePreferencesForUser(request)
|
|
|
|
if response.HasField("error") and response.error.id:
|
|
raise convert_app_error(response.error)
|
|
|
|
except grpc.RpcError as e:
|
|
raise convert_grpc_error(e) from e
|