Skip to content

Commit

Permalink
Merge pull request #35 from Clubs-Council-IIITH/report
Browse files Browse the repository at this point in the history
events data csv generation added
  • Loading branch information
bhavberi authored Jun 15, 2024
2 parents 80f3ecc + 30b9637 commit 96cf7ce
Show file tree
Hide file tree
Showing 3 changed files with 143 additions and 5 deletions.
15 changes: 14 additions & 1 deletion otypes.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import json
from datetime import datetime
from datetime import datetime, date
from functools import cached_property
from typing import Dict, List, Tuple

Expand Down Expand Up @@ -95,5 +95,18 @@ class InputEditEventDetails:
budget: List[BudgetInput] | None = None
poc: str | None = None

@strawberry.input()
class InputReportDetails:
clubid: str | None
fields: List[str]
dateperiod: List[date] | None = None

@strawberry.type
class CSVResponse:
csvFile: str
successMessage: str
errorMessage: str



timelot_type = Tuple[datetime, datetime]
122 changes: 119 additions & 3 deletions queries.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from typing import List

import csv
import io
import dateutil.parser as dp
import strawberry

from db import eventsdb

# import all models and types
from models import Event
from mtypes import Event_Location, Event_State_Status
from otypes import EventType, Info, RoomList, RoomListType, timelot_type
from mtypes import Event_Location, Event_State_Status, Event_Full_Location
from otypes import EventType, Info, RoomList, RoomListType, timelot_type, InputReportDetails, CSVResponse
from utils import eventsWithSorting, getClubs


Expand Down Expand Up @@ -133,7 +135,7 @@ def events(
"$in": statuses,
}

events = eventsWithSorting(searchspace)
events = eventsWithSorting(searchspace, date_filter=False)

if limit is not None:
events = events[:limit]
Expand Down Expand Up @@ -300,6 +302,119 @@ def availableRooms(
)


@strawberry.field
def downloadEventsData(details: InputReportDetails, info: Info) -> CSVResponse:
"""
Create events data in CSV format for the events with
given details in the given date period.
"""
user = info.context.user
all_events = list()

allclubs = getClubs(info.context.cookies)
searchspace = dict()
if details.clubid:
clubid = details.clubid
if details.clubid == "allclubs":
clubid = None
if user is not None:
if clubid is not None:
searchspace["clubid"] = clubid
else:
list_allclubs = [club["cid"] for club in allclubs]
searchspace["clubid"] = {"$in": list_allclubs}

# filter by date
if details.dateperiod:
datetime_start = details.dateperiod[0].strftime(
"%Y-%m-%dT00:00:00+00:00"
)
datetime_end = details.dateperiod[1].strftime(
"%Y-%m-%dT23:59:59+00:00"
)
searchspace["datetimeperiod.0"] = {
"$gte": datetime_start,
"$lte": datetime_end,
}

# include only approved events
searchspace["status.state"] = {
"$in": [
Event_State_Status.approved.value,
]
}

all_events = eventsWithSorting(searchspace, date_filter=True)

header_mapping = {
"code": "Event Code",
"name": "Event Name",
"clubid": "Club",
"datetimeperiod.0": "StartDate",
"datetimeperiod.1": "EndDate",
"description": "Description",
"audience": "Audience",
"population": "Audience Count",
"mode": "Mode",
"location": "Venue",
"budget": "Budget",
"poster": "Poster URL",
}

# Prepare CSV content
csv_output = io.StringIO()
fieldnames = [
header_mapping.get(field.lower(), field) for field in details.fields
]

csv_writer = csv.DictWriter(csv_output, fieldnames=fieldnames)
csv_writer.writeheader()

for event in all_events:
event_data = {}
for field in details.fields:
mapped_field = header_mapping.get(field, field)
value = event.get(field)

if field in ["datetimeperiod.0", "datetimeperiod.1"]:
value = event.get("datetimeperiod")
value = (
value[0].split("T")[0]
if field == "datetimeperiod.0"
else value[1].split("T")[0]
)
if value in [None, "", []]:
event_data[mapped_field] = "No " + mapped_field
elif field == "clubid":
event_data[mapped_field] = next(
(
club["name"]
for club in allclubs
if club["cid"] == value
),
"",
)
elif field == "location":
if value == []:
event_data[mapped_field] = "No location"
else:
event_data[mapped_field] = ", ".join(
getattr(Event_Full_Location, loc) for loc in value
)
event_data[mapped_field] = f"{event_data[mapped_field]}"
else:
event_data[mapped_field] = value
csv_writer.writerow(event_data)

csv_content = csv_output.getvalue()
csv_output.close()
return CSVResponse(
csvFile=csv_content,
successMessage="CSV file generated successfully",
errorMessage="",
)


# register all queries
queries = [
event,
Expand All @@ -309,4 +424,5 @@ def availableRooms(
approvedEvents,
pendingEvents,
availableRooms,
downloadEventsData,
]
11 changes: 10 additions & 1 deletion utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,14 +226,23 @@ def getRoleEmails(role: str) -> List[str]:
return []


def eventsWithSorting(searchspace):
def eventsWithSorting(searchspace, date_filter=False):
"""
Custom sorting of events based on
datetimeperiod with upcoming events first in ascending order
and then past events in descending order
"""
ist = pytz.timezone("Asia/Kolkata")
current_datetime = datetime.now(ist).strftime("%Y-%m-%dT%H:%M:%S+00:00")
if date_filter:
required_events_query = {
**searchspace,
}
events = list(
eventsdb.find(required_events_query).sort("datetimeperiod.0", -1)
)
return events

upcoming_events_query = {
**searchspace,
"datetimeperiod.0": {"$gte": current_datetime},
Expand Down

0 comments on commit 96cf7ce

Please sign in to comment.