From acd31d2619486b3d079ac661ae724295cea84ba2 Mon Sep 17 00:00:00 2001 From: Charlie Date: Sun, 23 Mar 2025 18:44:57 -0300 Subject: [PATCH 1/3] create new function decode_payments_params --- bot/utils.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/bot/utils.py b/bot/utils.py index 1d5f004..922afe8 100644 --- a/bot/utils.py +++ b/bot/utils.py @@ -184,6 +184,49 @@ async def decode_expense_params(params, group): return data +async def decode_payments_params(params,user,group): + """ + Process command params in payment's attributes, and return a dict with the following data: + amount = expense amount + date = date + to_user = User + """ + result = {} + if len(params) == 3: + try: + date = parse_date(params.pop(-1), DATE_INPUT_FORMATS) + except DateFormatterError: + example_date = dt.date.today() + formated_dates = [dt.datetime.strftime(example_date, format) for format in DATE_INPUT_FORMATS] + date_bullets = '\n - '.join(formated_dates) + text = f'El formato de fecha no es correcto. ' \ + f'Por ejemplo a la fecha de hoy la podés escribir en cualquiera ' \ + f'de los siguientes formatos: \n - {date_bullets}' + raise ParameterError(text) + else: + date = dt.date.today().strftime("%Y-%m-%d") + result["date"] = date + try: + amount, to_user = params + amount = float(amount) + if to_user.startswith("@"): + to_user = to_user[1:] + to_user = await User.objects.exclude(pk=user.pk).aget(username=to_user, telegram_groups=group) + result["amount"] =amount + result["to_user"] = to_user + except ValueError: + text = "El primer argumento debe ser el monto a pagar, y el segundo argumento el "\ + "username del usuario al que le estás pagando. \n\n"\ + "Opcionalmente puede contener un tercer argumento con la fecha en la que se "\ + "desea computar el gasto, con el formato dd/mm/yy." + return text + except User.DoesNotExist: + text = "El usuario espcificado ({}) no existe dentro de este grupo. \n".format(to_user) + text += "Los posibles usuarios a los que les podes cargar un pago son: \n" + async for member in group.users.exclude(pk=user.pk): + text += "- {}\n".format(member.username) + return text + return result async def get_amount_and_currency(raw_amount): """ From 895d449e8ef211e6962ac1e39de8f75102dab74d Mon Sep 17 00:00:00 2001 From: Charlie Date: Sun, 23 Mar 2025 18:45:24 -0300 Subject: [PATCH 2/3] refactor new_payment function --- bot/utils.py | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/bot/utils.py b/bot/utils.py index 922afe8..4a760a0 100644 --- a/bot/utils.py +++ b/bot/utils.py @@ -284,41 +284,21 @@ async def new_payment(params, update, user, group): "un único miembro, por lo que no se pueden realizar pagos." return text - DATE_FORMAT = '%d/%m/%y' - if len(params) == 3: - date = params.pop(-1) - else: - date = dt.date.today().strftime(DATE_FORMAT) try: - amount, to_user = params - amount = float(amount) - if to_user.startswith("@"): - to_user = to_user[1:] - to_user = await User.objects.exclude(pk=user.pk).aget(username=to_user, telegram_groups=group) - date = dt.datetime.strptime(date, DATE_FORMAT) - except ValueError: - text = "El primer argumento debe ser el monto a pagar, y el segundo argumento el "\ - "username del usuario al que le estás pagando. \n\n"\ - "Opcionalmente puede contener un tercer argumento con la fecha en la que se "\ - "desea computar el gasto, con el formato dd/mm/yy." - return text - except User.DoesNotExist: - text = "El usuario espcificado ({}) no existe dentro de este grupo. \n".format(to_user) - text += "Los posibles usuarios a los que les podes cargar un pago son: \n" - async for member in group.users.exclude(pk=user.pk): - text += "- {}\n".format(member.username) - return text + data = await decode_payments_params(params,user, group) + except ParameterError as e: + return str(e) payment_details = { 'from_user': user, - 'to_user': to_user, + 'to_user': data['to_user'], 'group': group, - 'amount': amount, - 'date': date, + 'amount': data['amount'], + 'date': data['date'], } payment = await Payment.objects.acreate(**payment_details) - return "Se ha registrado su pago a {} por ${} en la fecha {}".format(to_user, amount, date) + return "Se ha registrado su pago a {} por ${} en la fecha {}".format(data['to_user'], data['amount'], data['date']) async def show_expenses(group, **expense_filters): From 55d6e510a69a110dde968a9b816cb5c0848035a3 Mon Sep 17 00:00:00 2001 From: Charlie Date: Sat, 29 Mar 2025 11:17:03 -0300 Subject: [PATCH 3/3] fix exceptions handling in function decode_payments_param --- bot/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot/utils.py b/bot/utils.py index 4a760a0..dd66a47 100644 --- a/bot/utils.py +++ b/bot/utils.py @@ -219,13 +219,13 @@ async def decode_payments_params(params,user,group): "username del usuario al que le estás pagando. \n\n"\ "Opcionalmente puede contener un tercer argumento con la fecha en la que se "\ "desea computar el gasto, con el formato dd/mm/yy." - return text + raise ParameterError(text) except User.DoesNotExist: text = "El usuario espcificado ({}) no existe dentro de este grupo. \n".format(to_user) text += "Los posibles usuarios a los que les podes cargar un pago son: \n" async for member in group.users.exclude(pk=user.pk): text += "- {}\n".format(member.username) - return text + raise ParameterError(text) return result async def get_amount_and_currency(raw_amount):