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

Last change on this file since 6742 was 6742, checked in by Juanma, 3 years ago

WIP in basic mode

File size: 7.5 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'),'lmd':_("last day"),'eday':_("each day"),'days':_('days'),\
13                                        'day':_('day'),'evmon':_('every month'),'emon':_("each month"),'months':_('months'),\
14                                        'evweek':_("every week"),'weeks':_("weeks"),'eweek':_("weekly")}
15                        self.dbg=0
16
17        def _debug(self,msg):
18                if self.dbg:
19                        print("cronParser: %s"%msg)
20        ###
21        #Input: dict
22        ###
23        def parse_taskData(self,taskData):
24                self._debug ("parsing: "+str(taskData))
25                parsed_data=[]
26                parsed_calendar=''
27                expr={}
28#               day_dict={'1':_('Monday'),'2':_('Tuesday'),'3':_('Wednesday'),'4':_('Thursday'),'5':_('Friday'),\
29#                               '6':_('Saturday'),'7':_('Sunday'),'*':'every'}
30                day_dict={'1':_('Mon'),'2':_('Tue'),'3':_('Wed'),'4':_('Thu'),'5':_('Fri'),\
31                                '6':_('Sat'),'7':_('Sun'),'*':'every'}
32#               mon_dict={'1':_('January'),'2':_('February'),'3':_('March'),'4':_('April'),'5':_('May'),\
33#                               '6':_('June'),'7':_('July'),'8':_('August'),'9':_('September'),'10':_('October'),\
34#                               '11':_('November'),'12':_('December'),'*':'every'}
35                mon_dict={'1':_('Jan'),'2':_('Feb'),'3':_('Mar'),'4':_('Apr'),'5':_('May'),\
36                                '6':_('Jun'),'7':_('Jul'),'8':_('Aug'),'9':_('Sep'),'10':_('Oct'),\
37                                '11':_('Nov'),'12':_('Dec'),'*':'every'}
38                mon_expr=self._parse_cron_expression(taskData['mon'],mon_dict)
39                dow_expr=self._parse_cron_expression(taskData['dow'],day_dict)
40                if 'lmd' in taskData.keys():
41                        dom_expr=self.expr['lmd']
42                else:
43                        dom_expr=self._parse_cron_expression(taskData['dom'])
44                min_expr=self._parse_cron_expression(taskData['m'])
45                hou_expr=self._parse_cron_expression(taskData['h'])
46                time_expr=self._parse_time_expr(hou_expr,min_expr)
47                date_expr=self._parse_date_expr(mon_expr,dow_expr,dom_expr)
48                parsed_data=" ".join([time_expr,date_expr])
49                if parsed_data[0].isdigit():   
50                        parsed_calendar=self.expr['at'] +' ' + parsed_data
51                else:
52                        parsed_calendar=parsed_data
53                return parsed_calendar.capitalize()
54        #def parse_taskData(self,taskData):
55
56        def _parse_time_expr(self,hour,minute):
57                sw_err=False
58                try:
59                        int(hour)
60                        int(minute)
61                except:
62                        sw_err=True
63                if not sw_err:
64                        time_expr=hour+':'+minute
65                else:
66                        if minute!='every':
67                                if hour.startswith(self.expr['each']):
68                                        minute=self.expr['atm']+' '+minute
69                                else:
70                                        if hour!='every':
71                                                minute=minute+' '+self.expr['min']
72                        else:
73                                minute=self.expr['emin']
74                        if hour!='every':
75                                if hour.startswith(_('each')):
76                                        if hour.endswith(' 1 '):
77                                                hour=self.expr['ehour']
78                                        else:
79                                                hour=hour+' '+self.expr['h']
80                                else:
81                                        hour="%s %s"%(hour,self.expr['hoc'])
82                                time_expr="%s %s" % (hour,minute)
83                        else:
84                                hour="%s"%(self.expr['evhour'])
85                                time_expr="%s %s %s %s" % (hour,self.expr['on'],self.expr['tmin'],minute)
86                return time_expr
87        #def parse_time_expr
88
89        def _parse_date_expr(self,mon,dow,dom):
90                sw_dom_err=False
91                sw_mon_err=False
92                time_expr=''
93                try:
94                        int(dom)
95                except:
96                        sw_dom_err=True
97                try:
98                        int(mon)
99                except:
100                        sw_mon_err=True
101                time_expr="%s %s" % (dom,mon)
102                if sw_dom_err:
103                        if dom=='every' or dom=='*':
104                                dom=self.expr['evday']
105                        elif dom==self.expr['lmd']:
106                                pass
107                        elif 'every' in mon or mon=='*':
108                                if dom.startswith(self.expr['each']):
109                                        if dom.endswith(' 1 '):
110                                                dom=self.expr['eday']
111                                        else:
112                                                self._debug(dom)
113                                                interval=int(dom.rstrip(' ').split(' ')[-1])
114                                                if interval%7:
115                                                        dom="%s %s" % (dom,self.expr['days'])
116                                                else:
117                                                        weeks=int(dom.rstrip(' ').split(' ')[-1])/7
118                                                        if weeks==1:
119                                                                dom=self.expr['eweek']
120                                                        else:
121                                                                dom="%s %s %s" % (self.expr['each'],int(weeks),self.expr['weeks'])
122                                else:
123                                        dom="%s %s" % (self.expr['day'],dom)
124                        elif ',' in dom:
125                                dom="%s %s" % (self.expr['days'],dom)
126                        elif 'from' in dom:
127                                dom="%s %s" % (self.expr['days'],dom)
128                        elif dom.startswith(self.expr['each']):
129                                        if dom.endswith(' 1 '):
130                                                dom=self.expr['eday']
131                                        else:
132                                                dom="%s %s" % (dom,self.expr['days'])
133                else:
134#                       dom="%s %s %s" % (self.expr['on'],self.expr['day'],dom)
135                        dom="%s %s %s" % (self.expr['of'],self.expr['day'],dom)
136
137                if sw_mon_err:
138                        if mon=='every' or mon =='*':
139                                if dow!='*' and dow!='every':
140#                                       mon=self.expr['evweek']
141                                        mon=''
142                                else:
143                                        mon=self.expr['evmon']
144                        elif mon.startswith(self.expr['each']):
145                                if mon.endswith(' 1 '):
146                                        mon=self.expr['emon']
147                                else:
148                                        mon="%s %s" % (mon,self.expr['months'])
149                else:
150                        mon="%s %s" % (self,expr['mon'],mon)
151
152                if dow!='every' and dow!='*':   
153                        if mon==self.expr['emon'] or mon.startswith(self.expr['each']):
154                                time_expr="%s %s %s %s %s" % (self.expr['the'],dow,self.expr['in'],self.expr['evweek'],mon)
155                        else:
156                                if mon!=self.expr['emon'] and mon!=self.expr['evmon'] and mon!='':
157                                        time_expr="%s %s %s %s" % (self.expr['the'],dow,self.expr['in'],mon)
158                                else:
159                                        time_expr="%s %s" % (self.expr['the'],dow)
160                else:
161                        if dom==self.expr['eday'] and mon==self.expr['emon']:
162                                time_expr="%s" % (self.expr['evday'])
163                        else:
164                                if dom.startswith(self.expr['each']):
165                                        if mon!='*' and mon!=self.expr['evmon']:
166                                                time_expr="%s %s %s" % (dom,self.expr['in'],mon)
167                                        else:
168                                                time_expr="%s" % (dom)
169                                else:
170                                        if mon!=self.expr['evmon'] or (dom!=self.expr['evday'] and dom!=self.expr['eweek']):
171                                                if dom==self.expr['evday']:
172                                                        dom=self.expr['eday']
173                                                time_expr="%s %s %s" % (dom,self.expr['in'],mon)
174                                        else:
175                                                time_expr="%s" % (dom)
176#                               time_expr="%s %s %s" % (self.expr['on'],dom,mon)
177#                               time_expr="%s %s %s" % (dom,self.expr['of'],mon)
178#                               if dom==self.expr['evday']:
179#                                       time_expr="%s" % (dom)
180
181
182                return time_expr
183        #def parse_date_expr
184
185        def _parse_cron_expression(self,data,description_dict={}):
186                (each,at_values,range_values,extra_range,values)=('','','','','')
187#       */2 -> Each two time units
188#       1-2 -> Range between 1 and 2
189#       1,2 -> At 1 and 2
190#       1 -> direct value
191                if data in description_dict.keys():
192                        values=description_dict[data]
193                else:
194                        if '/' in data:
195                                expr=data.split('/')
196                                each=expr[-1]
197                                data=expr[0]
198                        if ',' in data:
199                                at_values=data.split(',')
200                                value_desc=[]
201                                for value in at_values:
202                                        if '-' in value:
203                                                extra_range=value
204                                        else:
205                                                if value in description_dict.keys():
206                                                        value_desc.append(description_dict[value])
207                                at_values=value_desc
208                        if '-' in data or extra_range:
209                                if extra_range:
210                                        data=extra_range
211                                range_values=data.split('-')
212                                value_desc=[]
213                                for value in range_values:
214                                        if value in description_dict.keys():
215                                                value_desc.append(description_dict[value])
216                                if value_desc:
217                                        range_values=value_desc
218                (str_range,str_each,str_at)=('','','')
219                if range_values:
220                        str_range="%s %s %s %s " % (self.expr['from'],range_values[0],self.expr['to'],range_values[1])
221                if each:
222                        str_each="%s %s " % (self.expr['each'],each)
223                if at_values:
224                        if range_values:
225                                str_at="%s %s %s %s" % (self.expr['and'],', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
226                        else:
227                                str_at="%s %s %s" % (', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
228
229                retval=str_range+str_at+str_each+values
230                if retval=='':
231                        if len(data)<2 and data!='*':
232                                data='0'+data
233                        elif data=='*':
234                                data='every'
235                        retval=data
236                return (retval.rstrip('\n'))
237        #def parse_cron_expression
Note: See TracBrowser for help on using the repository browser.