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:
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:
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