From 1375c1e7f9e21de9ea0a1c756d27caa652a7c2f2 Mon Sep 17 00:00:00 2001 From: maxbr Date: Mon, 19 Sep 2016 10:13:26 +0200 Subject: Send notifications for booking start and end JIRA: PHAROS-265 Change-Id: I53a37ac31dda70935752afc6da3315e6dfcbc90f Signed-off-by: maxbr --- tools/pharos-dashboard/dashboard/tasks.py | 13 +++++++++++++ tools/pharos-dashboard/notification/__init__.py | 1 + tools/pharos-dashboard/notification/admin.py | 7 +++++++ tools/pharos-dashboard/notification/apps.py | 8 ++++++++ tools/pharos-dashboard/notification/models.py | 22 ++++++++++++++++++++++ tools/pharos-dashboard/notification/signals.py | 15 +++++++++++++++ tools/pharos-dashboard/notification/tasks.py | 23 +++++++++++++++++++++++ 7 files changed, 89 insertions(+) create mode 100644 tools/pharos-dashboard/dashboard/tasks.py create mode 100644 tools/pharos-dashboard/notification/__init__.py create mode 100644 tools/pharos-dashboard/notification/admin.py create mode 100644 tools/pharos-dashboard/notification/apps.py create mode 100644 tools/pharos-dashboard/notification/models.py create mode 100644 tools/pharos-dashboard/notification/signals.py create mode 100644 tools/pharos-dashboard/notification/tasks.py (limited to 'tools/pharos-dashboard') diff --git a/tools/pharos-dashboard/dashboard/tasks.py b/tools/pharos-dashboard/dashboard/tasks.py new file mode 100644 index 00000000..3df4bfba --- /dev/null +++ b/tools/pharos-dashboard/dashboard/tasks.py @@ -0,0 +1,13 @@ +from celery import shared_task +from datetime import timedelta +from django.utils import timezone + +from jenkins.models import JenkinsStatistic +from notification.models import BookingNotification + + +@shared_task +def database_cleanup(): + now = timezone.now() + JenkinsStatistic.objects.filter(timestamp__lt=now - timedelta(weeks=4)).delete() + BookingNotification.objects.filter(submit_time__lt=now - timedelta(weeks=4)).delete() \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/__init__.py b/tools/pharos-dashboard/notification/__init__.py new file mode 100644 index 00000000..926c6e80 --- /dev/null +++ b/tools/pharos-dashboard/notification/__init__.py @@ -0,0 +1 @@ +default_app_config = 'notification.apps.NotificationConfig' \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/admin.py b/tools/pharos-dashboard/notification/admin.py new file mode 100644 index 00000000..1fb5921f --- /dev/null +++ b/tools/pharos-dashboard/notification/admin.py @@ -0,0 +1,7 @@ +from django.conf import settings +from django.contrib import admin + +from notification.models import BookingNotification + +if settings.DEBUG: + admin.site.register(BookingNotification) \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/apps.py b/tools/pharos-dashboard/notification/apps.py new file mode 100644 index 00000000..6039c7bd --- /dev/null +++ b/tools/pharos-dashboard/notification/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class NotificationConfig(AppConfig): + name = 'notification' + + def ready(self): + import notification.signals #noqa \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/models.py b/tools/pharos-dashboard/notification/models.py new file mode 100644 index 00000000..80f65df4 --- /dev/null +++ b/tools/pharos-dashboard/notification/models.py @@ -0,0 +1,22 @@ +from django.db import models + +class BookingNotification(models.Model): + id = models.AutoField(primary_key=True) + type = models.CharField(max_length=100) + booking = models.ForeignKey('booking.Booking', on_delete=models.CASCADE) + submit_time = models.DateTimeField() + submitted = models.BooleanField(default=False) + + def get_content(self): + return { + 'start': self.booking.start.isoformat(), + 'end': self.booking.end.isoformat(), + 'user': self.booking.user.username, + 'purpose': self.booking.purpose + } + + def save(self, *args, **kwargs): + notifications = self.booking.bookingnotification_set.filter(type=self.type) + if notifications.count() > 1: + raise ValueError('Doubled Notification') + return super(BookingNotification, self).save(*args, **kwargs) \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/signals.py b/tools/pharos-dashboard/notification/signals.py new file mode 100644 index 00000000..c1f33ac0 --- /dev/null +++ b/tools/pharos-dashboard/notification/signals.py @@ -0,0 +1,15 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from booking.models import Booking +from notification.models import BookingNotification + + +@receiver(post_save, sender=Booking) +def booking_notification_handler(sender, instance, **kwargs): + BookingNotification.objects.update_or_create( + booking=instance, type='booking_start', defaults={'submit_time': instance.start} + ) + BookingNotification.objects.update_or_create( + booking=instance, type='booking_end', defaults={'submit_time': instance.end} + ) \ No newline at end of file diff --git a/tools/pharos-dashboard/notification/tasks.py b/tools/pharos-dashboard/notification/tasks.py new file mode 100644 index 00000000..ab3bddc7 --- /dev/null +++ b/tools/pharos-dashboard/notification/tasks.py @@ -0,0 +1,23 @@ +from celery import shared_task +from datetime import timedelta + +from django.conf import settings +from django.utils import timezone + +from notification.models import BookingNotification +from notification_framework.notification import Notification + + +@shared_task +def send_booking_notifications(): + messaging = Notification(dashboard_url=settings.RABBITMQ_URL) + + now = timezone.now() + notifications = BookingNotification.objects.filter(submitted=False, + submit_time__gt=now, + submit_time__lt=now + timedelta(minutes=5)) + for notification in notifications: + messaging.send(notification.type, notification.booking.resource.name, + notification.get_content()) + notification.submitted = True + notification.save() -- cgit 1.2.3-korg