Spaces:
No application file
No application file
Update app.py
Browse files
app.py
CHANGED
@@ -1,72 +1,91 @@
|
|
1 |
-
from flask import Flask, render_template, request, redirect,
|
2 |
from supabase_client import supabase
|
3 |
-
from datetime import datetime
|
4 |
-
import pdfkit
|
5 |
import os
|
6 |
-
from io import BytesIO
|
7 |
|
8 |
app = Flask(__name__)
|
|
|
9 |
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
-
@app.route(
|
13 |
-
def
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
orcamentos = response.data
|
16 |
-
return render_template(
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
"detalhes": request.form["detalhes"],
|
29 |
-
"total": float(request.form["total"]),
|
30 |
-
"criado_em": datetime.now().isoformat()
|
31 |
}
|
32 |
-
supabase.table(
|
33 |
-
return redirect(
|
34 |
-
return render_template(
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
"banheiros": int(request.form["banheiros"]),
|
46 |
-
"inicio": request.form["inicio"],
|
47 |
-
"detalhes": request.form["detalhes"],
|
48 |
-
"total": float(request.form["total"])
|
49 |
}
|
50 |
-
supabase.table(
|
51 |
-
return redirect(
|
52 |
-
|
|
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
|
|
|
|
58 |
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
o = supabase.table("orcamentos").select("*").eq("id", id).single().execute().data
|
67 |
-
html = render_template("contrato.html", o=o)
|
68 |
-
pdf = pdfkit.from_string(html, False, configuration=pdfkit_config)
|
69 |
-
return send_file(BytesIO(pdf), as_attachment=True, download_name=f"Contrato_{o['cliente']}.pdf")
|
70 |
|
71 |
-
if __name__ == "__main__":
|
72 |
-
app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 7860)))
|
|
|
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')
|
23 |
+
def logout():
|
24 |
+
session.clear()
|
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 |
|
|
|
|