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

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

WIP on basic mode

File size: 7.3 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                                else:
142                                        mon=self.expr['evmon']
143                        elif mon.startswith(self.expr['each']):
144                                if mon.endswith(' 1 '):
145                                        mon=self.expr['emon']
146                                else:
147                                        mon="%s %s" % (mon,self.expr['months'])
148                else:
149                        mon="%s %s" % (self,expr['mon'],mon)
150
151                if dow!='every' and dow!='*':   
152                        if mon==self.expr['emon'] or mon.startswith(self.expr['each']):
153                                time_expr="%s %s %s %s %s" % (self.expr['the'],dow,self.expr['in'],self.expr['evweek'],mon)
154                        else:
155                                time_expr="%s %s %s %s" % (self.expr['the'],dow,self.expr['in'],mon)
156                else:
157                        if dom==self.expr['eday'] and mon==self.expr['emon']:
158                                time_expr="%s" % (self.expr['evday'])
159                        else:
160                                if dom.startswith(self.expr['each']):
161                                        if mon!='*' and mon!=self.expr['evmon']:
162                                                time_expr="%s %s %s" % (dom,self.expr['in'],mon)
163                                        else:
164                                                time_expr="%s" % (dom)
165                                else:
166                                        if mon!=self.expr['evmon'] or (dom!=self.expr['evday'] and dom!=self.expr['eweek']):
167                                                if dom==self.expr['evday']:
168                                                        dom=self.expr['eday']
169                                                time_expr="%s %s %s" % (dom,self.expr['in'],mon)
170                                        else:
171                                                time_expr="%s" % (dom)
172#                               time_expr="%s %s %s" % (self.expr['on'],dom,mon)
173#                               time_expr="%s %s %s" % (dom,self.expr['of'],mon)
174#                               if dom==self.expr['evday']:
175#                                       time_expr="%s" % (dom)
176
177
178                return time_expr
179        #def parse_date_expr
180
181        def _parse_cron_expression(self,data,description_dict={}):
182                (each,at_values,range_values,extra_range,values)=('','','','','')
183#       */2 -> Each two time units
184#       1-2 -> Range between 1 and 2
185#       1,2 -> At 1 and 2
186#       1 -> direct value
187                if data in description_dict.keys():
188                        values=description_dict[data]
189                else:
190                        if '/' in data:
191                                expr=data.split('/')
192                                each=expr[-1]
193                                data=expr[0]
194                        if ',' in data:
195                                at_values=data.split(',')
196                                value_desc=[]
197                                for value in at_values:
198                                        if '-' in value:
199                                                extra_range=value
200                                        else:
201                                                if value in description_dict.keys():
202                                                        value_desc.append(description_dict[value])
203                                at_values=value_desc
204                        if '-' in data or extra_range:
205                                if extra_range:
206                                        data=extra_range
207                                range_values=data.split('-')
208                                value_desc=[]
209                                for value in range_values:
210                                        if value in description_dict.keys():
211                                                value_desc.append(description_dict[value])
212                                if value_desc:
213                                        range_values=value_desc
214                (str_range,str_each,str_at)=('','','')
215                if range_values:
216                        str_range="%s %s %s %s " % (self.expr['from'],range_values[0],self.expr['to'],range_values[1])
217                if each:
218                        str_each="%s %s " % (self.expr['each'],each)
219                if at_values:
220                        if range_values:
221                                str_at="%s %s %s %s" % (self.expr['and'],', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
222                        else:
223                                str_at="%s %s %s" % (', '.join(at_values[:-1]),self.expr['and'],at_values[-1])
224
225                retval=str_range+str_at+str_each+values
226                if retval=='':
227                        if len(data)<2 and data!='*':
228                                data='0'+data
229                        elif data=='*':
230                                data='every'
231                        retval=data
232                return (retval.rstrip('\n'))
233        #def parse_cron_expression
Note: See TracBrowser for help on using the repository browser.