Persano commited on
Commit
48c9226
·
verified ·
1 Parent(s): fd7cff7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +107 -49
app.py CHANGED
@@ -1,22 +1,40 @@
1
- from flask import Flask, render_template, request, redirect, session, url_for
 
2
  from supabase_client import supabase
 
3
  import os
 
 
 
 
4
 
5
  app = Flask(__name__)
6
  app.secret_key = os.urandom(24)
7
 
8
- # -------- Autenticação --------
 
 
 
 
 
 
 
 
 
 
 
 
9
  @app.route('/login', methods=['GET', 'POST'])
10
  def login():
11
  if request.method == 'POST':
12
  email = request.form['email']
13
- password = request.form['password']
14
- result = supabase.auth.sign_in_with_password({'email': email, 'password': password})
15
  if result.user:
16
- session['user'] = result.user.id
17
  return redirect('/dashboard')
18
  else:
19
- return "Login inválido"
20
  return render_template('login.html')
21
 
22
  @app.route('/logout')
@@ -25,67 +43,107 @@ def logout():
25
  return redirect('/login')
26
 
27
  def login_required(f):
28
- def wrap(*args, **kwargs):
29
- if 'user' in session:
30
- return f(*args, **kwargs)
31
- else:
32
  return redirect('/login')
33
- wrap.__name__ = f.__name__
34
- return wrap
 
 
 
35
 
36
- # -------- Dashboard --------
37
  @app.route('/dashboard')
38
  @login_required
39
  def dashboard():
40
- user_id = session['user']
41
- response = supabase.table('orcamentos').select('*').eq('user_id', user_id).execute()
42
- orcamentos = response.data
43
  return render_template('dashboard.html', orcamentos=orcamentos)
44
 
45
- # -------- Criar Orçamento --------
46
- @app.route('/orcamentos/novo', methods=['GET', 'POST'])
 
47
  @login_required
48
- def criar_orcamento():
49
  if request.method == 'POST':
50
- dados = {
51
- 'user_id': session['user'],
52
- 'cliente': request.form['cliente'],
53
- 'endereco': request.form['endereco'],
54
- 'valor_total': request.form['valor_total']
55
- }
56
- supabase.table('orcamentos').insert(dados).execute()
 
 
 
 
 
 
57
  return redirect('/dashboard')
58
- return render_template('create_orcamento.html')
 
 
59
 
60
- # -------- Editar Orçamento --------
61
- @app.route('/orcamentos/<int:orcamento_id>/editar', methods=['GET', 'POST'])
62
  @login_required
63
- def editar_orcamento(orcamento_id):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  if request.method == 'POST':
65
- update_data = {
66
- 'cliente': request.form['cliente'],
67
- 'endereco': request.form['endereco'],
68
- 'valor_total': request.form['valor_total']
69
- }
70
- supabase.table('orcamentos').update(update_data).eq('id', orcamento_id).execute()
 
 
 
 
 
71
  return redirect('/dashboard')
72
- orcamento = supabase.table('orcamentos').select('*').eq('id', orcamento_id).single().execute().data
73
- return render_template('edit_orcamento.html', orcamento=orcamento)
74
 
75
- # -------- Ver Orçamento --------
76
- @app.route('/orcamentos/<int:orcamento_id>')
77
- @login_required
78
- def visualizar_orcamento(orcamento_id):
79
- orcamento = supabase.table('orcamentos').select('*').eq('id', orcamento_id).single().execute().data
80
- return render_template('view_orcamento.html', orcamento=orcamento)
81
 
82
- # -------- Excluir Orçamento --------
83
- @app.route('/orcamentos/<int:orcamento_id>/excluir', methods=['POST'])
 
84
  @login_required
85
- def excluir_orcamento(orcamento_id):
86
- supabase.table('orcamentos').delete().eq('id', orcamento_id).execute()
 
87
  return redirect('/dashboard')
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  if __name__ == '__main__':
90
- app.run(host='0.0.0.0', port=7860)
 
91
 
 
1
+ from flask import Flask, render_template, request, redirect, session, url_for, send_file
2
+ from datetime import datetime
3
  from supabase_client import supabase
4
+ from dotenv import load_dotenv
5
  import os
6
+ import io
7
+ from weasyprint import HTML
8
+
9
+ load_dotenv()
10
 
11
  app = Flask(__name__)
12
  app.secret_key = os.urandom(24)
13
 
14
+ def calcular_total(dados):
15
+ area = float(dados.get('area', 0))
16
+ quartos = int(dados.get('quartos', 0))
17
+ banheiros = int(dados.get('banheiros', 0))
18
+ padrao = dados.get('padrao', 'simples')
19
+
20
+ fator = {'simples': 1000, 'medio': 1500, 'luxo': 2000}.get(padrao, 1000)
21
+
22
+ total = (area * fator) + (quartos * 5000) + (banheiros * 7000)
23
+ return total
24
+
25
+ # --------- Autenticação ---------
26
+
27
  @app.route('/login', methods=['GET', 'POST'])
28
  def login():
29
  if request.method == 'POST':
30
  email = request.form['email']
31
+ senha = request.form['senha']
32
+ result = supabase.auth.sign_in_with_password({'email': email, 'password': senha})
33
  if result.user:
34
+ session['user_id'] = result.user.id
35
  return redirect('/dashboard')
36
  else:
37
+ return render_template('login.html', erro="Login inválido")
38
  return render_template('login.html')
39
 
40
  @app.route('/logout')
 
43
  return redirect('/login')
44
 
45
  def login_required(f):
46
+ def wrapper(*args, **kwargs):
47
+ if 'user_id' not in session:
 
 
48
  return redirect('/login')
49
+ return f(*args, **kwargs)
50
+ wrapper.__name__ = f.__name__
51
+ return wrapper
52
+
53
+ # --------- Dashboard ---------
54
 
 
55
  @app.route('/dashboard')
56
  @login_required
57
  def dashboard():
58
+ user_id = session['user_id']
59
+ orcamentos = supabase.table('orcamentos').select('*').eq('user_id', user_id).execute().data
 
60
  return render_template('dashboard.html', orcamentos=orcamentos)
61
 
62
+ # --------- Criar Orçamento ---------
63
+
64
+ @app.route('/orcamento/novo', methods=['GET', 'POST'])
65
  @login_required
66
+ def novo_orcamento():
67
  if request.method == 'POST':
68
+ dados = request.form
69
+ total = calcular_total(dados)
70
+ supabase.table('orcamentos').insert({
71
+ 'user_id': session['user_id'],
72
+ 'cliente': dados['cliente'],
73
+ 'endereco': dados['endereco'],
74
+ 'area': float(dados['area']),
75
+ 'quartos': int(dados['quartos']),
76
+ 'banheiros': int(dados['banheiros']),
77
+ 'padrao': dados['padrao'],
78
+ 'total': total,
79
+ 'data': datetime.now().isoformat()
80
+ }).execute()
81
  return redirect('/dashboard')
82
+ return render_template('form_orcamento.html')
83
+
84
+ # --------- Visualizar ---------
85
 
86
+ @app.route('/orcamento/<int:orc_id>')
 
87
  @login_required
88
+ def visualizar_orcamento(orc_id):
89
+ user_id = session['user_id']
90
+ orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data
91
+ if not orc:
92
+ return "Orçamento não encontrado", 404
93
+ return render_template('visualizar_orcamento.html', orc=orc)
94
+
95
+ # --------- Editar ---------
96
+
97
+ @app.route('/orcamento/<int:orc_id>/editar', methods=['GET', 'POST'])
98
+ @login_required
99
+ def editar_orcamento(orc_id):
100
+ user_id = session['user_id']
101
+ orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data
102
+ if not orc:
103
+ return "Orçamento não encontrado", 404
104
+
105
  if request.method == 'POST':
106
+ dados = request.form
107
+ total = calcular_total(dados)
108
+ supabase.table('orcamentos').update({
109
+ 'cliente': dados['cliente'],
110
+ 'endereco': dados['endereco'],
111
+ 'area': float(dados['area']),
112
+ 'quartos': int(dados['quartos']),
113
+ 'banheiros': int(dados['banheiros']),
114
+ 'padrao': dados['padrao'],
115
+ 'total': total
116
+ }).eq('id', orc_id).execute()
117
  return redirect('/dashboard')
 
 
118
 
119
+ return render_template('form_orcamento.html', orc=orc)
 
 
 
 
 
120
 
121
+ # --------- Excluir ---------
122
+
123
+ @app.route('/orcamento/<int:orc_id>/excluir')
124
  @login_required
125
+ def excluir_orcamento(orc_id):
126
+ user_id = session['user_id']
127
+ supabase.table('orcamentos').delete().eq('id', orc_id).eq('user_id', user_id).execute()
128
  return redirect('/dashboard')
129
 
130
+ # --------- Geração PDF ---------
131
+
132
+ @app.route('/orcamento/<int:orc_id>/pdf')
133
+ @login_required
134
+ def gerar_pdf(orc_id):
135
+ user_id = session['user_id']
136
+ orc = supabase.table('orcamentos').select('*').eq('id', orc_id).eq('user_id', user_id).single().execute().data
137
+ if not orc:
138
+ return "Orçamento não encontrado", 404
139
+
140
+ html = render_template('contrato_pdf.html', orc=orc)
141
+ pdf = HTML(string=html).write_pdf()
142
+ return send_file(io.BytesIO(pdf), download_name="contrato.pdf", as_attachment=True)
143
+
144
+ # --------- Run Hugging Face ---------
145
+
146
  if __name__ == '__main__':
147
+ app.run(host="0.0.0.0", port=int(os.environ.get('PORT', 7860)))
148
+
149