29 lines
922 B
Python
29 lines
922 B
Python
|
|
from abc import ABC, abstractmethod
|
||
|
|
|
||
|
|
|
||
|
|
class IssueAdapter(ABC):
|
||
|
|
"""
|
||
|
|
Adapter-Basisklasse. Jeder externe Issue-Tracker implementiert diese
|
||
|
|
Schnittstelle. Registrierung via ISSUE_ADAPTERS-Dict in settings.
|
||
|
|
"""
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def create_issue(self, aufgabe) -> dict:
|
||
|
|
"""Legt ein Issue im externen System an. Gibt {'url', 'key'} zurück."""
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def fetch_status(self, external_issue) -> str:
|
||
|
|
"""Liest den aktuellen Status aus dem externen System."""
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
def close_issue(self, external_issue) -> None:
|
||
|
|
"""Schließt das Issue im externen System."""
|
||
|
|
|
||
|
|
|
||
|
|
def get_adapter(system: str) -> 'IssueAdapter | None':
|
||
|
|
"""Gibt den registrierten Adapter für `system` zurück, oder None."""
|
||
|
|
from django.conf import settings
|
||
|
|
adapters = getattr(settings, 'ISSUE_ADAPTERS', {})
|
||
|
|
cls = adapters.get(system)
|
||
|
|
return cls() if cls else None
|