summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pharos-dashboard/dashboard/tasks.py13
-rw-r--r--pharos-dashboard/notification/__init__.py1
-rw-r--r--pharos-dashboard/notification/admin.py7
-rw-r--r--pharos-dashboard/notification/apps.py8
-rw-r--r--pharos-dashboard/notification/models.py22
-rw-r--r--pharos-dashboard/notification/signals.py15
-rw-r--r--pharos-dashboard/notification/tasks.py23
7 files changed, 89 insertions, 0 deletions
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()