Contact: fumanchu@aminus.org

Log in as guest/dejavu to create tickets

I think I've seen this ORM somewhere before...

Changeset 274

Show
Ignore:
Timestamp:
08/10/06 21:43:00
Author:
dowski
Message:

New eachweekday function for recur. See misc [101].

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/recur.py

    r273 r274  
    341341        startDate += datetime.timedelta(1) 
    342342 
     343def eachweekday(startDate, weekday, timeofday=None, endDate=None): 
     344    """Yield the same time-of-day each week for the given day. The time-of-day 
     345    defaults to midnight. 
     346     
     347    Yielded values are datetime.datetime objects. 
     348    For example: 
     349        eachweekday(datetime.date(2006, 8, 10), 3, datetime.time(14, 3, 0)) 
     350    yields the sequence: 2006-08-11 14:03:00, 2006-08-18 14:03:00, 
     351                         2006-08-25 14:03:00, ... 
     352     
     353    timeofday may be a datetime.time, as in the above example, or it 
     354    may be a string, of the form "hour:min:sec". Seconds and minutes 
     355    may be omitted if their colon ":" separator is also omitted. So 
     356    the example above could be rewritten: 
     357        eachday(datetime.date(2004, 5, 4), "14:03") 
     358    """ 
     359    if timeofday is None: 
     360        timeofday = datetime.time(0) 
     361    elif isinstance(timeofday, (str, unicode)): 
     362        timeofday = time_from_str(timeofday) 
     363 
     364    # get the given start time or datetime.time(0,0) 
     365    startTime = getattr(startDate, 'time', datetime.time)() 
     366     
     367    if startDate.weekday() > weekday or startTime > timeofday: 
     368        offset = (7 + weekday) - startDate.weekday() 
     369        while offset > 6: 
     370            offset -= 7 
     371        while offset <= 0: 
     372            offset += 7 
     373        startDate += datetime.timedelta(offset) 
     374     
     375    startDate = datetime.datetime.combine(startDate, timeofday) 
     376     
     377    # Now that we've coerced our startDate to a datetime, we need to 
     378    # do the same thing to endDate so we can compare them. 
     379    if endDate and not hasattr(endDate, "time"): 
     380        endDate = datetime.datetime.combine(endDate, timeofday) 
     381     
     382    end = getattr(endDate, 'date', lambda: None)() 
     383    day_iter = eachweek(startDate.date(), weekday, end) 
     384    startDate = datetime.datetime.combine(day_iter.next(), timeofday) 
     385     
     386    while (endDate is None) or (startDate <= endDate): 
     387        yield startDate 
     388        startDate = datetime.datetime.combine(day_iter.next(), timeofday) 
     389 
    343390def days(startDate, frequency=1, endDate=None): 
    344391    """Yield a sequence of dates, adding 'frequency' days each time. 
     
    584631                # \S is any non-whitespace character. 
    585632                eachday: r"([\S]+) (?:every|each) day", 
    586                 eachweek: [r"mon(?:days?)?", r"tues?(?:days?)?", 
    587                            r"wed(?:nesdays?)?", r"thurs?(?:days?)?", 
     633                # $ in first regex below so as not to match "month" 
     634                eachweekday: [r"([\S]+) (?:every|each) mon(?:day)?$", 
     635                              r"([\S]+) (?:every|each) tue(?:s?)?(?:day$)?$", 
     636                              r"([\S]+) (?:every|each) wed(?:nesday)?", 
     637                              r"([\S]+) (?:every|each) thu(?:rs?)?(?:day)?$", 
     638                              r"([\S]+) (?:every|each) fri(?:day)?", 
     639                              r"([\S]+) (?:every|each) sat(?:urday)?", 
     640                              r"([\S]+) (?:every|each) sun(?:day)?", 
     641                              ], 
     642                eachweek: [r"mon(?:days?)?", r"tue(?:s?)s?(?:days)?$", 
     643                           r"wed(?:nesdays?)?", r"thu(?:rs?)?(?:days)?$", 
    588644                           r"fri(?:days?)?", r"sat(?:urdays?)?", 
    589645                           r"sun(?:days?)?", 
     
    742798        try: 
    743799            next = self.recurrence.next() 
    744         except (AttributeError, StopIteration)
     800        except StopIteration
    745801            # The recurrence series was exhausted immediately. 
    746802            self.nextrun = None 
     
    757813            try: 
    758814                next = self.recurrence.next() 
    759             except (AttributeError, StopIteration)
     815            except StopIteration
    760816                # The recurrence series was exhausted. 
    761817                self.nextrun = None 
     
    781837        """Stop work.""" 
    782838        self.active = False 
    783         if self.curthread: 
    784             self.curthread.cancel() 
     839        self.curthread.cancel() 
    785840 
    786841 
     
    800855    def __init__(self, workers=None): 
    801856        if workers is None: 
    802             workers = {} 
     857            workers = [] 
    803858        self.workers = workers 
    804859        self.curthread = None 
     
    812867        """ 
    813868        # Set nextrun for all workers 
    814         for worker in self.workers.values()
     869        for worker in self.workers
    815870            worker.advance() 
    816871        self.terminated = False 
     
    823878         
    824879        ivs = [] 
    825         for w in self.workers.values()
     880        for w in self.workers
    826881            next = w.nextrun 
    827882            if next is not None: 
     
    844899    def stop(self): 
    845900        self.terminated = True 
    846         if self.curthread: 
    847             self.curthread.cancel() 
    848         for w in self.workers.values(): 
     901        self.curthread.cancel() 
     902        for w in self.workers: 
    849903            w.stop() 
    850904