report and share api
This commit is contained in:
33
manage_events/management/commands/manager_report.py
Normal file
33
manage_events/management/commands/manager_report.py
Normal 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()
|
||||
@@ -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"],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user