Merge "Fix trigger creation failed"
This commit is contained in:
commit
bfcecfee68
@ -112,6 +112,12 @@ msgstr "Error Deleting"
|
||||
msgid "Event Trigger"
|
||||
msgstr "Event Trigger"
|
||||
|
||||
msgid "Every Minute"
|
||||
msgstr "Every Minute"
|
||||
|
||||
msgid "Every Hour"
|
||||
msgstr "Every Hour"
|
||||
|
||||
msgid "Every Day"
|
||||
msgstr "Every Day"
|
||||
|
||||
|
@ -22,5 +22,17 @@
|
||||
<dt>{% trans "Execution Time (HH:MM)" %}</dt>
|
||||
<dd>{{ trigger.time }}</dd>
|
||||
{% endif %}
|
||||
{% if trigger.hour %}
|
||||
<dt>{% trans "Hour" %}</dt>
|
||||
<dd>{{ trigger.hour }}</dd>
|
||||
{% endif %}
|
||||
{% if trigger.minute %}
|
||||
<dt>{% trans "Minute" %}</dt>
|
||||
<dd>{{ trigger.minute }}</dd>
|
||||
{% endif %}
|
||||
{% if trigger.interval %}
|
||||
<dt>{% trans "Execution Interval" %}</dt>
|
||||
<dd>{{ trigger.interval }}</dd>
|
||||
{% endif %}
|
||||
</dl>
|
||||
</div>
|
||||
|
@ -34,7 +34,7 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
|
||||
}))
|
||||
frequence = forms.ChoiceField(
|
||||
label=_('Frequence'),
|
||||
choices=utils.FREQUENCE_CHOICES,
|
||||
choices=utils.CRONTAB_FREQUENCE_CHOICES,
|
||||
widget=forms.Select(attrs={
|
||||
'class': 'switchable switched',
|
||||
'data-slug': 'frequence'}))
|
||||
@ -60,12 +60,12 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(CreateTriggerForm, self).__init__(request, *args, **kwargs)
|
||||
|
||||
self.fields['day'].choices = utils.DAY_CHOICES
|
||||
self.fields['day'].choices = utils.CRONTAB_DAY_CHOICES
|
||||
self.fields['date'].choices = [(e, e) for e in range(1, 31 + 1)]
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
data_properties = utils.CrontabUtil.convert_to_crontab(data)
|
||||
data_properties = utils.CalendarUtil.convert_to_calendar(data)
|
||||
new_trigger = karborclient.trigger_create(request,
|
||||
data["name"],
|
||||
data["type"],
|
||||
|
@ -14,29 +14,32 @@
|
||||
|
||||
import collections
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from icalendar.cal import Component
|
||||
from icalendar import Event
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
TRIGGERTYPE_CHOICES = [('time', _('Time Trigger')),
|
||||
('event', _('Event Trigger'))]
|
||||
|
||||
CRONTAB = 'crontab'
|
||||
|
||||
DAY_CHOICES = [('1', _('Monday')),
|
||||
CRONTAB_DAY_CHOICES = [('1', _('Monday')),
|
||||
('2', _('Tuesday')),
|
||||
('3', _('Wednesday')),
|
||||
('4', _('Thursday')),
|
||||
('5', _('Friday')),
|
||||
('6', _('Saturday')),
|
||||
('0', _('Sunday'))]
|
||||
DAY_DICT = collections.OrderedDict(DAY_CHOICES)
|
||||
CRONTAB_DAY_DICT = collections.OrderedDict(CRONTAB_DAY_CHOICES)
|
||||
|
||||
EVERYDAY = 'everyday'
|
||||
EVERYWEEK = 'everyweek'
|
||||
EVERYMONTH = 'everymonth'
|
||||
|
||||
FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
|
||||
CRONTAB_FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
|
||||
(EVERYWEEK, _('Every Week')),
|
||||
(EVERYMONTH, _('Every Month'))]
|
||||
FREQUENCE_DICT = collections.OrderedDict(FREQUENCE_CHOICES)
|
||||
CRONTAB_FREQUENCE_DICT = collections.OrderedDict(CRONTAB_FREQUENCE_CHOICES)
|
||||
|
||||
|
||||
class CrontabUtil(object):
|
||||
@ -78,7 +81,9 @@ class CrontabUtil(object):
|
||||
|
||||
@staticmethod
|
||||
def convert_from_crontab(dict_crontab):
|
||||
data = {}
|
||||
data = {
|
||||
'format': dict_crontab['format']
|
||||
}
|
||||
if dict_crontab["format"] == CRONTAB:
|
||||
pattern = dict_crontab["pattern"]
|
||||
patterns = pattern.split(" ")
|
||||
@ -86,18 +91,124 @@ class CrontabUtil(object):
|
||||
if patterns[2] == "*" \
|
||||
and patterns[3] == "*" \
|
||||
and patterns[4] == "*":
|
||||
data["frequence"] = FREQUENCE_DICT[EVERYDAY]
|
||||
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYDAY]
|
||||
elif patterns[2] == "*" \
|
||||
and patterns[3] == "*" \
|
||||
and patterns[4] != "*":
|
||||
data["frequence"] = FREQUENCE_DICT[EVERYWEEK]
|
||||
data["day"] = DAY_DICT[patterns[4]]
|
||||
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYWEEK]
|
||||
data["day"] = CRONTAB_DAY_DICT[patterns[4]]
|
||||
elif patterns[2] != "*" \
|
||||
and patterns[3] == "*" \
|
||||
and patterns[4] == "*":
|
||||
data["frequence"] = FREQUENCE_DICT[EVERYMONTH]
|
||||
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYMONTH]
|
||||
data["date"] = patterns[2]
|
||||
|
||||
data["time"] = '%s:%s' % (patterns[1].zfill(2),
|
||||
patterns[0].zfill(2))
|
||||
return data
|
||||
|
||||
CALENDAR = 'calendar'
|
||||
CALENDAR_DAY_CHOICES = [('1', _('MO')),
|
||||
('2', _('TU')),
|
||||
('3', _('WE')),
|
||||
('4', _('TH')),
|
||||
('5', _('FR')),
|
||||
('6', _('SA')),
|
||||
('0', _('SU'))]
|
||||
CALENDAR_DAY_DICT = collections.OrderedDict(CALENDAR_DAY_CHOICES)
|
||||
CALENDAR_DAY_MAPPING = [('MO', _('Monday')),
|
||||
('TU', _('Tuesday')),
|
||||
('WE', _('Wednesday')),
|
||||
('TH', _('Thursday')),
|
||||
('FR', _('Friday')),
|
||||
('SA', _('Saturday')),
|
||||
('SU', _('Sunday'))]
|
||||
CALENDAR_DAY_MAPPING_DICT = collections.OrderedDict(CALENDAR_DAY_MAPPING)
|
||||
MINUTELY = 'MINUTELY'
|
||||
HOURLY = 'HOURLY'
|
||||
DAILY = 'DAILY'
|
||||
WEEKLY = 'WEEKLY'
|
||||
MONTHLY = 'MONTHLY'
|
||||
|
||||
|
||||
class CalendarUtil(object):
|
||||
"""Convert to or from calendar format."""
|
||||
@staticmethod
|
||||
def convert_to_calendar(data):
|
||||
dict_calendar = {
|
||||
"format": CALENDAR,
|
||||
}
|
||||
|
||||
pattern_frequence = ''
|
||||
if data['frequence'] == EVERYMONTH:
|
||||
pattern_frequence = MONTHLY
|
||||
elif data['frequence'] == EVERYWEEK:
|
||||
pattern_frequence = WEEKLY
|
||||
elif data['frequence'] == EVERYDAY:
|
||||
pattern_frequence = DAILY
|
||||
calendar_event = Event()
|
||||
rule_pattern = {
|
||||
'freq': pattern_frequence,
|
||||
'byhour': data["time"].hour,
|
||||
'byminute': data["time"].minute,
|
||||
}
|
||||
|
||||
if pattern_frequence == MONTHLY:
|
||||
rule_pattern['bymonthday'] = data["date"]
|
||||
elif pattern_frequence == WEEKLY:
|
||||
rule_pattern['byday'] = CALENDAR_DAY_DICT[data["day"]]
|
||||
|
||||
calendar_event.add('rrule', rule_pattern)
|
||||
dict_calendar['pattern'] = calendar_event.to_ical()
|
||||
return dict_calendar
|
||||
|
||||
@staticmethod
|
||||
def decode_calendar_pattern(pattern):
|
||||
try:
|
||||
pattern.index('\\')
|
||||
pattern_dict = jsonutils.loads('{"pattern": "%s"}' % pattern)
|
||||
return pattern_dict["pattern"]
|
||||
except Exception:
|
||||
return pattern
|
||||
|
||||
@staticmethod
|
||||
def convert_from_calendar(dict_calendar):
|
||||
data = {
|
||||
'format': dict_calendar['format']
|
||||
}
|
||||
if dict_calendar["format"] == CALENDAR:
|
||||
pattern = dict_calendar["pattern"]
|
||||
calendar_event = Component.from_ical(
|
||||
CalendarUtil.decode_calendar_pattern(pattern)
|
||||
)
|
||||
if isinstance(calendar_event, Event):
|
||||
calendar_event_rule = calendar_event['RRULE']
|
||||
data['frequence'] = calendar_event_rule['FREQ'][0]
|
||||
|
||||
if data['frequence'] == MONTHLY and not (
|
||||
'INTERVAL' in calendar_event['RRULE']):
|
||||
data['date'] = ' '.join(
|
||||
str(date)
|
||||
for date in calendar_event_rule['BYMONTHDAY'])
|
||||
|
||||
if data['frequence'] == WEEKLY and not (
|
||||
'INTERVAL' in calendar_event['RRULE']):
|
||||
data['day'] = ' '.join(
|
||||
str(CALENDAR_DAY_MAPPING_DICT[day])
|
||||
for day in calendar_event_rule['BYDAY'])
|
||||
|
||||
if 'BYHOUR' in calendar_event['RRULE']:
|
||||
data['hour'] = ' '.join(
|
||||
str(hour) for hour in calendar_event_rule['BYHOUR'])
|
||||
|
||||
if 'BYMINUTE' in calendar_event['RRULE']:
|
||||
data['minute'] = ' '.join(
|
||||
str(minute)
|
||||
for minute in calendar_event_rule['BYMINUTE'])
|
||||
|
||||
if 'INTERVAL' in calendar_event['RRULE']:
|
||||
data['interval'] = ' '.join(
|
||||
str(interval)
|
||||
for interval in calendar_event_rule['INTERVAL'])
|
||||
|
||||
return data
|
||||
|
@ -89,8 +89,13 @@ class DetailView(horizon_views.HorizonTemplateView):
|
||||
|
||||
if trigger is not None and trigger.properties is not None:
|
||||
if trigger.properties["format"] == utils.CRONTAB:
|
||||
data = utils.CrontabUtil\
|
||||
.convert_from_crontab(trigger.properties)
|
||||
data = utils.CrontabUtil.convert_from_crontab(
|
||||
trigger.properties
|
||||
)
|
||||
else:
|
||||
data = utils.CalendarUtil.convert_from_calendar(
|
||||
trigger.properties
|
||||
)
|
||||
if data:
|
||||
for key, value in data.items():
|
||||
setattr(trigger, key, value)
|
||||
|
Loading…
Reference in New Issue
Block a user