From 920999ccb029e2b13d34411b302673704f9f9322 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 28 Jan 2026 00:51:55 +0000 Subject: [PATCH] add send message from admin panel --- core/__pycache__/admin.cpython-311.pyc | Bin 12030 -> 15060 bytes core/admin.py | 51 +++++++++++++++++- .../core/user/send_whatsapp_message.html | 20 +++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 core/templates/admin/core/user/send_whatsapp_message.html diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 6364bac4216635bf2f7b15cdd08e455c2db03ece..8040b574823b05e7661c2fd5f8d4674a0e3ab106 100644 GIT binary patch delta 5093 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 CG|aXD delta 2391 zcmZ`)T}%{L6yD1&yDYFQ^5Y_|?D8k9EP@C{q}uvlTfiT%QT*AAGuL%+*}*fj6-`r2 zV=UFC(O$JNHb!HVSdFFGhd$Z#rD@_rwMie$ytSzhrY|*Z8rz4q=iC8`LD%%4c8DaAAs3DYC(MNc{wd&Q}OWLSnO z4HiKY%7OM4nh7e!j!>g_H4R(ESSYlw8;7>QwQI*e@0XM57hFvm?bl7{Uy@dtBUO{nJmK}ZLoOKfPmTVwl%(JLj%?IPf+KBDuqm2gg> zrCTWueIgJ)z`8^#-ZplA=HpLj6e6JL9IyPFMpZsy=|&nZAZfetyuw8iUm~Co;Zp(` zS?>Q83|+|DjKgL8HFFVW)$2z%JyEwkrC5hVeKaWI&Bg59?3(7wIki_%6mvr<{=fnP zS*kDe8Sz)kMs`uGZS5<|$1T<>MqfEI zHbiy`v>_#(G?pL6>k%r53G`cvdW36R(&N^0H_sI3azj(B&rELM* a#(s0X9M9>`q~wp;@}=3fuB*&Lf&T}8FF;-Z diff --git a/core/admin.py b/core/admin.py index 54f6b0f..c8e66eb 100644 --- a/core/admin.py +++ b/core/admin.py @@ -12,7 +12,7 @@ from django.conf import settings from .mail import send_html_email import logging import csv -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect class ProfileInline(admin.StackedInline): model = Profile @@ -26,7 +26,7 @@ class ProfileInline(admin.StackedInline): class CustomUserAdmin(UserAdmin): inlines = (ProfileInline,) - list_display = ('username', 'email', 'get_role', 'get_approval_status', 'is_active', 'is_staff') + list_display = ('username', 'email', 'get_role', 'get_approval_status', 'is_active', 'is_staff', 'send_whatsapp_link') list_filter = ('is_active', 'is_staff', 'profile__role', 'profile__is_approved') def get_role(self, obj): @@ -43,6 +43,53 @@ class CustomUserAdmin(UserAdmin): return list() return super(CustomUserAdmin, self).get_inline_instances(request, obj) + def get_urls(self): + urls = super().get_urls() + custom_urls = [ + path('/send-whatsapp/', self.admin_site.admin_view(self.send_whatsapp_view), name='user-send-whatsapp'), + ] + return custom_urls + urls + + def send_whatsapp_view(self, request, user_id): + user = self.get_object(request, user_id) + if not user: + messages.error(request, _("User not found.")) + return HttpResponseRedirect(reverse('admin:auth_user_changelist')) + + if not hasattr(user, 'profile') or not user.profile.phone_number: + messages.warning(request, _("This user does not have a phone number in their profile.")) + return HttpResponseRedirect(reverse('admin:auth_user_changelist')) + + if request.method == 'POST': + message = request.POST.get('message') + if message: + success, msg = send_whatsapp_message_detailed(user.profile.phone_number, message) + if success: + messages.success(request, _("WhatsApp message sent successfully.")) + return HttpResponseRedirect(reverse('admin:auth_user_changelist')) + else: + messages.error(request, _(f"Failed to send message: {msg}")) + else: + messages.warning(request, _("Message cannot be empty.")) + + context = dict( + self.admin_site.each_context(request), + user_obj=user, + phone_number=user.profile.phone_number, + ) + return render(request, "admin/core/user/send_whatsapp_message.html", context) + + def send_whatsapp_link(self, obj): + if hasattr(obj, 'profile') and obj.profile.phone_number: + return format_html( + '{}', + reverse('admin:user-send-whatsapp', args=[obj.pk]), + _('Send WhatsApp') + ) + return "-" + send_whatsapp_link.short_description = _("WhatsApp") + send_whatsapp_link.allow_tags = True + class ParcelAdmin(admin.ModelAdmin): list_display = ('tracking_number', 'shipper', 'carrier', 'price', 'status', 'payment_status', 'created_at') list_filter = ('status', 'payment_status', 'created_at') diff --git a/core/templates/admin/core/user/send_whatsapp_message.html b/core/templates/admin/core/user/send_whatsapp_message.html new file mode 100644 index 0000000..256aeed --- /dev/null +++ b/core/templates/admin/core/user/send_whatsapp_message.html @@ -0,0 +1,20 @@ +{% extends "admin/base_site.html" %} +{% load i18n static %} + +{% block content %} +
+
+ {% csrf_token %} +
+
+ + +
+
+ +
+
+{% endblock %}