Files
django-dav-events/dav_events/models/oneclickaction.py
heinzel 8610e2a557
All checks were successful
buildbot/tox Build done.
BIG UPD: migrate to python 3.10 and django 3.2
2022-06-07 16:07:08 +02:00

116 lines
4.3 KiB
Python

# -*- 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 ugettext, ugettext_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': ugettext('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 = (ugettext('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 = (ugettext('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': ugettext('Invalid Command. Code on fire!'),
}
return result