From d77560162ebf4805bab5eaaf051467590f2b414f 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 --- pharos-dashboard/dashboard/tasks.py | 13 +++++++++++++ pharos-dashboard/notification/__init__.py | 1 + pharos-dashboard/notification/admin.py | 7 +++++++ pharos-dashboard/notification/apps.py | 8 ++++++++ pharos-dashboard/notification/models.py | 22 ++++++++++++++++++++++ pharos-dashboard/notification/signals.py | 15 +++++++++++++++ pharos-dashboard/notification/tasks.py | 23 +++++++++++++++++++++++ 7 files changed, 89 insertions(+) create mode 100644 pharos-dashboard/dashboard/tasks.py create mode 100644 pharos-dashboard/notification/__init__.py create mode 100644 pharos-dashboard/notification/admin.py create mode 100644 pharos-dashboard/notification/apps.py create mode 100644 pharos-dashboard/notification/models.py create mode 100644 pharos-dashboard/notification/signals.py create mode 100644 pharos-dashboard/notification/tasks.py diff --git a/pharos-dashboard/dashboard/tasks.py b/pharos-dashboard/dashboard/tasks.py new file mode 100644 index 0000000..3df4bfb --- /dev/null +++ b/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/pharos-dashboard/notification/__init__.py b/pharos-dashboard/notification/__init__.py new file mode 100644 index 0000000..926c6e8 --- /dev/null +++ b/pharos-dashboard/notification/__init__.py @@ -0,0 +1 @@ +default_app_config = 'notification.apps.NotificationConfig' \ No newline at end of file diff --git a/pharos-dashboard/notification/admin.py b/pharos-dashboard/notification/admin.py new file mode 100644 index 0000000..1fb5921 --- /dev/null +++ b/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/pharos-dashboard/notification/apps.py b/pharos-dashboard/notification/apps.py new file mode 100644 index 0000000..6039c7b --- /dev/null +++ b/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/pharos-dashboard/notification/models.py b/pharos-dashboard/notification/models.py new file mode 100644 index 0000000..80f65df --- /dev/null +++ b/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/pharos-dashboard/notification/signals.py b/pharos-dashboard/notification/signals.py new file mode 100644 index 0000000..c1f33ac --- /dev/null +++ b/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/pharos-dashboard/notification/tasks.py b/pharos-dashboard/notification/tasks.py new file mode 100644 index 0000000..ab3bddc --- /dev/null +++ b/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