Skip to content

To-Do WebApp Using Flask and Python #457

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
1 change: 1 addition & 0 deletions TO-DO App/Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn app:app
Binary file added TO-DO App/__pycache__/app.cpython-39.pyc
Binary file not shown.
63 changes: 63 additions & 0 deletions TO-DO App/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from re import T
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///todo.db"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

class Todo(db.Model):
sno = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
desc = db.Column(db.String(500), nullable=False)
date_created = db.Column(db.DateTime, default=datetime.utcnow)

def __repr__(self) -> str:
return f"{self.sno} - {self.title}"


@app.route("/", methods=['GET','POST'])
def hello_world():
if request.method=='POST':
title = request.form['title']
desc = request.form['desc']
todo = Todo(title=title, desc=desc)
db.session.add(todo)
db.session.commit()
allTodo = Todo.query.all()
return render_template('index.html', allTodo=allTodo)


@app.route('/show')
def Products():
allTodo = Todo.query.all()
print(allTodo)
return 'This Is Product Area'


@app.route('/Update/<int:sno>', methods=['GET','POST'])
def update(sno):
if request.method=='POST':
title = request.form['title']
desc = request.form['desc']
todo = Todo.query.filter_by(sno=sno).first()
todo.title = title
todo.desc = desc
db.session.add(todo)
db.session.commit()
return redirect("/")

todo = Todo.query.filter_by(sno=sno).first()
return render_template('update.html', todo=todo)


@app.route('/delete/<int:sno>')
def delete(sno):
todo = Todo.query.filter_by(sno=sno).first()
db.session.delete(todo)
db.session.commit()
return redirect("/")
if __name__ == "__main__":
app.run(debug=True)
Binary file added TO-DO App/requirements.txt
Binary file not shown.
39 changes: 39 additions & 0 deletions TO-DO App/templates/base.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">

<title>Hello, world!</title>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="/">MyTodo</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</ul>
<form class="d-flex">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
</div>
</nav>
{% block body %}

{% endblock body %}
</body>
</html>
73 changes: 73 additions & 0 deletions TO-DO App/templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{% extends 'base.html' %}
{% block body %}

<div class="container my-3">
<h2>Add a Todo</h2>
<form action="/" method="POST">
<div class="mb-3">
<label for="title" class="form-label">Todo Title</label>
<input type="text" class="form-control" name="title" id="title" aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
</div>
<div class="mb-3">
<label for="desc" class="form-label">Todo Description</label>
<input type="text" class="form-control" name="desc" id="desc">
</div>

<button type="submit" class="btn btn-success">Submit</button>
</form>
</div>

<div class="container my-3">
<h2>Your Todos</h2>

{% if allTodo|length == 0 %}
<div class="alert alert-danger" role="alert">
No Todos Found | Add a New Todo Now
</div>
{% else %}
<table class="table">
<thead>
<tr>
<th scope="col">Sno</th>
<th scope="col">Title</th>
<th scope="col">Description</th>
<th scope="col">Time</th>
<th scope="col">Actions</th>
</tr>
</thead>

<tbody>
{% for todo in allTodo %}

<tr>
<th scope="row">{{loop.index}}</th>
<td>{{todo.title}}</td>
<td>{{todo.desc}}</td>
<td>{{todo.date_created}}</td>
<td>
<a href ="/Update/{{todo.sno}}" type="button" class="btn btn-dark btn-sm mx-1">Update</button>
<a href ="/delete/{{todo.sno}}" type="button" class="btn btn-danger btn-sm mx=1">Delete</button>

</td>
</tr>

{% endfor %}
</tbody>
</table>
{% endif %}


</div>

<!-- Optional JavaScript; choose one of the two! -->

<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>

<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
-->
{% endblock body %}
33 changes: 33 additions & 0 deletions TO-DO App/templates/update.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{% extends 'base.html' %}
{% block body %}

<div class="container my-3">
<h2>Update Your Todo</h2>
<form action="/Update/{{todo.sno}}" method="POST">
<div class="mb-3">
<label for="title" class="form-label">Todo Title</label>
<input type="text" class="form-control" name="title" id="title" value="{{todo.title}}" aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
</div>
<div class="mb-3">
<label for="desc" class="form-label">Todo Description</label>
<input type="text" class="form-control" value="{{todo.desc}}" name="desc" id="desc">
</div>

<button type="submit" class="btn btn-success">Update</button>
</form>
</div>



<!-- Optional JavaScript; choose one of the two! -->

<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>

<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.min.js" integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT" crossorigin="anonymous"></script>
-->
{% endblock body %}
Binary file added TO-DO App/todo.db
Binary file not shown.