152 lines
5.7 KiB
Python
152 lines
5.7 KiB
Python
# -*- 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
|