report and share api

This commit is contained in:
rizwanisready
2024-06-03 19:30:33 +05:30
parent 5ddccc0860
commit d09ff0f973
4 changed files with 68 additions and 19 deletions

View File

@@ -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()

View File

@@ -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"],

View File

@@ -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

View File

@@ -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