fix error in gitignore

This commit is contained in:
2026-09-24 12:32:59 +03:30
commit 86c117ee2a
165 changed files with 5963 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
"""Pluggable SMS / notification providers.
Providers are selected at runtime from the dynamic settings store, so an SMS
gateway can be configured from the admin panel without touching code. Business
logic only ever talks to the provider interface.
"""
import json
import re
import urllib.request
from typing import Protocol
from apps.core.settings_service import SettingsService
class SmsProviderInterface(Protocol):
def send(self, recipient: str, message: str) -> str:
"""Return the provider message id."""
...
class MockSmsProvider:
def send(self, recipient: str, message: str) -> str:
return f"MOCK-{recipient}-{abs(hash(message)) % 10_000_000}"
class HttpSmsProvider:
"""Generic HTTP gateway: POSTs a JSON payload to a configurable endpoint."""
def __init__(self, endpoint: str, api_key: str = "", sender: str = ""):
self.endpoint = endpoint
self.api_key = api_key
self.sender = sender
def send(self, recipient: str, message: str) -> str:
payload = {"to": recipient, "text": message, "from": self.sender, "api_key": self.api_key}
data = json.dumps(payload).encode("utf-8")
request = urllib.request.Request(
self.endpoint, data=data, headers={"Content-Type": "application/json"}, method="POST"
)
with urllib.request.urlopen(request, timeout=15) as response:
return response.read().decode("utf-8", "replace")[:120]
def get_sms_provider() -> SmsProviderInterface:
service = SettingsService()
provider = service.get("sms.provider", "mock")
if provider == "http":
return HttpSmsProvider(
endpoint=service.get("sms.endpoint", ""),
api_key=service.get("sms.api_key", ""),
sender=service.get("sms.sender", ""),
)
return MockSmsProvider()
def render_template(template_text: str, context: dict) -> str:
def _replace(match):
key = match.group(1)
return str(context.get(key, ""))
return re.sub(r"\{\{\s*(\w+)\s*\}\}", _replace, template_text)