This tutorial is a Jquery Fullcalandar Integration FullCalendar.js plugin https://fullcalendar.io/demos
install psycopg2 https://pypi.org/project/psycopg2/
Psycopg is the most popular PostgreSQL database adapter for the Python programming language.
(venv) PS C:\flaskmyproject> pip install psycopg2
CREATE TABLE events (
id serial PRIMARY KEY,
title VARCHAR ( 150 ) NOT NULL,
start_event TIMESTAMP NOT NULL,
end_event TIMESTAMP NOT NULL
);
INSERT INTO
events(title,start_event,end_event)
VALUES
('Python Flask coding visual studio', '2021-07-03 16:00:00', '2021-07-04 03:00:00'),
('PHP coding Notepad++', '2021-07-08 03:17:15', '2021-07-10 04:00:00'),
('Basketball', '2021-07-05 00:00:00', '2021-07-05 14:30:00'),
('Birthday Party', '2021-07-12 00:00:00', '2021-07-13 00:00:00');
#app.py from flask import Flask, render_template, request, jsonify import psycopg2 #pip install psycopg2 import psycopg2.extras app = Flask(__name__) app.secret_key = "caircocoders-ednalan" DB_HOST = "localhost" DB_NAME = "sampledb" DB_USER = "postgres" DB_PASS = "admin" conn = psycopg2.connect(dbname=DB_NAME, user=DB_USER, password=DB_PASS, host=DB_HOST) @app.route('/') def index(): cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) cur.execute("SELECT * FROM events ORDER BY id") calendar = cur.fetchall() return render_template('index.html', calendar = calendar) @app.route("/insert",methods=["POST","GET"]) def insert(): cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) if request.method == 'POST': title = request.form['title'] start = request.form['start'] end = request.form['end'] print(title) print(start) cur.execute("INSERT INTO events (title,start_event,end_event) VALUES (%s,%s,%s)",[title,start,end]) conn.commit() cur.close() msg = 'success' return jsonify(msg) @app.route("/update",methods=["POST","GET"]) def update(): cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) if request.method == 'POST': title = request.form['title'] start = request.form['start'] end = request.form['end'] id = request.form['id'] print(title) print(start) cur.execute("UPDATE events SET title = %s, start_event = %s, end_event = %s WHERE id = %s ", [title, start, end, id]) conn.commit() cur.close() msg = 'success' return jsonify(msg) @app.route("/ajax_delete",methods=["POST","GET"]) def ajax_delete(): cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) if request.method == 'POST': getid = request.form['id'] print(getid) cur.execute('DELETE FROM events WHERE id = {0}'.format(getid)) conn.commit() cur.close() msg = 'Record deleted successfully' return jsonify(msg) if __name__ == "__main__": app.run(debug=True)templates/index.html
//templates/index.html <!DOCTYPE html> <html> <head> <title>Fullcalandar CRUD(Create, Read, Update, Delete) with Python Flask Jquery Ajax and PostgreSQL</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.css" /> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.min.js"></script> <script> $(document).ready(function() { var calendar = $('#calendar').fullCalendar({ editable:true, header:{ left:'prev,next today', center:'title', right:'month,agendaWeek,agendaDay' }, events: [{% for row in calendar %}{ id : '{{row.id}}', title : '{{row.title}}', start : '{{row.start_event}}', end : '{{row.end_event}}', }, {% endfor %}], selectable:true, selectHelper:true, select: function(start, end, allDay) { var title = prompt("Enter Event Title"); if(title) { var start = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss"); var end = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss"); $.ajax({ url:"/insert", type:"POST", data:{title:title, start:start, end:end}, success:function(data) { //alert(data) alert("Added Successfully"); window.location.replace("/"); } }) } }, editable:true, eventResize:function(event) { var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"); var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"); var title = event.title; var id = event.id; $.ajax({ url:"/update", type:"POST", data:{title:title, start:start, end:end, id:id}, success:function(){ calendar.fullCalendar('refetchEvents'); alert('Event Update'); } }) }, eventDrop:function(event) { var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"); var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"); var title = event.title; var id = event.id; $.ajax({ url:"/update", type:"POST", data:{title:title, start:start, end:end, id:id}, success:function() { calendar.fullCalendar('refetchEvents'); alert("Event Updated"); } }); }, eventClick:function(event) { if(confirm("Are you sure you want to remove it?")) { var id = event.id; $.ajax({ url:"/ajax_delete", type:"POST", data:{id:id}, success:function() { calendar.fullCalendar('refetchEvents'); alert("Event Removed"); } }) } }, }); }); </script> </head> <body> <br /> <h2 align="center"><a href="#">Fullcalandar CRUD(Create, Read, Update, Delete) with Python Flask Jquery Ajax and PostgreSQL</a></h2> <br /> <div class="container"> <div id="calendar"></div> </div> </body> </html>