Fix some task quirks
This commit is contained in:
@@ -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":
|
||||
|
||||
Reference in New Issue
Block a user