Скриншот архива с проектом
Структура проекта
Задание
Название приложения: Система управления задачами
Описание:
Разработайте веб-приложение для управления задачами, которое позволит пользователям создавать, редактировать, удалять и отслеживать свои задачи. Приложение должно иметь следующие функции:
Создание задач: Пользователи должны иметь возможность создавать задачи с заголовком, описанием и датой выполнения.
Редактирование задач: Пользователи должны иметь возможность редактировать существующие задачи, изменяя их заголовок, описание и дату выполнения.
Удаление задач: Пользователи должны иметь возможность удалять задачи.
Отслеживание задач: Приложение должно предоставлять пользователям возможность отслеживать свои задачи, отмечая их как выполненные или отложенные.
Фильтрация задач: Пользователи должны иметь возможность фильтровать задачи по статусу (выполненные, отложенные, все) и дате выполнения.
Требования:
Python 3.6+
Flask
База данных SQLite или PostgreSQL
Функционал программы
- добавление задач
- удаление задач
- редактирование задач
- поиск и фильтрация
- экспорт в Excel
Фрагмент программного кода
from flask import Flask, render_template, redirect, url_for, flash, request from flask_sqlalchemy import SQLAlchemy from datetime import datetime, timezone from flask_wtf import FlaskForm from wtforms import StringField, BooleanField from wtforms.fields.datetime import DateField from wtforms.fields.simple import PasswordField from wtforms.validators import DataRequired, EqualTo import io import csv import codecs from flask import Response app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db' app.config['SECRET_KEY'] = 'your_secret_key_here' db = SQLAlchemy(app) class Task(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) description = db.Column(db.Text, nullable=True) completed = db.Column(db.Boolean, default=False) created_date = db.Column(db.DateTime, nullable=False, default=datetime.now(timezone.utc)) comment = db.Column(db.Text, nullable=True) class TaskForm(FlaskForm): title = StringField('Title', validators=[DataRequired()]) description = StringField('Description') completed = BooleanField('Completed') created_date = DateField('Created Date', validators=[DataRequired()]) comment = StringField('Comment') class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) @app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): flash(f'Account created for {form.username.data}!', 'success') return redirect(url_for('tasks')) return render_template('register.html', title='Register', form=form) @app.route('/', methods=['POST', 'GET']) def tasks(): form = TaskForm() if form.validate_on_submit(): title = form.title.data description = form.description.data completed = form.completed.data created_date = form.created_date.data comment = form.comment.data task = Task(title=title, description=description, completed=completed, created_date=created_date, comment=comment) db.session.add(task) db.session.commit() return redirect(url_for('tasks')) tasks = Task.query.all() return render_template('tasks.html', form=form, tasks=tasks) @app.route('/tasks/<int:id>') def task_detail(id): tasks = Task.query.all() task = Task.query.get(id) return render_template("task_detail.html", tasks=tasks, task=task) @app.route('/add_task', methods=['POST', 'GET']) def add_task(): if request.method == 'POST': title = request.form['title'] description = request.form['description'] completed = request.form.get('completed') created_date = datetime.strptime(request.form['created_date'], '%Y-%m-%d') # Преобразование строки в объект datetime comment = request.form['comment'] task = Task(title=title, description=description, completed=completed, created_date=created_date, comment=comment) try: db.session.add(task) db.session.commit() return redirect(url_for('tasks')) except Exception as e: return f"При добавлении задачи произошла ошибка: {str(e)}" else: return render_template("add_task.html") @app.route('/tasks/<int:id>/update', methods=['POST', 'GET']) def task_update(id): task = Task.query.get(id) form = TaskForm(obj=task) if request.method == 'POST': task.title = request.form['title'] task.description = request.form['description'] task.completed = True if request.form.get('completed') else False task.created_date = datetime.strptime(request.form['created_date'], '%Y-%m-%d') task.comment = request.form['comment'] try: db.session.commit() return redirect(url_for('tasks')) except Exception as e: return f"При изменении задачи произошла ошибка: {str(e)}" else: return render_template("task_update.html", task=task, form=form) @app.route('/tasks/<int:id>/delete') def task_delete(id): task = Task.query.get_or_404(id) try: db.session.delete(task) db.session.commit() return redirect(url_for('tasks')) except Exception as e: return f"При удалении задачи произошла ошибка: {str(e)}!!!" @app.route('/search', methods=['POST', 'GET']) def search(): if request.method == 'POST': search_term = request.form['search_term'] completed_filter = request.form.get('completed_filter') # Получаем значение фильтра по полю "completed" if completed_filter == 'all': # Показать все задачи tasks = Task.query.filter(Task.title.ilike(f"%{search_term}%")).all() else: completed = True if completed_filter == 'completed' else False tasks = Task.query.filter(Task.title.ilike(f"%{search_term}%"), Task.completed == completed).all() return render_template('search_results.html', tasks=tasks, search_term=search_term) else: return render_template('search_form.html') @app.route('/export_csv') def export_csv(): tasks = Task.query.all() output = io.StringIO() writer = csv.writer(output) writer.writerow(['Title', 'Description', 'Completed', 'Created Date', 'Comment']) for task in tasks: writer.writerow([task.title, task.description, "Да" if task.completed else "Нет", task.created_date, task.comment]) output.seek(0) return Response(codecs.BOM_UTF8 + output.getvalue().encode('utf-8'), mimetype='text/csv', headers={"Content-Disposition": "attachment; filename=tasks.csv"}) if __name__ == '__main__': with app.app_context(): db.create_all() app.run(debug=True)
Пояснения по запуску программы
Для эффективной работы с приложением вам потребуется:
- редактор кода VS Code - скачать можно тут - https://code.visualstudio.com/download или PyCharm - https://www.jetbrains.com/ru-ru/pycharm/ Я же использовал PyCharm Community - https://www.jetbrains.com/ru-ru/pycharm/download/?section=windows
- интерпретатор языка Python, скачать можно тут - https://www.python.org/downloads/
- После установки всего выше описанного, настройте VS Code для работы с Python установив необходимые расширения (см. инструкцию - https://youtu.be/j5e5gwZgMH8) . Или откройте проект в PyCharm.
- Запускаете приложение и пользуетесь. Также вы можете самостоятельно выложить проект на Heroku или другой хостинг по вашему усмотрению. Также можете доработать проект как вам нужно.
admin