aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaven Hodgdon <jhodgdon@iol.unh.edu>2022-04-12 14:55:07 -0400
committerRaven Hodgdon <jhodgdon@iol.unh.edu>2022-04-12 15:09:15 -0400
commit9367a2ced41c26f9d799a7b3de7cdee3f6b6247c (patch)
treef9bd7e4393892d1da8d7e74eb88a2979d04220ef
parente3f283a3711d1b93a93c915ad668a2b01dbcbc7b (diff)
added util to get booking data in a range of years
Signed-off-by: jhodgon <jhodgdon@iol.unh.edu> Change-Id: I6b403a6244765a27bb32b4f4b6508ef2699d4bd8
-rw-r--r--src/dashboard/admin_utils.py98
1 files changed, 95 insertions, 3 deletions
diff --git a/src/dashboard/admin_utils.py b/src/dashboard/admin_utils.py
index 045caeb..821ca03 100644
--- a/src/dashboard/admin_utils.py
+++ b/src/dashboard/admin_utils.py
@@ -30,6 +30,7 @@ import json
import sys
import inspect
import pydoc
+import csv
from django.contrib.auth.models import User
@@ -43,9 +44,7 @@ from resource_inventory.pdf_templater import PDFTemplater
from booking.quick_deployer import update_template
-from datetime import timedelta
-
-from django.utils import timezone
+from datetime import timedelta, date, datetime, timezone
from booking.models import Booking
from notifier.manager import NotificationHandler
@@ -225,6 +224,99 @@ def get_info(host_labid, lab_username):
return info
+class CumulativeData:
+ use_days = 0
+ count_bookings = 0
+ count_extensions = 0
+
+ def __init__(self, file_writer):
+ self.file_writer = file_writer
+
+ def account(self, booking, usage_days):
+ self.count_bookings += 1
+ self.count_extensions += booking.ext_count
+ self.use_days += usage_days
+
+ def write_cumulative(self):
+ self.file_writer.writerow([])
+ self.file_writer.writerow([])
+ self.file_writer.writerow(['Lab Use Days', 'Count of Bookings', 'Total Extensions Used'])
+ self.file_writer.writerow([self.use_days, self.count_bookings, (self.count_bookings * 2) - self.count_extensions])
+
+
+def get_years_booking_data(start_year=None, end_year=None):
+ """
+ Outputs yearly booking information from the past 'start_year' years (default: current year)
+ until the last day of the end year (default current year) as a csv file.
+ """
+ if start_year is None and end_year is None:
+ start = datetime.combine(date(datetime.now().year, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+ end = datetime.combine(date(start.year + 1, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+ elif end_year is None:
+ start = datetime.combine(date(start_year, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+ end = datetime.combine(date(datetime.now().year, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+ else:
+ start = datetime.combine(date(start_year, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+ end = datetime.combine(date(end_year + 1, 1, 1), datetime.min.time()).replace(tzinfo=timezone.utc)
+
+ if (start.year == end.year - 1):
+ file_name = "yearly_booking_data_" + str(start.year) + ".csv"
+ else:
+ file_name = "yearly_booking_data_" + str(start.year) + "-" + str(end.year - 1) + ".csv"
+
+ with open(file_name, "w", newline="") as file:
+ file_writer = csv.writer(file)
+ cumulative_data = CumulativeData(file_writer)
+ file_writer.writerow(
+ [
+ 'ID',
+ 'Project',
+ 'Purpose',
+ 'User',
+ 'Collaborators',
+ 'Extensions Left',
+ 'Usage Days',
+ 'Start',
+ 'End'
+ ]
+ )
+
+ for booking in Booking.objects.filter(start__gte=start, start__lte=end):
+ filtered = False
+ booking_filter = [279]
+ user_filter = ["ParkerBerberian", "ssmith", "ahassick", "sbergeron", "jhodgdon", "rhodgdon", "aburch", "jspewock"]
+ user = booking.owner.username if booking.owner.username is not None else "None"
+
+ for b in booking_filter:
+ if b == booking.id:
+ filtered = True
+
+ for u in user_filter:
+ if u == user:
+ filtered = True
+ # trims time delta to the the specified year(s) if between years
+ usage_days = ((end if booking.end > end else booking.end) - (start if booking.start < start else booking.start)).days
+ collaborators = []
+
+ for c in booking.collaborators.all():
+ collaborators.append(c.username)
+
+ if (not filtered):
+ cumulative_data.account(booking, usage_days)
+ file_writer.writerow([
+ str(booking.id),
+ str(booking.project),
+ str(booking.purpose),
+ str(booking.owner.username),
+ ','.join(collaborators),
+ str(booking.ext_count),
+ str(usage_days),
+ str(booking.start),
+ str(booking.end)
+ ])
+ cumulative_data.write_cumulative()
+
+
def map_cntt_interfaces(labid: str):
"""
Use this during cntt migrations, call it with a host labid and it will change profiles for this host