From d09ff0f9735d9b54050dcea92f457b4d30999f02 Mon Sep 17 00:00:00 2001 From: rizwanisready Date: Mon, 3 Jun 2024 19:30:33 +0530 Subject: [PATCH] report and share api --- .../management/commands/manager_report.py | 33 ++++++++++++ manage_events/report.py | 50 ++++++++++++------- manage_events/views.py | 2 +- requirements.txt | 2 +- 4 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 manage_events/management/commands/manager_report.py diff --git a/manage_events/management/commands/manager_report.py b/manage_events/management/commands/manager_report.py new file mode 100644 index 0000000..8da35e6 --- /dev/null +++ b/manage_events/management/commands/manager_report.py @@ -0,0 +1,33 @@ +from django.core.management.base import BaseCommand +from django.core.mail import EmailMessage +from django.conf import settings +from manage_events.report import ( + get_previous_month_date_range, + event_managers, + generate_event_report, + generate_event_report_pdf_three, +) + + +class Command(BaseCommand): + help = "Send monthly event reports to event managers" + + def handle(self, *args, **kwargs): + start_date, end_date = get_previous_month_date_range() + users = event_managers() + + for user in users: + report_data = generate_event_report(user.id) + if report_data: + pdf_data, filename = generate_event_report_pdf_three(user, report_data) + self.send_email_with_attachment(user.email, pdf_data, filename) + + def send_email_with_attachment(self, email, pdf_data, filename): + email_message = EmailMessage( + subject="Monthly Event Report", + body="Please find the attached report for the last month.", + to=[email], + from_email=settings.EMAIL_HOST_USER, + ) + email_message.attach(filename, pdf_data, "application/pdf") + email_message.send() diff --git a/manage_events/report.py b/manage_events/report.py index be32646..19619f5 100644 --- a/manage_events/report.py +++ b/manage_events/report.py @@ -6,7 +6,7 @@ from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.graphics.shapes import Drawing from reportlab.lib import colors -from reportlab.lib.styles import getSampleStyleSheet +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.graphics.charts.piecharts import Pie from reportlab.platypus import ( SimpleDocTemplate, @@ -21,6 +21,7 @@ from django.conf import settings from collections import defaultdict from reportlab.graphics import renderPDF from django.contrib.auth import get_user_model +from accounts.models import IAmPrincipalType from goodtimes.services import EmailService from manage_events.models import Event, EventInteractionType, EventShare, EventView @@ -37,6 +38,10 @@ def generate_filename(email, date): filename = f"{username}_{month_name}_report.pdf" return filename +def event_managers(): + principal_type = IAmPrincipalType.objects.filter(name="event_manager").first() + return User.objects.filter(principal_type=principal_type, is_active=True) + def get_previous_month_date_range(): today = timezone.now() @@ -69,7 +74,7 @@ def generate_event_report(user_id): ), views_count=Count("views", filter=Q(views__active=True, views__deleted=False)), ) - print("events: ", events) + # print("events: ", events) report_data = [] for event in events: @@ -105,7 +110,7 @@ def generate_event_report(user_id): "shares_data": shares_data, } ) - print("report_data: ", report_data) + # print("report_data: ", report_data) return report_data @@ -121,6 +126,14 @@ def generate_event_report_pdf_three(user, report_data): styles = getSampleStyleSheet() + custom_style = ParagraphStyle( + name="Custom", + parent=styles["Normal"], + fontName="Helvetica", + fontSize=14, + leading=18, + spaceAfter=12, + ) # Header Section title = Paragraph("Good Times Ltd. Monthly Report", styles["Title"]) report_for_month = Paragraph( @@ -148,8 +161,8 @@ def generate_event_report_pdf_three(user, report_data): summary_text = ( f"Number of Events added in {start_date.strftime('%B %Y')} - {len(report_data)}" ) - elements.append(Paragraph(summary_text, styles["Normal"])) - elements.append(Spacer(1, 12)) + elements.append(Paragraph(summary_text, styles["Title"])) + elements.append(Spacer(1, 24)) data = [["Sr No.", "Name of the Event", "Event Type", "Date"]] for idx, event in enumerate(report_data, start=1): @@ -204,12 +217,15 @@ def generate_event_report_pdf_three(user, report_data): # Top 5 Locations and Top 5 Viewed Events all_locations = defaultdict(int) + print("all_locations: ", all_locations) for event in report_data: for location, count in event["locations"].items(): all_locations[location] += count top_locations = sorted(all_locations.items(), key=lambda x: x[1], reverse=True)[:5] + print("top_locations: ", top_locations) top_events = sorted(report_data, key=lambda x: x["views_count"], reverse=True)[:5] + print("top_events: ", top_events) data = [ ["Top 5 Locations Viewed From", "Top 5 Viewed Events"], @@ -239,10 +255,10 @@ def generate_event_report_pdf_three(user, report_data): # Detailed Review of Each Event for event in report_data: - elements.append(Paragraph(f"Event Name - {event['event_name']}", styles['Heading2'])) + elements.append(Paragraph(f"Event Name - {event['event_name']}", styles['Heading1'])) elements.append(Spacer(1, 12)) - elements.append(Paragraph(f"Event Type - {event['event_type']}", styles['Normal'])) - elements.append(Paragraph(f"Event Date - {event['event_date']}", styles['Normal'])) + elements.append(Paragraph(f"Event Type - {event['event_type']}", custom_style)) + elements.append(Paragraph(f"Event Date - {event['event_date']}", custom_style)) views = f"Number of Views - {event['views_count']}" favorites = f"Favorites Count - {event['favorites_count']}" @@ -251,22 +267,22 @@ def generate_event_report_pdf_three(user, report_data): reviews = f"Reviews - {event['reviews_count']}" shares = f"Social Media Shares - {event['social_media_shares']}" - elements.append(Paragraph(views, styles['Normal'])) - elements.append(Paragraph(shares, styles['Normal'])) - elements.append(Paragraph(favorites, styles['Normal'])) - elements.append(Paragraph(interested, styles['Normal'])) - elements.append(Paragraph(going, styles['Normal'])) - elements.append(Paragraph(reviews, styles['Normal'])) + elements.append(Paragraph(views, custom_style)) + elements.append(Paragraph(shares, custom_style)) + elements.append(Paragraph(favorites, custom_style)) + elements.append(Paragraph(interested, custom_style)) + elements.append(Paragraph(going, custom_style)) + elements.append(Paragraph(reviews, custom_style)) elements.append(Spacer(1, 12)) location_details = [] for location, count in event["locations"].items(): location_details.append(f"{location}: {count}") - elements.append(Paragraph("Event viewed from:", styles['Normal'])) - elements.append(Paragraph(", ".join(location_details), styles['Normal'])) + elements.append(Paragraph("Event viewed from:", custom_style)) + elements.append(Paragraph(", ".join(location_details), custom_style)) # elements.append(PageBreak()) - elements.append(Spacer(1, 60)) + elements.append(Spacer(1, 48)) pie_data = [ event["views_count"], diff --git a/manage_events/views.py b/manage_events/views.py index 89c3336..0bfcc9e 100644 --- a/manage_events/views.py +++ b/manage_events/views.py @@ -500,5 +500,5 @@ class GenerateEventReportView(generic.View): # Create the HttpResponse object with the PDF data response = HttpResponse(pdf_data, content_type="application/pdf") response["Content-Disposition"] = f'attachment; filename="{filename}"' - + return response diff --git a/requirements.txt b/requirements.txt index 094748b..e80e07b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -68,7 +68,7 @@ sqlparse==0.4.4 stripe==8.2.0 tqdm==4.66.2 Twisted==23.10.0 -twisted-iocpsupport==1.0.4 +# twisted-iocpsupport==1.0.4 txaio==23.1.1 typing_extensions==4.9.0 tzdata==2024.1