Get It Done! Part 4: Changing a Model Class

Important Note:

This series of videos uses MAMP, PHPMyAdmin, and MySQL. WE ARE NOT USING THESE TOOLS. Instead we are using TablePlus and Sqlite3.

Notes

In this lesson we'll improve the delete functionality of our app so that it uses a boolean flag to determine whether a task is completed or not, thus leaving the task in our database. This will allow us to also add a display for completed tasks.

Improve Delete Functionality

Add a boolean property to the Task class and set it to False in the constructor:

    completed = db.Column(db.Boolean)

    def __init__(self, name):
        self.name = name
        self.completed = False

Now fire up the Python shell in your terminal. You're going to drop and then re-create the table. Note: you will lose the data in the table:

>>> db.drop_all()
>>> db.create_all()

Back in main.py remove the code that deleted a task, and instead set its boolean value to True:

@app.route('/delete-task', methods=['POST'])
def delete_task():

    task_id = int(request.form['task-id'])
    task = Task.query.get(task_id)
    task.completed = True
    db.session.add(task)
    db.session.commit()

    return redirect('/')

Amend the index function so that it only gets tasks where the property completed has a value of False:

    tasks = Task.query.filter_by(completed=False).all()

Display Completed Tasks

Add a variable to hold the completed tasks and pass this into the template:

    completed_tasks = Task.query.filter_by(completed=True).all()
    return render_template('todos.html', title="Get It Done!", 
        tasks=tasks, completed_tasks=completed_tasks)

Create the HTML in the todos.html template to display the list of completed tasks:

    <hr />
    <h2>Completed</h2>
    <ul>
        {% for task in completed_tasks %}
        <li>{{task.name}}</li>
        {% endfor %}
    </ul>

Code

View the final code for this lesson.