From c684fe13cf6f3b4666a664bfdc638e446b2d123f Mon Sep 17 00:00:00 2001 From: maxbr Date: Mon, 12 Sep 2016 11:08:56 +0200 Subject: Add booking utilization chart JIRA: PHAROS-263 Change-Id: I3a3a5115a1cf7742f9ac5a3ec753699c36b49815 Signed-off-by: maxbr --- tools/pharos-dashboard/dashboard/models.py | 38 +++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'tools/pharos-dashboard/dashboard/models.py') diff --git a/tools/pharos-dashboard/dashboard/models.py b/tools/pharos-dashboard/dashboard/models.py index d645cd55..734da386 100644 --- a/tools/pharos-dashboard/dashboard/models.py +++ b/tools/pharos-dashboard/dashboard/models.py @@ -1,3 +1,6 @@ +from datetime import timedelta + +from django.utils import timezone from django.contrib.auth.models import User from django.db import models @@ -9,9 +12,42 @@ class Resource(models.Model): name = models.CharField(max_length=100, unique=True) description = models.CharField(max_length=300, blank=True, null=True) url = models.CharField(max_length=100, blank=True, null=True) - owner = models.ForeignKey(User) + owner = models.ForeignKey(User, related_name='user_lab_owner', null=True) + vpn_users = models.ManyToManyField(User, related_name='user_vpn_users') slave = models.ForeignKey(JenkinsSlave, on_delete=models.DO_NOTHING, null=True) + def get_booking_utilization(self, weeks): + """ + Return a dictionary containing the count of booked and free seconds for a resource in the + range [now,now + weeks] if weeks is positive, + or [now-weeks, now] if weeks is negative + """ + + length = timedelta(weeks=abs(weeks)) + now = timezone.now() + + start = now + end = now + length + if weeks < 0: + start = now - length + end = now + + bookings = self.booking_set.filter(start__lt=start + length, end__gt=start) + + booked_seconds = 0 + for booking in bookings: + booking_start = booking.start + booking_end = booking.end + if booking_start < start: + booking_start = start + if booking_end > end: + booking_end = start + length + total = booking_end - booking_start + booked_seconds += total.total_seconds() + + return {'booked_seconds': booked_seconds, + 'available_seconds': length.total_seconds() - booked_seconds} + class Meta: db_table = 'resource' -- cgit 1.2.3-korg