def home(): '''Home page method. Displays welcome message or login page.''' if request.method == 'GET': #check if logged in if 'uid' in session: # get user info username = session['username'] uid = session['uid'] conn = queries.getConn(DATABASE) campaigns = queries.getUserCampaigns(conn, uid) #render template return render_template('home.html', username=username, campaigns=campaigns) else: # render template w/o user info username = None campaigns = None return render_template('home.html', username=username, campaigns=campaigns) else: #login attempt user = request.form.get('user') attempt = request.form.get('password') # check database for user-pass match conn = queries.getConn(DATABASE) curs = conn.cursor(MySQLdb.cursors.DictCursor) curs.execute('''select hashed from user where username = %s''', [user]) password = curs.fetchone() if password is None: flash("Login unsuccessful. Try again.") return redirect(url_for('home')) hashed = password['hashed'] if bcrypt.hashpw(attempt.encode('utf-8'), hashed.encode('utf-8')) == hashed: session['username'] = user #get uid curs.execute('''select uid from user where username = %s''', [user]) uid = curs.fetchone()['uid'] session['uid'] = uid flash("Login successful for " + user) return redirect(url_for('home')) else: flash("Login unsuccessful. Try again.") return redirect(url_for('home'))
def match(): '''CRUX OF APPLICATION Not a sophisticated algorithm but matches students in the roster ''' courseNum = request.args.get('courseNum') pid = request.args.get('pid') try: conn = queries.getConn('c9') curs = conn.cursor(MySQLdb.cursors.DictCursor) roster = queries.roster(conn, courseNum) matches = matching.match(roster) groupNums = list() for match in matches: allGroups = queries.allGroups(conn) groupNum = matching.groupNum(allGroups) check = curs.execute('''insert into groups(groupNum, pid, courseNum) values(%s, %s, %s)''',[groupNum, pid, courseNum]) curs.execute('''insert into groupForPset(groupNum, bnumber) values(%s, %s)''',[groupNum, match]) if matches[match]: curs.execute('''insert into groupForPset(groupNum, bnumber) values(%s, %s)''',[groupNum, matches[match]]) groupNums.append(groupNum) return jsonify( {'error': False, 'match': matches, 'groupNum': groupNums}) except Exception as err: return jsonify( {'error': True, 'err': str(err) } )
def register(): '''User registration route.''' if request.method == 'GET': if 'uid' in session: flash('Already logged into existing account.') return redirect(url_for('home')) else: return render_template("register.html") else: #submit registration form username = request.form.get('user') pass1 = request.form.get('password1') pass2 = request.form.get('password2') if pass1 != pass2: flash("Passwords don't match") return redirect(url_for('register')) else: #register user into database hashed = bcrypt.hashpw(pass1.encode('utf-8'), bcrypt.gensalt()) conn = queries.getConn(DATABASE) try: uid = queries.registerUser(conn, username, hashed) except: flash("There was an error registering user") return redirect(url_for("register")) if uid == False: flash("User already exists") return redirect(url_for("register")) else: session['uid'] = uid session['username'] = username flash("Registration successful") return redirect(url_for("home"))
def newUser(): '''Returns a template for user sign up if the user is not found in the database''' if request.method == 'GET': return render_template('newUser.html') else: conn = queries.getConn('c9') username = request.form.get('username') password = request.form.get('password1') password2 = request.form.get('password2') name = request.form.get('name') email = request.form.get('email') phone = request.form.get('phone') bnumber = request.form.get('bnumber') userType = request.form.get('userType') if '@' not in email: flash('Please provide a correct email address') return render_template('newUser.html') if queries.usernameTaken(conn, username): flash('Username taken. Enter a new username') return render_template('newUser.html') if password != password2: flash('Passwords do not match') return render_template('newUser.html') hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) if (username and hashed and name and email and phone and bnumber and userType): queries.addUser(conn, username, hashed, bnumber, name, email, phone, userType) flash('Your account has been created. You can go ahead and login!') return redirect(url_for('index'))
def courses(courseNum = None): '''Display courses student is in enrolled in or courses professor teaches''' if session.get('logged_in'): conn = queries.getConn('c9') bnumber = session.get('bnumber') instructor = queries.isInstructor(conn, bnumber) if courseNum: course = queries.findCourse(conn, courseNum) roster = queries.roster(conn, courseNum) session['courseNum'] = courseNum students = queries.allStudents(conn) psets = queries.getAssignments(conn, courseNum, bnumber) return render_template('roster.html', course = course, courseNum = courseNum, roster = roster, psets = psets, students = students, logged_in = session['logged_in'], instructor = instructor) else: if instructor: courses = queries.courses(conn, bnumber) else: courses = queries.coursesStudent(conn, bnumber) return render_template('courses.html', courses = courses, logged_in = session['logged_in'], instructor=instructor) else: flash('Need to login to access page') return index()
def newAssignment(): '''Allows professor to add a new assignment to the database''' if session.get('logged_in'): if request.method == 'GET': return render_template('assignment.html',logged_in = session['logged_in']) else: psetNum = request.form.get('psetNum') psetTitle = request.form.get('psetTitle') dueDate = request.form.get('dueDate').encode('utf-8') maxSize = request.form.get('maxSize') conn = queries.getConn('c9') courseNum = session.get('courseNum') try: psetNum = int(psetNum) except: flash('Invalid input: Please insert an integer value for Assignment Number') try: maxSize = int(maxSize) except: flash('Invalid input: Please insert an integer for Max Group Size') if psetNum and psetTitle and dueDate and isinstance(maxSize, int): queries.addAssignment(conn, psetNum, psetTitle, dueDate, maxSize, courseNum) return redirect(url_for('courses', courseNum = courseNum)) return render_template('assignment.html', logged_in = session['logged_in']) else: flash('Need to login to access page') return redirect(url_for('index'))
def flaskLogin(): '''Manual login for users who are already signed up''' conn = queries.getConn('c9') check = '' pwrd = request.form['password'] print(pwrd) if '@' in request.form['username-email']: email = request.form['username-email'] check = queries.emailLogin(conn, email) else: username = request.form['username-email'] check = queries.nameLogin(conn, username) if not check: flash('Username/email is not found in the database. Create an account to continue.') return redirect(request.referrer) else: hashed = check['password'] try: if bcrypt.hashpw(pwrd.encode('utf-8'), hashed.encode('utf-8')) != hashed: flash('Incorrect password') return redirect(request.referrer) except: if pwrd != hashed: flash('Incorrect password') return redirect(request.referrer) session['logged_in'] = True session['bnumber'] = check['bnumber'] session['username'] = check['username'] session['name'] = check['name'] return redirect(url_for('profile', bnumber = session['bnumber']))
def deleteAssignment(pid): '''Allows professor to delete assignment and will update database accordingly''' if session.get('logged_in'): conn = queries.getConn('c9') courseNum = session.get('courseNum') bnumber = session.get('bnumber') instructor = queries.isInstructor(conn, bnumber) if request.method == 'GET': info = queries.getAssignment(conn, pid) return render_template('update.html', pset = info, courseNum = courseNum, logged_in = session['logged_in']) else: if request.form.get('submit') == 'update': newPid = request.form.get('pid') psetTitle = request.form.get('psetTitle') dueDate = request.form.get('dueDate') maxSize = request.form.get('maxSize') queries.updatePsets(conn, newPid, psetTitle, dueDate, maxSize, courseNum) return redirect(url_for('courses', courseNum = courseNum, instructor = instructor)) elif request.form.get('submit') == 'delete': queries.deleteAssignment(conn, pid) return redirect(url_for('courses', courseNum=courseNum, instructor=instructor)) else: flash('Need to login to access page') return redirect(url_for('index'))
def newCamp(): if 'uid' not in session: #verify user is logged in flash("Login to add campaign.") return redirect(url_for('home')) if request.method == 'GET': #display form return render_template('new_camp.html') else: uid = session['uid'] campName = request.form.get("name") players = request.form.get("players") players = players.strip().split() #make into list conn = queries.getConn(DATABASE) #insert new campaign into db cid = queries.createCampaign(conn, campName) #insert players into campaign for player in players: playerID = queries.getUserID(conn, player) if playerID == None: flash("There was an error adding " + player + " to campaign.") else: try: queries.addPlayerToCamp(conn, playerID['uid'], cid) except: flash("There was an error adding " + player + " to campaign.") #insert current user as dm to campaign (assume only DMs are creating campaigns) queries.addPlayerToCamp(conn, uid, cid, dm='yes') session['camp'] = cid return redirect(url_for('campPage'))
def newCourse(): '''Allows professors to add new course to database and will be displayed on courses page''' if session.get('logged_in'): bnumber = session.get('bnumber') if request.method == 'GET': return render_template('newCourse.html', bnumber = bnumber) else: courseNum = request.form.get('courseNum') courseName = request.form.get('courseName') semester = request.form.get('semester') if courseNum: try: courseNum = int(courseNum) except: flash('Invalid input: Please enter integer values') else: flash('Missing input: Course Number is missing') if not courseName: flash('Missing input: Course Title is missing') if not semester: flash('Missing input: Semester is missing') if isinstance(courseNum, int) and courseName and semester: conn = queries.getConn('c9') queries.addCourse(conn, courseNum, courseName, bnumber, semester) return redirect(url_for('courses')) return render_template('newCourse.html', bnumber = bnumber, logged_in = session['logged_in']) else: flash('Need to login to access page')
def newUser(): '''Returns a template for user sign up if the user is not found in the database''' if request.method == 'GET': return render_template('newUser.html') else: conn = queries.getConn('c9') username = request.form.get('username') password = request.form.get('password1') password2 = request.form.get('password2') name = request.form.get('name') email = request.form.get('email') phone = request.form.get('phone') bnumber = request.form.get('bnumber') userType = request.form.get('userType') print('queries', queries.usernameTaken(conn, username)) if queries.usernameTaken(conn, username): flash('Username taken. Enter a new username') return render_template('newUser.html') if password != password2: flash('Passwords do not match') return render_template('newUser.html') # hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) if (username and password and name and email and phone and bnumber and userType): queries.addUser(conn, username, password, bnumber, name, email, phone, userType) return redirect(url_for('profile'))
def pics(): conn = queries.getConn('c9') curs = conn.cursor(MySQLdb.cursors.DictCursor) curs.execute( 'select bnumber,filename from picfile inner join users using (bnumber)' ) pics = curs.fetchall() return render_template('all_pics.html', pics=pics)
def courses(courseNum=None): if courseNum: conn = queries.getConn('c9') course = queries.findCourse(conn, courseNum) roster = queries.roster(conn, courseNum) bnumber = session.get('bnumber') psets = queries.getAssignments(conn, courseNum, bnumber) return render_template('roster.html', course=course, roster=roster, psets=psets) else: conn = queries.getConn('c9') courses = queries.courses(conn) return render_template('courses.html', courses=courses, logged_in=session['logged_in'])
def LiquorCrimeTypeQuery(t): """ Option 6 from Main Menu """ UserInterface.displayLiquorCrimeType(t) userChoice = input() conn = queries.getConn() while userChoice != 'q': if userChoice == "q": break elif userChoice == '1': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.liquor_crimes('rape', conn) print( "-----------------------------------------------------------" ) elif userChoice == '2': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.liquor_crimes('murder', conn) print( "-----------------------------------------------------------" ) elif userChoice == '3': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.liquor_crimes('aggravated', conn) print( "-----------------------------------------------------------" ) elif userChoice == '4': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.liquor_crimes('robbery', conn) print( "-----------------------------------------------------------" ) else: print( t.bold_red( "Invalid input. Please type in a number from 1-6")) UserInterface.displayLiquorCrimeType(t) userChoice = input() print() print(t.bold_cyan("Exited Option 6")) print()
def updateRoster(): conn = queries.getConn('c9') bnumber = request.form.get('students') courseNum = session.get('courseNum') # courseNum = request.form.get('courseNum') # not necessary curs = conn.cursor(MySQLdb.cursors.DictCursor) curs.execute('''insert into enrollment(bnumber, courseNum) values(%s, %s)''',[bnumber, courseNum]) return redirect(request.referrer)
def update(): if session.get('logged_in'): if request.form['submit'] == 'Save Changes': conn = queries.getConn('c9') name = request.form.get('username') email = request.form.get('email') phone = request.form.get('phone') bnumber = request.form.get('bnumber') residence = request.form.get('residence') avail = request.form.get('avail') try: updated = queries.update(conn, name, email, phone, residence, avail) except: flash('Unable to Update info') return redirect(url_for('profile')) else: try: bnumber = request.form['bnumber'] # may throw error f = request.files['pic'] mime_type = imghdr.what(f) if mime_type.lower() not in ['jpeg', 'gif', 'png', 'jpg']: raise Exception( 'Not a JPEG, GIF, JPG or PNG: {}'.format(mime_type)) filename = secure_filename('{}.{}'.format(bnumber, mime_type)) pathname = os.path.join(app.config['UPLOADS'], filename) f.save(pathname) flash('Upload successful') conn = queries.getConn('c9') curs = conn.cursor() curs.execute( '''insert into picfile(bnumber,filename) values (%s,%s) on duplicate key update filename = %s''', [bnumber, filename, filename]) return redirect(url_for('profile')) except Exception as err: flash('Upload failed {why}'.format(why=err)) return redirect(url_for('profile')) else: return redirect(request.referrer)
def MainMenu(): t = Terminal() MainMenuTitle = t.red_on_green('MAIN MENU') print(MainMenuTitle) UserInterface.displayOptions(t) conn = queries.getConn() userChoice = input() while userChoice != 'q': if userChoice == "q": break elif userChoice == '1': print() UserInterface.TypeRatioQuery(t) print(MainMenuTitle) elif userChoice == '2': UserInterface.CrimeLiquorQuery(t) print(MainMenuTitle) elif userChoice == '3': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.responsibleratio(conn) print( "-----------------------------------------------------------" ) print(MainMenuTitle) elif userChoice == '4': print( "-----------------------------------------------------------" ) queries.liquorstores(conn) print( "-----------------------------------------------------------" ) print(MainMenuTitle) elif userChoice == '5': UserInterface.CrimeChangeQuery(t) print(MainMenuTitle) elif userChoice == '6': UserInterface.LiquorCrimeTypeQuery(t) print(MainMenuTitle) # elif userChoice == '7': # print(Terminal().bold_red(sisMan())) else: print( t.bold_red( "Invalid input. Please type in a number from 1-6")) UserInterface.displayOptions(t) userChoice = input() print() print(t.bold_blue("EXITED APPLICATION")) print()
def pic(bnumber): conn = queries.getConn('c9') curs = conn.cursor(MySQLdb.cursors.DictCursor) numrows = curs.execute( '''select bnumber,filename from users inner join picfile using (bnumber) where bnumber = %s''', [bnumber]) if numrows == 0: flash('No picture for {}'.format(bnumber)) return redirect(url_for('profile')) row = curs.fetchone() val = send_from_directory(app.config['UPLOADS'], row['filename']) return val
def groupProf(courseNum, pid): '''Returns group page for users that are professors''' if session.get('logged_in'): conn = queries.getConn('c9') course = queries.findCourse(conn, courseNum) groups = queries.groups(conn, courseNum, pid) numGroups = queries.numGroup(conn, courseNum, pid) return render_template('groupProf.html', course = course, courseNum = courseNum, pid = pid, numGroups = numGroups['numGroups'], groups = groups, logged_in = session['logged_in']) else: flash('Need to login to access page') return index()
def group(courseNum, groupNum, pid): '''Returns group page for student users''' if session.get('logged_in'): conn = queries.getConn('c9') course = queries.findCourse(conn, courseNum) group = queries.psetGroup(conn, courseNum, pid, groupNum) return render_template('groups.html', course = course, groupNum = groupNum, group = group, logged_in = session['logged_in']) else: flash('Need to login to access page') return index()
def newPassword(): '''Allows students to sign up for accounts if added by professor''' username = request.form.get('username') password1 = request.form.get('password') password2 = request.form.get('password2') if password1 != password2: flash('Passwords do not match') return render_template('newPassword.html', usernmame = username) hashed = bcrypt.hashpw(password1.encode('utf-8'), bcrypt.gensalt()) conn = queries.getConn('c9') queries.newPassword(conn, hashed) flash('Your account has been created! Go ahead and login.') return render_template('base.html')
def newEnrollment(): if request.method == 'GET': return render_template('newEnrollment.html') else: username = request.form.get('username') courseNum = request.form.get('courseNum') conn = queries.getConn('c9') if not queries.checkEnrollment(conn, username, courseNum): flash('Your username is not enrolled in this course. ' + 'Confirm your course number or sign up for a new account') return redirect(request.referrer) return render_template('newPassword.html', username = username)
def editPlayers(): if 'uid' in session and 'camp' in session: uid = session['uid'] cid = session['camp'] conn = queries.getConn(DATABASE) if not queries.userIsDM(conn, uid, cid): flash("You cannot add or remove players.") return redirect(url_for('campPage')) if request.method == 'GET': name = pb_view.camp_name(cid, conn) players = map(lambda x: x[0], queries.getCampPlayers( conn, cid)) #get campaign players and clean list return render_template('edit_players.html', name=name, players=' '.join(players)) else: playersBefore = map(lambda x: x[0], queries.getCampPlayers(conn, cid)) players = request.form.get("players") players = players.strip().split() #make into list #Remove players who've been removed for player in playersBefore: #this is horrible and i hate it if player not in players: queries.removePlayer( conn, queries.getUserID(conn, player)['uid'], cid) #insert players into campaign for player in players: playerID = queries.getUserID(conn, player) if playerID == None: flash("There was an error adding " + player + " to campaign.") else: try: queries.addPlayerToCamp(conn, playerID['uid'], cid) except: flash("There was an error adding " + player + " to campaign.") flash("Successfully edited players") return redirect(url_for("campPage")) else: flash("There was an error accessing requested page.") return redirect(url_for('home'))
def login(token, userinfo, **params): user = users[userinfo['id']] = User(userinfo) login_user(user) #uses google token and extra info in session session['logged_in'] = True conn = queries.getConn('c9') search = queries.google_login(conn, user.email) session['username'] = search['username'] if search: return redirect(url_for('profile')) else: return redirect(params.get('next', url_for('newUser')))
def CrimeLiquorQuery(t): """ Option 2 from Main Menu """ UserInterface.displayCrimeLiquorOptions(t) userChoice = input() conn = queries.getConn() while userChoice != 'q': if userChoice == "q": break elif userChoice == '1': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.counties_liq_crime(1, conn) print( "-----------------------------------------------------------" ) elif userChoice == '2': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.counties_liq_crime(2, conn) print( "-----------------------------------------------------------" ) elif userChoice == '3': print( "-----------------------------------------------------------" ) print("Loading...") print() queries.counties_liq_crime(3, conn) print( "-----------------------------------------------------------" ) else: print( t.bold_red( "Invalid input. Please type in a number from 1-6")) UserInterface.displayCrimeLiquorOptions(t) userChoice = input() print() print(t.bold_cyan("Exited Option 2")) print()
def pic(bnumber): '''URL that displays images of users from uploads folder''' if session.get('logged_in'): conn = queries.getConn('c9') curs = conn.cursor(MySQLdb.cursors.DictCursor) numrows = curs.execute('''select bnumber,filename from users inner join picfile using (bnumber) where bnumber = %s''', [bnumber]) if numrows == 0: flash('No picture for {}'.format(bnumber)) return redirect(url_for('profile')) row = curs.fetchone() val = send_from_directory(app.config['UPLOADS'],row['filename']) return val else: flash('Need to login to access page') return index()
def updateRosterWithUpload(): file = request.files['roster-csv'] if not file.filename: flash('No file selected') filename = secure_filename(file.filename) if filename.split('.')[-1] in ALLOWED_EXTENSIONS: fullpath = os.path.join(app.config['UPLOADS'], filename) file.save(os.path.join(app.config['UPLOADS'], filename)) conn = queries.getConn('c9') queries.loadCSV(conn, fullpath) courseNum = session.get('courseNum') queries.enrollCSV(conn, fullpath, courseNum) else: flash('The provided file extension is not allowed for uploads.') return redirect(request.referrer)
def newUser(): conn = queries.getConn('c9') if request.method == 'POST': name = request.form.get('name') email = request.form.get('email') phone = request.form.get('phone') bnumber = request.form.get('bnumber') if len(bnumber) == 0: flash('enter a bnumber') else: queries.addUser(conn, bnumber, name, email, phone) return redirect(url_for('profile')) else: name = current_user.name email = current_user.email return render_template('newUser.html', name=name, email=email)
def flaskLogin(): conn = queries.getConn('c9') check = '' pwrd = request.form['password'] if '@' in request.form['username-email']: email = request.form['username-email'] check = queries.emailLogin(conn, email, pwrd) else: username = request.form['username-email'] check = queries.nameLogin(conn, username, pwrd) if not check: flash('Incorrect username or password') return redirect(request.referrer) session['logged_in'] = True session['bnumber'] = check['bnumber'] session['username'] = check['username'] return redirect(url_for('profile', bnumber=session['bnumber']))
def availabilityAjax(): '''Waits for changes in availability section to update in the database AUTOSAVE FEATURE ''' availability = request.args.get('availability') bnumber = request.args.get('bnumber') try: conn = queries.getConn('c9') curs = conn.cursor(MySQLdb.cursors.DictCursor) numrows = curs.execute('''update users set availability = %s where bnumber = %s''', [availability, bnumber]) return jsonify( {'error': False, 'availability': availability, 'bnumber': bnumber} ) except Exception as err: return jsonify( {'error': True, 'err': str(err) } )