# -*- coding: utf-8 -*- import logging import uuid from django.contrib.auth import get_user_model from django.core.urlresolvers 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 = ( ('EA', 'accept event'), ('EP', 'confirm publication of an event'), ('EL', 'login and go to event list') ) 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=2, choices=COMMANDS) parameters = models.TextField(blank=True) class Meta: verbose_name = _(u'One-Click-Action') def __unicode__(self): s = u'{command}({parameters}) - {description}'.format(description=self.get_command_display(), command=self.command, parameters=self.parameters) if self.done and not self.allow_repeat: s += u' - 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(u'Diese Aktion hast du bereits ausgeführt.'), } return result logger.info('OneClickAction.run(): %s(%s)', self.command, self.parameters) if self.command == 'EA': text = u'' try: event_id, 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='accepted').first() if flag: status = 'info' message = (ugettext(u'Veranstaltung wurde bereits von %(fullname)s freigegeben.') % {'fullname': flag.user.get_full_name()}) text = unicode(event) text += u'\n' text += (ugettext(u'Freigegeben am: %(date)s') % {'date': flag.timestamp.strftime('%d.%m.%Y %H:%M:%S')}) else: event.confirm_status('accepted', user) status = 'success' message = ugettext(u'Veranstaltung freigegeben.') text = unicode(event) self.done = True self.done_at = timezone.now() self.save() except Exception as e: status = 'danger' message = str(e) logger.error('OneClickAction.run(): %s(%s): %s', self.command, self.parameters, message) result['context'] = { 'status': status, 'message': message, 'text': text, } elif self.command == 'EP': text = u'' try: event_id, 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__in=('publishing', 'published')).first() if flag: status = 'info' message = (ugettext(u'Veröffentlichung wurde bereits von %(fullname)s bestätigt.') % {'fullname': flag.user.get_full_name()}) text = unicode(event) text += u'\n' text += (ugettext(u'Bestätigt am: %(date)s') % {'date': flag.timestamp.strftime('%d.%m.%Y %H:%M:%S')}) else: if event.planned_publication_date: new_state = 'publishing' else: new_state = 'published' event.confirm_status(new_state, user) status = 'success' message = ugettext(u'Veröffentlichung registriert.') text = unicode(event) self.done = True self.done_at = timezone.now() self.save() except Exception as e: status = 'danger' message = str(e) logger.error('OneClickAction.run(): %s(%s): %s', self.command, self.parameters, message) result['context'] = { 'status': status, 'message': message, 'text': text, } elif self.command == 'EL': 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, } else: result['context'] = { 'status': 'danger', 'message': ugettext(u'Invalid Command. Code on fire!'), } return result