Fix some task quirks

This commit is contained in:
2026-03-08 23:16:15 +00:00
parent acedc01e83
commit a7421b9350
7 changed files with 312 additions and 34 deletions

View File

@@ -45,6 +45,50 @@ from core.tasks.engine import create_task_record_and_sync
from core.tasks.providers import get_provider
def _upsert_task_source(
*,
user,
service: str,
channel_identifier: str,
project,
epic=None,
enabled: bool = True,
settings: dict | None = None,
):
service_key = str(service or "").strip().lower()
normalized_identifier = normalize_channel_identifier(service_key, channel_identifier)
if not service_key or not normalized_identifier:
return None, False
source, created = ChatTaskSource.objects.get_or_create(
user=user,
service=service_key,
channel_identifier=normalized_identifier,
defaults={
"project": project,
"epic": epic,
"enabled": bool(enabled),
"settings": dict(settings or {}),
},
)
changed_fields = []
if source.project_id != getattr(project, "id", None):
source.project = project
changed_fields.append("project")
if source.epic_id != getattr(epic, "id", None):
source.epic = epic
changed_fields.append("epic")
if bool(source.enabled) != bool(enabled):
source.enabled = bool(enabled)
changed_fields.append("enabled")
settings_payload = dict(settings or {})
if dict(source.settings or {}) != settings_payload:
source.settings = settings_payload
changed_fields.append("settings")
if changed_fields:
source.save(update_fields=changed_fields + ["updated_at"])
return source, created
def _to_bool(raw, default=False) -> bool:
if raw is None:
return bool(default)
@@ -1562,7 +1606,7 @@ class TaskSettings(LoginRequiredMixin, View):
epic = get_object_or_404(
TaskEpic, id=epic_id, project__user=request.user
)
ChatTaskSource.objects.create(
source, _ = _upsert_task_source(
user=request.user,
service=str(request.POST.get("service") or "web").strip(),
channel_identifier=str(
@@ -1573,6 +1617,8 @@ class TaskSettings(LoginRequiredMixin, View):
enabled=bool(request.POST.get("enabled") or "1"),
settings=_flags_from_post(request, prefix="source_"),
)
if source is None:
messages.error(request, "Invalid channel identifier.")
return _settings_redirect(request)
if action == "quick_setup":
@@ -1598,31 +1644,17 @@ class TaskSettings(LoginRequiredMixin, View):
project=project, name=epic_name
)
if channel_identifier:
source, created = ChatTaskSource.objects.get_or_create(
source, created = _upsert_task_source(
user=request.user,
service=service,
channel_identifier=channel_identifier,
project=project,
defaults={
"epic": epic,
"enabled": True,
"settings": _flags_from_post(request, prefix="source_"),
},
epic=epic,
enabled=True,
settings=_flags_from_post(request, prefix="source_"),
)
if not created:
source.project = project
source.epic = epic
source.enabled = True
source.settings = _flags_from_post(request, prefix="source_")
source.save(
update_fields=[
"project",
"epic",
"enabled",
"settings",
"updated_at",
]
)
if source is None:
messages.error(request, "Invalid channel identifier.")
return _settings_redirect(request)
if action == "project_flags_update":