"""Knowledge Base plugin main class. Reference NON-asset plugin: contributes a model + blueprint + nav item but no AssetType (it is not an asset). Mirrors the notifications plugin. """ import json import logging from pathlib import Path from typing import List, Dict, Optional, Type from flask import Flask, Blueprint from shopdb.plugins.base import BasePlugin, PluginMeta from .models import KnowledgeBase from .api import knowledgebase_bp logger = logging.getLogger(__name__) class KnowledgeBasePlugin(BasePlugin): """Knowledge Base plugin - articles linking to external resources.""" def __init__(self): self._manifest = self._load_manifest() def _load_manifest(self) -> Dict: """Load plugin manifest from JSON file.""" manifest_path = Path(__file__).parent / 'manifest.json' if manifest_path.exists(): with open(manifest_path, 'r') as f: return json.load(f) return {} @property def meta(self) -> PluginMeta: """Return plugin metadata.""" return PluginMeta( name=self._manifest.get('name', 'knowledgebase'), version=self._manifest.get('version', '1.0.0'), description=self._manifest.get( 'description', 'Knowledge Base articles linking to external resources' ), author=self._manifest.get('author', 'ShopDB Team'), dependencies=self._manifest.get('dependencies', []), core_version=self._manifest.get('core_version', '>=0.1.0,<1.0.0'), api_prefix=self._manifest.get('api_prefix', '/api/knowledgebase'), ) def get_blueprint(self) -> Optional[Blueprint]: """Return Flask Blueprint with API routes.""" return knowledgebase_bp def get_models(self) -> List[Type]: """Return list of SQLAlchemy model classes.""" return [KnowledgeBase] def init_app(self, app: Flask, db_instance) -> None: """Initialize plugin with Flask app.""" logger.info(f"Knowledge Base plugin initialized (v{self.meta.version})") def get_navigation_items(self) -> List[Dict]: """Return navigation menu items.""" return [ { 'name': 'Knowledge Base', 'icon': 'book-open', 'route': '/knowledgebase', 'position': 35, 'section': 'information', }, ] def get_permissions(self) -> List: """Return the RBAC permissions this plugin owns.""" return [ ('kb.view', 'View knowledge base', 'knowledgebase'), ('kb.create', 'Create KB articles', 'knowledgebase'), ('kb.edit', 'Edit KB articles', 'knowledgebase'), ('kb.delete', 'Delete KB articles', 'knowledgebase'), ]