fix: report isssue and custom command to generate individual marchant report

This commit is contained in:
bobbyvish
2024-11-28 15:56:20 +05:30
parent 76323a1ea1
commit 76ac9413c4
3 changed files with 65 additions and 5 deletions

View File

@@ -0,0 +1,60 @@
from django.core.mail import EmailMessage
from django.conf import settings
from django.core.management.base import BaseCommand
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
from django.utils.timezone import now
from django.contrib.auth import get_user_model
import calendar
from manage_events.report import generate_event_report, generate_event_report_pdf_three
class Command(BaseCommand):
help = 'Getting event reports of specific event managers'
def add_arguments(self, parser):
parser.add_argument('month', type=int, help='Month number (1-12)')
parser.add_argument('email', type=str, help='User email address')
parser.add_argument('mail_send_on', type=str, help='Email to send the report')
def handle(self, *args, **kwargs):
month = kwargs['month']
email = kwargs['email']
mail_send_on = kwargs['mail_send_on']
# Validate the month
if month < 1 or month > 12:
self.stdout.write(self.style.ERROR("Invalid month. Must be between 1 and 12."))
return
User = get_user_model()
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
self.stdout.write(self.style.ERROR(f"User with email {email} does not exist."))
return
# Calculate start and end dates of the month
year = now().year # Assuming the current year
start_date = datetime(year, month, 1)
last_day = calendar.monthrange(year, month)[1]
end_date = datetime(year, month, last_day)
report_data = generate_event_report(user.id, start_date, end_date)
if report_data:
pdf_data, filename = generate_event_report_pdf_three(user, report_data, start_date)
self.send_email_with_attachment(mail_send_on, pdf_data, filename)
def send_email_with_attachment(self, email, pdf_data, filename):
try:
email_message = EmailMessage(
subject="Monthly Event Report",
body="Please find the attached report for the last month.",
to=[email],
from_email=settings.DEFAULT_FROM_EMAIL,
)
email_message.attach(filename, pdf_data, "application/pdf")
email_message.send()
self.stdout.write(self.style.SUCCESS(f"Email successfully sent to {email} with attachment {filename}."))
except Exception as e:
self.stdout.write(self.style.ERROR(f"Failed to send email to {email}. Error: {str(e)}"))

View File

@@ -17,7 +17,7 @@ class Command(BaseCommand):
users = event_managers()
for user in users:
report_data = generate_event_report(user.id)
report_data = generate_event_report(user.id, start_date, end_date)
if report_data:
pdf_data, filename = generate_event_report_pdf_three(user, report_data)
self.send_email_with_attachment(user.email, pdf_data, filename)

View File

@@ -52,8 +52,8 @@ def get_previous_month_date_range():
return first_day_of_previous_month, last_day_of_previous_month
def generate_event_report(user_id):
start_date, end_date = get_previous_month_date_range()
def generate_event_report(user_id, start_date, end_date):
# start_date, end_date = get_previous_month_date_range()
user = User.objects.get(id=user_id)
# events = Event.objects.filter(
@@ -167,8 +167,8 @@ def generate_event_report(user_id):
return report_data
def generate_event_report_pdf_three(user, report_data):
start_date, _ = get_previous_month_date_range()
def generate_event_report_pdf_three(user, report_data, start_date):
# start_date, _ = get_previous_month_date_range()
filename = generate_filename(user.email, start_date)
buffer = BytesIO()