routes.py (12233B)
1 from app import app 2 from flask_pymongo import PyMongo 3 from flask import render_template, redirect, url_for, flash, request 4 from flask_login import login_required 5 from app.meetings import bp 6 from bson.objectid import ObjectId 7 import datetime, hashlib 8 import os 9 from gridfs import GridFS 10 from app.meetings.forms import NewMeeting, UpdateMeeting, NewFileUpload 11 #from app.meetings.update import 12 #from app.meetings.meeting import 13 14 mongo = PyMongo(app) 15 fs = GridFS(mongo.db, 'meeting') 16 17 # REMOVE THIS WHEN UPLOAD AND READ ARE RESOLVED 18 #a=fs.put(b'test data') 19 #item = fs.get(a) 20 # END REMOVE 21 22 ### Define fetch_meeting ### 23 #TRY TO MOVE TO app.meetings.meeting.py 24 class MeetingNotFoundError(Exception): 25 pass 26 27 def fetch_meeting(meeting_id): 28 meeting = mongo.db.meeting_collection.find_one({"meeting_id":meeting_id}) 29 30 if meeting == None: 31 raise MeetingNotFoundError(f'Meeting Id {meeting_id} returned None') 32 else: 33 return meeting 34 35 ### BEGIN DEV ROUTES ### 36 37 @bp.route('/meetings/seed',methods=["GET","PUT"]) 38 @login_required 39 def meetingSeed(): 40 expectedtime = datetime.datetime.now() 41 expectedtime1 = expectedtime + datetime.timedelta(minutes=60) 42 expectedtime2 = expectedtime - datetime.timedelta(minutes=60) 43 r1 = hashlib.sha256(os.urandom(16)).hexdigest() 44 r2 = hashlib.sha256(os.urandom(16)).hexdigest() 45 seeds = [ 46 { 47 "meeting_id": r1, 48 "timestamp": datetime.datetime.now(), 49 "expected_end": expectedtime1, 50 "location": "https://www.brennen.work", 51 "documents":["/uploads/test.txt","/uploads/test2.pdf"], 52 "meeting_description":"Design Meeting" 53 }, 54 { 55 "meeting_id": r2, 56 "timestamp": datetime.datetime.now(), 57 "expected_end": expectedtime2, 58 "location": "https://www.brennen.work", 59 "documents":["/uploads/test2.doc"], 60 "minutes_file":"minutes.doc", 61 "meeting_description":"Design Meet" 62 } 63 ] 64 mongo.db.meeting_collection.delete_many({}) 65 mongo.db.meeting_collection.insert_many(seeds) 66 dev_meetings = mongo.db.meeting_collection.find() 67 return render_template('dev_meetings.html',dev_meetings=dev_meetings) 68 69 @bp.route('/meetings/dev',methods=["GET"]) 70 @login_required 71 def allMeetings(): 72 dev_meetings = mongo.db.meeting_collection.find({}) 73 return render_template('dev_meetings.html',dev_meetings=dev_meetings) 74 75 ### END DEV ROUTES ### 76 77 #### BEGIN ROUTES #### 78 79 @bp.route('/meetings',methods=["GET"]) 80 @bp.route('/meetings/',methods=["GET"]) 81 @login_required 82 def meetings(): 83 ongoingMeetings = mongo.db.meeting_collection.aggregate( [ 84 { 85 '$match':{ 86 'timestamp':{ 87 '$lt':datetime.datetime.now() 88 }, 89 'expected_end':{ 90 '$gt':datetime.datetime.now() 91 } 92 } 93 }, 94 { '$sort':{'timestamp':1}} 95 ] ) 96 97 upcomingMeetings = mongo.db.meeting_collection.aggregate( [ 98 { 99 '$match':{'timestamp':{'$gt': datetime.datetime.now() }} 100 }, 101 { 102 '$sort':{'timestamp':1} 103 } 104 ] ) 105 106 pastMeetings = mongo.db.meeting_collection.aggregate( [ 107 { 108 '$match':{ 'timestamp': {"$lt": datetime.datetime.now()},'expected_end':{'$lt': datetime.datetime.now()} } 109 }, 110 { 111 '$sort':{ 'timestamp':-1 } 112 }, 113 { 114 '$limit':7 115 } 116 ]) 117 118 return render_template('meetings.html',ongoingMeetings=ongoingMeetings,upcomingMeetings=upcomingMeetings,pastMeetings=pastMeetings) 119 120 @bp.route('/meetings/past',methods=["GET"]) 121 @login_required 122 def past_meetings(): 123 allOldMeetings = True 124 pastMeetings = mongo.db.meeting_collection.aggregate( [ 125 { 126 '$match':{'expected_end': {"$lt": datetime.datetime.now()} } 127 }, 128 { 129 '$sort':{ 'timestamp':-1 } 130 } 131 ] ) 132 return render_template('meetings.html',pastMeetings=pastMeetings, allOldMeetings=allOldMeetings) 133 134 @bp.route('/meeting/<meeting_id>',methods=["GET"]) 135 @bp.route('/meeting/<meeting_id>/',methods=["GET"]) 136 def meeting(meeting_id): 137 try: 138 meeting = fetch_meeting(meeting_id) 139 except MeetingNotFoundError as e: 140 return render_template('error.html',error=e) 141 else: 142 return render_template('meeting.html',meeting=meeting) 143 144 @bp.route('/meeting/new',methods=["GET","POST"]) 145 @login_required 146 def new_meeting(): 147 form = NewMeeting() 148 if form.validate_on_submit(): 149 m_id = hashlib.sha256(os.urandom(16)).hexdigest() 150 timestp = datetime.datetime.combine(form.date.data,form.time.data) 151 expectedtime = timestp + datetime.timedelta(minutes=form.expected_end.data) 152 try: 153 new_meeting = {'meeting_id':m_id,'timestamp':timestp,'location':form.location.data,'expected_end':expectedtime} 154 if form.meeting_description.data != "": 155 new_meeting['meeting_description']=form.meeting_description.data 156 except Exception: 157 return "Error assigning form data" 158 else: 159 mongo.db.meeting_collection.insert_one(new_meeting) 160 flash("Created new meeting!") 161 return redirect(url_for('meetings.meetings')) 162 163 # if form.name.data != "": 164 # new_meeting['meeting_name']=form.name.data 165 return render_template('new_meeting.html',form=form) 166 167 @bp.route('/meeting/<meeting_id>/upload',methods=["GET","POST","PUT"]) 168 @login_required 169 def upload_meeting_document(meeting_id): 170 try: 171 meeting = fetch_meeting(meeting_id) 172 except MeetingNotFoundError as e: 173 return render_template('error.html',error=e) 174 else: 175 form = NewFileUpload() 176 if form.validate_on_submit(): 177 fs = GridFS(mongo.db, 'meeting') 178 #fs = GridFS(mongo.db) 179 #upload = request.files['file'] 180 upload = request.files[form.document.name].read() 181 uploadfn = request.files[form.document.name].filename 182 if uploadfn != '': 183 fid = fs.put(upload,filename=uploadfn,meeting=ObjectId(meeting['_id'])) 184 flash("submitted {}".format(uploadfn)) 185 mongo.db.meeting_collection.update_one({'_id':meeting['_id']},{'$push':{'documents':{"doc_id":ObjectId(fid),"doc_filename":uploadfn}}}) 186 return redirect(url_for('meetings.upload_meeting_document',meeting_id=meeting['meeting_id'])) 187 # app_root = os.path.dirname(os.path.abspath(__file__)) 188 # target = os.path.join(app_root, 'static/meeting-docs') 189 # if not os.path.isdir(target): 190 # os.mkdir(target) 191 # if request.method == "POST": 192 # upload = request.files['file'] 193 # if upload.filename != '': 194 # upload.save(os.path.join('static/meeting-docs',upload.filename)) 195 # flash("submitted {}".format(upload.filename)) 196 # mongo.db.meeting_collection.update_one({'_id':meeting['_id']},{'$push':{'documents':upload.filename}}) 197 # return redirect(url_for('meetings.upload_meeting_document',meeting_id=meeting['meeting_id'])) 198 return render_template('upload_meeting_document.html',meeting=meeting,form=form) 199 200 @bp.route('/meetings/upload',methods=["GET","POST"]) 201 @login_required 202 def upload_doc(): 203 form = NewFileUpload() 204 if form.validate_on_submit(): 205 fs = GridFS(mongo.db, 'meeting') 206 upload = request.files[form.document.name].read() 207 if request.files[form.document.name].filename != '': 208 fid = fs.put(upload,filename=request.files[form.document.name].filename,meeting="meeting id") 209 flash("submitted {}".format(fid)) 210 return redirect(url_for('meetings.upload_doc')) 211 return render_template('upload_meeting_doc_test.html',form=form) 212 213 @bp.route('/meeting/get-file/<fid>') 214 @bp.route('/meeting/get-file') 215 def get_meeting_file(fid=None): 216 fs = GridFS(mongo.db, 'meeting') 217 if fid is not None: 218 file = fs.get(ObjectId(fid)) 219 rfile = app.response_class(file, direct_passthrough=True, mimetype='application/octet-stream') 220 rfile.headers.set('Content-Disposition','attachment',filename=file.filename) #maybe change to actually return real filename instead of file_id 221 return rfile 222 return render_template('get_meeting_file.html', files=fs.find()) #find() was list() 223 224 @bp.route('/meeting/delete-file/<fid>') 225 @bp.route('/meeting/delete-file/<fid>/<previous>') 226 def delete_meeting_file(fid=None,previous=None): 227 fs = GridFS(mongo.db, 'meeting') 228 if fid is not None and previous is None: 229 fs.delete(ObjectId(fid)) 230 return redirect(url_for('meetings.get_meeting_file')) 231 elif fid is not None and previous is not None: 232 meeting = fetch_meeting(previous) 233 fs.delete(ObjectId(fid)) 234 mongo.db.meeting_collection.update_one({"_id":meeting["_id"]},{"$pull":{'documents':{'doc_id':ObjectId(fid)}}}) 235 return redirect(url_for('meetings.update_meeting',meeting_id=previous)) 236 else: 237 return render_template('get_meeting_file.html', files=fs.find())#find() was list() 238 239 @bp.route('/meeting/<meeting_id>/update',methods=["GET","POST"]) 240 @login_required 241 def update_meeting(meeting_id): 242 try: 243 meeting = fetch_meeting(meeting_id) 244 except MeetingNotFoundError as e: 245 return render_template('error.html',error=e) 246 else: 247 return render_template('update_meeting.html',meeting=meeting) 248 249 @bp.route('/meeting/<meeting_id>/<update>',methods=["GET","POST"]) 250 @login_required 251 def change_meeting(meeting_id,update): 252 form = UpdateMeeting() 253 try: 254 meeting = fetch_meeting(meeting_id) 255 except MeetingNotFoundError as e: 256 return render_template('error.html',error=e) 257 else: 258 if form.validate_on_submit(): 259 if update == "date": 260 timestamp = datetime.datetime.combine(form.date.data,meeting['timestamp'].time()) 261 mongo.db.meeting_collection.update_one({'meeting_id':meeting['meeting_id']},{'$set':{'timestamp':timestamp}}) 262 flash("Updated Date from {} to {}".format(meeting['timestamp'],timestamp)) 263 return redirect(url_for('meetings.update_meeting',meeting_id=meeting['meeting_id'])) 264 if update == "time": 265 timestamp = datetime.datetime.combine(meeting['timestamp'].date(),form.time.data) 266 mongo.db.meeting_collection.update_one({'meeting_id':meeting['meeting_id']},{'$set':{'timestamp':timestamp}}) 267 flash("Updated Time from {} to {}".format(meeting['timestamp'],timestamp)) 268 return redirect(url_for('meetings.update_meeting',meeting_id=meeting['meeting_id'])) 269 if update == "location": 270 mongo.db.meeting_collection.update_one({'meeting_id':meeting['meeting_id']},{'$set':{'location':form.location.data}}) 271 flash("Updated location from {} to {}".format(meeting['location'],form.location.data)) 272 return redirect(url_for('meetings.update_meeting',meeting_id=meeting['meeting_id'])) 273 if update == "description": 274 mongo.db.meeting_collection.update_one({'meeting_id':meeting['meeting_id']},{'$set':{'meeting_description':form.meeting_description.data}}) 275 flash("Updated description to {}".format(form.meeting_description.data)) 276 return redirect(url_for('meetings.update_meeting',meeting_id=meeting['meeting_id'])) 277 return render_template('form_meetings.html',meeting=meeting,update=update,form=form) 278 279 @bp.route('/meeting/<meeting_id>/remove',methods=["GET","POST"]) 280 @login_required 281 def remove_meeting(meeting_id): 282 try: 283 meeting = fetch_meeting(meeting_id) 284 except MeetingNotFoundError as e: 285 return render_template('error.html',error=e) 286 else: 287 mongo.db.meeting_collection.delete_one(meeting) 288 flash("Deleted meeting {}".format(meeting['meeting_description'])) 289 return redirect(url_for('meetings.meetings'))