def forward_incident(request): try: with transaction.atomic(): incident = Incident.objects.get(id=request.POST['id']) user = User.objects.get(id=request.POST['user_id']) ScheduledNotification.remove_all_for_incident(incident) NotificationHelper.notify_user_about_incident(incident, user) event_log_message = "%s changed assignee of incident : %s to %s" % ( request.user.username, incident.incident_key, user.username) event_log = EventLog() event_log.user = request.user event_log.action = "forward" event_log.incident_key = incident event_log.service_key = incident.service_key event_log.data = event_log_message event_log.occurred_at = timezone.now() event_log.save() except Incident.DoesNotExist: messages.error(request, 'Incident not found') return HttpResponseRedirect(request.POST['url']) except User.DoesNotExist: messages.error(request, 'Incident not found') return HttpResponseRedirect(request.POST['url']) except ValidationError as e: messages.error(request, e.messages) return HttpResponseRedirect(request.POST['url'])
def create(self, request, *args, **kwargs): try: token = Token.objects.get(key = request.DATA["service_key"]) serviceToken = ServiceTokens.objects.get(token_id=token) service = serviceToken.service_id except ServiceTokens.DoesNotExist: return Response({}, status=status.HTTP_404_NOT_FOUND) except Token.DoesNotExist: return Response({}, status=status.HTTP_403_FORBIDDEN) with transaction.atomic(): try: incident = Incident.objects.get(incident_key = request.DATA["incident_key"], service_key = service) event_log_message = "%s api key changed %s from %s to %s" % (serviceToken.name, incident.incident_key, incident.event_type, request.DATA['event_type']) except (Incident.DoesNotExist, KeyError): incident = Incident() try: incident.incident_key = request.DATA["incident_key"] except KeyError: if request.DATA["event_type"] == Incident.TRIGGER: incident.incident_key = base64.urlsafe_b64encode(uuid.uuid1().bytes).replace('=', '') else: response = {} response["status"] = "failure" response["message"] = "Mandatory parameter missing" return Response(response, status=status.HTTP_400_BAD_REQUEST) incident.service_key = service event_log_message = "%s api key created %s with status %s" % (serviceToken.name, incident.incident_key, request.DATA['event_type']) if incident.event_type != Incident.ACKNOWLEDGE or (incident.event_type == Incident.ACKNOWLEDGE and request.DATA["event_type"] == Incident.RESOLVE ): event_log = EventLog() event_log.service_key = incident.service_key event_log.data = event_log_message event_log.occurred_at = datetime.now() event_log.save() incident.event_type = request.DATA["event_type"] incident.description = request.DATA["description"][:100] incident.details =request.DATA["details"] incident.occurred_at = datetime.now() try: incident.full_clean() except ValidationError as e: return Response({'errors': e.messages}, status=status.HTTP_400_BAD_REQUEST) incident.save() if incident.event_type == Incident.TRIGGER: NotificationHelper.notify_incident(incident) if incident.event_type == "resolve" or incident.event_type == Incident.ACKNOWLEDGE: ScheduledNotification.remove_all_for_incident(incident) headers = self.get_success_headers(request.POST) response = {} response["status"] = "success" response["message"] = "Event processed" response["incident_key"] = incident.incident_key return Response(response, status=status.HTTP_201_CREATED, headers=headers)
def unsilence_incident(incident_id): incident = Incident.objects.get(id=incident_id) if incident.event_type == Incident.ACKNOWLEDGE: incident.event_type = Incident.TRIGGER incident.save() NotificationHelper.notify_incident(incident) silenced_incident = IncidentSilenced.objects.filter(incident=incident) silenced_incident.delete()
def testnotification(request): if not request.user.is_staff and int(request.user.id) != int( request.POST['id']): raise PermissionDenied("User " + str(request.user.id) + " isn't staff") user = User.objects.get(id=request.POST['id']) NotificationHelper.notify_user_about_incident( None, user, 1, "This is a notification test message, just ignore it") return HttpResponseRedirect(reverse('openduty.users.list'))
def testnotification(request): user = User.objects.get(id=request.POST['id']) NotificationHelper.notify_user_about_incident( None, user, 1, "This is a notification test message, just ignore it") return HttpResponseRedirect(reverse('openduty.users.list'))
def testnotification(request): user = User.objects.get(id=request.POST['id']) NotificationHelper.notify_user_about_incident(None, user, 1, "This is a notification test message, just ignore it") return HttpResponseRedirect(reverse('openduty.users.list'))
def create(self, request, *args, **kwargs): try: token = Token.objects.get(key=request.DATA["service_key"]) service_token = ServiceTokens.objects.get(token_id=token) service = service_token.service_id police = service.policy if not police: return Response({}, status=status.HTTP_403_FORBIDDEN) schedule_police_rule = SchedulePolicyRule.objects.get( schedule_policy=police) calendar = schedule_police_rule.schedule event = Event.objects.filter(start__lte=timezone.now(), calendar=calendar) if not event: return Response({}, status=status.HTTP_403_FORBIDDEN) # except except Event.DoesNotExist: return Response({}, status=status.HTTP_404_NOT_FOUND) except SchedulePolicyRule.DoesNotExist: return Response({}, status=status.HTTP_404_NOT_FOUND) except ServiceTokens.DoesNotExist: return Response({}, status=status.HTTP_404_NOT_FOUND) except Token.DoesNotExist: return Response({}, status=status.HTTP_403_FORBIDDEN) with transaction.atomic(): try: incident = Incident.objects.get( incident_key=request.DATA["incident_key"], service_key=service) event_log_message = "%s api key changed %s from %s to %s" % ( service_token.name, incident.incident_key, incident.event_type, request.DATA['event_type']) except (Incident.DoesNotExist, KeyError): incident = Incident() try: incident.incident_key = request.DATA["incident_key"] except KeyError: if request.DATA["event_type"] == Incident.TRIGGER: incident.incident_key = base64.urlsafe_b64encode( uuid.uuid1().bytes).replace('=', '') else: response = {} response["status"] = "failure" response["message"] = "Mandatory parameter missing" return Response(response, status=status.HTTP_400_BAD_REQUEST) incident.service_key = service event_log_message = "%s api key created %s with status %s" % ( service_token.name, incident.incident_key, request.DATA['event_type']) if self.is_relevant(incident, request.DATA['event_type']): event_log = EventLog() # Anonymous user for testing if request.user.is_anonymous(): user = None else: user = request.user event_log.user = user event_log.service_key = incident.service_key event_log.data = event_log_message event_log.occurred_at = timezone.now() incident.event_type = request.DATA["event_type"] incident.description = request.DATA["description"][:100] incident.details = request.DATA["details"] incident.occurred_at = timezone.now() try: incident.full_clean() except ValidationError as e: return Response({'errors': e.messages}, status=status.HTTP_400_BAD_REQUEST) incident.save() event_log.incident_key = incident event_log.action = incident.event_type event_log.save() servicesilenced = ServiceSilenced.objects.filter( service=service).count() > 0 if incident.event_type == Incident.TRIGGER and not servicesilenced: NotificationHelper.notify_incident(incident) if incident.event_type == "resolve" or incident.event_type == Incident.ACKNOWLEDGE: ScheduledNotification.remove_all_for_incident(incident) headers = self.get_success_headers(request.POST) response = {} response["status"] = "success" response["message"] = "Event processed" response["incident_key"] = incident.incident_key return Response(response, status=status.HTTP_201_CREATED, headers=headers)
def create(self, request, *args, **kwargs): try: token = Token.objects.get(key=request.DATA["service_key"]) serviceToken = ServiceTokens.objects.get(token_id=token) service = serviceToken.service_id except ServiceTokens.DoesNotExist: return Response({"Service key does not exist"}, status=status.HTTP_404_NOT_FOUND) except Token.DoesNotExist: return Response({"No service key"}, status=status.HTTP_403_FORBIDDEN) with transaction.atomic(): try: esc = False incident = Incident.objects.get( incident_key=request.DATA["incident_key"], service_key=service) print "Received %s for %s on service %s" % ( request.DATA['event_type'], request.DATA['incident_key'], serviceToken.name) #check if type is ACK or resolve and if there's an escalation to a different escalation policy, remove it if request.DATA[ 'event_type'] == Incident.ACKNOWLEDGE or request.DATA[ 'event_type'] == Incident.RESOLVE: print "ACK or Resolve, removing specific escalation" esc = True incident.service_to_escalate_to = None incident.save() # check if incident is resolved and refuse to ACK if not (incident.event_type == Incident.RESOLVE and request.DATA['event_type'] == Incident.ACKNOWLEDGE): event_log_message = "%s api key changed %s from %s to %s" % ( serviceToken.name, incident.incident_key, incident.event_type, request.DATA['event_type']) if esc: event_log_message += ", unescalated" else: response = {} response["status"] = "failure" response["message"] = "Can\'t ACK a resolved incident!" return Response(response, status=status.HTTP_400_BAD_REQUEST) except (Incident.DoesNotExist, KeyError): incident = Incident() try: incident.incident_key = request.DATA["incident_key"] except KeyError: if request.DATA["event_type"] == Incident.TRIGGER: incident.incident_key = base64.urlsafe_b64encode( uuid.uuid1().bytes).replace('=', '') else: response = {} response["status"] = "failure" response["message"] = "Mandatory parameter missing" return Response(response, status=status.HTTP_400_BAD_REQUEST) incident.service_key = service event_log_message = "%s api key created %s with status %s" % ( serviceToken.name, incident.incident_key, request.DATA['event_type']) if self.is_relevant(incident, request.DATA['event_type']): event_log = EventLog() # Anonymous user for testing if request.user.is_anonymous(): user = None else: user = request.user event_log.user = user event_log.service_key = incident.service_key event_log.data = event_log_message event_log.occurred_at = timezone.now() incident.event_type = request.DATA["event_type"] incident.description = request.DATA["description"][:100] incident.details = request.DATA.get("details", "") incident.occurred_at = timezone.now() try: incident.full_clean() except ValidationError as e: return Response({'errors': e.messages}, status=status.HTTP_400_BAD_REQUEST) incident.save() event_log.incident_key = incident event_log.action = incident.event_type event_log.save() servicesilenced = ServiceSilenced.objects.filter( service=service).count() > 0 if incident.event_type == Incident.TRIGGER and not servicesilenced: NotificationHelper.notify_incident(incident) if incident.event_type == Incident.RESOLVE or incident.event_type == Incident.ACKNOWLEDGE: ScheduledNotification.remove_all_for_incident(incident) if incident.event_type == Incident.RESOLVE and service.send_resolve_enabled: NotificationHelper.notify_incident(incident) headers = self.get_success_headers(request.POST) response = {} response["status"] = "success" response["message"] = "Event processed" response["incident_key"] = incident.incident_key return Response(response, status=status.HTTP_201_CREATED, headers=headers)
def escalate(self, request, *args, **kwargs): #get arguments try: token = Token.objects.get(key=request.DATA["service_key"]) serviceToken = ServiceTokens.objects.get(token_id=token) service = serviceToken.service_id except ServiceTokens.DoesNotExist: return Response({"Service key does not exist"}, status=status.HTTP_404_NOT_FOUND) except Token.DoesNotExist: return Response({"No service key"}, status=status.HTTP_403_FORBIDDEN) try: token2 = Token.objects.get( key=request.DATA["service_key_to_escalate_to"]) serviceToken2 = ServiceTokens.objects.get(token_id=token2) service2 = serviceToken2.service_id except ServiceTokens.DoesNotExist: return Response({"Service to escalate to key does not exist"}, status=status.HTTP_404_NOT_FOUND) except Token.DoesNotExist: return Response({"No service to escalate to key"}, status=status.HTTP_403_FORBIDDEN) #modify incident with transaction.atomic(): try: # get service_to_escalate to and modify incident object incident = Incident.objects.get( incident_key=request.DATA["incident_key"], service_key=service) incident.service_to_escalate_to = service2 incident.event_type = "escalated" if request.DATA["incident_details"]: incident.details = request.DATA["incident_details"] # incident.description = "[escalated] " + incident.description incident.save() event_log_message = "%s escalated to service escalation policy : %s to %s" % ( request.user.username, incident.incident_key, service2.name) event_log = EventLog() event_log.user = request.user event_log.action = "escalate" event_log.incident_key = incident event_log.service_key = incident.service_key event_log.data = event_log_message event_log.occurred_at = timezone.now() event_log.save() except (Incident.DoesNotExist, KeyError): return Response({"Incident does not exist"}, status=status.HTTP_404_NOT_FOUND) except (Service.DoesNotExist, KeyError): return Response({"Service does not exist"}, status=status.HTTP_400_BAD_REQUEST) # remove all planned notifs ScheduledNotification.remove_all_for_incident(incident) # notify anew, this time notify_incident will detect the service_to_escalate to and notify its escalation rule NotificationHelper.notify_incident(incident) headers = self.get_success_headers(request.POST) return Response( { "Incident successfully escalated to service " + service2.name + " escalation policy" }, status=status.HTTP_200_OK, headers=headers)