# -*- coding: utf-8 -*- from __future__ import unicode_literals import logging import uuid from django.contrib.auth import get_user_model from django.urls import reverse from django.db import models from django.utils import timezone from django.utils.translation import gettext, gettext_lazy as _ from .event import Event logger = logging.getLogger(__name__) class OneClickAction(models.Model): COMMANDS = ( ('EVENT_LIST', 'login and go to event list (user id)'), ('EVENT_STATUS_UPDATE', 'update event status (event id,status code,user id)'), ) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) created_at = models.DateTimeField(auto_now_add=True) allow_repeat = models.BooleanField(default=False) done = models.BooleanField(default=False) done_at = models.DateTimeField(blank=True, null=True) command = models.CharField(max_length=254, choices=COMMANDS) parameters = models.TextField(blank=True) class Meta: verbose_name = _('One-Click-Action') def __str__(self): s = '{command}({parameters}) - {description}'.format(description=self.get_command_display(), command=self.command, parameters=self.parameters) if self.done and not self.allow_repeat: s += ' - done' return s def get_absolute_url(self): return reverse('dav_events:action_run', kwargs={'pk': self.pk}) def run(self): result = {} if self.done and not self.allow_repeat: result['context'] = { 'status': 'warning', 'message': gettext('Diese Aktion hast du bereits ausgeführt.'), } return result logger.info('OneClickAction.run(): %s(%s)', self.command, self.parameters) if self.command == 'EVENT_LIST': try: user_id = self.parameters user = get_user_model().objects.get(id=user_id) url = reverse('dav_events:list') result['location'] = url result['login'] = user except Exception as e: message = str(e) logger.error('OneClickAction.run(): %s(%s): %s', self.command, self.parameters, message) result['context'] = { 'status': 'danger', 'message': message, } elif self.command == 'EVENT_STATUS_UPDATE': try: event_id, status_code, user_id = self.parameters.split(',') event = Event.objects.get(id=event_id) user = get_user_model().objects.get(id=user_id) flag = event.flags.filter(status__code=status_code).first() if flag: message = (gettext('Der Status wurde bereits' ' am %(date)s' ' von %(user)s' ' auf \'%(status)s\' gesetzt.') % { 'status': flag.status.label, 'date': timezone.localtime(flag.timestamp).strftime('%d.%m.%Y %H:%M:%S'), 'user': flag.user.get_full_name(), }) else: flag = event.workflow.update_status(status_code, user) message = (gettext('Der Status wurde auf \'%(status)s\' gesetzt.') % {'status': flag.status.label}) result['context'] = { 'status': 'success', 'message': message, } self.done = True self.done_at = timezone.now() self.save() except Exception as e: message = str(e) logger.error('OneClickAction.run(): %s(%s): %s', self.command, self.parameters, message) result['context'] = { 'status': 'danger', 'message': message, } else: result['context'] = { 'status': 'danger', 'message': gettext('Invalid Command. Code on fire!'), } return result