source: taskScheduler/trunk/fuentes/python3-taskscheduler.install/usr/share/taskscheduler/cronParser.py @ 6078

Last change on this file since 6078 was 6078, checked in by Juanma, 2 years ago

Initial Release

File size: 5.9 KB
Line 
1#!/usr/bin/env python3
2import gettext
3gettext.textdomain('taskscheduler')
4_ = gettext.gettext
5
6class cronParser():
7        def __init__(self):
8                        self.expr={'of':_('of'),'each':_('each'),'at':_('at'),'on':_('on'),'from':_('from'),\
9                                        'to':_('to'),'and':_('and'),'the':_('the'),'in':_('in'),\
10                                        'atm':_("at minute"),'min':_("minutes"),'emin':_('each minute'),'tmin':_('the minute'),\
11                                        'ehour':_("each hour"),'h':_("hours"),'hoc':_("o'clock"),'evhour':_('every hour'),\
12                                        'evday':_('everyday'),'eday':_("each day"),'days':_('days'),'day':_('day'),\
13                                        'evmon':_('every month'),'emon':_("each month"),'months':_('months')}
14        ###
15        #Input: dict
16        ###
17        def parse_taskData(self,taskData):
18                print ("parsing: "+str(taskData))
19                parsed_data=[]
20                parsed_calendar=''
21                expr={}
22                day_dict={'1':_('Monday'),'2':_('Tuesday'),'3':_('Wednesday'),'4':_('Thursday'),'5':_('Friday'),'6':_('Saturday'),'7':_('Sunday'),'*':'every'}
23                mon_dict={'1':_('January'),'2':_('February'),'3':_('March'),'4':_('April'),'5':_('May'),'6':_('June'),'7':_('July'),'8':_('August'),'9':_('September'),'10':_('October'),'11':_('November'),'12':_('December'),'*':'every'}
24                mon_expr=self._parse_cron_expression(taskData['mon'],mon_dict)
25                dow_expr=self._parse_cron_expression(taskData['dow'],day_dict)
26                dom_expr=self._parse_cron_expression(taskData['dom'])
27                min_expr=self._parse_cron_expression(taskData['m'])
28                hou_expr=self._parse_cron_expression(taskData['h'])
29                time_expr=self._parse_time_expr(hou_expr,min_expr)
30                date_expr=self._parse_date_expr(mon_expr,dow_expr,dom_expr)
31                parsed_data=" ".join([time_expr,date_expr])
32                if parsed_data[0].isdigit():   
33                        parsed_calendar=self.expr['at'] +' ' + parsed_data
34                else:
35                        parsed_calendar=parsed_data
36                return parsed_calendar.capitalize()
37        #def parse_taskData(self,taskData):
38
39        def _parse_time_expr(self,hour,minute):
40                sw_err=False
41                try:
42                        int(hour)
43                        int(minute)
44                except:
45                        sw_err=True
46                if not sw_err:
47                        time_expr=hour+':'+minute
48                else:
49                        if minute!='every':
50                                if hour.startswith(self.expr['each']):
51                                        minute=self.expr['atm']+' '+minute
52                                else:
53                                        if hour!='every':
54                                                minute=minute+' '+self.expr['min']
55                        else:
56                                minute=self.expr['emin']
57                        if hour!='every':
58                                if hour.startswith(_('each')):
59                                        if hour.endswith(' 1 '):
60                                                hour=self.expr['ehour']
61                                        else:
62                                                hour=hour+' '+self.expr['h']
63                                else:
64                                        hour="%s %s"%(hour,self.expr['hoc'])
65                                time_expr="%s %s" % (hour,minute)
66                        else:
67                                hour="%s"%(self.expr['evhour'])
68                                time_expr="%s %s %s %s" % (hour,self.expr['on'],self.expr['tmin'],minute)
69                return time_expr
70        #def parse_time_expr
71
72        def _parse_date_expr(self,mon,dow,dom):
73                sw_dom_err=False
74                sw_mon_err=False
75                time_expr=''
76                try:
77                        int(dom)
78                except:
79                        sw_dom_err=True
80                try:
81                        int(mon)
82                except:
83                        sw_mon_err=True
84                time_expr="%s %s" % (dom,mon)
85                if sw_dom_err:
86                        if dom=='every' or dom=='*':
87                                dom=self.expr['evday']
88                        elif 'every' in mon or mon=='*':
89                                if dom.startswith(self.expr['each']):
90                                        if dom.endswith(' 1 '):
91                                                dom=self.expr['eday']
92                                        else:
93                                                dom="%s %s" % (dom,self.expr['days'])
94                                else:
95                                        dom="%s %s" % (self.expr['day'],dom)
96                        elif ',' in dom:
97                                dom="%s %s" % (self.expr['days'],dom)
98                        elif 'from' in dom:
99                                dom="%s %s" % (self.expr['days'],dom)
100                        elif dom.startswith(self.expr['each']):
101                                        if dom.endswith(' 1 '):
102                                                dom=self.expr['eday']
103                                        else:
104                                                dom="%s %s" % (dom,self.expr['days'])
105                else:
106#                       dom="%s %s %s" % (self.expr['on'],self.expr['day'],dom)
107                        dom="%s %s %s" % (self.expr['of'],self.expr['day'],dom)
108                if sw_mon_err:
109                        if mon=='every' or mon =='*':
110                                mon=self.expr['evmon']
111                        elif mon.startswith(self.expr['each']):
112                                if mon.endswith(' 1 '):
113                                        mon=self.expr['emon']
114                                else:
115                                        mon="%s %s" % (mon,self.expr['months'])
116                else:
117                        mon="%s %s" % (self,expr['mon'],mon)
118
119                if dow!='every' and dow!='*':   
120                        time_expr="%s %s %s %s" % (self.expr['the'],dow,self.expr['in'],mon)
121                else:
122                        if dom.startswith(self.expr['each']):
123                                time_expr="%s %s %s" % (dom,self.expr['in'],mon)
124                        else:
125                                if mon!=self.expr['evmon'] or dom!=self.expr['evday']:
126                                        time_expr="%s %s %s" % (dom,self.expr['in'],mon)
127                                else:
128#                                       time_expr="%s %s" % (dom,mon)
129                                        time_expr="%s" % (dom)
130#                               time_expr="%s %s %s" % (self.expr['on'],dom,mon)
131#                               time_expr="%s %s %s" % (dom,self.expr['of'],mon)
132
133                return time_expr
134        #def parse_date_expr
135
136        def _parse_cron_expression(self,data,description_dict={}):
137                (each,at_values,range_values,extra_range,values)=('','','','','')
138#       */2 -> Each two time units
139#       1-2 -> Range between 1 and 2
140#       1,2 -> At 1 and 2
141#       1 -> direct value
142                if data in description_dict.keys():
143                        values=description_dict[data]
144                else:
145                        if '/' in data:
146                                expr=data.split('/')
147                                each=expr[-1]
148                                data=expr[0]
149                        if ',' in data:
150                                at_values=data.split(',')
151                                value_desc=[]
152                                for value in at_values:
153                                        if '-' in value:
154                                                extra_range=value
155                                        else:
156                                                if value in description_dict.keys():
157                                                        value_desc.append(description_dict[value])
158                                at_values=value_desc
159                        if '-' in data or extra_range:
160                                if extra_range:
161                                        data=extra_range
162                                range_values=data.split('-')
163                                value_desc=[]
164                                for value in range_values:
165                                        if value in description_dict.keys():
166                                                value_desc.append(description_dict[value])
167                                if value_desc:
168                                        range_values=value_desc
169                (str_range,str_each,str_at)=('','','')
170                if range_values:
171                        str_range="%s %s %s %s " % (self.expr['from'],range_values[0],self.expr['to'],range_values[1])
172                if each:
173                        str_each="%s %s " % (self.expr['each'],each)
174                if at_values:
175                        if range_values:
176                                str_at="%s %s %s %s" % (self.expr['and'],', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
177                        else:
178                                str_at="%s %s %s" % (', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
179
180                retval=str_range+str_at+str_each+values
181                if retval=='':
182                        if len(data)<2 and data!='*':
183                                data='0'+data
184                        elif data=='*':
185                                data='every'
186                        retval=data
187                return (retval.rstrip('\n'))
188        #def parse_cron_expression
Note: See TracBrowser for help on using the repository browser.