diff --git a/Bennett Events Portal.py b/Bennett Events Portal.py new file mode 100644 index 0000000..ee4c6de --- /dev/null +++ b/Bennett Events Portal.py @@ -0,0 +1,129 @@ +''' +Bennett Events Portal + +Hitesh Nair +E18CSE064 +hello@hiteshnair.com + +''' + +# importing required libraries and modules +from flask import Flask, render_template +from flask_wtf import FlaskForm +from wtforms import StringField, SelectField +from wtforms.fields.html5 import DateField +import firebase_admin +from firebase_admin import credentials +from firebase_admin import firestore +import datetime +import sendgrid +import os +from sendgrid.helpers.mail import * + +#authentication of firestore credentials +cred = credentials.Certificate('bennettra-f6176-39124368e57f.json') +firebase_admin.initialize_app(cred) + +#defining what date 'today' is +todaydate = datetime.datetime.today().strftime('%Y-%m-%d') + +#initializing firestore +db = firestore.client() + +#initializing Flask +app = Flask(__name__) +app.config['SECRET_KEY'] = 'bennettsecret' + +#a function to count the number of events on a given date, with 'today' as default date +def numofEvents(date_events = todaydate): + dates_ref = db.collection(date_events) + totevents = dates_ref.get() + c = 0 + for i in totevents: + c+=1 + return c + +#index page or main menu +@app.route('/') +def index(): + global numevents + numevents = numofEvents() + return render_template('index.html', numevents = numevents) #renders index.html on screen + +#making a form for event details +class EventForm(FlaskForm): + + nameClub = StringField('Club Name') + nameEvent = StringField('Name of Event') + nameHall = StringField('Name of Hall') + eventDate = DateField('Date of Event') + eventTime = StringField('Time') + eventDetails = StringField('Event Details') + +#form event details page +@app.route('/form', methods=['GET', 'POST']) +def form(): + form = EventForm() + + if form.validate_on_submit(): #validating form data + return dbpush(form.nameClub.data,form.nameEvent.data,form.nameHall.data,form.eventDate.data,form.eventTime.data,form.eventDetails.data) + return render_template('form.html', form=form) #in case of invalid data user will be presented with the form again + +#sending data to firestore and using SendGrid API to send email invitations +def dbpush(nameClub,nameEvent,nameHall,eventDate,eventTime,eventDetails): + + doc = db.collection(str(eventDate)).document(nameEvent) #setting data in firestore + doc.set({ + 'Club': nameClub, + 'Event': nameEvent, + 'Venue': nameHall, + 'Date': str(eventDate), + 'Time': eventTime, + 'Details': eventDetails + }) + + sg = sendgrid.SendGridAPIClient(apikey='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') #sending emails + from_email = Email("events@bennett") + to_email = Email("hn5298@bennett.edu.in") + subject = nameEvent+" at Bennett" + mailtext = nameClub+" is hosting "+ nameEvent+" on "+str(eventDate)+" at "+eventTime+", venue: "+nameHall+". Details of the event: "+eventDetails+""". + + Looking forward to seeing you there. + + - Bennett Events Portal.""" + content = Content("text/plain", mailtext) + mail = Mail(from_email, subject, to_email, content) + response = sg.client.mail.send.post(request_body=mail.get()) + + #display success page + return render_template('success.html') + + +#input field that allows picking a date through an interactive calendar +class DateViewForm(FlaskForm): + pickdate = DateField("Choose date") + +#form to pick a date +@app.route('/dateview', methods=['GET', 'POST']) +def dateview(): + dateform = DateViewForm() + if dateform.validate_on_submit(): + return display(str(dateform.pickdate.data)) + return render_template('dateview.html', form = dateform) + + +#displaying all events on a given date +@app.route('/display', methods=['GET', 'POST']) +def display(date_events = todaydate): + dates_ref = db.collection(date_events) + events = dates_ref.get() + eventscopy = dates_ref.get() + numevents = numofEvents(date_events) + if(numevents==0): + return render_template('display.html', eventdata = 'empty') #display 'no events on this date' page + else: + return render_template('display.html', eventdata = events) + + +if __name__ == '__main__': + app.run(debug=False) #setting Flask to production mode diff --git a/QR code scanner.py b/QR code scanner.py deleted file mode 100644 index 3f1d49a..0000000 --- a/QR code scanner.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import print_function - -import pyzbar.pyzbar as pyzbar -import numpy as np -import cv2 -import time -import sqlite3 -import json - -# get the webcam: -cap = cv2.VideoCapture(0) - -cap.set(3,640) -cap.set(4,480) -#160.0 x 120.0 -#176.0 x 144.0 -#320.0 x 240.0 -#352.0 x 288.0 -#640.0 x 480.0 -#1024.0 x 768.0 -#1280.0 x 1024.0 -time.sleep(2) - -def decode(im) : - # Find barcodes and QR codes - decodedObjects = pyzbar.decode(im) - # Print results - for obj in decodedObjects: - print('Type : ', obj.type) - print('Data : ', obj.data,'\n') - return decodedObjects - -db_conn = sqlite3.connect('scanned_items.db') -db_cursor = db_conn.cursor() - -db_cursor.execute('CREATE TABLE IF NOT EXISTS scanned_items(id INTEGER PRIMARY KEY, item_name TEXT, quantity INTEGER);') - -font = cv2.FONT_HERSHEY_SIMPLEX - -while(cap.isOpened()): - # Capture frame-by-frame - ret, frame = cap.read() - # Our operations on the frame come here - im = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) - - decodedObjects = decode(im) - - for decodedObject in decodedObjects: - points = decodedObject.polygon - - # If the points do not form a quad, find convex hull - if len(points) > 4 : - hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32)) - hull = list(map(tuple, np.squeeze(hull))) - else : - hull = points; - - # Number of points in the convex hull - n = len(hull) - # Draw the convext hull - for j in range(0,n): - cv2.line(frame, hull[j], hull[ (j+1) % n], (255,0,0), 3) - - x = decodedObject.rect.left - y = decodedObject.rect.top - - print(x, y) - - print('Type : ', decodedObject.type) - print('Data : ', decodedObject.data,'\n') - - barCode = str(decodedObject.data) - cv2.putText(frame, barCode, (x, y), font, 1, (0,255,255), 2, cv2.LINE_AA) - - data = json.loads(decodedObject.data) - - db_cursor.execute('SELECT * FROM scanned_items WHERE item_name=?', (data['item_name'],)) - db_data = db_cursor.fetchall() - if not db_data: - db_cursor.execute('INSERT INTO scanned_items(item_name, quantity) VALUES(?,?);', (data['item_name'], data['quantity'])) - - db_conn.commit() - # Display the resulting frame - cv2.imshow('frame',frame) - key = cv2.waitKey(1) - if key & 0xFF == ord('q'): - break - elif key & 0xFF == ord('s'): # wait for 's' key to save - cv2.imwrite('Capture.png', frame) - -# When everything done, release the capture -cap.release() -cv2.destroyAllWindows() -db_conn.close() diff --git a/dateview.html b/dateview.html new file mode 100644 index 0000000..b862f85 --- /dev/null +++ b/dateview.html @@ -0,0 +1,27 @@ + +
+
+Club: {{ event.to_dict().get('Club') }}
+
+What: {{ event.to_dict().get('Event') }}
+
+When: {{ event.to_dict().get('Date') }}, at {{ event.to_dict().get('Time') }}
+
+Where: {{ event.to_dict().get('Venue') }}
+
+Details: {{ event.to_dict().get('Details') }}
+
+