Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
DB_HOST = ''
DB_USER = ''
DB_PSWD = ''
DB_NAME = ''
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.venv
__pycache__
__pycache__
.env
38 changes: 34 additions & 4 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,37 @@
from flask import Flask, render_template
from flask import Flask, redirect, render_template, request, url_for
from model.tarefa import Tarefa

app = Flask(__name__)

@app.route("/")
def home():
return render_template("agenda.html", title='Adicionar Tarefa')
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
titulo = request.form['titulo']
data_conclusao = request.form['data_conclusao']
tarefa = Tarefa(titulo=titulo, data_conclusao=data_conclusao)
tarefa.salvarTarefa()
return redirect(url_for('index'))

tarefas = Tarefa.listarTarefas()
return render_template("index.html", tarefas=tarefas, title='Minhas Tarefas')

@app.route('/delete/<int:idtarefa>')
def delete(idtarefa):
tarefa = Tarefa(id=idtarefa)
tarefa.apagarTarefa()
return redirect(url_for('index'))

@app.route('/editar/<int:idtarefa>', methods=['GET', 'POST'])
def editar(idtarefa):
tarefa = Tarefa(id=idtarefa)

if request.method == 'POST':
novo_titulo = request.form['titulo']
nova_data_conclusao = request.form['data_conclusao']
tarefa.editarTarefa(novo_titulo, nova_data_conclusao)
return redirect(url_for('index'))

return render_template("editar.html", tarefa=tarefa)

if __name__ == "__main__":
app.run(debug=True)
11 changes: 11 additions & 0 deletions data/agenda.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
create database if not exists `agenda`;

use `agenda`;

drop table if exists `tarefa`;

create table if not exists `tarefa`(
`id` int not null `auto_increment` primary key,
`titulo` varchar(60) not null,
`data_conclusao` datetime null
);
70 changes: 70 additions & 0 deletions model/database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import mysql.connector as mc
from mysql.connector import Error
from dotenv import load_dotenv
from os import getenv

class Database:
def __init__(self):
load_dotenv()
self.host = getenv('DB_HOST')
self.username = getenv('DB_USER')
self.password = getenv('DB_PSWD')
self.database = getenv('DB_NAME')
self.connection = None
self.cursor = None

def conectar(self):
"""Estabelece uma conexão com o banco de dados."""
try:
self.connection = mc.connect(
host = self.host,
database = self.database,
user = self.username,
password = self.password
)
if self.connection.is_connected():
self.cursor = self.connection.cursor(dictionary=True)
print('Conexão ao banco de dados realizada com sucesso!')
except Error as e:
print(f'Erro de conexão: {e}')
self.connection = None
self.cursor = None

def desconectar(self):
"""Encerra a conexão com o vanco de dados e o cursor, se existirem."""
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
print('Conexão com o banco de dados encerrada com sucesso!')

def executar(self,sql,params=None):
"""Executa uma instrução no banco de dados."""
if self.connection is None and self.cursor is None:
print('Conexão ao banco de dados não estabelecida!')
return None

try:
self.cursor.execute(sql,params)
self.connection.commit()
return self.cursor
except Error as e:
print(f'Erro de execução: {e}')
return None

def consultar(self,sql,params=None):
"""Executa uma instrução no banco de dados."""
if self.connection is None and self.cursor is None:
print('Conexão ao banco de dados não estabelecida!')
return None

try:
self.cursor.execute(sql,params)
return self.cursor.fetchall()
except Error as e:
print(f'Erro de execução: {e}')
return None

db = Database()
db.conectar()
db.desconectar()
49 changes: 49 additions & 0 deletions model/tarefa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from model.database import Database

class Tarefa:
def __init__(self, id=None, titulo=None, data_conclusao=None):
self.id = id
self.titulo = titulo
self.data_conclusao = data_conclusao

def salvarTarefa(self):
"""Salva uma nova tarefa no banco de dados."""
db = Database()
db.conectar()
sql = 'INSERT INTO tarefa (titulo, data_conclusao) VALUES (%s, %s)'
params = (self.titulo, self.data_conclusao)
db.executar(sql, params)
db.desconectar()

@staticmethod
def listarTarefas():
"""Retorna uma lista de tarefas cadastradas."""
db = Database()
db.conectar()
sql = 'SELECT id, titulo, data_conclusao FROM tarefa'
tarefas = db.consultar(sql)
db.desconectar()
return tarefas if tarefas else []

def editarTarefa(self, novo_titulo=None, nova_data_conclusao=None):
"""Edita os dados da tarefa no banco de dados."""
db = Database()
db.conectar()

if novo_titulo:
sql = 'UPDATE tarefa SET titulo = %s WHERE id = %s'
db.executar(sql, (novo_titulo, self.id))

if nova_data_conclusao:
sql = 'UPDATE tarefa SET data_conclusao = %s WHERE id = %s'
db.executar(sql, (nova_data_conclusao, self.id))

db.desconectar()

def apagarTarefa(self):
"""Apaga uma tarefa cadastrada no banco de dados."""
db = Database()
db.conectar()
sql = 'DELETE FROM tarefa WHERE id = %s'
db.executar(sql, (self.id,))
db.desconectar()
10 changes: 10 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
blinker==1.9.0
click==8.1.8
colorama==0.4.6
Flask==3.1.0
itsdangerous==2.2.0
Jinja2==3.1.5
MarkupSafe==3.0.2
mysql-connector-python==9.2.0
python-dotenv==1.0.1
Werkzeug==3.1.3
12 changes: 8 additions & 4 deletions static/jinx.css
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@

body {
background-color: #0d0d0d;
background-color: #0d0d0d;
color: #f5f5f5;
font-family: 'Comic Sans MS', 'Arial', sans-serif;
font-family: 'Comic Sans MS', 'Arial', sans-serif;
margin: 0;
padding: 0;
display: flex;
align-items: center;
height: 100vh;
flex-direction: column;
}

h1#lt {
Expand Down Expand Up @@ -61,14 +64,15 @@ button#botao:hover {
max-width: 600px;
background-color: #1a1a1a;
padding: 20px;
justify-content: center;
border-radius: 12px;
box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.5);
border: 2px solid #ff007f;
}

#lista-de-tarefas div {
display: flex;
justify-content: space-between;
justify-content:center;
align-items: center;
background-color: #0d0d0d;
padding: 10px;
Expand Down
91 changes: 0 additions & 91 deletions templates/agenda.html

This file was deleted.

15 changes: 15 additions & 0 deletions templates/base.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='jinx.css') }}">
</head>

<body>
<h1>Agenda de Tarefas</h1>
{% block content %}
{% endblock %}
</body>
</html>
16 changes: 16 additions & 0 deletions templates/editar.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends "base.html" %}

{% block content %}
<h2>Editar Tarefa</h2>
<link rel="stylesheet" href="{{ url_for('static', filename='jinx.css') }}">
<form method="POST">
<label for="titulo">Título</label>
<input type="text" name="titulo" value="{{ tarefa.titulo }}" required>

<label for="data_conclusao">Data de Conclusão</label>
<input type="date" name="data_conclusao" value="{{ tarefa.data_conclusao }}">

<button type="submit">Salvar</button>
</form>
<a href="{{ url_for('index') }}">Voltar</a>
{% endblock %}
19 changes: 19 additions & 0 deletions templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{% extends "base.html" %}

{% block content %}
<form method="POST">
<input type="text" name="titulo" placeholder="Título da tarefa" required>
<input type="date" name="data_conclusao">
<link rel="stylesheet" href="{{ url_for('static', filename='jinx.css') }}">
<button type="submit">Adicionar</button>
</form>
<ul>
{% for tarefa in tarefas %}
<li>
{{ tarefa.titulo }} - {{ tarefa.data_conclusao }}
<a href="{{ url_for('delete', idtarefa=tarefa.id) }}">Apagar</a>
<a href="{{ url_for('editar', idtarefa=tarefa.id) }}">Editar</a>
</li>
{% endfor %}
</ul>
{% endblock %}