stc

a simple time card webapp
git clone _git@git.brennen.work:stc.git
Log | Files | Refs | README

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'))