def _compute_values(cls, standard, rule): # Remember to support also time zones that differ from UTC by not # exact hours (e.g. Australia/Adelaide) if not rule: nh = _datetime.datetime.now() + _datetime.timedelta(hours=1) lday = _calendar.monthrange(nh.year, nh.month)[1] win = (lday - nh.day) // 7 + 1 values = { 'start_weekday_raw': nh.weekday(), 'start_hour': nh.hour, 'start_minute': 0, 'end_relative_time': 3600, 'alarm_relative_time': 0, 'end_type': 0, 'alarm_type': 0, 'time_standard': standard, } else: values = { 'selected_months_raw': rule[0], 'start_weekday_raw': rule[1], 'start_weekday_number_raw': rule[2], 'max_overlap': rule[3], 'start_hour': rule[4], 'start_minute': rule[5], 'end_relative_time': rule[6] if rule[6] is not None else 3600, 'alarm_relative_time': rule[7] if rule[7] is not None else 0, 'end_type': rule[8][1], 'alarm_type': rule[8][2], 'time_standard': standard, } win = values['start_weekday_number_raw'] + 1 values['end_relative_number'], values['end_relative_unit'] = \ TimeSpanCtrl.compute_widget_values( values['end_relative_time']) # ralarm could be negative values['alarm_relative_number'], values['alarm_relative_unit'] = \ TimeSpanCtrl.compute_widget_values( max((0, values['alarm_relative_time']))) rrstart = values['start_hour'] * 3600 + values['start_minute'] * 60 rrend = rrstart + values['end_relative_time'] values['end_next_day'] = False # End time could be set after 23:59 of the start day if rrend > 86399: rrend = rrend % 86400 values['end_next_day'] = True rralarm = rrstart - values['alarm_relative_time'] values['alarm_previous_day'] = False # Alarm time could be set before 00:00 of the start day if rralarm < 0: rralarm = 86400 - abs(rralarm) % 86400 values['alarm_previous_day'] = True values.update({ 'start_weekday_number': win, 'start_weekday': MonthInverseWeekdayHourCtrl.compute_widget_weekday( values['start_weekday_raw']), 'end_hour': rrend // 3600, 'end_minute': rrend % 3600 // 60, 'alarm_hour': rralarm // 3600, 'alarm_minute': rralarm % 3600 // 60, }) return values