from flask import Flask, render_template, request, redirect, url_for import pyodbc import configparser from datetime import datetime app = Flask(__name__, template_folder='.',static_folder='') class TodoList: def __init__(self): config = configparser.ConfigParser() config.read('dane.ini') mssql_config = config['mssql'] self.conn = pyodbc.connect( f"DRIVER={mssql_config['driver']};" f"SERVER={mssql_config['server']};" f"DATABASE={mssql_config['database']};" f"UID={mssql_config['uid']};" f"PWD={mssql_config['pwd']}" ) self.create_table() def create_table(self): with self.conn.cursor() as cursor: cursor.execute(''' IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='tasks' and xtype='U') CREATE TABLE tasks ( id INT PRIMARY KEY IDENTITY(1,1), description NVARCHAR(255) NOT NULL ) ''') self.conn.commit() def add_task(self, description): description_with_timestamp = self.add_timestamp(description) with self.conn.cursor() as cursor: cursor.execute('INSERT INTO tasks (description) VALUES (?)', (description_with_timestamp,)) self.conn.commit() def remove_task(self, task_id): with self.conn.cursor() as cursor: cursor.execute('DELETE FROM tasks WHERE id = ?', (task_id,)) self.conn.commit() def edit_task(self, task_id, new_description): new_description_with_timestamp = self.add_timestamp(new_description) with self.conn.cursor() as cursor: cursor.execute('UPDATE tasks SET description = ? WHERE id = ?', (new_description_with_timestamp, task_id)) self.conn.commit() def get_tasks(self): with self.conn.cursor() as cursor: cursor.execute('SELECT id, description FROM tasks') tasks = [] for row in cursor.fetchall(): task_dict = { 'id': row.id, 'description': row.description } tasks.append(task_dict) return tasks def get_task(self, task_id): with self.conn.cursor() as cursor: cursor.execute('SELECT id, description FROM tasks WHERE id = ?', (task_id,)) return cursor.fetchone() def add_timestamp(self, description): return f"{description} (added/edited on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')})" def __del__(self): self.conn.close() todo_list = TodoList() @app.route('/') def index(): tasks = todo_list.get_tasks() return render_template('todo_list.html', tasks=tasks) @app.route('/add', methods=['GET', 'POST']) def add_task(): if request.method == 'POST': description = request.form['description'] todo_list.add_task(description) return redirect(url_for('index')) return render_template('task_add.html') @app.route('/delete/') def delete_task(task_id): todo_list.remove_task(task_id) return redirect(url_for('index')) @app.route('/search', methods=['GET', 'POST']) def search_tasks(): if request.method == 'POST': keyword = request.form['keyword'].lower() tasks = todo_list.get_tasks() matching_tasks = [task for task in tasks if keyword in task['description'].lower()] return render_template('task_search.html', tasks=matching_tasks, keyword=request.form['keyword']) return render_template('task_search.html') @app.route('/edit/', methods=['GET', 'POST']) def edit_task(task_id): task = todo_list.get_task(task_id) if request.method == 'POST': new_description = request.form['description'] todo_list.edit_task(task_id, new_description) return redirect(url_for('index')) return render_template('task_edit.html', task=task) @app.route('/long') def long_tasks(): tasks = todo_list.get_tasks() long_tasks = list(filter(lambda task: len(task['description']) > 60, tasks)) return render_template('long.html', tasks=long_tasks) if __name__ == '__main__': app.run('localhost', 4449, debug=True)