diff --git a/manage_events/management/commands/get_specific_manager_report.py b/manage_events/management/commands/get_specific_manager_report.py new file mode 100644 index 0000000..97a8adb --- /dev/null +++ b/manage_events/management/commands/get_specific_manager_report.py @@ -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)}")) diff --git a/manage_events/management/commands/manager_report.py b/manage_events/management/commands/manager_report.py index 5e8778e..c2117bc 100644 --- a/manage_events/management/commands/manager_report.py +++ b/manage_events/management/commands/manager_report.py @@ -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) diff --git a/manage_events/report.py b/manage_events/report.py index 704ce90..70c0d75 100644 --- a/manage_events/report.py +++ b/manage_events/report.py @@ -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()