183 lines
13 KiB
Python
183 lines
13 KiB
Python
from django.utils.translation import get_language
|
|
from .models import NotificationTemplate
|
|
from django.template import Template, Context
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
DEFAULT_TEMPLATES = {
|
|
'otp_registration': {
|
|
'description': 'Sent when a user registers (Email/WhatsApp)',
|
|
'variables': '{{ code }}',
|
|
'subject_en': 'Verification Code',
|
|
'subject_ar': 'رمز التحقق',
|
|
'email_body_en': 'Your Masar Verification Code is {{ code }}',
|
|
'email_body_ar': 'رمز التحقق الخاص بك هو {{ code }}',
|
|
'whatsapp_body_en': 'Your Masar Verification Code is {{ code }}',
|
|
'whatsapp_body_ar': 'رمز التحقق الخاص بك هو {{ code }}',
|
|
},
|
|
'otp_login': {
|
|
'description': 'Sent for 2FA Login (Email/WhatsApp)',
|
|
'variables': '{{ code }}',
|
|
'subject_en': 'Login OTP',
|
|
'subject_ar': 'رمز الدخول',
|
|
'email_body_en': 'Your Masar Login Code is {{ code }}. Do not share this code.',
|
|
'email_body_ar': 'رمز دخول مسار هو {{ code }}. لا تشارك هذا الرمز.',
|
|
'whatsapp_body_en': 'Your Masar Login Code is {{ code }}. Do not share this code.',
|
|
'whatsapp_body_ar': 'رمز دخول مسار هو {{ code }}. لا تشارك هذا الرمز.',
|
|
},
|
|
'otp_profile_update': {
|
|
'description': 'Sent when updating profile sensitive info',
|
|
'variables': '{{ code }}',
|
|
'subject_en': 'Verification Code',
|
|
'subject_ar': 'رمز التحقق',
|
|
'email_body_en': 'Your Masar Update Code is {{ code }}',
|
|
'email_body_ar': 'رمز التحديث الخاص بك هو {{ code }}',
|
|
'whatsapp_body_en': 'Your Masar Update Code is {{ code }}',
|
|
'whatsapp_body_ar': 'رمز التحديث الخاص بك هو {{ code }}',
|
|
},
|
|
'shipment_created_shipper': {
|
|
'description': 'Sent to Shipper when they create a shipment',
|
|
'variables': '{{ name }}, {{ description }}, {{ tracking_number }}, {{ status }}',
|
|
'subject_en': 'Shipment Request Received - {{ tracking_number }}',
|
|
'subject_ar': 'تم استلام طلب الشحنة - {{ tracking_number }}',
|
|
'email_body_en': "Hello {{ name }},\n\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}\n\nPlease proceed to payment to make it visible to drivers.",
|
|
'email_body_ar': "مرحباً {{ name }}،\n\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}\n\nيرجى متابعة الدفع لجعلها مرئية للسائقين.",
|
|
'whatsapp_body_en': "Hello {{ name }},\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}\nPlease proceed to payment.",
|
|
'whatsapp_body_ar': "مرحباً {{ name }}،\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}\nيرجى الدفع.",
|
|
},
|
|
'payment_success_shipper': {
|
|
'description': 'Sent to Shipper after payment',
|
|
'variables': '{{ tracking_number }}',
|
|
'subject_en': 'Payment Successful - {{ tracking_number }}',
|
|
'subject_ar': 'تم الدفع بنجاح - {{ tracking_number }}',
|
|
'email_body_en': 'Payment successful for shipment {{ tracking_number }}.\nYour shipment is now visible to available drivers.',
|
|
'email_body_ar': 'تم الدفع بنجاح للشحنة {{ tracking_number }}.\nشحنتك الآن مرئية للسائقين المتاحين.',
|
|
'whatsapp_body_en': 'Payment successful for shipment {{ tracking_number }}.\nYour shipment is now visible to available drivers.',
|
|
'whatsapp_body_ar': 'تم الدفع بنجاح للشحنة {{ tracking_number }}.\nشحنتك الآن مرئية للسائقين المتاحين.',
|
|
},
|
|
'shipment_visible_receiver': {
|
|
'description': 'Sent to Receiver when shipment is paid/ready',
|
|
'variables': '{{ receiver_name }}, {{ shipper_name }}, {{ tracking_number }}, {{ status }}',
|
|
'subject_en': 'Incoming Shipment - {{ tracking_number }}',
|
|
'subject_ar': 'شحنة واردة - {{ tracking_number }}',
|
|
'email_body_en': 'Hello {{ receiver_name }},\n\nA shipment is coming your way from {{ shipper_name }}.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}',
|
|
'email_body_ar': 'مرحباً {{ receiver_name }}،\n\nشحنة قادمة إليك من {{ shipper_name }}.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}',
|
|
'whatsapp_body_en': 'Hello {{ receiver_name }},\nA shipment is coming your way from {{ shipper_name }}.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}',
|
|
'whatsapp_body_ar': 'مرحباً {{ receiver_name }}،\nشحنة قادمة إليك من {{ shipper_name }}.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}',
|
|
},
|
|
'driver_pickup_shipper': {
|
|
'description': 'Sent to Shipper when driver picks up',
|
|
'variables': '{{ tracking_number }}, {{ driver_name }}, {{ car_plate_number }}, {{ status }}',
|
|
'subject_en': 'Driver Assigned - {{ tracking_number }}',
|
|
'subject_ar': 'تم تعيين سائق - {{ tracking_number }}',
|
|
'email_body_en': 'Shipment {{ tracking_number }} has been picked up by {{ driver_name }}.\nCar Plate: {{ car_plate_number }}\nStatus: {{ status }}',
|
|
'email_body_ar': 'الشحنة {{ tracking_number }} تم استلامها بواسطة {{ driver_name }}.\nرقم اللوحة: {{ car_plate_number }}\nالحالة: {{ status }}',
|
|
'whatsapp_body_en': 'Shipment {{ tracking_number }} has been picked up by {{ driver_name }}.\nCar Plate: {{ car_plate_number }}\nStatus: {{ status }}',
|
|
'whatsapp_body_ar': 'الشحنة {{ tracking_number }} تم استلامها بواسطة {{ driver_name }}.\nرقم اللوحة: {{ car_plate_number }}\nالحالة: {{ status }}',
|
|
},
|
|
'driver_pickup_receiver': {
|
|
'description': 'Sent to Receiver when driver picks up',
|
|
'variables': '{{ tracking_number }}, {{ shipper_name }}, {{ driver_name }}, {{ car_plate_number }}',
|
|
'subject_en': 'Shipment On The Way - {{ tracking_number }}',
|
|
'subject_ar': 'الشحنة في الطريق - {{ tracking_number }}',
|
|
'email_body_en': 'Shipment {{ tracking_number }} from {{ shipper_name }} is on the way (Picked up).\nDriver: {{ driver_name }}\nCar Plate: {{ car_plate_number }}',
|
|
'email_body_ar': 'الشحنة {{ tracking_number }} من {{ shipper_name }} في الطريق (تم الاستلام).\nالسائق: {{ driver_name }}\nرقم اللوحة: {{ car_plate_number }}',
|
|
'whatsapp_body_en': 'Shipment {{ tracking_number }} from {{ shipper_name }} is on the way (Picked up).\nDriver: {{ driver_name }}\nCar Plate: {{ car_plate_number }}',
|
|
'whatsapp_body_ar': 'الشحنة {{ tracking_number }} من {{ shipper_name }} في الطريق (تم الاستلام).\nالسائق: {{ driver_name }}\nرقم اللوحة: {{ car_plate_number }}',
|
|
},
|
|
'driver_pickup_driver': {
|
|
'description': 'Sent to Driver upon acceptance',
|
|
'variables': '{{ tracking_number }}, {{ shipper_name }}, {{ pickup_address }}, {{ delivery_address }}, {{ price }}',
|
|
'subject_en': 'Shipment Accepted - {{ tracking_number }}',
|
|
'subject_ar': 'تم قبول الشحنة - {{ tracking_number }}',
|
|
'email_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nPrice: {{ price }} OMR',
|
|
'email_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالسعر: {{ price }} ر.ع',
|
|
'whatsapp_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nPrice/Bid: {{ price }} OMR',
|
|
'whatsapp_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالسعر: {{ price }} ر.ع',
|
|
},
|
|
'shipment_status_update': {
|
|
'description': 'Sent on general status change (In Transit, Delivered)',
|
|
'variables': '{{ tracking_number }}, {{ status }}',
|
|
'subject_en': 'Shipment Update - {{ tracking_number }}',
|
|
'subject_ar': 'تحديث الشحنة - {{ tracking_number }}',
|
|
'email_body_en': 'Update for shipment {{ tracking_number }}:\nNew Status: {{ status }}',
|
|
'email_body_ar': 'تحديث للشحنة {{ tracking_number }}:\nالحالة الجديدة: {{ status }}',
|
|
'whatsapp_body_en': 'Update for shipment {{ tracking_number }}:\nNew Status: {{ status }}',
|
|
'whatsapp_body_ar': 'تحديث للشحنة {{ tracking_number }}:\nالحالة الجديدة: {{ status }}',
|
|
},
|
|
'admin_alert_driver_accept': {
|
|
'description': 'Sent to Admin when driver accepts shipment',
|
|
'variables': '{{ driver_name }}, {{ car_plate_number }}, {{ tracking_number }}, {{ shipper_name }}, {{ price }}',
|
|
'subject_en': 'Shipment Accepted ({{ tracking_number }})',
|
|
'subject_ar': 'تم قبول الشحنة ({{ tracking_number }})',
|
|
'email_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nPrice: {{ price }} OMR',
|
|
'email_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالسعر: {{ price }} ر.ع',
|
|
'whatsapp_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nPrice: {{ price }} OMR',
|
|
'whatsapp_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالسعر: {{ price }} ر.ع',
|
|
},
|
|
'contact_form_admin': {
|
|
'description': 'Sent to Admin when contact form is submitted',
|
|
'variables': '{{ name }}, {{ email }}, {{ message }}',
|
|
'subject_en': 'New Contact Message from {{ name }}',
|
|
'subject_ar': 'رسالة جديدة من {{ name }}',
|
|
'email_body_en': 'You have received a new message from your website contact form.\n\nName: {{ name }}\nEmail: {{ email }}\n\nMessage:\n{{ message }}',
|
|
'email_body_ar': 'لقد تلقيت رسالة جديدة من نموذج الاتصال.\n\nالاسم: {{ name }}\nالبريد: {{ email }}\n\nالرسالة:\n{{ message }}',
|
|
'whatsapp_body_en': 'New Message from {{ name }}:\n{{ message }}',
|
|
'whatsapp_body_ar': 'رسالة جديدة من {{ name }}:\n{{ message }}',
|
|
}
|
|
}
|
|
|
|
def get_notification_content(key, context, language=None):
|
|
if not language:
|
|
language = get_language() or 'en'
|
|
|
|
# 1. Fetch or Create Template
|
|
try:
|
|
template_obj = NotificationTemplate.objects.get(key=key)
|
|
except NotificationTemplate.DoesNotExist:
|
|
# Create default
|
|
default = DEFAULT_TEMPLATES.get(key)
|
|
if default:
|
|
template_obj = NotificationTemplate.objects.create(
|
|
key=key,
|
|
description=default.get('description', ''),
|
|
available_variables=default.get('variables', ''),
|
|
subject_en=default.get('subject_en', ''),
|
|
subject_ar=default.get('subject_ar', ''),
|
|
email_body_en=default.get('email_body_en', ''),
|
|
email_body_ar=default.get('email_body_ar', ''),
|
|
whatsapp_body_en=default.get('whatsapp_body_en', ''),
|
|
whatsapp_body_ar=default.get('whatsapp_body_ar', ''),
|
|
)
|
|
else:
|
|
# Fallback if key unknown
|
|
return f"[{key}] Subject", f"[{key}] Body", f"[{key}] WA"
|
|
|
|
# 2. Select Language Fields
|
|
# Note: If translation is missing, fallback to EN
|
|
if language == 'ar':
|
|
subject = template_obj.subject_ar or template_obj.subject_en
|
|
email_body = template_obj.email_body_ar or template_obj.email_body_en
|
|
whatsapp_body = template_obj.whatsapp_body_ar or template_obj.whatsapp_body_en
|
|
else:
|
|
subject = template_obj.subject_en
|
|
email_body = template_obj.email_body_en
|
|
whatsapp_body = template_obj.whatsapp_body_en
|
|
|
|
# 3. Render
|
|
# Use Django Template engine for variable substitution
|
|
|
|
def render(text, ctx):
|
|
if not text: return ""
|
|
try:
|
|
# Convert context to dict if it isn't already
|
|
if not isinstance(ctx, dict):
|
|
ctx = {}
|
|
t = Template(text)
|
|
return t.render(Context(ctx))
|
|
except Exception as e:
|
|
logger.error(f"Template rendering error for {key}: {e}")
|
|
return text
|
|
|
|
return render(subject, context), render(email_body, context), render(whatsapp_body, context) |