habitante.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. # vim:fileencoding=utf-8
  2. # Go Working - Controle das Mesas
  3. #
  4. # Copyright (C) 2019-2020 Fábrica do Futuro
  5. #
  6. # This program is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import re
  20. from datetime import datetime
  21. from blueprints.goworking import bp
  22. from flask import (
  23. abort,
  24. flash,
  25. redirect,
  26. request,
  27. render_template,
  28. url_for,
  29. )
  30. from flask_login import login_required
  31. from blueprints.goworking.controllers import (
  32. NovaHabitanteForm,
  33. EditarHabitanteForm,
  34. custom_uuid,
  35. )
  36. from app import (
  37. db,
  38. )
  39. from blueprints.goworking.models import (
  40. habitante as habitante_model,
  41. cadeira as cadeira_model,
  42. empresa as empresa_model,
  43. )
  44. @bp.route('/habitante', methods=['GET', 'POST'])
  45. @login_required
  46. def habitante():
  47. try:
  48. habitantes_object = habitante_model.query.order_by(
  49. habitante_model.nome).all()
  50. ## Gera um uuid aleatório até que não exista nenhum idêntico no
  51. ## banco de dados. Mesmo que a chance hipotética de acontecer
  52. ## seja altamente improvável.
  53. id = custom_uuid.random_uuid()
  54. while habitante_model.query.get(id):
  55. id = custom_uuid.random_uuid()
  56. habitante_object = habitante_model(id=id)
  57. ## Tenta popular o formulário e o objeto habitante com os valores
  58. ## dos parâmetros do HTTP POST. Isto deve acontecer caso o
  59. ## formulário seja enviado novamente em virtude de algum erro
  60. ## processado pelo servidor (python) ao invés do cliente
  61. ## (javascript).
  62. if 'nome' in request.args:
  63. habitante_object.nome = request.args.get('nome')
  64. if 'cpf' in request.args:
  65. habitante_object.cpf = re.sub(
  66. r'[^\d]*',
  67. '',
  68. request.args.get('cpf'),
  69. )
  70. if 'desc' in request.args:
  71. habitante_object.desc = request.args.get('desc')
  72. if 'data_entrada' in request.args:
  73. habitante_object.data_entrada = datetime.strptime(
  74. request.args.get('data_entrada'), '%Y-%m-%d')
  75. if 'data_saida' in request.args:
  76. habitante_object.data_saida = datetime.strptime(
  77. request.args.get('data_saida'), '%Y-%m-%d')
  78. if 'data_renovacao' in request.args:
  79. habitante_object.data_renovacao = datetime.strptime(
  80. request.args.get('data_renovacao'), '%Y-%m-%d')
  81. form = NovaHabitanteForm(obj = habitante_object)
  82. if form.validate_on_submit():
  83. try:
  84. habitante_object.nome = form.nome.data
  85. habitante_object.cpf = re.sub(r'[^\d]*', '', form.cpf.data)
  86. habitante_object.desc = form.desc.data
  87. habitante_object.data_entrada = form.data_entrada.data
  88. habitante_object.data_saida = form.data_saida.data
  89. habitante_object.data_renovacao = form.data_renovacao.data
  90. if form.empresa.data is not None:
  91. habitante_object.id_empresa = form.empresa.data.id
  92. except Exception as e:
  93. mensagem = u"Falha tentando criar habitante! \
  94. Erro: %s" % (str(e))
  95. print(u"[DEBUG] %s" % (mensagem))
  96. flash(mensagem, 'danger')
  97. return redirect(url_for(
  98. 'goworking.habitante',
  99. nome = form.nome.data,
  100. cpf = form.cpf.data,
  101. desc = form.desc.data,
  102. data_entrada = form.data_entrada.data,
  103. data_saida = form.data_saida.data,
  104. data_renovacao = form.data_renovacao.data,
  105. ))
  106. ## Verifica se já tem alguém nesta cadeira
  107. cadeira_ocupada = False
  108. if form.cadeira.data is not None:
  109. cadeira_ocupada = habitante_model.query.filter_by(
  110. id_cadeira = form.cadeira.data.id).first()
  111. if cadeira_ocupada:
  112. mensagem = u"Cadeira já está ocupada, escolha outra!"
  113. flash(mensagem, 'danger')
  114. return redirect(url_for(
  115. 'goworking.habitante',
  116. nome = form.nome.data,
  117. cpf = form.cpf.data,
  118. desc = form.desc.data,
  119. data_entrada = form.data_entrada.data,
  120. data_saida = form.data_saida.data,
  121. data_renovacao = form.data_renovacao.data,
  122. ))
  123. else:
  124. if form.cadeira.data is not None:
  125. habitante_object.id_cadeira = form.cadeira.data.id
  126. try:
  127. db.session.add(habitante_object)
  128. db.session.commit()
  129. flash(
  130. u"Deu certo! Dados de %s cadastrados"
  131. % (str(habitante_object.nome)),
  132. 'success',
  133. )
  134. except Exception as e:
  135. db.session.rollback()
  136. db.session.remove()
  137. #~ logging.exception(e)
  138. mensagem = u"Não deu certo! O problema foi o seguinte: \
  139. %s" % (str(e))
  140. print(u"[DEBUG]: %s" % (mensagem))
  141. flash(mensagem, 'danger')
  142. finally:
  143. return redirect(url_for('goworking.habitante'))
  144. return render_template(
  145. 'habitante.html',
  146. title = u"Habitantes",
  147. subtitle = u"Cadastrar habitante",
  148. habitante = habitante_object,
  149. habitantes = habitantes_object,
  150. form = form,
  151. )
  152. except Exception as e:
  153. abort(500, str(e))
  154. abort(500)
  155. @bp.route('/habitante/cadeira/<string:id_cadeira>', methods=['GET', 'POST'])
  156. @login_required
  157. def habitante_cadeira(id_cadeira = custom_uuid.nil_uuid):
  158. try:
  159. habitantes_object = habitante_model.query.order_by(
  160. habitante_model.nome).all()
  161. ## Gera um uuid aleatório até que não exista nenhum idêntico no
  162. ## banco de dados. Mesmo que a chance hipotética de acontecer
  163. ## seja altamente improvável.
  164. id = custom_uuid.random_uuid()
  165. while habitante_model.query.get(id):
  166. id = custom_uuid.random_uuid()
  167. habitante_object = habitante_model(id=id, id_cadeira=id_cadeira)
  168. ## Tenta popular o formulário e o objeto habitante com os valores
  169. ## dos parâmetros do HTTP POST. Isto deve acontecer caso o
  170. ## formulário seja enviado novamente em virtude de algum erro
  171. ## processado pelo servidor (python) ao invés do cliente
  172. ## (javascript).
  173. if 'nome' in request.args:
  174. habitante_object.nome = request.args.get('nome')
  175. if 'cpf' in request.args:
  176. habitante_object.cpf = re.sub(
  177. r'[^\d]*',
  178. '',
  179. request.args.get('cpf'),
  180. )
  181. if 'desc' in request.args:
  182. habitante_object.desc = request.args.get('desc')
  183. if 'data_entrada' in request.args:
  184. habitante_object.data_entrada = datetime.strptime(
  185. request.args.get('data_entrada'), '%Y-%m-%d')
  186. if 'data_saida' in request.args:
  187. habitante_object.data_saida = datetime.strptime(
  188. request.args.get('data_saida'), '%Y-%m-%d')
  189. if 'data_renovacao' in request.args:
  190. habitante_object.data_renovacao = datetime.strptime(
  191. request.args.get('data_renovacao'), '%Y-%m-%d')
  192. form = NovaHabitanteForm(obj = habitante_object)
  193. cadeira_object = cadeira_model.query.get(id_cadeira)
  194. if cadeira_object:
  195. form.cadeira.data = cadeira_object
  196. if form.validate_on_submit():
  197. try:
  198. habitante_object.nome = form.nome.data
  199. habitante_object.cpf = re.sub(r'[^\d]*', '', form.cpf.data)
  200. habitante_object.desc = form.desc.data
  201. habitante_object.data_entrada = form.data_entrada.data
  202. habitante_object.data_saida = form.data_saida.data
  203. habitante_object.data_renovacao = form.data_renovacao.data
  204. if form.empresa.data is not None:
  205. habitante_object.id_empresa = form.empresa.data.id
  206. except Exception as e:
  207. mensagem = u"Falha tentando criar habitante! \
  208. Erro: %s" % (str(e))
  209. print(u"[DEBUG] %s" % (mensagem))
  210. flash(mensagem, 'danger')
  211. return redirect(url_for(
  212. 'goworking.habitante',
  213. nome = form.nome.data,
  214. cpf = form.cpf.data,
  215. desc = form.desc.data,
  216. data_entrada = form.data_entrada.data,
  217. data_saida = form.data_saida.data,
  218. data_renovacao = form.data_renovacao.data,
  219. ))
  220. ## Verifica se já tem alguém nesta cadeira
  221. cadeira_ocupada = False
  222. if form.cadeira.data is not None:
  223. cadeira_ocupada = habitante_model.query.filter_by(
  224. id_cadeira = form.cadeira.data.id).first()
  225. if cadeira_ocupada:
  226. mensagem = u"Cadeira já está ocupada, escolha outra!"
  227. flash(mensagem, 'danger')
  228. return redirect(url_for(
  229. 'goworking.habitante_cadeira',
  230. nome = form.nome.data,
  231. cpf = form.cpf.data,
  232. desc = form.desc.data,
  233. data_entrada = form.data_entrada.data,
  234. data_saida = form.data_saida.data,
  235. data_renovacao = form.data_renovacao.data,
  236. ))
  237. else:
  238. if form.cadeira.data is not None:
  239. habitante_object.id_cadeira = form.cadeira.data.id
  240. try:
  241. db.session.add(habitante_object)
  242. db.session.commit()
  243. flash(
  244. u"Deu certo! Dados de %s cadastrados"
  245. % (str(habitante_object.nome)),
  246. 'success',
  247. )
  248. except Exception as e:
  249. db.session.rollback()
  250. db.session.remove()
  251. #~ logging.exception(e)
  252. mensagem = u"Não deu certo! O problema foi o seguinte: \
  253. %s" % (str(e))
  254. print(u"[DEBUG]: %s" % (mensagem))
  255. flash(mensagem, 'danger')
  256. finally:
  257. return redirect(url_for('goworking.habitante'))
  258. return render_template(
  259. 'habitante.html',
  260. title = u"Habitantes",
  261. subtitle = u"Cadastrar habitante",
  262. habitante = habitante_object,
  263. habitantes = habitantes_object,
  264. form = form,
  265. )
  266. except Exception as e:
  267. abort(500, str(e))
  268. abort(500)
  269. @bp.route('/habitante/editar/<string:id>', methods=['GET', 'POST'])
  270. @login_required
  271. def habitante_editar(id = custom_uuid.nil_uuid):
  272. try:
  273. habitantes_object = habitante_model.query.order_by(
  274. habitante_model.nome).all()
  275. habitante_object = habitante_model.query.get(id)
  276. #~ form = EditarHabitanteForm()
  277. ## Tenta popular o formulário e o objeto habitante com os valores
  278. ## dos parâmetros do HTTP POST. Isto deve acontecer caso o
  279. ## formulário seja enviado novamente em virtude de algum erro
  280. ## processado pelo servidor (python) ao invés do cliente
  281. ## (javascript).
  282. if 'nome' in request.args:
  283. habitante_object.nome = request.args.get('nome')
  284. if 'cpf' in request.args:
  285. habitante_object.cpf = re.sub(
  286. r'[^\d]*',
  287. '',
  288. request.args.get('cpf'),
  289. )
  290. if 'desc' in request.args:
  291. habitante_object.desc = request.args.get('desc')
  292. if 'data_entrada' in request.args:
  293. habitante_object.data_entrada = datetime.strptime(
  294. request.args.get('data_entrada'), '%Y-%m-%d')
  295. if 'data_saida' in request.args:
  296. habitante_object.data_saida = datetime.strptime(
  297. request.args.get('data_saida'), '%Y-%m-%d')
  298. if 'data_renovacao' in request.args:
  299. habitante_object.data_renovacao = datetime.strptime(
  300. request.args.get('data_renovacao'), '%Y-%m-%d')
  301. form = EditarHabitanteForm(obj = habitante_object)
  302. #~ form.populate_obj(habitante_object)
  303. if form.validate_on_submit():
  304. try:
  305. if form.nome.data is not None:
  306. habitante_object.nome = form.nome.data
  307. if form.cpf.data is not None:
  308. habitante_object.cpf = re.sub(r'[^\d]*', '', form.cpf.data)
  309. if form.desc.data is not None:
  310. habitante_object.desc = form.desc.data
  311. if form.data_entrada.data is not None:
  312. habitante_object.data_entrada = form.data_entrada.data
  313. if form.data_saida.data is not None:
  314. habitante_object.data_saida = form.data_saida.data
  315. if form.data_renovacao.data is not None:
  316. habitante_object.data_renovacao = form.data_renovacao.data
  317. if form.empresa.data is not None:
  318. habitante_object.id_empresa = form.empresa.data.id
  319. except Exception as e:
  320. mensagem = u"Falha tentando editar habitante! \
  321. Erro: %s" % (str(e))
  322. print(u"[DEBUG] %s" % (mensagem))
  323. flash(mensagem, 'danger')
  324. return redirect(url_for(
  325. 'goworking.habitante_editar',
  326. id = form.id.data,
  327. nome = form.nome.data,
  328. cpf = form.cpf.data,
  329. desc = form.desc.data,
  330. data_entrada = form.data_entrada.data,
  331. data_saida = form.data_saida.data,
  332. data_renovacao = form.data_renovacao.data,
  333. ))
  334. ## Verifica se já tem alguém nesta cadeira
  335. cadeira_ocupada = False
  336. if form.data['cadeira']:
  337. cadeira_ocupada = habitante_model.query.filter_by(
  338. id_cadeira = form.cadeira.data.id).first()
  339. if cadeira_ocupada and cadeira_ocupada is not habitante_object:
  340. mensagem = u"Cadeira já está ocupada, escolha outra!"
  341. flash(mensagem, 'danger')
  342. return redirect(url_for(
  343. 'goworking.habitante_editar',
  344. id = form.id.data,
  345. nome = form.nome.data,
  346. cpf = form.cpf.data,
  347. desc = form.desc.data,
  348. data_entrada = form.data_entrada.data,
  349. data_saida = form.data_saida.data,
  350. data_renovacao = form.data_renovacao.data,
  351. ))
  352. else:
  353. if form.cadeira.data is not None:
  354. habitante_object.id_cadeira = form.cadeira.data.id
  355. try:
  356. #~ db.session.add(habitante_object)
  357. db.session.commit()
  358. flash(
  359. u"Deu certo! Dados de %s atualizados"
  360. % (str(habitante_object.nome)),
  361. 'success',
  362. )
  363. except Exception as e:
  364. db.session.rollback()
  365. db.session.remove()
  366. #~ logging.exception(e)
  367. mensagem = u"Não deu certo! O problema foi o seguinte: \
  368. %s" % (str(e))
  369. print(u"[DEBUG]: %s" % (mensagem))
  370. flash(mensagem, 'danger')
  371. finally:
  372. return redirect(url_for('goworking.habitante'))
  373. return render_template(
  374. 'habitante.html',
  375. title = u"Habitantes",
  376. subtitle = u"Editar habitante",
  377. habitante = habitante_object,
  378. habitantes = habitantes_object,
  379. form = form,
  380. )
  381. except Exception as e:
  382. abort(500, str(e))
  383. abort(500)
  384. ## TODO Confirmar antes de apagar. Atualmente é muito fácil apagar sem
  385. ## querer.
  386. @bp.route(
  387. '/habitante/apagar/<string:id>',
  388. methods=['GET', 'POST', 'DELETE'],
  389. )
  390. @login_required
  391. def habitante_apagar(id = None):
  392. try:
  393. if id is None:
  394. return redirect(url_for('goworking.habitante'))
  395. habitante_object = habitante_model.query.get(id)
  396. if habitante_object:
  397. try:
  398. db.session.delete(habitante_object)
  399. db.session.commit()
  400. flash(
  401. u"Deu certo! Dados de %s \
  402. apagados" % (str(habitante_object.nome)),
  403. 'success',
  404. )
  405. except Exception as e:
  406. flash(u"Deu errado! O problema foi: %s" % (str(e)), 'danger')
  407. else:
  408. flash(
  409. u"Não tem habitante com o id %s pra apagar!" % (id),
  410. 'warning',
  411. )
  412. return redirect(url_for('goworking.habitante'))
  413. except Exception as e:
  414. abort(500, str(e))
  415. abort(500)