Send notifications for booking start and end 97/21397/1
authormaxbr <maxbr@mi.fu-berlin.de>
Mon, 19 Sep 2016 08:13:26 +0000 (10:13 +0200)
committermaxbr <maxbr@mi.fu-berlin.de>
Mon, 19 Sep 2016 08:13:26 +0000 (10:13 +0200)
JIRA: PHAROS-265

Change-Id: I53a37ac31dda70935752afc6da3315e6dfcbc90f
Signed-off-by: maxbr <maxbr@mi.fu-berlin.de>
tools/pharos-dashboard/dashboard/tasks.py [new file with mode: 0644]
tools/pharos-dashboard/notification/__init__.py [new file with mode: 0644]
tools/pharos-dashboard/notification/admin.py [new file with mode: 0644]
tools/pharos-dashboard/notification/apps.py [new file with mode: 0644]
tools/pharos-dashboard/notification/models.py [new file with mode: 0644]
tools/pharos-dashboard/notification/signals.py [new file with mode: 0644]
tools/pharos-dashboard/notification/tasks.py [new file with mode: 0644]

diff --git a/tools/pharos-dashboard/dashboard/tasks.py b/tools/pharos-dashboard/dashboard/tasks.py
new file mode 100644 (file)
index 0000000..3df4bfb
--- /dev/null
@@ -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 (file)
index 0000000..926c6e8
--- /dev/null
@@ -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 (file)
index 0000000..1fb5921
--- /dev/null
@@ -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 (file)
index 0000000..6039c7b
--- /dev/null
@@ -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 (file)
index 0000000..80f65df
--- /dev/null
@@ -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 (file)
index 0000000..c1f33ac
--- /dev/null
@@ -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 (file)
index 0000000..ab3bddc
--- /dev/null
@@ -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()