Skip to content

Commit eedab0f

Browse files
committed
New PyCamp creation flow
1 parent 51652bc commit eedab0f

File tree

1 file changed

+85
-23
lines changed

1 file changed

+85
-23
lines changed

src/pycamp_bot/commands/manage_pycamp.py

Lines changed: 85 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
import datetime
2-
from telegram.ext import CommandHandler
2+
from telegram.ext import ConversationHandler, CommandHandler, MessageHandler, filters
33
from pycamp_bot.models import Pycamp
44
from pycamp_bot.models import Pycampista
55
from pycamp_bot.models import PycampistaAtPycamp
66
from pycamp_bot.commands.auth import admin_needed
77
from pycamp_bot.logger import logger
88

99

10+
SET_DATE_STATE = "set_fate"
11+
SET_DURATION_STATE = "set_duration"
12+
WRAP_UP_STATE = "wrap_up"
13+
14+
1015
def get_pycamp_by_name(name):
1116
pycamps = Pycamp.select().where(Pycamp.headquarters == name)
1217
count = pycamps.count()
@@ -68,36 +73,98 @@ async def set_active_pycamp(update, context):
6873

6974
@admin_needed
7075
async def add_pycamp(update, context):
71-
parameters = update.message.text.split(' ')
72-
if not len(parameters) == 2:
76+
parameters = update.message.text.split(' ', 1)
77+
if len(parameters) < 2:
7378
await context.bot.send_message(
7479
chat_id=update.message.chat_id,
75-
text="El comando necesita un parametro (pycamp name)")
80+
text="El comando necesita un parametro (headquarters)")
81+
return
82+
hq = parameters[1].strip()
83+
if not hq:
84+
await context.bot.send_message(
85+
chat_id=update.message.chat_id,
86+
text="El parámetro headquarters no puede ser vacío")
7687
return
7788

78-
pycamp = Pycamp.get_or_create(headquarters=parameters[1])[0]
89+
pycamp = Pycamp.get_or_create(headquarters=hq, active=True)[0]
90+
pycamp.set_as_only_active()
91+
logger.info('Creado: {}'.format(pycamp))
7992

93+
msg = "El Pycamp {} fue creado.\n¿Cuándo empieza? (formato yyyy-mm-dd)"
8094
await context.bot.send_message(
8195
chat_id=update.message.chat_id,
82-
text="El Pycamp {} fue creado.".format(pycamp.headquarters))
96+
text=msg.format(pycamp.headquarters)
97+
)
98+
return SET_DATE_STATE
8399

84100

85-
@active_needed
86-
@admin_needed
87-
async def start_pycamp(update, context):
88-
parameters = update.message.text.split(' ')
89-
if len(parameters) == 2:
90-
date = datetime.datetime.fromisoformat(parameters[1])
91-
else:
92-
date = datetime.datetime.now()
101+
async def define_start_date(update, context):
102+
text = update.message.text
103+
try:
104+
start_date = datetime.datetime.fromisoformat(text)
105+
except ValueError:
106+
await context.bot.send_message(
107+
chat_id=update.message.chat_id,
108+
text="mmm no entiendo esa fecha, de nuevo?"
109+
)
110+
return SET_DATE_STATE
111+
112+
_, pycamp = get_active_pycamp()
113+
pycamp.init = start_date
114+
pycamp.save()
93115

94-
is_active, pycamp = get_active_pycamp()
95-
pycamp.init = date
116+
await context.bot.send_message(
117+
chat_id=update.message.chat_id,
118+
text="¿Cuantos días dura el PyCamp?"
119+
)
120+
return SET_DURATION_STATE
121+
122+
123+
async def define_duration(update, context):
124+
text = update.message.text.strip()
125+
try:
126+
duration = int(text)
127+
except ValueError:
128+
await context.bot.send_message(
129+
chat_id=update.message.chat_id,
130+
text="mmm no entiendo. Poné un número entero porfa."
131+
)
132+
return SET_DURATION_STATE
133+
134+
_, pycamp = get_active_pycamp()
135+
pycamp.end = pycamp.init + datetime.timedelta(days=duration - 1)
96136
pycamp.save()
97137

138+
msg = "Listo, el PyCamp '{}' está activo, desde el {} hasta el {}".format(
139+
pycamp.headquarters,
140+
pycamp.init.date(),
141+
pycamp.end.date()
142+
)
143+
await context.bot.send_message(
144+
chat_id=update.message.chat_id,
145+
text=msg
146+
)
147+
148+
149+
async def cancel(update, context):
98150
await context.bot.send_message(
99151
chat_id=update.message.chat_id,
100-
text="Empezó Pycamp :) ! {}".format(date))
152+
text="Se canceló la carga del PyCamp...")
153+
return ConversationHandler.END
154+
155+
156+
load_start_pycamp = ConversationHandler(
157+
entry_points=[CommandHandler('empezar_pycamp', add_pycamp)],
158+
states={
159+
SET_DATE_STATE: [MessageHandler(filters.TEXT, define_start_date)],
160+
SET_DURATION_STATE: [MessageHandler(filters.TEXT, define_duration)]
161+
},
162+
fallbacks=[CommandHandler('cancel', cancel)]
163+
)
164+
165+
166+
167+
101168

102169

103170
@active_needed
@@ -162,19 +229,14 @@ async def list_pycampistas(update, context):
162229

163230

164231
def set_handlers(application):
165-
application.add_handler(
166-
CommandHandler('empezar_pycamp', start_pycamp))
232+
application.add_handler(load_start_pycamp)
167233
application.add_handler(
168234
CommandHandler('terminar_pycamp', end_pycamp))
169235
application.add_handler(
170236
CommandHandler('activar_pycamp', set_active_pycamp))
171-
application.add_handler(
172-
CommandHandler('agregar_pycamp', add_pycamp))
173237
application.add_handler(
174238
CommandHandler('pycamps', list_pycamps))
175239
application.add_handler(
176240
CommandHandler('voy_al_pycamp', add_pycampista_to_pycamp))
177241
application.add_handler(
178242
CommandHandler('pycampistas', list_pycampistas))
179-
180-

0 commit comments

Comments
 (0)