mindroot 9.10.0__py3-none-any.whl → 9.12.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mindroot might be problematic. Click here for more details.
- mindroot/__init__.py +1 -0
- mindroot/coreplugins/__init__.py +2 -0
- mindroot/coreplugins/home/templates/home.jinja2 +1 -0
- mindroot/docs/Makefile +20 -0
- mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
- mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
- mindroot/docs/_build/doctrees/environment.pickle +0 -0
- mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
- mindroot/docs/_build/doctrees/index.doctree +0 -0
- mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
- mindroot/docs/_build/doctrees/installation.doctree +0 -0
- mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
- mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
- mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
- mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
- mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
- mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
- mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
- mindroot/docs/_build/html/.buildinfo +4 -0
- mindroot/docs/_build/html/.buildinfo.bak +4 -0
- mindroot/docs/_build/html/_images/envvar.png +0 -0
- mindroot/docs/_build/html/_images/files.png +0 -0
- mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
- mindroot/docs/_build/html/_images/mood.png +0 -0
- mindroot/docs/_build/html/_images/moon.png +0 -0
- mindroot/docs/_build/html/_images/openrouter.png +0 -0
- mindroot/docs/_build/html/_images/restart.png +0 -0
- mindroot/docs/_build/html/_modules/index.html +425 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
- mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
- mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
- mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
- mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
- mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
- mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
- mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
- mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
- mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
- mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
- mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
- mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
- mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
- mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
- mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
- mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
- mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
- mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- mindroot/docs/_build/html/_static/basic.css +906 -0
- mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/theme.css +4 -0
- mindroot/docs/_build/html/_static/custom.css +19 -0
- mindroot/docs/_build/html/_static/debug.css +69 -0
- mindroot/docs/_build/html/_static/doctools.js +149 -0
- mindroot/docs/_build/html/_static/documentation_options.js +13 -0
- mindroot/docs/_build/html/_static/file.png +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/jquery.js +2 -0
- mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
- mindroot/docs/_build/html/_static/js/theme.js +1 -0
- mindroot/docs/_build/html/_static/js/versions.js +228 -0
- mindroot/docs/_build/html/_static/language_data.js +192 -0
- mindroot/docs/_build/html/_static/minus.png +0 -0
- mindroot/docs/_build/html/_static/plus.png +0 -0
- mindroot/docs/_build/html/_static/pygments.css +232 -0
- mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
- mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
- mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
- mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
- mindroot/docs/_build/html/_static/searchtools.js +635 -0
- mindroot/docs/_build/html/_static/skeleton.css +296 -0
- mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
- mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
- mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
- mindroot/docs/_build/html/_static/styles/furo.css +2 -0
- mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
- mindroot/docs/_build/html/chat_with_assistant.html +329 -0
- mindroot/docs/_build/html/developer_documentation.html +338 -0
- mindroot/docs/_build/html/genindex.html +4690 -0
- mindroot/docs/_build/html/getting_started.html +423 -0
- mindroot/docs/_build/html/index.html +357 -0
- mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
- mindroot/docs/_build/html/installation.html +330 -0
- mindroot/docs/_build/html/llm_api_key.html +337 -0
- mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
- mindroot/docs/_build/html/objects.inv +0 -0
- mindroot/docs/_build/html/programming_task.html +326 -0
- mindroot/docs/_build/html/py-modindex.html +1307 -0
- mindroot/docs/_build/html/search.html +307 -0
- mindroot/docs/_build/html/searchindex.js +1 -0
- mindroot/docs/_build/html/source/ahp.html +302 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
- mindroot/docs/_build/html/source/mindroot.html +811 -0
- mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
- mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
- mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
- mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
- mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
- mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
- mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
- mindroot/docs/_build/html/source/modules.html +377 -0
- mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
- mindroot/docs/_build/html/starting_mindroot.html +325 -0
- mindroot/docs/_build/html/user_documentation.html +333 -0
- mindroot/docs/_static/custom.css +19 -0
- mindroot/docs/chat_with_assistant.rst +14 -0
- mindroot/docs/conf.py +54 -0
- mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
- mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
- mindroot/docs/data/equivalent_flags.json +1 -0
- mindroot/docs/data/mcp/servers.json +9 -0
- mindroot/docs/data/models.json +57 -0
- mindroot/docs/data/plugin_manifest.json +95 -0
- mindroot/docs/data/preferred_models.json +12 -0
- mindroot/docs/data/providers.json +62 -0
- mindroot/docs/developer_documentation.rst +26 -0
- mindroot/docs/envvar.png +0 -0
- mindroot/docs/files.png +0 -0
- mindroot/docs/getting_started.rst +139 -0
- mindroot/docs/index.rst +38 -0
- mindroot/docs/install_plugins_with_tools.rst +25 -0
- mindroot/docs/installation.rst +21 -0
- mindroot/docs/installopenrouter.png +0 -0
- mindroot/docs/llm_api_key.rst +22 -0
- mindroot/docs/llm_plugin_installation.rst +27 -0
- mindroot/docs/make.bat +35 -0
- mindroot/docs/mood.png +0 -0
- mindroot/docs/moon.png +0 -0
- mindroot/docs/openrouter.png +0 -0
- mindroot/docs/personas/local/Assistant/avatar.png +0 -0
- mindroot/docs/personas/local/Assistant/faceref.png +0 -0
- mindroot/docs/personas/local/Assistant/persona.json +7 -0
- mindroot/docs/programming_task.rst +10 -0
- mindroot/docs/restart.png +0 -0
- mindroot/docs/source/ahp.rst +7 -0
- mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
- mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
- mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
- mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
- mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
- mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
- mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
- mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
- mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
- mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.rst +35 -0
- mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
- mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
- mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
- mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
- mindroot/docs/source/mindroot.lib.auth.rst +29 -0
- mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
- mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
- mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
- mindroot/docs/source/mindroot.lib.providers.rst +61 -0
- mindroot/docs/source/mindroot.lib.rst +152 -0
- mindroot/docs/source/mindroot.registry.rst +29 -0
- mindroot/docs/source/mindroot.rst +54 -0
- mindroot/docs/source/modules.rst +7 -0
- mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
- mindroot/docs/starting_mindroot.rst +12 -0
- mindroot/docs/user_documentation.rst +16 -0
- mindroot/lib/plugins/default_plugin_manifest.json +1 -1
- mindroot/server.py +10 -1
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +418 -10
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
- {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1089 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
<!DOCTYPE html>
|
|
4
|
+
<html class="writer-html5" lang="en" data-content_root="../../../../">
|
|
5
|
+
<head>
|
|
6
|
+
<meta charset="utf-8" />
|
|
7
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
8
|
+
<title>mindroot.coreplugins.subscriptions.mod — MindRoot 9.10.0 documentation</title>
|
|
9
|
+
<link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
|
|
10
|
+
<link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
<script src="../../../../_static/jquery.js?v=5d32c60e"></script>
|
|
14
|
+
<script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
|
15
|
+
<script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
|
|
16
|
+
<script src="../../../../_static/doctools.js?v=9bcbadda"></script>
|
|
17
|
+
<script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
18
|
+
<script src="../../../../_static/js/theme.js"></script>
|
|
19
|
+
<link rel="index" title="Index" href="../../../../genindex.html" />
|
|
20
|
+
<link rel="search" title="Search" href="../../../../search.html" />
|
|
21
|
+
</head>
|
|
22
|
+
|
|
23
|
+
<body class="wy-body-for-nav">
|
|
24
|
+
<div class="wy-grid-for-nav">
|
|
25
|
+
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
|
26
|
+
<div class="wy-side-scroll">
|
|
27
|
+
<div class="wy-side-nav-search" style="background: #343131" >
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
<a href="../../../../index.html" class="icon icon-home">
|
|
32
|
+
MindRoot
|
|
33
|
+
</a>
|
|
34
|
+
<div role="search">
|
|
35
|
+
<form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
|
|
36
|
+
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
|
|
37
|
+
<input type="hidden" name="check_keywords" value="yes" />
|
|
38
|
+
<input type="hidden" name="area" value="default" />
|
|
39
|
+
</form>
|
|
40
|
+
</div>
|
|
41
|
+
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
|
42
|
+
<!-- Local TOC -->
|
|
43
|
+
<div class="local-toc"></div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</nav>
|
|
47
|
+
|
|
48
|
+
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
|
|
49
|
+
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
|
50
|
+
<a href="../../../../index.html">MindRoot</a>
|
|
51
|
+
</nav>
|
|
52
|
+
|
|
53
|
+
<div class="wy-nav-content">
|
|
54
|
+
<div class="rst-content">
|
|
55
|
+
<div role="navigation" aria-label="Page navigation">
|
|
56
|
+
<ul class="wy-breadcrumbs">
|
|
57
|
+
<li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
|
58
|
+
<li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
|
|
59
|
+
<li class="breadcrumb-item active">mindroot.coreplugins.subscriptions.mod</li>
|
|
60
|
+
<li class="wy-breadcrumbs-aside">
|
|
61
|
+
</li>
|
|
62
|
+
</ul>
|
|
63
|
+
<hr/>
|
|
64
|
+
</div>
|
|
65
|
+
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
|
66
|
+
<div itemprop="articleBody">
|
|
67
|
+
|
|
68
|
+
<h1>Source code for mindroot.coreplugins.subscriptions.mod</h1><div class="highlight"><pre>
|
|
69
|
+
<span></span><span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
|
|
70
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Any</span>
|
|
71
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
|
|
72
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">uuid</span>
|
|
73
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
|
|
74
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service</span>
|
|
75
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.commands</span><span class="w"> </span><span class="kn">import</span> <span class="n">command</span>
|
|
76
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.hooks</span><span class="w"> </span><span class="kn">import</span> <span class="n">hook</span>
|
|
77
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.utils.debug</span><span class="w"> </span><span class="kn">import</span> <span class="n">debug_box</span>
|
|
78
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">loguru</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
|
|
79
|
+
|
|
80
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">SubscriptionPlan</span><span class="p">,</span> <span class="n">UserSubscription</span><span class="p">,</span> <span class="n">PlanFeature</span><span class="p">,</span> <span class="n">PageTemplate</span>
|
|
81
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">.storage</span><span class="w"> </span><span class="kn">import</span> <span class="n">SubscriptionStorage</span>
|
|
82
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">.subscription_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">SubscriptionManager</span>
|
|
83
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">.credit_integration</span><span class="w"> </span><span class="kn">import</span> <span class="n">CreditIntegration</span>
|
|
84
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">.default_templates</span><span class="w"> </span><span class="kn">import</span> <span class="n">DEFAULT_HTML_TEMPLATE</span><span class="p">,</span> <span class="n">DEFAULT_CSS_TEMPLATE</span><span class="p">,</span> <span class="n">DEFAULT_JS_TEMPLATE</span>
|
|
85
|
+
|
|
86
|
+
<span class="c1"># Global components</span>
|
|
87
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="kc">None</span>
|
|
88
|
+
<span class="n">_credit_integration</span> <span class="o">=</span> <span class="kc">None</span>
|
|
89
|
+
|
|
90
|
+
<div class="viewcode-block" id="SubscriptionsPlugin">
|
|
91
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.SubscriptionsPlugin">[docs]</a>
|
|
92
|
+
<span class="k">class</span><span class="w"> </span><span class="nc">SubscriptionsPlugin</span><span class="p">:</span>
|
|
93
|
+
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
94
|
+
<span class="bp">self</span><span class="o">.</span><span class="n">base_path</span> <span class="o">=</span> <span class="n">base_path</span>
|
|
95
|
+
|
|
96
|
+
<div class="viewcode-block" id="SubscriptionsPlugin.create_components">
|
|
97
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.SubscriptionsPlugin.create_components">[docs]</a>
|
|
98
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">create_components</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
99
|
+
<span class="w"> </span><span class="sd">"""Create fresh instances of all subscription system components"""</span>
|
|
100
|
+
<span class="n">storage</span> <span class="o">=</span> <span class="n">SubscriptionStorage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_path</span><span class="p">)</span>
|
|
101
|
+
<span class="n">subscription_manager</span> <span class="o">=</span> <span class="n">SubscriptionManager</span><span class="p">(</span><span class="n">storage</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_path</span><span class="p">)</span>
|
|
102
|
+
<span class="n">credit_integration</span> <span class="o">=</span> <span class="n">CreditIntegration</span><span class="p">()</span>
|
|
103
|
+
<span class="k">return</span> <span class="n">storage</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">credit_integration</span></div>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
<div class="viewcode-block" id="get_base_path">
|
|
108
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_base_path">[docs]</a>
|
|
109
|
+
<span class="k">def</span><span class="w"> </span><span class="nf">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
|
110
|
+
<span class="w"> </span><span class="sd">"""Get the base path for subscription data storage"""</span>
|
|
111
|
+
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="s1">'data'</span> <span class="o">/</span> <span class="s1">'subscriptions'</span><span class="p">)</span></div>
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
<div class="viewcode-block" id="startup">
|
|
115
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.startup">[docs]</a>
|
|
116
|
+
<span class="nd">@hook</span><span class="p">()</span>
|
|
117
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">startup</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
118
|
+
<span class="w"> </span><span class="sd">"""Startup tasks"""</span>
|
|
119
|
+
<span class="c1"># Initialize components</span>
|
|
120
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
121
|
+
<span class="n">storage</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">credit_integration</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
122
|
+
|
|
123
|
+
<span class="c1"># Store components globally</span>
|
|
124
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span><span class="p">,</span> <span class="n">_credit_integration</span>
|
|
125
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
126
|
+
<span class="n">_credit_integration</span> <span class="o">=</span> <span class="n">credit_integration</span>
|
|
127
|
+
|
|
128
|
+
<span class="c1"># Initialize default features if none exist</span>
|
|
129
|
+
<span class="n">features</span> <span class="o">=</span> <span class="k">await</span> <span class="n">storage</span><span class="o">.</span><span class="n">get_all_features</span><span class="p">(</span><span class="n">active_only</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
130
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">features</span><span class="p">:</span>
|
|
131
|
+
<span class="k">await</span> <span class="n">initialize_default_features</span><span class="p">(</span><span class="n">storage</span><span class="p">)</span>
|
|
132
|
+
|
|
133
|
+
<span class="c1"># Initialize default template if none exist</span>
|
|
134
|
+
<span class="n">templates</span> <span class="o">=</span> <span class="k">await</span> <span class="n">storage</span><span class="o">.</span><span class="n">get_all_templates</span><span class="p">()</span>
|
|
135
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">templates</span><span class="p">:</span>
|
|
136
|
+
<span class="k">await</span> <span class="n">initialize_default_template</span><span class="p">(</span><span class="n">storage</span><span class="p">)</span>
|
|
137
|
+
|
|
138
|
+
<span class="n">debug_box</span><span class="p">(</span><span class="s2">"Subscriptions plugin initialized"</span><span class="p">)</span></div>
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
<div class="viewcode-block" id="initialize_default_features">
|
|
142
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.initialize_default_features">[docs]</a>
|
|
143
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">initialize_default_features</span><span class="p">(</span><span class="n">storage</span><span class="p">):</span>
|
|
144
|
+
<span class="w"> </span><span class="sd">"""Initialize default plan features"""</span>
|
|
145
|
+
<span class="n">default_features</span> <span class="o">=</span> <span class="p">[</span>
|
|
146
|
+
<span class="p">{</span>
|
|
147
|
+
<span class="s2">"feature_id"</span><span class="p">:</span> <span class="s2">"sessions_per_month"</span><span class="p">,</span>
|
|
148
|
+
<span class="s2">"name"</span><span class="p">:</span> <span class="s2">"Sessions Per Month"</span><span class="p">,</span>
|
|
149
|
+
<span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Number of sessions included per month"</span><span class="p">,</span>
|
|
150
|
+
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"number"</span><span class="p">,</span>
|
|
151
|
+
<span class="s2">"default_value"</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
|
|
152
|
+
<span class="s2">"display_order"</span><span class="p">:</span> <span class="mi">10</span>
|
|
153
|
+
<span class="p">},</span>
|
|
154
|
+
<span class="p">{</span>
|
|
155
|
+
<span class="s2">"feature_id"</span><span class="p">:</span> <span class="s2">"session_length"</span><span class="p">,</span>
|
|
156
|
+
<span class="s2">"name"</span><span class="p">:</span> <span class="s2">"Session Length"</span><span class="p">,</span>
|
|
157
|
+
<span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Length of each session"</span><span class="p">,</span>
|
|
158
|
+
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"select"</span><span class="p">,</span>
|
|
159
|
+
<span class="s2">"options"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"15 minutes"</span><span class="p">,</span> <span class="s2">"30 minutes"</span><span class="p">,</span> <span class="s2">"45 minutes"</span><span class="p">,</span> <span class="s2">"60 minutes"</span><span class="p">,</span> <span class="s2">"unlimited"</span><span class="p">],</span>
|
|
160
|
+
<span class="s2">"default_value"</span><span class="p">:</span> <span class="s2">"30 minutes"</span><span class="p">,</span>
|
|
161
|
+
<span class="s2">"display_order"</span><span class="p">:</span> <span class="mi">20</span>
|
|
162
|
+
<span class="p">},</span>
|
|
163
|
+
<span class="p">{</span>
|
|
164
|
+
<span class="s2">"feature_id"</span><span class="p">:</span> <span class="s2">"priority_support"</span><span class="p">,</span>
|
|
165
|
+
<span class="s2">"name"</span><span class="p">:</span> <span class="s2">"Priority Support"</span><span class="p">,</span>
|
|
166
|
+
<span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Access to priority customer support"</span><span class="p">,</span>
|
|
167
|
+
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"boolean"</span><span class="p">,</span>
|
|
168
|
+
<span class="s2">"default_value"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
169
|
+
<span class="s2">"display_order"</span><span class="p">:</span> <span class="mi">30</span>
|
|
170
|
+
<span class="p">},</span>
|
|
171
|
+
<span class="p">{</span>
|
|
172
|
+
<span class="s2">"feature_id"</span><span class="p">:</span> <span class="s2">"additional_resources"</span><span class="p">,</span>
|
|
173
|
+
<span class="s2">"name"</span><span class="p">:</span> <span class="s2">"Additional Resources"</span><span class="p">,</span>
|
|
174
|
+
<span class="s2">"description"</span><span class="p">:</span> <span class="s2">"Access to additional resources and materials"</span><span class="p">,</span>
|
|
175
|
+
<span class="s2">"type"</span><span class="p">:</span> <span class="s2">"boolean"</span><span class="p">,</span>
|
|
176
|
+
<span class="s2">"default_value"</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
|
|
177
|
+
<span class="s2">"display_order"</span><span class="p">:</span> <span class="mi">40</span>
|
|
178
|
+
<span class="p">}</span>
|
|
179
|
+
<span class="p">]</span>
|
|
180
|
+
|
|
181
|
+
<span class="k">for</span> <span class="n">feature_data</span> <span class="ow">in</span> <span class="n">default_features</span><span class="p">:</span>
|
|
182
|
+
<span class="n">feature</span> <span class="o">=</span> <span class="n">PlanFeature</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">feature_data</span><span class="p">)</span>
|
|
183
|
+
<span class="k">await</span> <span class="n">storage</span><span class="o">.</span><span class="n">store_feature</span><span class="p">(</span><span class="n">feature</span><span class="p">)</span>
|
|
184
|
+
|
|
185
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Initialized </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">default_features</span><span class="p">)</span><span class="si">}</span><span class="s2"> default features"</span><span class="p">)</span></div>
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
<div class="viewcode-block" id="initialize_default_template">
|
|
189
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.initialize_default_template">[docs]</a>
|
|
190
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">initialize_default_template</span><span class="p">(</span><span class="n">storage</span><span class="p">):</span>
|
|
191
|
+
<span class="w"> </span><span class="sd">"""Initialize default page template"""</span>
|
|
192
|
+
<span class="n">default_template</span> <span class="o">=</span> <span class="n">PageTemplate</span><span class="p">(</span>
|
|
193
|
+
<span class="n">template_id</span><span class="o">=</span><span class="s2">"default"</span><span class="p">,</span>
|
|
194
|
+
<span class="n">name</span><span class="o">=</span><span class="s2">"Default Template"</span><span class="p">,</span>
|
|
195
|
+
<span class="n">description</span><span class="o">=</span><span class="s2">"Standard subscription page template"</span><span class="p">,</span>
|
|
196
|
+
<span class="n">html_template</span><span class="o">=</span><span class="n">DEFAULT_HTML_TEMPLATE</span><span class="p">,</span>
|
|
197
|
+
<span class="n">css_template</span><span class="o">=</span><span class="n">DEFAULT_CSS_TEMPLATE</span><span class="p">,</span>
|
|
198
|
+
<span class="n">js_template</span><span class="o">=</span><span class="n">DEFAULT_JS_TEMPLATE</span><span class="p">,</span>
|
|
199
|
+
<span class="n">is_default</span><span class="o">=</span><span class="kc">True</span>
|
|
200
|
+
<span class="p">)</span>
|
|
201
|
+
|
|
202
|
+
<span class="k">await</span> <span class="n">storage</span><span class="o">.</span><span class="n">store_template</span><span class="p">(</span><span class="n">default_template</span><span class="p">)</span>
|
|
203
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Initialized default page template"</span><span class="p">)</span></div>
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
<span class="c1"># Plan management services</span>
|
|
207
|
+
|
|
208
|
+
<div class="viewcode-block" id="create_subscription_plan">
|
|
209
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.create_subscription_plan">[docs]</a>
|
|
210
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
211
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">create_subscription_plan</span><span class="p">(</span><span class="n">plan_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
212
|
+
<span class="w"> </span><span class="sd">"""Create a new subscription plan</span>
|
|
213
|
+
<span class="sd"> </span>
|
|
214
|
+
<span class="sd"> Args:</span>
|
|
215
|
+
<span class="sd"> plan_data: Plan details including name, description, price, etc.</span>
|
|
216
|
+
<span class="sd"> context: Request context</span>
|
|
217
|
+
<span class="sd"> </span>
|
|
218
|
+
<span class="sd"> Returns:</span>
|
|
219
|
+
<span class="sd"> Dict: Created plan details</span>
|
|
220
|
+
<span class="sd"> """</span>
|
|
221
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
222
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
223
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
224
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
225
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
226
|
+
|
|
227
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">create_plan</span><span class="p">(</span><span class="n">plan_data</span><span class="p">)</span>
|
|
228
|
+
<span class="k">return</span> <span class="n">plan</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
<div class="viewcode-block" id="get_subscription_plans">
|
|
232
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_subscription_plans">[docs]</a>
|
|
233
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
234
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_subscription_plans</span><span class="p">(</span><span class="n">active_only</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
|
|
235
|
+
<span class="w"> </span><span class="sd">"""Get all subscription plans</span>
|
|
236
|
+
<span class="sd"> </span>
|
|
237
|
+
<span class="sd"> Args:</span>
|
|
238
|
+
<span class="sd"> active_only: Whether to return only active plans</span>
|
|
239
|
+
<span class="sd"> context: Request context</span>
|
|
240
|
+
<span class="sd"> </span>
|
|
241
|
+
<span class="sd"> Returns:</span>
|
|
242
|
+
<span class="sd"> List[Dict]: List of plan details</span>
|
|
243
|
+
<span class="sd"> """</span>
|
|
244
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
245
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
246
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
247
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
248
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
249
|
+
|
|
250
|
+
<span class="n">plans</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">list_plans</span><span class="p">(</span><span class="n">active_only</span><span class="p">)</span>
|
|
251
|
+
<span class="k">return</span> <span class="p">[</span><span class="n">plan</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">plan</span> <span class="ow">in</span> <span class="n">plans</span><span class="p">]</span></div>
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
<div class="viewcode-block" id="get_subscription_plan">
|
|
255
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_subscription_plan">[docs]</a>
|
|
256
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
257
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_subscription_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
|
|
258
|
+
<span class="w"> </span><span class="sd">"""Get a subscription plan by ID</span>
|
|
259
|
+
<span class="sd"> </span>
|
|
260
|
+
<span class="sd"> Args:</span>
|
|
261
|
+
<span class="sd"> plan_id: ID of the plan to retrieve</span>
|
|
262
|
+
<span class="sd"> context: Request context</span>
|
|
263
|
+
<span class="sd"> </span>
|
|
264
|
+
<span class="sd"> Returns:</span>
|
|
265
|
+
<span class="sd"> Optional[Dict]: Plan details or None if not found</span>
|
|
266
|
+
<span class="sd"> """</span>
|
|
267
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
268
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
269
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
270
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
271
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
272
|
+
|
|
273
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">)</span>
|
|
274
|
+
<span class="k">return</span> <span class="n">plan</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">if</span> <span class="n">plan</span> <span class="k">else</span> <span class="kc">None</span></div>
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
<div class="viewcode-block" id="update_subscription_plan">
|
|
278
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.update_subscription_plan">[docs]</a>
|
|
279
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
280
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">update_subscription_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">plan_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
281
|
+
<span class="w"> </span><span class="sd">"""Update an existing subscription plan</span>
|
|
282
|
+
<span class="sd"> </span>
|
|
283
|
+
<span class="sd"> Args:</span>
|
|
284
|
+
<span class="sd"> plan_id: ID of the plan to update</span>
|
|
285
|
+
<span class="sd"> plan_data: Updated plan details</span>
|
|
286
|
+
<span class="sd"> context: Request context</span>
|
|
287
|
+
<span class="sd"> </span>
|
|
288
|
+
<span class="sd"> Returns:</span>
|
|
289
|
+
<span class="sd"> Dict: Updated plan details</span>
|
|
290
|
+
<span class="sd"> """</span>
|
|
291
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
292
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
293
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
294
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
295
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
296
|
+
|
|
297
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">,</span> <span class="n">plan_data</span><span class="p">)</span>
|
|
298
|
+
<span class="k">return</span> <span class="n">plan</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
<div class="viewcode-block" id="deactivate_subscription_plan">
|
|
302
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.deactivate_subscription_plan">[docs]</a>
|
|
303
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
304
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">deactivate_subscription_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
305
|
+
<span class="w"> </span><span class="sd">"""Deactivate a subscription plan</span>
|
|
306
|
+
<span class="sd"> </span>
|
|
307
|
+
<span class="sd"> Args:</span>
|
|
308
|
+
<span class="sd"> plan_id: ID of the plan to deactivate</span>
|
|
309
|
+
<span class="sd"> context: Request context</span>
|
|
310
|
+
<span class="sd"> </span>
|
|
311
|
+
<span class="sd"> Returns:</span>
|
|
312
|
+
<span class="sd"> Dict: Status result</span>
|
|
313
|
+
<span class="sd"> """</span>
|
|
314
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
315
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
316
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
317
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
318
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
319
|
+
|
|
320
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">deactivate_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">)</span>
|
|
321
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Plan </span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2"> deactivated"</span><span class="p">}</span></div>
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
<div class="viewcode-block" id="activate_subscription_plan">
|
|
325
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.activate_subscription_plan">[docs]</a>
|
|
326
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
327
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">activate_subscription_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
328
|
+
<span class="w"> </span><span class="sd">"""Activate a subscription plan</span>
|
|
329
|
+
<span class="sd"> </span>
|
|
330
|
+
<span class="sd"> Args:</span>
|
|
331
|
+
<span class="sd"> plan_id: ID of the plan to activate</span>
|
|
332
|
+
<span class="sd"> context: Request context</span>
|
|
333
|
+
<span class="sd"> </span>
|
|
334
|
+
<span class="sd"> Returns:</span>
|
|
335
|
+
<span class="sd"> Dict: Status result</span>
|
|
336
|
+
<span class="sd"> """</span>
|
|
337
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
338
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
339
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
340
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
341
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
342
|
+
|
|
343
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">)</span>
|
|
344
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">plan</span><span class="p">:</span>
|
|
345
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Plan </span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span>
|
|
346
|
+
|
|
347
|
+
<span class="n">plan</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">True</span>
|
|
348
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">,</span> <span class="n">plan</span><span class="o">.</span><span class="n">to_dict</span><span class="p">())</span>
|
|
349
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Plan </span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2"> activated"</span><span class="p">}</span></div>
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
<span class="c1"># Feature management services</span>
|
|
353
|
+
|
|
354
|
+
<div class="viewcode-block" id="get_available_features">
|
|
355
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_available_features">[docs]</a>
|
|
356
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
357
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_available_features</span><span class="p">(</span><span class="n">active_only</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
|
|
358
|
+
<span class="w"> </span><span class="sd">"""Get all available plan features</span>
|
|
359
|
+
<span class="sd"> </span>
|
|
360
|
+
<span class="sd"> Args:</span>
|
|
361
|
+
<span class="sd"> active_only: Whether to return only active features</span>
|
|
362
|
+
<span class="sd"> context: Request context</span>
|
|
363
|
+
<span class="sd"> </span>
|
|
364
|
+
<span class="sd"> Returns:</span>
|
|
365
|
+
<span class="sd"> List[Dict]: List of feature details</span>
|
|
366
|
+
<span class="sd"> """</span>
|
|
367
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
368
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
369
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
370
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
371
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
372
|
+
|
|
373
|
+
<span class="n">features</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_all_features</span><span class="p">(</span><span class="n">active_only</span><span class="p">)</span>
|
|
374
|
+
<span class="k">return</span> <span class="p">[</span><span class="n">feature</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">features</span><span class="p">]</span></div>
|
|
375
|
+
|
|
376
|
+
<div class="viewcode-block" id="create_plan_feature">
|
|
377
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.create_plan_feature">[docs]</a>
|
|
378
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
379
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">create_plan_feature</span><span class="p">(</span><span class="n">feature_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
380
|
+
<span class="w"> </span><span class="sd">"""Create a new plan feature</span>
|
|
381
|
+
<span class="sd"> </span>
|
|
382
|
+
<span class="sd"> Args:</span>
|
|
383
|
+
<span class="sd"> feature_data: Feature details</span>
|
|
384
|
+
<span class="sd"> context: Request context</span>
|
|
385
|
+
<span class="sd"> </span>
|
|
386
|
+
<span class="sd"> Returns:</span>
|
|
387
|
+
<span class="sd"> Dict: Created feature details</span>
|
|
388
|
+
<span class="sd"> """</span>
|
|
389
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
390
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
391
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
392
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
393
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
394
|
+
|
|
395
|
+
<span class="c1"># Generate feature ID if not provided</span>
|
|
396
|
+
<span class="k">if</span> <span class="s1">'feature_id'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">feature_data</span><span class="p">:</span>
|
|
397
|
+
<span class="n">feature_data</span><span class="p">[</span><span class="s1">'feature_id'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"feature_</span><span class="si">{</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span><span class="p">[:</span><span class="mi">8</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
|
|
398
|
+
|
|
399
|
+
<span class="n">feature</span> <span class="o">=</span> <span class="n">PlanFeature</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">feature_data</span><span class="p">)</span>
|
|
400
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">store_feature</span><span class="p">(</span><span class="n">feature</span><span class="p">)</span>
|
|
401
|
+
|
|
402
|
+
<span class="k">return</span> <span class="n">feature</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
<div class="viewcode-block" id="update_plan_feature">
|
|
406
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.update_plan_feature">[docs]</a>
|
|
407
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
408
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">update_plan_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">feature_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
409
|
+
<span class="w"> </span><span class="sd">"""Update an existing plan feature</span>
|
|
410
|
+
<span class="sd"> </span>
|
|
411
|
+
<span class="sd"> Args:</span>
|
|
412
|
+
<span class="sd"> feature_id: ID of the feature to update</span>
|
|
413
|
+
<span class="sd"> feature_data: Updated feature details</span>
|
|
414
|
+
<span class="sd"> context: Request context</span>
|
|
415
|
+
<span class="sd"> </span>
|
|
416
|
+
<span class="sd"> Returns:</span>
|
|
417
|
+
<span class="sd"> Dict: Updated feature details</span>
|
|
418
|
+
<span class="sd"> """</span>
|
|
419
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
420
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
421
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
422
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
423
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
424
|
+
|
|
425
|
+
<span class="n">feature</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">)</span>
|
|
426
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">feature</span><span class="p">:</span>
|
|
427
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Feature </span><span class="si">{</span><span class="n">feature_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span>
|
|
428
|
+
|
|
429
|
+
<span class="c1"># Update fields</span>
|
|
430
|
+
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">feature_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
431
|
+
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">feature</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
432
|
+
<span class="nb">setattr</span><span class="p">(</span><span class="n">feature</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
433
|
+
|
|
434
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">update_feature</span><span class="p">(</span><span class="n">feature</span><span class="p">)</span>
|
|
435
|
+
<span class="k">return</span> <span class="n">feature</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
<div class="viewcode-block" id="deactivate_plan_feature">
|
|
439
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.deactivate_plan_feature">[docs]</a>
|
|
440
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
441
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">deactivate_plan_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
442
|
+
<span class="w"> </span><span class="sd">"""Deactivate a plan feature</span>
|
|
443
|
+
<span class="sd"> </span>
|
|
444
|
+
<span class="sd"> Args:</span>
|
|
445
|
+
<span class="sd"> feature_id: ID of the feature to deactivate</span>
|
|
446
|
+
<span class="sd"> context: Request context</span>
|
|
447
|
+
<span class="sd"> </span>
|
|
448
|
+
<span class="sd"> Returns:</span>
|
|
449
|
+
<span class="sd"> Dict: Status result</span>
|
|
450
|
+
<span class="sd"> """</span>
|
|
451
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
452
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
453
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
454
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
455
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
456
|
+
|
|
457
|
+
<span class="n">feature</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">)</span>
|
|
458
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">feature</span><span class="p">:</span>
|
|
459
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Feature </span><span class="si">{</span><span class="n">feature_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span>
|
|
460
|
+
|
|
461
|
+
<span class="n">feature</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">False</span>
|
|
462
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">update_feature</span><span class="p">(</span><span class="n">feature</span><span class="p">)</span>
|
|
463
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Feature </span><span class="si">{</span><span class="n">feature_id</span><span class="si">}</span><span class="s2"> deactivated"</span><span class="p">}</span></div>
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
<div class="viewcode-block" id="activate_plan_feature">
|
|
467
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.activate_plan_feature">[docs]</a>
|
|
468
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
469
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">activate_plan_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
470
|
+
<span class="w"> </span><span class="sd">"""Activate a plan feature</span>
|
|
471
|
+
<span class="sd"> </span>
|
|
472
|
+
<span class="sd"> Args:</span>
|
|
473
|
+
<span class="sd"> feature_id: ID of the feature to activate</span>
|
|
474
|
+
<span class="sd"> context: Request context</span>
|
|
475
|
+
<span class="sd"> </span>
|
|
476
|
+
<span class="sd"> Returns:</span>
|
|
477
|
+
<span class="sd"> Dict: Status result</span>
|
|
478
|
+
<span class="sd"> """</span>
|
|
479
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
480
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
481
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
482
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
483
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
484
|
+
|
|
485
|
+
<span class="n">feature</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_feature</span><span class="p">(</span><span class="n">feature_id</span><span class="p">)</span>
|
|
486
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">feature</span><span class="p">:</span>
|
|
487
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Feature </span><span class="si">{</span><span class="n">feature_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span>
|
|
488
|
+
|
|
489
|
+
<span class="n">feature</span><span class="o">.</span><span class="n">active</span> <span class="o">=</span> <span class="kc">True</span>
|
|
490
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">update_feature</span><span class="p">(</span><span class="n">feature</span><span class="p">)</span>
|
|
491
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Feature </span><span class="si">{</span><span class="n">feature_id</span><span class="si">}</span><span class="s2"> activated"</span><span class="p">}</span></div>
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
<span class="c1"># Template management services</span>
|
|
495
|
+
|
|
496
|
+
<div class="viewcode-block" id="get_page_templates">
|
|
497
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_page_templates">[docs]</a>
|
|
498
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
499
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_page_templates</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
|
|
500
|
+
<span class="w"> </span><span class="sd">"""Get all page templates</span>
|
|
501
|
+
<span class="sd"> </span>
|
|
502
|
+
<span class="sd"> Args:</span>
|
|
503
|
+
<span class="sd"> context: Request context</span>
|
|
504
|
+
<span class="sd"> </span>
|
|
505
|
+
<span class="sd"> Returns:</span>
|
|
506
|
+
<span class="sd"> List[Dict]: List of template details</span>
|
|
507
|
+
<span class="sd"> """</span>
|
|
508
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
509
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
510
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
511
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
512
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
513
|
+
|
|
514
|
+
<span class="n">templates</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_all_templates</span><span class="p">()</span>
|
|
515
|
+
<span class="k">return</span> <span class="p">[</span><span class="n">template</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">template</span> <span class="ow">in</span> <span class="n">templates</span><span class="p">]</span></div>
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
<div class="viewcode-block" id="create_page_template">
|
|
519
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.create_page_template">[docs]</a>
|
|
520
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
521
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">create_page_template</span><span class="p">(</span><span class="n">template_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
522
|
+
<span class="w"> </span><span class="sd">"""Create a new page template</span>
|
|
523
|
+
<span class="sd"> </span>
|
|
524
|
+
<span class="sd"> Args:</span>
|
|
525
|
+
<span class="sd"> template_data: Template details</span>
|
|
526
|
+
<span class="sd"> context: Request context</span>
|
|
527
|
+
<span class="sd"> </span>
|
|
528
|
+
<span class="sd"> Returns:</span>
|
|
529
|
+
<span class="sd"> Dict: Created template details</span>
|
|
530
|
+
<span class="sd"> """</span>
|
|
531
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
532
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
533
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
534
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
535
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
536
|
+
|
|
537
|
+
<span class="c1"># Generate template ID if not provided</span>
|
|
538
|
+
<span class="k">if</span> <span class="s1">'template_id'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">template_data</span><span class="p">:</span>
|
|
539
|
+
<span class="n">template_data</span><span class="p">[</span><span class="s1">'template_id'</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"template_</span><span class="si">{</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span><span class="p">[:</span><span class="mi">8</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
|
|
540
|
+
|
|
541
|
+
<span class="c1"># Set is_default to False by default</span>
|
|
542
|
+
<span class="k">if</span> <span class="s1">'is_default'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">template_data</span><span class="p">:</span>
|
|
543
|
+
<span class="n">template_data</span><span class="p">[</span><span class="s1">'is_default'</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
|
|
544
|
+
|
|
545
|
+
<span class="n">template</span> <span class="o">=</span> <span class="n">PageTemplate</span><span class="o">.</span><span class="n">from_dict</span><span class="p">(</span><span class="n">template_data</span><span class="p">)</span>
|
|
546
|
+
|
|
547
|
+
<span class="c1"># If this is set as default, unset other defaults</span>
|
|
548
|
+
<span class="k">if</span> <span class="n">template</span><span class="o">.</span><span class="n">is_default</span><span class="p">:</span>
|
|
549
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">set_default_template</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">template_id</span><span class="p">)</span>
|
|
550
|
+
|
|
551
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">store_template</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
|
|
552
|
+
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
<div class="viewcode-block" id="update_page_template">
|
|
556
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.update_page_template">[docs]</a>
|
|
557
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
558
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">update_page_template</span><span class="p">(</span><span class="n">template_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">template_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
559
|
+
<span class="w"> </span><span class="sd">"""Update an existing page template</span>
|
|
560
|
+
<span class="sd"> </span>
|
|
561
|
+
<span class="sd"> Args:</span>
|
|
562
|
+
<span class="sd"> template_id: ID of the template to update</span>
|
|
563
|
+
<span class="sd"> template_data: Updated template details</span>
|
|
564
|
+
<span class="sd"> context: Request context</span>
|
|
565
|
+
<span class="sd"> </span>
|
|
566
|
+
<span class="sd"> Returns:</span>
|
|
567
|
+
<span class="sd"> Dict: Updated template details</span>
|
|
568
|
+
<span class="sd"> """</span>
|
|
569
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
570
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
571
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
572
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
573
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
574
|
+
|
|
575
|
+
<span class="n">template</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_template</span><span class="p">(</span><span class="n">template_id</span><span class="p">)</span>
|
|
576
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">template</span><span class="p">:</span>
|
|
577
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Template </span><span class="si">{</span><span class="n">template_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span>
|
|
578
|
+
|
|
579
|
+
<span class="c1"># Update fields</span>
|
|
580
|
+
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">template_data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
581
|
+
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
582
|
+
<span class="nb">setattr</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
|
|
583
|
+
|
|
584
|
+
<span class="c1"># If this is set as default, unset other defaults</span>
|
|
585
|
+
<span class="k">if</span> <span class="n">template</span><span class="o">.</span><span class="n">is_default</span><span class="p">:</span>
|
|
586
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">set_default_template</span><span class="p">(</span><span class="n">template</span><span class="o">.</span><span class="n">template_id</span><span class="p">)</span>
|
|
587
|
+
|
|
588
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">store_template</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
|
|
589
|
+
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
<div class="viewcode-block" id="set_default_template">
|
|
593
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.set_default_template">[docs]</a>
|
|
594
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
595
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">set_default_template</span><span class="p">(</span><span class="n">template_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
596
|
+
<span class="w"> </span><span class="sd">"""Set a template as the default</span>
|
|
597
|
+
<span class="sd"> </span>
|
|
598
|
+
<span class="sd"> Args:</span>
|
|
599
|
+
<span class="sd"> template_id: ID of the template to set as default</span>
|
|
600
|
+
<span class="sd"> context: Request context</span>
|
|
601
|
+
<span class="sd"> </span>
|
|
602
|
+
<span class="sd"> Returns:</span>
|
|
603
|
+
<span class="sd"> Dict: Status result</span>
|
|
604
|
+
<span class="sd"> """</span>
|
|
605
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
606
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
607
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
608
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
609
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
610
|
+
|
|
611
|
+
<span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">set_default_template</span><span class="p">(</span><span class="n">template_id</span><span class="p">)</span>
|
|
612
|
+
|
|
613
|
+
<span class="k">if</span> <span class="n">success</span><span class="p">:</span>
|
|
614
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Template </span><span class="si">{</span><span class="n">template_id</span><span class="si">}</span><span class="s2"> set as default"</span><span class="p">}</span>
|
|
615
|
+
<span class="k">else</span><span class="p">:</span>
|
|
616
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Template </span><span class="si">{</span><span class="n">template_id</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">}</span></div>
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
<span class="c1"># Subscription event handling</span>
|
|
620
|
+
|
|
621
|
+
<div class="viewcode-block" id="process_subscription_event">
|
|
622
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.process_subscription_event">[docs]</a>
|
|
623
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
624
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">process_subscription_event</span><span class="p">(</span><span class="n">event_data</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
625
|
+
<span class="w"> </span><span class="sd">"""Process normalized subscription events from any payment provider</span>
|
|
626
|
+
<span class="sd"> </span>
|
|
627
|
+
<span class="sd"> Args:</span>
|
|
628
|
+
<span class="sd"> event_data: Normalized event data with provider, event type, etc.</span>
|
|
629
|
+
<span class="sd"> context: Request context</span>
|
|
630
|
+
<span class="sd"> </span>
|
|
631
|
+
<span class="sd"> Returns:</span>
|
|
632
|
+
<span class="sd"> Dict: Processing result</span>
|
|
633
|
+
<span class="sd"> """</span>
|
|
634
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span><span class="p">,</span> <span class="n">_credit_integration</span>
|
|
635
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">_credit_integration</span><span class="p">:</span>
|
|
636
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
637
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">credit_integration</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
638
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
639
|
+
<span class="n">_credit_integration</span> <span class="o">=</span> <span class="n">credit_integration</span>
|
|
640
|
+
|
|
641
|
+
<span class="n">provider</span> <span class="o">=</span> <span class="n">event_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'provider'</span><span class="p">,</span> <span class="s1">'unknown'</span><span class="p">)</span>
|
|
642
|
+
<span class="n">normalized_event</span> <span class="o">=</span> <span class="n">event_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'normalized_event'</span><span class="p">,</span> <span class="p">{})</span>
|
|
643
|
+
<span class="n">event_type</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event_type'</span><span class="p">)</span>
|
|
644
|
+
|
|
645
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Processing </span><span class="si">{</span><span class="n">provider</span><span class="si">}</span><span class="s2"> subscription event: </span><span class="si">{</span><span class="n">event_type</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
646
|
+
|
|
647
|
+
<span class="k">if</span> <span class="n">event_type</span> <span class="o">==</span> <span class="s1">'subscription_created'</span><span class="p">:</span>
|
|
648
|
+
<span class="c1"># Extract data from normalized event</span>
|
|
649
|
+
<span class="n">username</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'username'</span><span class="p">)</span>
|
|
650
|
+
<span class="n">metadata</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'metadata'</span><span class="p">,</span> <span class="p">{})</span>
|
|
651
|
+
<span class="n">plan_id</span> <span class="o">=</span> <span class="n">metadata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'plan_id'</span><span class="p">)</span>
|
|
652
|
+
<span class="n">provider_subscription_id</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'subscription_id'</span><span class="p">)</span>
|
|
653
|
+
|
|
654
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">([</span><span class="n">username</span><span class="p">,</span> <span class="n">plan_id</span><span class="p">,</span> <span class="n">provider_subscription_id</span><span class="p">]):</span>
|
|
655
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Missing required subscription data: username=</span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">, "</span>
|
|
656
|
+
<span class="sa">f</span><span class="s2">"plan_id=</span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2">, subscription_id=</span><span class="si">{</span><span class="n">provider_subscription_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
657
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Missing required data'</span><span class="p">}</span>
|
|
658
|
+
|
|
659
|
+
<span class="c1"># Create subscription record</span>
|
|
660
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">create_subscription</span><span class="p">(</span>
|
|
661
|
+
<span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
|
|
662
|
+
<span class="n">plan_id</span><span class="o">=</span><span class="n">plan_id</span><span class="p">,</span>
|
|
663
|
+
<span class="n">provider_data</span><span class="o">=</span><span class="p">{</span>
|
|
664
|
+
<span class="s1">'provider'</span><span class="p">:</span> <span class="n">provider</span><span class="p">,</span>
|
|
665
|
+
<span class="s1">'provider_subscription_id'</span><span class="p">:</span> <span class="n">provider_subscription_id</span>
|
|
666
|
+
<span class="p">}</span>
|
|
667
|
+
<span class="p">)</span>
|
|
668
|
+
|
|
669
|
+
<span class="c1"># Allocate initial credits</span>
|
|
670
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_plan</span><span class="p">(</span><span class="n">plan_id</span><span class="p">)</span>
|
|
671
|
+
<span class="k">if</span> <span class="n">plan</span><span class="p">:</span>
|
|
672
|
+
<span class="k">await</span> <span class="n">_credit_integration</span><span class="o">.</span><span class="n">allocate_subscription_credits</span><span class="p">(</span>
|
|
673
|
+
<span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
|
|
674
|
+
<span class="n">amount</span><span class="o">=</span><span class="n">plan</span><span class="o">.</span><span class="n">credits_per_cycle</span><span class="p">,</span>
|
|
675
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
676
|
+
<span class="n">metadata</span><span class="o">=</span><span class="p">{</span>
|
|
677
|
+
<span class="s1">'event'</span><span class="p">:</span> <span class="s1">'subscription_created'</span><span class="p">,</span>
|
|
678
|
+
<span class="s1">'plan_id'</span><span class="p">:</span> <span class="n">plan_id</span><span class="p">,</span>
|
|
679
|
+
<span class="s1">'plan_name'</span><span class="p">:</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
680
|
+
<span class="s1">'provider'</span><span class="p">:</span> <span class="n">provider</span>
|
|
681
|
+
<span class="p">}</span>
|
|
682
|
+
<span class="p">)</span>
|
|
683
|
+
|
|
684
|
+
<span class="c1"># Notify any plugins that handle subscription creation</span>
|
|
685
|
+
<span class="k">try</span><span class="p">:</span>
|
|
686
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service_manager</span>
|
|
687
|
+
<span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">handle_subscription_created</span><span class="p">(</span>
|
|
688
|
+
<span class="n">user_id</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
|
|
689
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
690
|
+
<span class="n">plan_id</span><span class="o">=</span><span class="n">plan_id</span><span class="p">,</span>
|
|
691
|
+
<span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span>
|
|
692
|
+
<span class="p">)</span>
|
|
693
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Notified subscription handlers for </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
694
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
695
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to notify subscription handlers: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
696
|
+
|
|
697
|
+
<span class="k">return</span> <span class="p">{</span>
|
|
698
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'success'</span><span class="p">,</span>
|
|
699
|
+
<span class="s1">'event_type'</span><span class="p">:</span> <span class="n">event_type</span><span class="p">,</span>
|
|
700
|
+
<span class="s1">'subscription_id'</span><span class="p">:</span> <span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
701
|
+
<span class="s1">'credits_allocated'</span><span class="p">:</span> <span class="n">plan</span><span class="o">.</span><span class="n">credits_per_cycle</span>
|
|
702
|
+
<span class="p">}</span>
|
|
703
|
+
<span class="k">else</span><span class="p">:</span>
|
|
704
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Plan not found: </span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
705
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Plan not found: </span><span class="si">{</span><span class="n">plan_id</span><span class="si">}</span><span class="s2">"</span><span class="p">}</span>
|
|
706
|
+
<span class="k">elif</span> <span class="n">event_type</span> <span class="o">==</span> <span class="s1">'subscription_renewed'</span><span class="p">:</span>
|
|
707
|
+
<span class="c1"># Handle subscription renewal</span>
|
|
708
|
+
<span class="n">provider_subscription_id</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'subscription_id'</span><span class="p">)</span>
|
|
709
|
+
<span class="n">period_start</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'period_start'</span><span class="p">)</span>
|
|
710
|
+
<span class="n">period_end</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'period_end'</span><span class="p">)</span>
|
|
711
|
+
|
|
712
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">provider_subscription_id</span><span class="p">:</span>
|
|
713
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Missing subscription ID in renewal event"</span><span class="p">)</span>
|
|
714
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Missing subscription ID'</span><span class="p">}</span>
|
|
715
|
+
|
|
716
|
+
<span class="c1"># Find subscription by provider subscription ID</span>
|
|
717
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_subscriptions_by_provider_id</span><span class="p">(</span>
|
|
718
|
+
<span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">,</span>
|
|
719
|
+
<span class="n">provider_subscription_id</span><span class="o">=</span><span class="n">provider_subscription_id</span>
|
|
720
|
+
<span class="p">)</span>
|
|
721
|
+
|
|
722
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">subscriptions</span><span class="p">:</span>
|
|
723
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No matching subscription found for renewal: </span><span class="si">{</span><span class="n">provider_subscription_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
724
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Subscription not found'</span><span class="p">}</span>
|
|
725
|
+
|
|
726
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="n">subscriptions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
727
|
+
|
|
728
|
+
<span class="c1"># Update subscription period if provided</span>
|
|
729
|
+
<span class="k">if</span> <span class="n">period_start</span> <span class="ow">and</span> <span class="n">period_end</span><span class="p">:</span>
|
|
730
|
+
<span class="k">try</span><span class="p">:</span>
|
|
731
|
+
<span class="n">start_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">period_start</span><span class="p">)</span>
|
|
732
|
+
<span class="n">end_date</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromisoformat</span><span class="p">(</span><span class="n">period_end</span><span class="p">)</span>
|
|
733
|
+
|
|
734
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_subscription_period</span><span class="p">(</span>
|
|
735
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
736
|
+
<span class="n">period_start</span><span class="o">=</span><span class="n">start_date</span><span class="p">,</span>
|
|
737
|
+
<span class="n">period_end</span><span class="o">=</span><span class="n">end_date</span>
|
|
738
|
+
<span class="p">)</span>
|
|
739
|
+
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
740
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Invalid date format in renewal event: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
741
|
+
|
|
742
|
+
<span class="c1"># Allocate renewal credits</span>
|
|
743
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_plan</span><span class="p">(</span><span class="n">subscription</span><span class="o">.</span><span class="n">plan_id</span><span class="p">)</span>
|
|
744
|
+
<span class="k">if</span> <span class="n">plan</span><span class="p">:</span>
|
|
745
|
+
<span class="k">await</span> <span class="n">_credit_integration</span><span class="o">.</span><span class="n">allocate_subscription_credits</span><span class="p">(</span>
|
|
746
|
+
<span class="n">username</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
|
|
747
|
+
<span class="n">amount</span><span class="o">=</span><span class="n">plan</span><span class="o">.</span><span class="n">credits_per_cycle</span><span class="p">,</span>
|
|
748
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
749
|
+
<span class="n">metadata</span><span class="o">=</span><span class="p">{</span>
|
|
750
|
+
<span class="s1">'event'</span><span class="p">:</span> <span class="s1">'subscription_renewed'</span><span class="p">,</span>
|
|
751
|
+
<span class="s1">'plan_id'</span><span class="p">:</span> <span class="n">plan</span><span class="o">.</span><span class="n">plan_id</span><span class="p">,</span>
|
|
752
|
+
<span class="s1">'plan_name'</span><span class="p">:</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
753
|
+
<span class="s1">'provider'</span><span class="p">:</span> <span class="n">provider</span><span class="p">,</span>
|
|
754
|
+
<span class="s1">'invoice_id'</span><span class="p">:</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'invoice_id'</span><span class="p">)</span>
|
|
755
|
+
<span class="p">}</span>
|
|
756
|
+
<span class="p">)</span>
|
|
757
|
+
|
|
758
|
+
<span class="k">return</span> <span class="p">{</span>
|
|
759
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'success'</span><span class="p">,</span>
|
|
760
|
+
<span class="s1">'event_type'</span><span class="p">:</span> <span class="n">event_type</span><span class="p">,</span>
|
|
761
|
+
<span class="s1">'subscription_id'</span><span class="p">:</span> <span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
762
|
+
<span class="s1">'credits_allocated'</span><span class="p">:</span> <span class="n">plan</span><span class="o">.</span><span class="n">credits_per_cycle</span>
|
|
763
|
+
<span class="p">}</span>
|
|
764
|
+
<span class="k">else</span><span class="p">:</span>
|
|
765
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Plan not found for renewal: </span><span class="si">{</span><span class="n">subscription</span><span class="o">.</span><span class="n">plan_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
766
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Plan not found: </span><span class="si">{</span><span class="n">subscription</span><span class="o">.</span><span class="n">plan_id</span><span class="si">}</span><span class="s2">"</span><span class="p">}</span>
|
|
767
|
+
|
|
768
|
+
<span class="k">elif</span> <span class="n">event_type</span> <span class="o">==</span> <span class="s1">'subscription_updated'</span><span class="p">:</span>
|
|
769
|
+
<span class="c1"># Handle subscription updates</span>
|
|
770
|
+
<span class="n">provider_subscription_id</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'subscription_id'</span><span class="p">)</span>
|
|
771
|
+
<span class="n">status</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'status'</span><span class="p">)</span>
|
|
772
|
+
<span class="n">cancel_at_period_end</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'cancel_at_period_end'</span><span class="p">)</span>
|
|
773
|
+
|
|
774
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">provider_subscription_id</span><span class="p">:</span>
|
|
775
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Missing subscription ID in update event"</span><span class="p">)</span>
|
|
776
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Missing subscription ID'</span><span class="p">}</span>
|
|
777
|
+
|
|
778
|
+
<span class="c1"># Find subscription by provider subscription ID</span>
|
|
779
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_subscriptions_by_provider_id</span><span class="p">(</span>
|
|
780
|
+
<span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">,</span>
|
|
781
|
+
<span class="n">provider_subscription_id</span><span class="o">=</span><span class="n">provider_subscription_id</span>
|
|
782
|
+
<span class="p">)</span>
|
|
783
|
+
|
|
784
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">subscriptions</span><span class="p">:</span>
|
|
785
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No matching subscription found for update: </span><span class="si">{</span><span class="n">provider_subscription_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
786
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Subscription not found'</span><span class="p">}</span>
|
|
787
|
+
|
|
788
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="n">subscriptions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
789
|
+
|
|
790
|
+
<span class="c1"># Update subscription status if provided</span>
|
|
791
|
+
<span class="k">if</span> <span class="n">status</span><span class="p">:</span>
|
|
792
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_subscription_status</span><span class="p">(</span>
|
|
793
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
794
|
+
<span class="n">status</span><span class="o">=</span><span class="n">status</span>
|
|
795
|
+
<span class="p">)</span>
|
|
796
|
+
|
|
797
|
+
<span class="c1"># Update cancel_at_period_end if provided</span>
|
|
798
|
+
<span class="k">if</span> <span class="n">cancel_at_period_end</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
799
|
+
<span class="n">subscription</span><span class="o">.</span><span class="n">cancel_at_period_end</span> <span class="o">=</span> <span class="n">cancel_at_period_end</span>
|
|
800
|
+
<span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_subscription</span><span class="p">(</span><span class="n">subscription</span><span class="p">)</span>
|
|
801
|
+
|
|
802
|
+
<span class="k">return</span> <span class="p">{</span>
|
|
803
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'success'</span><span class="p">,</span>
|
|
804
|
+
<span class="s1">'event_type'</span><span class="p">:</span> <span class="n">event_type</span><span class="p">,</span>
|
|
805
|
+
<span class="s1">'subscription_id'</span><span class="p">:</span> <span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span>
|
|
806
|
+
<span class="p">}</span>
|
|
807
|
+
|
|
808
|
+
<span class="k">elif</span> <span class="n">event_type</span> <span class="o">==</span> <span class="s1">'subscription_canceled'</span><span class="p">:</span>
|
|
809
|
+
<span class="c1"># Handle subscription cancellation</span>
|
|
810
|
+
<span class="n">provider_subscription_id</span> <span class="o">=</span> <span class="n">normalized_event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'subscription_id'</span><span class="p">)</span>
|
|
811
|
+
|
|
812
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">provider_subscription_id</span><span class="p">:</span>
|
|
813
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Missing subscription ID in cancellation event"</span><span class="p">)</span>
|
|
814
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Missing subscription ID'</span><span class="p">}</span>
|
|
815
|
+
|
|
816
|
+
<span class="c1"># Find subscription by provider subscription ID</span>
|
|
817
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_subscriptions_by_provider_id</span><span class="p">(</span>
|
|
818
|
+
<span class="n">provider</span><span class="o">=</span><span class="n">provider</span><span class="p">,</span>
|
|
819
|
+
<span class="n">provider_subscription_id</span><span class="o">=</span><span class="n">provider_subscription_id</span>
|
|
820
|
+
<span class="p">)</span>
|
|
821
|
+
|
|
822
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">subscriptions</span><span class="p">:</span>
|
|
823
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"No matching subscription found for cancellation: </span><span class="si">{</span><span class="n">provider_subscription_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
824
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span> <span class="s1">'message'</span><span class="p">:</span> <span class="s1">'Subscription not found'</span><span class="p">}</span>
|
|
825
|
+
|
|
826
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="n">subscriptions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
827
|
+
|
|
828
|
+
<span class="c1"># Update subscription status to canceled</span>
|
|
829
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_subscription_status</span><span class="p">(</span>
|
|
830
|
+
<span class="n">subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span><span class="p">,</span>
|
|
831
|
+
<span class="n">status</span><span class="o">=</span><span class="s1">'canceled'</span>
|
|
832
|
+
<span class="p">)</span>
|
|
833
|
+
|
|
834
|
+
<span class="k">return</span> <span class="p">{</span>
|
|
835
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'success'</span><span class="p">,</span>
|
|
836
|
+
<span class="s1">'event_type'</span><span class="p">:</span> <span class="n">event_type</span><span class="p">,</span>
|
|
837
|
+
<span class="s1">'subscription_id'</span><span class="p">:</span> <span class="n">subscription</span><span class="o">.</span><span class="n">subscription_id</span>
|
|
838
|
+
<span class="p">}</span>
|
|
839
|
+
|
|
840
|
+
<span class="c1"># Unknown event type</span>
|
|
841
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unknown subscription event type: </span><span class="si">{</span><span class="n">event_type</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
842
|
+
<span class="k">return</span> <span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="s1">'ignored'</span><span class="p">,</span> <span class="s1">'event_type'</span><span class="p">:</span> <span class="n">event_type</span><span class="p">}</span></div>
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
<span class="c1"># User subscription services</span>
|
|
846
|
+
|
|
847
|
+
<div class="viewcode-block" id="get_user_subscriptions">
|
|
848
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_user_subscriptions">[docs]</a>
|
|
849
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
850
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_user_subscriptions</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
|
|
851
|
+
<span class="w"> </span><span class="sd">"""Get all subscriptions for a user</span>
|
|
852
|
+
<span class="sd"> </span>
|
|
853
|
+
<span class="sd"> Args:</span>
|
|
854
|
+
<span class="sd"> username: User to get subscriptions for</span>
|
|
855
|
+
<span class="sd"> context: Request context</span>
|
|
856
|
+
<span class="sd"> </span>
|
|
857
|
+
<span class="sd"> Returns:</span>
|
|
858
|
+
<span class="sd"> List[Dict]: List of subscription details</span>
|
|
859
|
+
<span class="sd"> """</span>
|
|
860
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
861
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
862
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
863
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
864
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
865
|
+
|
|
866
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_user_subscriptions</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
|
|
867
|
+
<span class="k">return</span> <span class="p">[</span><span class="n">sub</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subscriptions</span><span class="p">]</span></div>
|
|
868
|
+
|
|
869
|
+
|
|
870
|
+
<div class="viewcode-block" id="cancel_subscription">
|
|
871
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.cancel_subscription">[docs]</a>
|
|
872
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
873
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_subscription</span><span class="p">(</span><span class="n">subscription_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">at_period_end</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
|
|
874
|
+
<span class="w"> </span><span class="sd">"""Cancel a user subscription</span>
|
|
875
|
+
<span class="sd"> </span>
|
|
876
|
+
<span class="sd"> Args:</span>
|
|
877
|
+
<span class="sd"> subscription_id: ID of the subscription to cancel</span>
|
|
878
|
+
<span class="sd"> at_period_end: Whether to cancel at period end or immediately</span>
|
|
879
|
+
<span class="sd"> context: Request context</span>
|
|
880
|
+
<span class="sd"> </span>
|
|
881
|
+
<span class="sd"> Returns:</span>
|
|
882
|
+
<span class="sd"> Dict: Updated subscription details</span>
|
|
883
|
+
<span class="sd"> """</span>
|
|
884
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
885
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
886
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
887
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
888
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
889
|
+
|
|
890
|
+
<span class="c1"># Get subscription details</span>
|
|
891
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_subscription</span><span class="p">(</span><span class="n">subscription_id</span><span class="p">)</span>
|
|
892
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">subscription</span><span class="p">:</span>
|
|
893
|
+
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Subscription not found: </span><span class="si">{</span><span class="n">subscription_id</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
894
|
+
|
|
895
|
+
<span class="c1"># Cancel with payment provider if applicable</span>
|
|
896
|
+
<span class="k">if</span> <span class="n">subscription</span><span class="o">.</span><span class="n">provider_subscription_id</span><span class="p">:</span>
|
|
897
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service_manager</span>
|
|
898
|
+
|
|
899
|
+
<span class="k">try</span><span class="p">:</span>
|
|
900
|
+
<span class="c1"># Call provider-specific cancellation service if available</span>
|
|
901
|
+
<span class="c1"># The service name follows the pattern: cancel_{provider}_subscription</span>
|
|
902
|
+
<span class="n">cancel_service</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"cancel_</span><span class="si">{</span><span class="n">subscription</span><span class="o">.</span><span class="n">payment_provider</span><span class="si">}</span><span class="s2">_subscription"</span>
|
|
903
|
+
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">service_manager</span><span class="p">,</span> <span class="n">cancel_service</span><span class="p">):</span>
|
|
904
|
+
<span class="k">await</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">service_manager</span><span class="p">,</span> <span class="n">cancel_service</span><span class="p">)(</span>
|
|
905
|
+
<span class="n">provider_subscription_id</span><span class="o">=</span><span class="n">subscription</span><span class="o">.</span><span class="n">provider_subscription_id</span><span class="p">,</span>
|
|
906
|
+
<span class="n">at_period_end</span><span class="o">=</span><span class="n">at_period_end</span>
|
|
907
|
+
<span class="p">)</span>
|
|
908
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
909
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to cancel with provider: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
910
|
+
<span class="c1"># Continue with local cancellation even if provider fails</span>
|
|
911
|
+
|
|
912
|
+
<span class="c1"># Update subscription status</span>
|
|
913
|
+
<span class="n">updated_subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">cancel_subscription</span><span class="p">(</span>
|
|
914
|
+
<span class="n">subscription_id</span><span class="p">,</span>
|
|
915
|
+
<span class="n">at_period_end</span>
|
|
916
|
+
<span class="p">)</span>
|
|
917
|
+
|
|
918
|
+
<span class="k">return</span> <span class="n">updated_subscription</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span></div>
|
|
919
|
+
|
|
920
|
+
|
|
921
|
+
<div class="viewcode-block" id="get_subscription_by_provider_id">
|
|
922
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_subscription_by_provider_id">[docs]</a>
|
|
923
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
924
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_subscription_by_provider_id</span><span class="p">(</span><span class="n">provider_subscription_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
|
|
925
|
+
<span class="w"> </span><span class="sd">"""Get subscription by provider subscription ID (e.g., Stripe subscription ID)</span>
|
|
926
|
+
<span class="sd"> </span>
|
|
927
|
+
<span class="sd"> Args:</span>
|
|
928
|
+
<span class="sd"> provider_subscription_id: Provider's subscription ID</span>
|
|
929
|
+
<span class="sd"> context: Request context</span>
|
|
930
|
+
<span class="sd"> </span>
|
|
931
|
+
<span class="sd"> Returns:</span>
|
|
932
|
+
<span class="sd"> Optional[Dict]: Subscription details or None if not found</span>
|
|
933
|
+
<span class="sd"> """</span>
|
|
934
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
935
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
936
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
937
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
938
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
939
|
+
|
|
940
|
+
<span class="k">try</span><span class="p">:</span>
|
|
941
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_subscriptions_by_provider_id</span><span class="p">(</span>
|
|
942
|
+
<span class="n">provider</span><span class="o">=</span><span class="s1">'stripe'</span><span class="p">,</span>
|
|
943
|
+
<span class="n">provider_subscription_id</span><span class="o">=</span><span class="n">provider_subscription_id</span>
|
|
944
|
+
<span class="p">)</span>
|
|
945
|
+
<span class="k">return</span> <span class="n">subscriptions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">if</span> <span class="n">subscriptions</span> <span class="k">else</span> <span class="kc">None</span>
|
|
946
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
947
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Error getting subscription by provider ID: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
948
|
+
<span class="k">return</span> <span class="kc">None</span></div>
|
|
949
|
+
|
|
950
|
+
|
|
951
|
+
|
|
952
|
+
<div class="viewcode-block" id="update_subscription_status">
|
|
953
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.update_subscription_status">[docs]</a>
|
|
954
|
+
<span class="nd">@service</span><span class="p">()</span>
|
|
955
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">update_subscription_status</span><span class="p">(</span><span class="n">subscription_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">status</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
|
|
956
|
+
<span class="w"> </span><span class="sd">"""Update a subscription's status</span>
|
|
957
|
+
<span class="sd"> </span>
|
|
958
|
+
<span class="sd"> Args:</span>
|
|
959
|
+
<span class="sd"> subscription_id: Internal subscription ID</span>
|
|
960
|
+
<span class="sd"> status: New status (active, canceled, etc.)</span>
|
|
961
|
+
<span class="sd"> context: Request context</span>
|
|
962
|
+
<span class="sd"> </span>
|
|
963
|
+
<span class="sd"> Returns:</span>
|
|
964
|
+
<span class="sd"> Optional[Dict]: Updated subscription details or None if not found</span>
|
|
965
|
+
<span class="sd"> """</span>
|
|
966
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
967
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
968
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
969
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
970
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
971
|
+
|
|
972
|
+
<span class="k">try</span><span class="p">:</span>
|
|
973
|
+
<span class="n">subscription</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">update_subscription_status</span><span class="p">(</span><span class="n">subscription_id</span><span class="p">,</span> <span class="n">status</span><span class="p">)</span>
|
|
974
|
+
<span class="k">return</span> <span class="n">subscription</span><span class="o">.</span><span class="n">to_dict</span><span class="p">()</span> <span class="k">if</span> <span class="n">subscription</span> <span class="k">else</span> <span class="kc">None</span>
|
|
975
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
976
|
+
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Error updating subscription status: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
977
|
+
<span class="k">return</span> <span class="kc">None</span></div>
|
|
978
|
+
|
|
979
|
+
|
|
980
|
+
<span class="c1"># Command methods</span>
|
|
981
|
+
|
|
982
|
+
<div class="viewcode-block" id="list_subscription_plans">
|
|
983
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.list_subscription_plans">[docs]</a>
|
|
984
|
+
<span class="nd">@command</span><span class="p">()</span>
|
|
985
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">list_subscription_plans</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
986
|
+
<span class="w"> </span><span class="sd">"""List available subscription plans</span>
|
|
987
|
+
<span class="sd"> </span>
|
|
988
|
+
<span class="sd"> Example:</span>
|
|
989
|
+
<span class="sd"> { "list_subscription_plans": {} }</span>
|
|
990
|
+
<span class="sd"> """</span>
|
|
991
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
992
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
993
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
994
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
995
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
996
|
+
|
|
997
|
+
<span class="n">plans</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">list_plans</span><span class="p">(</span><span class="n">active_only</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
998
|
+
|
|
999
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">plans</span><span class="p">:</span>
|
|
1000
|
+
<span class="k">return</span> <span class="s2">"No subscription plans are currently available."</span>
|
|
1001
|
+
|
|
1002
|
+
<span class="n">result</span> <span class="o">=</span> <span class="s2">"Available Subscription Plans:</span><span class="se">\n\n</span><span class="s2">"</span>
|
|
1003
|
+
|
|
1004
|
+
<span class="k">for</span> <span class="n">plan</span> <span class="ow">in</span> <span class="n">plans</span><span class="p">:</span>
|
|
1005
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Plan: </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1006
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Description: </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">description</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1007
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Price: </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">price</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">currency</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">interval</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1008
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Credits: </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">credits_per_cycle</span><span class="si">}</span><span class="s2"> per </span><span class="si">{</span><span class="n">plan</span><span class="o">.</span><span class="n">interval</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1009
|
+
|
|
1010
|
+
<span class="k">if</span> <span class="n">plan</span><span class="o">.</span><span class="n">features</span><span class="p">:</span>
|
|
1011
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="s2">"Features:</span><span class="se">\n</span><span class="s2">"</span>
|
|
1012
|
+
<span class="k">for</span> <span class="n">feature</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">plan</span><span class="o">.</span><span class="n">features</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
1013
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"- </span><span class="si">{</span><span class="n">feature</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1014
|
+
|
|
1015
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
1016
|
+
|
|
1017
|
+
<span class="k">return</span> <span class="n">result</span></div>
|
|
1018
|
+
|
|
1019
|
+
|
|
1020
|
+
<div class="viewcode-block" id="get_my_subscriptions">
|
|
1021
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.subscriptions.html#mindroot.coreplugins.subscriptions.mod.get_my_subscriptions">[docs]</a>
|
|
1022
|
+
<span class="nd">@command</span><span class="p">()</span>
|
|
1023
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_my_subscriptions</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
1024
|
+
<span class="w"> </span><span class="sd">"""Get current user's subscriptions</span>
|
|
1025
|
+
<span class="sd"> </span>
|
|
1026
|
+
<span class="sd"> Example:</span>
|
|
1027
|
+
<span class="sd"> { "get_my_subscriptions": {} }</span>
|
|
1028
|
+
<span class="sd"> """</span>
|
|
1029
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">context</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">context</span><span class="o">.</span><span class="n">username</span><span class="p">:</span>
|
|
1030
|
+
<span class="k">return</span> <span class="s2">"You must be logged in to view your subscriptions."</span>
|
|
1031
|
+
|
|
1032
|
+
<span class="k">global</span> <span class="n">_subscription_manager</span>
|
|
1033
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">_subscription_manager</span><span class="p">:</span>
|
|
1034
|
+
<span class="n">plugin</span> <span class="o">=</span> <span class="n">SubscriptionsPlugin</span><span class="p">(</span><span class="n">get_base_path</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
|
|
1035
|
+
<span class="n">_</span><span class="p">,</span> <span class="n">subscription_manager</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">create_components</span><span class="p">()</span>
|
|
1036
|
+
<span class="n">_subscription_manager</span> <span class="o">=</span> <span class="n">subscription_manager</span>
|
|
1037
|
+
|
|
1038
|
+
<span class="n">subscriptions</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_user_subscriptions</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">username</span><span class="p">)</span>
|
|
1039
|
+
|
|
1040
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">subscriptions</span><span class="p">:</span>
|
|
1041
|
+
<span class="k">return</span> <span class="s2">"You don't have any active subscriptions."</span>
|
|
1042
|
+
|
|
1043
|
+
<span class="n">result</span> <span class="o">=</span> <span class="s2">"Your Subscriptions:</span><span class="se">\n\n</span><span class="s2">"</span>
|
|
1044
|
+
|
|
1045
|
+
<span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subscriptions</span><span class="p">:</span>
|
|
1046
|
+
<span class="n">plan</span> <span class="o">=</span> <span class="k">await</span> <span class="n">_subscription_manager</span><span class="o">.</span><span class="n">get_plan</span><span class="p">(</span><span class="n">sub</span><span class="o">.</span><span class="n">plan_id</span><span class="p">)</span>
|
|
1047
|
+
<span class="n">plan_name</span> <span class="o">=</span> <span class="n">plan</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="n">plan</span> <span class="k">else</span> <span class="s2">"Unknown Plan"</span>
|
|
1048
|
+
|
|
1049
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Plan: </span><span class="si">{</span><span class="n">plan_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1050
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Status: </span><span class="si">{</span><span class="n">sub</span><span class="o">.</span><span class="n">status</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1051
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"Current period: </span><span class="si">{</span><span class="n">sub</span><span class="o">.</span><span class="n">current_period_start</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">sub</span><span class="o">.</span><span class="n">current_period_end</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
1052
|
+
|
|
1053
|
+
<span class="k">if</span> <span class="n">sub</span><span class="o">.</span><span class="n">cancel_at_period_end</span><span class="p">:</span>
|
|
1054
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="s2">"Will cancel at end of current period</span><span class="se">\n</span><span class="s2">"</span>
|
|
1055
|
+
|
|
1056
|
+
<span class="n">result</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
1057
|
+
|
|
1058
|
+
<span class="k">return</span> <span class="n">result</span></div>
|
|
1059
|
+
|
|
1060
|
+
</pre></div>
|
|
1061
|
+
|
|
1062
|
+
</div>
|
|
1063
|
+
</div>
|
|
1064
|
+
<footer>
|
|
1065
|
+
|
|
1066
|
+
<hr/>
|
|
1067
|
+
|
|
1068
|
+
<div role="contentinfo">
|
|
1069
|
+
<p>© Copyright 2025, Jason Livesay.</p>
|
|
1070
|
+
</div>
|
|
1071
|
+
|
|
1072
|
+
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
|
1073
|
+
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
|
1074
|
+
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
</footer>
|
|
1078
|
+
</div>
|
|
1079
|
+
</div>
|
|
1080
|
+
</section>
|
|
1081
|
+
</div>
|
|
1082
|
+
<script>
|
|
1083
|
+
jQuery(function () {
|
|
1084
|
+
SphinxRtdTheme.Navigation.enable(true);
|
|
1085
|
+
});
|
|
1086
|
+
</script>
|
|
1087
|
+
|
|
1088
|
+
</body>
|
|
1089
|
+
</html>
|