Fix Signal messages and replies

This commit is contained in:
2026-03-03 15:51:58 +00:00
parent 56c620473f
commit d6bd56dace
31 changed files with 3317 additions and 668 deletions

View File

@@ -3,6 +3,8 @@ from urllib.parse import urlencode
import orjson
import requests
from django.conf import settings
from django.contrib import messages
from django.db.models import Q
from django.shortcuts import render
from django.urls import reverse
from django.views import View
@@ -68,6 +70,11 @@ class SignalAccounts(SuperUserRequiredMixin, ObjectList):
"service": service,
"service_label": label,
"account_add_url_name": add_url_name,
"account_add_type": "modal",
"account_add_target": "#modals-here",
"account_add_swap": "innerHTML",
"account_unlink_url_name": "signal_account_unlink",
"account_unlink_label": "Relink",
"show_contact_actions": show_contact_actions,
"contacts_url_name": f"{service}_contacts",
"chats_url_name": f"{service}_chats",
@@ -89,6 +96,69 @@ class SignalAccounts(SuperUserRequiredMixin, ObjectList):
return self._normalize_accounts(transport.list_accounts("signal"))
class SignalAccountUnlink(SuperUserRequiredMixin, View):
def post(self, request, *args, **kwargs):
return self.delete(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
account = str(kwargs.get("account") or "").strip()
if account:
ok = transport.unlink_account("signal", account)
if ok:
messages.success(
request,
(
"Signal account unlinked. Next step: enter a device name under "
"'Add account', submit, then scan the new QR code."
),
)
else:
messages.error(
request,
"Signal relink failed to clear current device state. Try relink again.",
)
else:
messages.warning(request, "No Signal account selected to relink.")
rows = []
for item in transport.list_accounts("signal"):
if isinstance(item, dict):
value = (
item.get("number")
or item.get("id")
or item.get("jid")
or item.get("account")
)
if value:
rows.append(str(value))
elif item:
rows.append(str(item))
context = {
"service": "signal",
"service_label": "Signal",
"account_add_url_name": "signal_account_add",
"account_add_type": "modal",
"account_add_target": "#modals-here",
"account_add_swap": "innerHTML",
"account_unlink_url_name": "signal_account_unlink",
"account_unlink_label": "Relink",
"show_contact_actions": True,
"contacts_url_name": "signal_contacts",
"chats_url_name": "signal_chats",
"endpoint_base": str(
getattr(settings, "SIGNAL_HTTP_URL", "http://signal:8080")
).rstrip("/"),
"service_warning": transport.get_service_warning("signal"),
"object_list": rows,
"list_url": reverse("signal_accounts", kwargs={"type": kwargs["type"]}),
"type": kwargs["type"],
"context_object_name_singular": "Signal Account",
"context_object_name": "Signal Accounts",
}
return render(request, "partials/signal-accounts.html", context)
class SignalContactsList(SuperUserRequiredMixin, ObjectList):
list_template = "partials/signal-contacts-list.html"
@@ -141,7 +211,13 @@ class SignalChatsList(SuperUserRequiredMixin, ObjectList):
def get_queryset(self, *args, **kwargs):
pk = self.kwargs.get("pk", "")
chats = list(Chat.objects.filter(account=pk))
chats = list(
Chat.objects.filter(
Q(account=pk) | Q(account__isnull=True) | Q(account="")
).order_by("-id")[:1000]
)
if not chats:
chats = list(Chat.objects.all().order_by("-id")[:1000])
rows = []
for chat in chats:
identifier_candidates = [