Merge "Fix trigger creation failed"
This commit is contained in:
commit
bfcecfee68
|
@ -112,6 +112,12 @@ msgstr "Error Deleting"
|
||||||
msgid "Event Trigger"
|
msgid "Event Trigger"
|
||||||
msgstr "Event Trigger"
|
msgstr "Event Trigger"
|
||||||
|
|
||||||
|
msgid "Every Minute"
|
||||||
|
msgstr "Every Minute"
|
||||||
|
|
||||||
|
msgid "Every Hour"
|
||||||
|
msgstr "Every Hour"
|
||||||
|
|
||||||
msgid "Every Day"
|
msgid "Every Day"
|
||||||
msgstr "Every Day"
|
msgstr "Every Day"
|
||||||
|
|
||||||
|
|
|
@ -22,5 +22,17 @@
|
||||||
<dt>{% trans "Execution Time (HH:MM)" %}</dt>
|
<dt>{% trans "Execution Time (HH:MM)" %}</dt>
|
||||||
<dd>{{ trigger.time }}</dd>
|
<dd>{{ trigger.time }}</dd>
|
||||||
{% endif %}
|
{% 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>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -34,7 +34,7 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
|
||||||
}))
|
}))
|
||||||
frequence = forms.ChoiceField(
|
frequence = forms.ChoiceField(
|
||||||
label=_('Frequence'),
|
label=_('Frequence'),
|
||||||
choices=utils.FREQUENCE_CHOICES,
|
choices=utils.CRONTAB_FREQUENCE_CHOICES,
|
||||||
widget=forms.Select(attrs={
|
widget=forms.Select(attrs={
|
||||||
'class': 'switchable switched',
|
'class': 'switchable switched',
|
||||||
'data-slug': 'frequence'}))
|
'data-slug': 'frequence'}))
|
||||||
|
@ -60,12 +60,12 @@ class CreateTriggerForm(horizon_forms.SelfHandlingForm):
|
||||||
def __init__(self, request, *args, **kwargs):
|
def __init__(self, request, *args, **kwargs):
|
||||||
super(CreateTriggerForm, self).__init__(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)]
|
self.fields['date'].choices = [(e, e) for e in range(1, 31 + 1)]
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
try:
|
try:
|
||||||
data_properties = utils.CrontabUtil.convert_to_crontab(data)
|
data_properties = utils.CalendarUtil.convert_to_calendar(data)
|
||||||
new_trigger = karborclient.trigger_create(request,
|
new_trigger = karborclient.trigger_create(request,
|
||||||
data["name"],
|
data["name"],
|
||||||
data["type"],
|
data["type"],
|
||||||
|
|
|
@ -14,29 +14,32 @@
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
from django.utils.translation import ugettext_lazy as _
|
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')),
|
TRIGGERTYPE_CHOICES = [('time', _('Time Trigger')),
|
||||||
('event', _('Event Trigger'))]
|
('event', _('Event Trigger'))]
|
||||||
|
|
||||||
CRONTAB = 'crontab'
|
CRONTAB = 'crontab'
|
||||||
|
|
||||||
DAY_CHOICES = [('1', _('Monday')),
|
CRONTAB_DAY_CHOICES = [('1', _('Monday')),
|
||||||
('2', _('Tuesday')),
|
('2', _('Tuesday')),
|
||||||
('3', _('Wednesday')),
|
('3', _('Wednesday')),
|
||||||
('4', _('Thursday')),
|
('4', _('Thursday')),
|
||||||
('5', _('Friday')),
|
('5', _('Friday')),
|
||||||
('6', _('Saturday')),
|
('6', _('Saturday')),
|
||||||
('0', _('Sunday'))]
|
('0', _('Sunday'))]
|
||||||
DAY_DICT = collections.OrderedDict(DAY_CHOICES)
|
CRONTAB_DAY_DICT = collections.OrderedDict(CRONTAB_DAY_CHOICES)
|
||||||
|
|
||||||
EVERYDAY = 'everyday'
|
EVERYDAY = 'everyday'
|
||||||
EVERYWEEK = 'everyweek'
|
EVERYWEEK = 'everyweek'
|
||||||
EVERYMONTH = 'everymonth'
|
EVERYMONTH = 'everymonth'
|
||||||
|
|
||||||
FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
|
CRONTAB_FREQUENCE_CHOICES = [(EVERYDAY, _('Every Day')),
|
||||||
(EVERYWEEK, _('Every Week')),
|
(EVERYWEEK, _('Every Week')),
|
||||||
(EVERYMONTH, _('Every Month'))]
|
(EVERYMONTH, _('Every Month'))]
|
||||||
FREQUENCE_DICT = collections.OrderedDict(FREQUENCE_CHOICES)
|
CRONTAB_FREQUENCE_DICT = collections.OrderedDict(CRONTAB_FREQUENCE_CHOICES)
|
||||||
|
|
||||||
|
|
||||||
class CrontabUtil(object):
|
class CrontabUtil(object):
|
||||||
|
@ -78,7 +81,9 @@ class CrontabUtil(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def convert_from_crontab(dict_crontab):
|
def convert_from_crontab(dict_crontab):
|
||||||
data = {}
|
data = {
|
||||||
|
'format': dict_crontab['format']
|
||||||
|
}
|
||||||
if dict_crontab["format"] == CRONTAB:
|
if dict_crontab["format"] == CRONTAB:
|
||||||
pattern = dict_crontab["pattern"]
|
pattern = dict_crontab["pattern"]
|
||||||
patterns = pattern.split(" ")
|
patterns = pattern.split(" ")
|
||||||
|
@ -86,18 +91,124 @@ class CrontabUtil(object):
|
||||||
if patterns[2] == "*" \
|
if patterns[2] == "*" \
|
||||||
and patterns[3] == "*" \
|
and patterns[3] == "*" \
|
||||||
and patterns[4] == "*":
|
and patterns[4] == "*":
|
||||||
data["frequence"] = FREQUENCE_DICT[EVERYDAY]
|
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYDAY]
|
||||||
elif patterns[2] == "*" \
|
elif patterns[2] == "*" \
|
||||||
and patterns[3] == "*" \
|
and patterns[3] == "*" \
|
||||||
and patterns[4] != "*":
|
and patterns[4] != "*":
|
||||||
data["frequence"] = FREQUENCE_DICT[EVERYWEEK]
|
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYWEEK]
|
||||||
data["day"] = DAY_DICT[patterns[4]]
|
data["day"] = CRONTAB_DAY_DICT[patterns[4]]
|
||||||
elif patterns[2] != "*" \
|
elif patterns[2] != "*" \
|
||||||
and patterns[3] == "*" \
|
and patterns[3] == "*" \
|
||||||
and patterns[4] == "*":
|
and patterns[4] == "*":
|
||||||
data["frequence"] = FREQUENCE_DICT[EVERYMONTH]
|
data["frequence"] = CRONTAB_FREQUENCE_DICT[EVERYMONTH]
|
||||||
data["date"] = patterns[2]
|
data["date"] = patterns[2]
|
||||||
|
|
||||||
data["time"] = '%s:%s' % (patterns[1].zfill(2),
|
data["time"] = '%s:%s' % (patterns[1].zfill(2),
|
||||||
patterns[0].zfill(2))
|
patterns[0].zfill(2))
|
||||||
return data
|
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,11 +89,16 @@ class DetailView(horizon_views.HorizonTemplateView):
|
||||||
|
|
||||||
if trigger is not None and trigger.properties is not None:
|
if trigger is not None and trigger.properties is not None:
|
||||||
if trigger.properties["format"] == utils.CRONTAB:
|
if trigger.properties["format"] == utils.CRONTAB:
|
||||||
data = utils.CrontabUtil\
|
data = utils.CrontabUtil.convert_from_crontab(
|
||||||
.convert_from_crontab(trigger.properties)
|
trigger.properties
|
||||||
if data:
|
)
|
||||||
for key, value in data.items():
|
else:
|
||||||
setattr(trigger, key, value)
|
data = utils.CalendarUtil.convert_from_calendar(
|
||||||
|
trigger.properties
|
||||||
|
)
|
||||||
|
if data:
|
||||||
|
for key, value in data.items():
|
||||||
|
setattr(trigger, key, value)
|
||||||
|
|
||||||
context["trigger"] = trigger
|
context["trigger"] = trigger
|
||||||
context["url"] = reverse("horizon:karbor:triggers:index")
|
context["url"] = reverse("horizon:karbor:triggers:index")
|
||||||
|
|
Loading…
Reference in New Issue