# Thierry Parmentelat -- INRIA
#
# Utilities for filtering on leases
-#
-from types import StringTypes
+import time
+import calendar
+
from PLC.Faults import *
from PLC.Filter import Filter
from PLC.Parameter import Parameter, Mixed
str, "str_timestamp: leases alive after at that time"),
Parameter(
tuple, "timeslot: the leases alive during this timeslot")),
+ ########## macros
+ # {'day' : 0} : all leases from today and on
+ # {'day' : 1} : all leases today (localtime at the myplc)
+ # {'day' : 2} : all leases today and tomorrow (localtime at the myplc)
+ # etc..
+ 'day': Parameter(int, "clip on a number of days from today and on;"
+ " 0 means no limit in the future"),
}
def __init__(self, fields={}, filter={},
# hooks for the local fields
def sql_alive(self, alive):
- if isinstance(alive, int) or isinstance(alive, StringTypes):
+ if isinstance(alive, int) or isinstance(alive, str):
# the lease is alive at that time if from <= alive <= until
alive = LeaseFilter.quote(alive)
return LeaseFilter.sql_time_in_range(alive, 't_from', 't_until')
.format(alive))
def sql_clip(self, clip):
- if isinstance(clip, int) or isinstance(clip, StringTypes):
+ if isinstance(clip, int) or isinstance(clip, str):
start = LeaseFilter.quote(clip)
return LeaseFilter.sql_timeslot_after('t_from', 't_until', start)
elif isinstance(clip, tuple):
raise PLCInvalidArgument("LeaseFilter: clip field {}"
.format(clip))
+ # the whole key to implementing day is to compute today's beginning
+ def today_start(self):
+ # a struct_time
+ st = time.localtime()
+ seconds_today = st.tm_hour * 3600 + st.tm_min * 60 + st.tm_sec
+ return int(time.time()) - seconds_today
+
# supersede the generic Filter 'sql' method
def sql(self, api, join_with="AND"):
+ # implement 'day' as a clip
+ if 'day' in self:
+ if 'clip' in self:
+ raise PLCInvalidArgument("LeaseFilter cannot have both 'clip' and 'day'")
+ today = self.today_start()
+ nb_days = self['day']
+ if nb_days == 0:
+ self['clip'] = today
+ else:
+ self['clip'] = (today, today + nb_days * 24 * 3600)
+ del self['day']
+
# preserve locally what belongs to us, hide it from the superclass
# self.local is a dict local_key : user_value
# self.negation is a dict local_key : string
self.local = {}
self.negation = {}
- for (k, v) in LeaseFilter.local_fields.items():
+ for (k, v) in list(LeaseFilter.local_fields.items()):
if k in self:
self.local[k] = self[k]
del self[k]
self.negation[k] = "NOT "
# run the generic filtering code
(where_part, clip_part) = Filter.sql(self, api, join_with)
- for (k, v) in self.local.items():
+ for (k, v) in list(self.local.items()):
try:
# locate hook function associated with key
method = LeaseFilter.__dict__['sql_' + k]
.format(self.join_with,
self.negation[k],
method(self, self.local[k]))
- except Exception, e:
+ except Exception as e:
raise PLCInvalidArgument(
"LeaseFilter: something wrong with filter"
"key {}, val was {} -- {}".format(k, v, e))