From 1e6b400b2c4b337e16bedd2ddeef7d16e933c57e Mon Sep 17 00:00:00 2001 From: Stranck Date: Mon, 13 May 2024 10:26:29 +0200 Subject: [PATCH] Automatically remove canceled orders from rooms Quite shit code, but it works (I haven't slept last night) --- messages.py | 7 +++-- utils.py | 89 ++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 32 deletions(-) diff --git a/messages.py b/messages.py index 5664829..455f238 100644 --- a/messages.py +++ b/messages.py @@ -3,15 +3,16 @@ ROOM_ERROR_TYPES = { 'unpaid': "Somebody in your room has not paid for their reservation, yet.", 'type_mismatch': "A member in your room has a ticket for a different type of room capacity. This happens when users swap their room types with others, without abandoning the room.", 'daily': "Some member in your room has a Daily ticket. These tickets do not include a hotel reservation.", - 'capacity_mismatch': "The number of people in your room mismatches your type of ticket." + 'capacity_mismatch': "The number of people in your room mismatches your type of ticket.", + 'canceled': "Someone in your room canceled his booking and it was removed from your room." } EMAILS_TEXT = { "ROOM_UNCONFIRM_TITLE": "Your room got unconfirmed", "ROOM_UNCONFIRM_TEXT": { - 'html': "Hello {0}
We had to unconfirm your room '{1}' due to the following issues:

{2}

Please contact your room's owner or contact our support for further informations at https://furizon.net/contact/.
Thank you.

Manage booking", + 'html': "Hello {0}
We had to unconfirm or change your room '{1}' due to the following issues:

{2}

Please contact your room's owner or contact our support for further informations at https://furizon.net/contact/.
Thank you.

Manage booking", - 'plain': "Hello {0}\nWe had to unconfirm your room '{1}' due to the following issues:\n{2}\nPlease contact your room's owner or contact our support for further informations at https://furizon.net/contact/.\nThank you\n\nTo manage your booking: https://reg.furizon.net/manage/welcome" + 'plain': "Hello {0}\nWe had to unconfirm or change your room '{1}' due to the following issues:\n{2}\nPlease contact your room's owner or contact our support for further informations at https://furizon.net/contact/.\nThank you\n\nTo manage your booking: https://reg.furizon.net/manage/welcome" }, diff --git a/utils.py b/utils.py index d82879f..2eaaf59 100644 --- a/utils.py +++ b/utils.py @@ -164,6 +164,17 @@ async def unconfirm_room_by_order(order, room_members=None, throw=True, request= await p.edit_answer('room_confirmed', "False") await p.send_answers() +async def remove_members_from_room(order, removeMembers): + didSomething = False + for member in removeMembers: + if (member in order.room_members): + order.room_members.remove(member) + didSomething = True + if(didSomething): + await order.edit_answer("room_members", ','.join(order.room_members)) + await order.send_answers() + return didSomething + async def validate_rooms(request, rooms, om): logger.info('Validating rooms...') if not om: om = request.app.ctx.om @@ -171,6 +182,7 @@ async def validate_rooms(request, rooms, om): # rooms_to_unconfirm is the room that MUST be unconfirmed, room_with_errors is a less strict set containing all rooms with kind-ish errors rooms_to_unconfirm = [] room_with_errors = [] + remove_members = [] # Validate rooms for order in rooms: @@ -195,43 +207,58 @@ async def validate_rooms(request, rooms, om): # Get confirmed rooms that fail validation failed_confirmed_rooms = list(filter(lambda fr: (fr[0].room_confirmed == True), rooms_to_unconfirm)) + didSomething = False + if len(failed_confirmed_rooms) == 0: logger.info('[ROOM VALIDATION] No rooms to unconfirm.') - return + else: + didSomething = True + logger.info(f"[ROOM VALIDATION] Trying to unconfirm {len(failed_confirmed_rooms)} rooms...") - logger.info(f"[ROOM VALIDATION] Trying to unconfirm {len(failed_confirmed_rooms)} rooms...") - - # Try unconfirming them - for rtu in failed_confirmed_rooms: - order = rtu[0] - member_orders = rtu[2] - logger.warning(f"[ROOM VALIDATION] [UNCONFIRMING] Unconfirming room {order.code}...") - - # Unconfirm and email users about the room - if UNCONFIRM_ROOMS_ENABLE: - await unconfirm_room_by_order(order, member_orders, False, None, om) - - logger.info(f"[ROOM VALIDATION] Sending unconfirm notice to room members...") - sent_count = 0 - # Send unconfirm notice via email - for rtu in failed_confirmed_rooms: - order = rtu[0] - member_orders = rtu[2] - try: + # Try unconfirming them + for rtu in failed_confirmed_rooms: + order = rtu[0] + member_orders = rtu[2] + logger.warning(f"[ROOM VALIDATION] [UNCONFIRMING] Unconfirming room {order.code}...") + + # Unconfirm and email users about the room if UNCONFIRM_ROOMS_ENABLE: - await send_unconfirm_message(order, member_orders) - sent_count += len(member_orders) - except Exception as ex: - if EXTRA_PRINTS: logger.exception(str(ex)) - logger.info(f"[ROOM VALIDATION] Sent {sent_count} emails") + await unconfirm_room_by_order(order, member_orders, False, None, om) + + for r in rooms_to_unconfirm: + order = r[0] + removeMembers = r[3] + if len(removeMembers) > 0: + logger.warning(f"[ROOM VALIDATION] [REMOVING] Removing members '{','.join(removeMembers)}' from room {order.code}") + + if UNCONFIRM_ROOMS_ENABLE: + didSomething |= await remove_members_from_room(order, removeMembers) + if(r not in failed_confirmed_rooms): failed_confirmed_rooms.append(r) + + + if(didSomething): + logger.info(f"[ROOM VALIDATION] Sending unconfirm notice to room members...") + sent_count = 0 + # Send unconfirm notice via email + for rtu in failed_confirmed_rooms: + order = rtu[0] + member_orders = rtu[2] + try: + if UNCONFIRM_ROOMS_ENABLE: + await send_unconfirm_message(order, member_orders) + sent_count += len(member_orders) + except Exception as ex: + if EXTRA_PRINTS: logger.exception(str(ex)) + logger.info(f"[ROOM VALIDATION] Sent {sent_count} emails") async def check_room(request, order, om=None): room_errors = [] room_members = [] + remove_members = [] use_cached = request == None if not om: om = request.app.ctx.om - if not order or not order.room_id or order.room_id != order.code: return (order, False, room_members) + if not order or not order.room_id or order.room_id != order.code: return (order, False, room_members, remove_members) # This is not needed anymore you buy tickets already #if quotas.get_left(len(order.room_members)) == 0: @@ -249,8 +276,12 @@ async def check_room(request, order, om=None): if res.room_id != order.code: room_errors.append((res.code, 'room_id_mismatch')) allOk = False - - if res.status != 'paid': + + if res.status == 'canceled': + room_errors.append((res.code, 'canceled')) + remove_members.append(res.code) + allOk = False + elif res.status != 'paid': room_errors.append((res.code, 'unpaid')) if res.bed_in_room != bed_in_room: @@ -270,4 +301,4 @@ async def check_room(request, order, om=None): if order.room_confirmed: allOk = False order.set_room_errors(room_errors) - return (order, allOk, room_members) \ No newline at end of file + return (order, allOk, room_members, remove_members) \ No newline at end of file