def process_exception_list(temp_exceptions): new_temp_exceptions = [[] for _ in range(len(temp_exceptions))] for i in range(0, len(temp_exceptions)): print("--new i---") for j in range(0, len(temp_exceptions[i])): if j == 0: new_temp_exceptions[i].append(temp_exceptions[i][j]) else: no_intersection = True for k in range(0, len(new_temp_exceptions[i])): date_range1 = DateTimeRange( str(temp_exceptions[i][j][0:19]), str(temp_exceptions[i][j][22:41])) date_range2 = DateTimeRange( str(new_temp_exceptions[i][k][0:19]), str(new_temp_exceptions[i][k][22:41])) if date_range1.is_intersection(date_range2): new_range = date_range1.intersection(date_range2) new_temp_exceptions[i][k] = str(new_range).replace( "T", " ") no_intersection = False if no_intersection: new_temp_exceptions[i].append(temp_exceptions[i][j]) for i in range(0, len(new_temp_exceptions)): for j in range(0, len(new_temp_exceptions[i])): if str(new_temp_exceptions[i][j][0:19]) == str( new_temp_exceptions[i][j][22:41]): new_temp_exceptions[i].remove(new_temp_exceptions[i][j]) return new_temp_exceptions
def check_if_rent_is_possible(centre_id, gear_id, rent_amount, rent_start, rent_end, max_rent, session=None): rent_start = datetime.datetime.strptime(rent_start, '%Y-%m-%dT%H:%M:%S.%fZ') rent_end = datetime.datetime.strptime(rent_end, '%Y-%m-%dT%H:%M:%S.%fZ') all_rents = session.query(GearRental).filter_by( centre_id=centre_id, gear_id=gear_id).filter(GearRental.rent_end > rent_start, GearRental.rent_start < rent_end, GearRental.rent_status != -1).all() iter_start = rent_start while iter_start <= rent_end: total_number_of_rented_gear = 0 iter_start_with_delta = iter_start + datetime.timedelta(minutes=15) timerange = DateTimeRange(iter_start, iter_start_with_delta) for rent in all_rents: rent_time_range = DateTimeRange(rent.rent_start, rent.rent_end) if timerange.intersection(rent_time_range): total_number_of_rented_gear += rent.rent_amount if total_number_of_rented_gear + rent_amount > max_rent: return False iter_start = iter_start_with_delta return True
def get_common_intervals(d_range_1, d_range_2): """ Get the interval of start_date and end_date. """ dtr1 = DateTimeRange(d_range_1['start_date'], d_range_1['end_date']) dtr2 = DateTimeRange(d_range_2['start_date'], d_range_2['end_date']) dtr_common = dtr1.intersection(dtr2) if dtr_common.start_datetime and dtr_common.end_datetime: return {'start_date': dtr_common.start_datetime, 'end_date': dtr_common.end_datetime} else: return None
.all() ) for qq in q: try: # Set up date ranges dur = qq.Event_Duration act_range = DateTimeRange(qq.CreatedAt, qq.UpdatedAt) std_range = DateTimeRange( datetime(qq.CreatedAt.year, qq.CreatedAt.month, qq.CreatedAt.day) + timedelta(hours=6), datetime(qq.CreatedAt.year, qq.CreatedAt.month, qq.CreatedAt.day) + timedelta(hours=22)) # Split STANDARD and GRAVEYARD try: std = act_range.intersection(std_range).timedelta.total_seconds() grv = dur - std if grv == 1: grv -= 1 std += 1 if std + grv != dur: if std > grv: std += dur - std - grv else: grv += dur - grv - std except: std = 0 grv = dur #pprint.pprint([std,grv,dur])