gnm_deliverables/management/commands/check_vs_notification.py (57 lines of code) (raw):
# coding: utf-8
from django.core.management.base import BaseCommand
from django.urls import reverse
from gnmvidispine.vs_notifications import VSNotificationCollection, VSNotification, VSTriggerEntry, HttpNotification
import random
from time import sleep
from django.conf import settings
import xml.etree.cElementTree as ET
class Command(BaseCommand):
args = ''
help = 'Check that our notification is present in Vidispine and install it if not'
our_notification_url = reverse("vs-notifications")
def is_our_notification(self, notification:VSNotification):
for action in notification.actions:
try:
if self.our_notification_url in action.url:
return True
except VSNotification.UnknownActionType:
pass
return False
def create_new_notification(self):
triggerdoc = ET.Element("trigger", attrib={"xmlns": "http://xml.vidispine.com/schema/vidispine"})
trigger = VSTriggerEntry(triggerdoc)
trigger.trigger_class = "job"
trigger.action = "stop"
actiondoc = ET.Element("http", attrib={"xmlns":"http://xml.vidispine.com/schema/vidispine"})
action = HttpNotification(actiondoc)
action.url = settings.VS_CALLBACK_ROOT + self.our_notification_url
action.method = "POST"
action.contentType = "application/json"
action.retry = 5
action.synchronous = False
action.timeout=10
notif = VSNotification(url=settings.VIDISPINE_URL,user=settings.VIDISPINE_USER, passwd=settings.VIDISPINE_PASSWORD)
notif.add_action(action)
notif.trigger = trigger
notif.objectclass = "job"
print(notif.as_xml())
print("Creating new notification to {}".format(action.url))
notif.save()
def handle(self, *args, **options):
# seed with current time
random.seed(a=None, version=2)
# wait between 0 and 1 seconds, to try to minimise multiple adds
sleeptime = random.randint(1,8)
print("Waiting {0}s".format(sleeptime))
sleep(sleeptime)
print("Checking for notification {0}...".format(self.our_notification_url))
print("Connecting to Vidispine at {0} as {1}...".format(settings.VIDISPINE_URL, settings.VIDISPINE_USER))
job_notifs = VSNotificationCollection(url=settings.VIDISPINE_URL,user=settings.VIDISPINE_USER, passwd=settings.VIDISPINE_PASSWORD)
already_existing = None
for notification in job_notifs.notifications(objectclass="job"):
if self.is_our_notification(notification):
already_existing = notification
break
if already_existing:
print("Found notification at {0}".format(already_existing.name))
else:
print("No existing notification found.")
self.create_new_notification()