X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FLeaseFilter.py;h=84f84b7a1e531c1d267330150e0f56350fe6a06e;hb=6bef7b35eec76ff66332cb20f58eb7703c2116f9;hp=e192d435420be1f21e009306ab1fd1d99bd2e869;hpb=21d187714285d9818fd94509b015ba069facb7ef;p=plcapi.git diff --git a/PLC/LeaseFilter.py b/PLC/LeaseFilter.py index e192d43..84f84b7 100644 --- a/PLC/LeaseFilter.py +++ b/PLC/LeaseFilter.py @@ -3,11 +3,12 @@ # # Utilities for filtering on leases +# w0622: we keep on using 'filter' as a variable name +# pylint: disable=c0111, c0103, w0622 + import time -import calendar -from types import StringTypes -from PLC.Faults import * +from PLC.Faults import * # pylint: disable=w0401, w0614 from PLC.Filter import Filter from PLC.Parameter import Parameter, Mixed from PLC.Timestamp import Timestamp @@ -15,7 +16,7 @@ from PLC.Timestamp import Timestamp # supersede the generic Filter class to support time intersection -class LeaseFilter (Filter): +class LeaseFilter(Filter): # general notes on input parameters # int_timestamp: number of seconds since the epoch @@ -25,45 +26,48 @@ class LeaseFilter (Filter): local_fields = { 'alive': Mixed( - Parameter( - int, "int_timestamp: leases alive at that time"), - Parameter( - str, "str_timestamp: leases alive at that time"), - Parameter( - tuple, "timeslot: the leases alive during this timeslot")), + Parameter(int, "int_timestamp: leases alive at that time"), + Parameter(str, "str_timestamp: leases alive at that time"), + Parameter(tuple, "timeslot: the leases alive during this timeslot")), 'clip': Mixed( - Parameter( - int, "int_timestamp: leases alive after that time"), - Parameter( - str, "str_timestamp: leases alive after at that time"), - Parameter( - tuple, "timeslot: the leases alive during this timeslot")), + Parameter(int, "int_timestamp: leases alive after that time"), + Parameter(str, "str_timestamp: leases alive after 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"), + '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={}, + def __init__(self, fields=None, filter=None, doc="Lease filter -- adds the 'alive' and 'clip'" "capabilities for filtering on leases"): + if fields is None: + fields = {} + if filter is None: + filter = {} Filter.__init__(self, fields, filter, doc) self.fields.update(LeaseFilter.local_fields) # canonical type @staticmethod - def quote(timestamp): return Timestamp.cast_long(timestamp) + def quote(timestamp): + return Timestamp.cast_long(timestamp) # basic SQL utilities @staticmethod def sql_time_intersect(f1, u1, f2, u2): # either f2 is in [f1,u1], or u2 is in [f1,u1], or f2<=f1<=u1<=u2 - return ("(({f1} <= {f2}) AND ({f2} <= {u1})) " + - "OR (({f1} <= {u2}) AND ({u2} <= {u1})) " + - "OR (({f2}<={f1}) AND ({u1}<={u2}))").format(**locals()) + return ( + "(({f1} <= {f2}) AND ({f2} <= {u1})) " + "OR (({f1} <= {u2}) AND ({u2} <= {u1})) " + "OR (({f2}<={f1}) AND ({u1}<={u2}))" + .format(f1=f1, u1=u1, f2=f2, u2=u2)) @staticmethod def time_in_range(timestamp, f1, u1): @@ -73,17 +77,18 @@ class LeaseFilter (Filter): @staticmethod def sql_time_in_range(timestamp, f1, u1): # is timestamp in [f1, u1] - return "(({f1} <= {timestamp}) AND ({timestamp} <= {u1}))"\ - .format(**locals()) + return ( + "(({f1} <= {timestamp}) AND ({timestamp} <= {u1}))" + .format(timestamp=timestamp, f1=f1, u1=u1)) @staticmethod def sql_timeslot_after(f1, u1, mark): # is the lease alive after mark, i.e. u1 >= mark - return "({u1} >= {mark})".format(**locals()) + return "({u1} >= {mark})".format(u1=u1, mark=mark) # hooks for the local fields def sql_alive(self, alive): - if isinstance(alive, int) or isinstance(alive, StringTypes): + if isinstance(alive, (int, 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') @@ -97,7 +102,7 @@ class LeaseFilter (Filter): .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): @@ -109,7 +114,7 @@ class LeaseFilter (Filter): raise PLCInvalidArgument("LeaseFilter: clip field {}" .format(clip)) - # the whole key to implementing day is to compute today's beginning + # the whole key to implementing day is to compute today's beginning def today_start(self): # a struct_time st = time.localtime() @@ -129,13 +134,13 @@ class LeaseFilter (Filter): 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] @@ -146,7 +151,7 @@ class LeaseFilter (Filter): 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] @@ -154,7 +159,7 @@ class LeaseFilter (Filter): .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))