diff --git a/app/__init__.py b/app/__init__.py old mode 100644 new mode 100755 index 2a7543d..8a49c40 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,13 +1,17 @@ ''' This file is called by "from app import app" inside the app.py file. -It includes all the imports to be used in the app (from allImports import *). +It includes all the imports to be used in the app (from app.allImports import *). It also includes all the application files that are used as "pages" in the app (e.g., "from app import start" imports all the code in start.py that is behind the start.html webpage) ''' -from allImports import * -from app import allImports +from flask import Flask + + + +app = Flask(__name__) +from app.allImports import * # Include an import for every python file that is serving a webpage #import your new python files here. It is not a part of the module until it is imported diff --git a/app/addCourse.py b/app/addCourse.py old mode 100644 new mode 100755 index 8a12970..c9e09a7 --- a/app/addCourse.py +++ b/app/addCourse.py @@ -1,7 +1,9 @@ -from allImports import * +from app.allImports import * from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url +from app.models import Semesters, Programs, Users + #Add Course @app.route('/admin/courseManagement/addCourse',methods=["GET","POST"]) diff --git a/app/allImports.py b/app/allImports.py old mode 100644 new mode 100755 index 0f9c08c..5ca7546 --- a/app/allImports.py +++ b/app/allImports.py @@ -12,12 +12,15 @@ from flask import flash from flask import abort from flask_admin import Admin - +import sys import pprint + from app import models -from models import * # all the database models +# from models import * # all the database models +from app.loadConfig import * +here = os.path.dirname(__file__) +cfg = load_config(os.path.join(here,'config.yaml')) -import sys sys.dont_write_bytecode = True def authUser(env): @@ -41,7 +44,7 @@ def authUser(env): @param {string} filename - the name of the file that should be in that directory @return {string} filepath -returns the absolute path of the directory''' '''TODO: ADD @PARAm for make dirs''' -def getAbsolutePath(relaitivePath,filename=None,makeDirs=False): +def getAbsolutePath(relaitivePath, filename=None, makeDirs=False): filepath = os.path.join(sys.path[0],relaitivePath) if makeDirs == True: try: @@ -59,8 +62,8 @@ def getAbsolutePath(relaitivePath,filename=None,makeDirs=False): "A decorator is just a callable that takes a function as an argument and returns a replacement function. See start.py for an example" ''' -app = Flask(__name__) -#from app import app +# app = Flask(__name__) +from app import app app.config.from_object('settings') # admin = Admin(app) diff --git a/app/archive.py b/app/archive.py old mode 100644 new mode 100755 index b35cd60..da55d7d --- a/app/archive.py +++ b/app/archive.py @@ -1,7 +1,8 @@ -from allImports import * +from app.allImports import * from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.getAll import GetAll +from app.models import Semesters @app.route("/archive/", defaults={'SEID': None}, methods = ["GET", "POST"]) @app.route("/archive/", methods = ["GET", "POST"]) diff --git a/app/config.yaml b/app/config.yaml old mode 100644 new mode 100755 index ebd3290..1ad1810 --- a/app/config.yaml +++ b/app/config.yaml @@ -53,7 +53,7 @@ courseManagementSidebar: link: "/admin/courseManagement/removeCourse" Headers: - Courses: ['Instructor','Course','Term','Syllabus Upload','Last Modified By'] + Courses: ['Instructor','Course','Term','Syllabus Upload','Course Materials','Last Modified By'] Archive: ['Instructor','Course','Term','Syllabus Upload','Last Modified By'] fileOperations: @@ -81,9 +81,9 @@ termInfo: #10: 'Berea Bridge Program' # e.g. Berea Bridge Program 2016 = 201610 DEBUG: - #user: "HEGGENS@berea.edu" #Admin Access + user: "HEGGENS@berea.edu" #Admin Access # user: "pearcej" #Division Chair Access - user: "jadudm" #Professor Access + # user: "jadudm" #Professor Access # user: "nakazawam" #Program Access contributors: diff --git a/app/contributors.py b/app/contributors.py old mode 100644 new mode 100755 index b977228..239c55c --- a/app/contributors.py +++ b/app/contributors.py @@ -1,4 +1,4 @@ -from allImports import * +from app.allImports import * from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.getAll import GetAll diff --git a/app/courses.py b/app/courses.py old mode 100644 new mode 100755 index fb284df..ddbae1f --- a/app/courses.py +++ b/app/courses.py @@ -1,10 +1,11 @@ -from allImports import * +from app.allImports import * #IMPORT LOGIC FILES from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.getCourses import GetCourses from app.logic.switch import switch from app.logic.getAll import GetAll +from app.models import Semesters @app.route("/courses", methods = ["GET"]) #SET A DEFAULT APP ROUTE @app.route("/courses/", methods = ["GET"]) #SET A DEFAULT APP ROUTE @@ -34,6 +35,10 @@ def courses(term = 0): programs_to_courses = two_dictionaries[1] # MY COURSES SELECT QUERY my_courses = getCourses.check_for_my_courses(currentSEID) + if my_courses and my_courses.courseMaterials: + print(my_courses.courseMaterials) + my_courses.courseMaterials = list(my_courses.courseMaterials) + print(my_courses.courseMaterials) # RENDER CORRECT PAGE BASED ON ACCESS LEVEL for case in switch(user_level): if case('admin'): @@ -48,7 +53,7 @@ def courses(term = 0): break; if case('division'): division_key = user.DID - print division_key + print(division_key) return render_template('courses/division.html', cfg = cfg, my_courses = my_courses, @@ -81,3 +86,19 @@ def courses(term = 0): abort(404) render_template('error.html') +@app.route("/editCourseMaterials/", methods = ["POST"]) +def editCourseMaterials(courseID): + data = request.form.to_dict(flat=False) + print(courseID) + # courseMaterials = [] + # if len(data) >= 0: + # for courseMaterialUsed in data: + # if courseMaterialUsed == "NoneRequired": + # break + # courseMaterials.append(courseMaterialUsed) + course = databaseInterface.get_course_info(courseID) + # print(str(courseMaterials)) + course.courseMaterials = data + course.save() + print(course.courseMaterials) + return "", 200 diff --git a/app/databaseAdmin.py b/app/databaseAdmin.py old mode 100644 new mode 100755 index 567c4ca..09f6fdd --- a/app/databaseAdmin.py +++ b/app/databaseAdmin.py @@ -1,4 +1,4 @@ -from allImports import * +from app.allImports import * from flask_admin.contrib.peewee import ModelView class AuthenticatedUser(ModelView): diff --git a/app/deadlineDisplay.py b/app/deadlineDisplay.py old mode 100644 new mode 100755 index fdf9ae6..26ea3ae --- a/app/deadlineDisplay.py +++ b/app/deadlineDisplay.py @@ -1,7 +1,9 @@ -from allImports import * +# from app import app +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser import datetime import time +from app.models import Deadline #from datetime import datetime diff --git a/app/deadlineManagement.py b/app/deadlineManagement.py old mode 100644 new mode 100755 index 4e5eace..a06493c --- a/app/deadlineManagement.py +++ b/app/deadlineManagement.py @@ -1,7 +1,8 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url import datetime +from app.models import Deadline @app.route("/deadline/create", methods=["POST"]) @@ -15,7 +16,7 @@ def deadlineCreate(): # data contains # deadlineDescription data = request.form - date = datetime.datetime.strptime(data['deadlineDate'],"%m/%d/%Y").date() + date = datetime.datetime.strptime(data['deadlineDate'],"%m/%d/%Y").date() deadline = Deadline.create( description=data['deadlineDescription'], date=date) diff --git a/app/deleteSyllabus.py b/app/deleteSyllabus.py old mode 100644 new mode 100755 index 7fc0eb9..49ee716 --- a/app/deleteSyllabus.py +++ b/app/deleteSyllabus.py @@ -1,4 +1,4 @@ -from allImports import * +from app.allImports import * import datetime #IMPORT LOGIC FILES from app.logic.getAuthUser import AuthorizedUser @@ -32,7 +32,7 @@ def delete(CID): update_last_modified.execute() return redirect(redirect_url()) - except Exception,e: + except Exception as e: app.logger.info("{0} attempting to delete a syllabus.".format(str(e))) message = "An error occured during the delete process of the file." return render_template("error.html", diff --git a/app/divisionManagement.py b/app/divisionManagement.py old mode 100644 new mode 100755 index 75ef3f5..b247db9 --- a/app/divisionManagement.py +++ b/app/divisionManagement.py @@ -1,6 +1,6 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser - +from app.models import Divisions, Users @app.route("/admin/divisionManagement/", methods=["GET", "POST"]) def adminDivisionManagement(did): diff --git a/app/download.py b/app/download.py old mode 100644 new mode 100755 index 7d76fc1..2dd92e3 --- a/app/download.py +++ b/app/download.py @@ -4,7 +4,7 @@ import sys import zipfile #from Flask -from allImports import * +from app.allImports import * from flask import send_file from flask import send_from_directory # From Logic @@ -19,11 +19,11 @@ def download(CID): page = r"/" + request.url.split("/")[-1] try: file_path = databaseInterface.get_course_download_file_path(CID) - print "This is file_path: {}".format(file_path) + print("This is file_path: {}".format(file_path)) message = "Download: {} has been downloaded".format(file_path) log.writer("INFO", page, message) return send_file(file_path, as_attachment=True) - except Exception,e: + except Exception as e: app.logger.info("{0} attempting to download file.".format(str(e))) message = "An error occured during the download process." return render_template("error.html", @@ -61,7 +61,7 @@ def downloadAll(SEID): message = 'Download: {0} has been downloaded as a zip'.format(parent_folder) log.writer("INFO", page, message) return send_file(zip_path,as_attachment=True) - except Exception,e: + except Exception as e: return render_template('error.html', cfg = cfg, message = e diff --git a/app/editAdmin.py b/app/editAdmin.py old mode 100644 new mode 100755 index 369e269..3a9ef04 --- a/app/editAdmin.py +++ b/app/editAdmin.py @@ -1,6 +1,7 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url +from app.models import Users def checkData(data,key): user = None diff --git a/app/editDivision.py b/app/editDivision.py old mode 100644 new mode 100755 index daf0f69..f323a0e --- a/app/editDivision.py +++ b/app/editDivision.py @@ -1,6 +1,9 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url +from app.models import Users + + @app.route("/editDivision", methods=["POST"]) def editDivision(): authorizedUser = AuthorizedUser() diff --git a/app/editProgram.py b/app/editProgram.py old mode 100644 new mode 100755 index 1879e03..84d6937 --- a/app/editProgram.py +++ b/app/editProgram.py @@ -1,6 +1,8 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url +from app.models import Users + @app.route("/editProgram", methods=["POST"]) def editProgram(): authorizedUser = AuthorizedUser() @@ -27,9 +29,8 @@ def editProgram(): #LOOK THROUGH THE NEW CHAIR LIST for user_name in newChairs: #ADD THE USERNAMES TO THE PROGRAM CHAIR LIST - newChair = Users.get(Users.username == user_name) - print newChair.username - newChair.PID = pid + newChair = Users.get(Users.username == user_name) + newChair.PID = pid newChair.save() message = "USER: {0} has been added as a program chair for pid: {1}".format(user_name,pid) log.writer("INFO", page, message) diff --git a/app/errorHandler.py b/app/errorHandler.py old mode 100644 new mode 100755 index 6e47293..5042c1f --- a/app/errorHandler.py +++ b/app/errorHandler.py @@ -1,4 +1,4 @@ -from allImports import * +from app.allImports import * @app.errorhandler(403) def pageNotFound(e): diff --git a/app/index.py b/app/index.py old mode 100644 new mode 100755 index d5e7d6d..1746851 --- a/app/index.py +++ b/app/index.py @@ -1,5 +1,5 @@ # This is the home page for bcsr -from allImports import * +from app.allImports import * @app.route("/", methods = ["GET"]) def start(): #TODO: FIND OUT HOW TO CATCH THE USERNAME FROM THE LOGIN PROCESS diff --git a/app/loadConfig.py b/app/loadConfig.py old mode 100644 new mode 100755 index 798a4bb..43f62dd --- a/app/loadConfig.py +++ b/app/loadConfig.py @@ -10,5 +10,5 @@ def load_config(file): with open(file, 'r') as ymlfile: - cfg = yaml.load(ymlfile) - return cfg \ No newline at end of file + cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) + return cfg diff --git a/app/logic/databaseInterface.py b/app/logic/databaseInterface.py old mode 100644 new mode 100755 index 267e2f5..6db97d9 --- a/app/logic/databaseInterface.py +++ b/app/logic/databaseInterface.py @@ -1,4 +1,5 @@ from app.allImports import * +from app.models import * def grab_current_semester(): semesters = Semesters.select() @@ -81,7 +82,6 @@ def get_course_instructors(CID): instructors_string = '' instructors = UsersCourses.select().where(UsersCourses.CID == CID) for instructor in instructors: - print instructor.username.username instructors_string += instructor.username.username return instructors_string diff --git a/app/logic/excelMaker.py b/app/logic/excelMaker.py old mode 100644 new mode 100755 index 66bf979..97c8b8f --- a/app/logic/excelMaker.py +++ b/app/logic/excelMaker.py @@ -1,10 +1,12 @@ import xlsxwriter from app.allImports import * import sys +from app.models import UsersCourses, Courses + def makeExcelFile(SEID): filename = "bcsr-{}-missing-syllabi.xlsx".format(SEID) - path = getAbsolutePath(cfg['fileOperations']['dataPaths']['tmp'],filename,False) + path = getAbsolutePath(cfg['fileOperations']['dataPaths']['tmp'], filename, False) workbook = xlsxwriter.Workbook(path) workbook.set_properties({ 'title': 'Missing Syllabi for {}'.format(SEID), diff --git a/app/logic/getAuthUser.py b/app/logic/getAuthUser.py old mode 100644 new mode 100755 index ef6f26d..ee6e1b4 --- a/app/logic/getAuthUser.py +++ b/app/logic/getAuthUser.py @@ -1,6 +1,7 @@ '''Any function that is related to user information or authentication should be located here''' from app.allImports import * +from app.models import Users class AuthorizedUser: def __init__(self): diff --git a/app/logic/getCourses.py b/app/logic/getCourses.py old mode 100644 new mode 100755 index 476f3e8..7550881 --- a/app/logic/getCourses.py +++ b/app/logic/getCourses.py @@ -13,7 +13,7 @@ def check_for_my_courses(self,SEID): try: temp_courses = UsersCourses.get(UsersCourses.username == self.username) my_courses = databaseInterface.grab_my_courses(self.username,SEID) - except DoesNotExist: + except Exception: # Using blanket exception, DoesNotExist no longer exists... my_courses = None return my_courses \ No newline at end of file diff --git a/app/logic/getSystemManagement.py b/app/logic/getSystemManagement.py old mode 100644 new mode 100755 index 157a81e..62f35cb --- a/app/logic/getSystemManagement.py +++ b/app/logic/getSystemManagement.py @@ -1,6 +1,7 @@ from app.allImports import * from app.logic import databaseInterface import time +from app.models import Semesters class GetSystemManagement(): '''Purpose: This class should hold any method directly related to @@ -31,7 +32,6 @@ def create_seid(self, data): @key -year => {string} @key -term => {integer} ''' - print 'inside create' year = data['year'] term_key = str(data['term']) #same year is a list of all term keys that go off the current year, @@ -42,8 +42,6 @@ def create_seid(self, data): seid = year + term_key else: seid = str(int(year)-1) + term_key - - print "This is the SEID: " + str(seid) return seid def add_semester(self, data): diff --git a/app/logic/getUploads.py b/app/logic/getUploads.py old mode 100644 new mode 100755 index 83a810a..864cb4c --- a/app/logic/getUploads.py +++ b/app/logic/getUploads.py @@ -54,7 +54,7 @@ def check_path_exist(self,path): os.makedirs(path) app.logger.info("Directories made: {0}".format(path)) except OSError as e: - print e.errno + print(e.errno) app.logger.error("Error making directories: {0}".format(e.errno)) pass return 0 diff --git a/app/logtool.py b/app/logtool.py old mode 100644 new mode 100755 index 32c3e35..a867bcc --- a/app/logtool.py +++ b/app/logtool.py @@ -6,10 +6,10 @@ class Log(): def __init__(self, logfile = 'urcpp.log'): - here = os.path.dirname(__file__) - self.logfile = os.path.join(os.path.join(here,logfile)) + here = os.path.dirname(__file__) + self.logfile = os.path.join(os.path.join(here,logfile)) self.lowPrivilege = "User does not have enough access privileges for this operation" - + def writer(self, level, page, message): envK = "HTTP_X_PROXY_REMOTE_USER" diff --git a/app/missingSyllabi.py b/app/missingSyllabi.py old mode 100644 new mode 100755 index 91700cc..fbb193e --- a/app/missingSyllabi.py +++ b/app/missingSyllabi.py @@ -1,9 +1,10 @@ -from allImports import * +from app.allImports import * from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url from app.logic.excelMaker import makeExcelFile from flask import send_file +from app.models import Semesters #Missing Syllabi @app.route("/admin/courseManagement/missingSyllabi", methods=["GET","POST"]) @@ -22,8 +23,7 @@ def missingSyllabi(): filePath = makeExcelFile(data['SEID']) return send_file(filePath,as_attachment=True) except Exception as e: - #TODO: Log e - print e + print(e) flash('Error occured while trying to prepare excel sheet. ') return redirect(url_for("missingSyllabi")) else: diff --git a/app/models.py b/app/models.py old mode 100644 new mode 100755 index e780330..3f12028 --- a/app/models.py +++ b/app/models.py @@ -74,6 +74,7 @@ class Courses (dbModel): SEID = ForeignKeyField(Semesters) filePath = TextField(null = True) lastModified = TextField(null = True) + courseMaterials = CharField(default = None) def __str__(self): return str(self.CID) diff --git a/app/programManagement.py b/app/programManagement.py old mode 100644 new mode 100755 index 2c4c72d..e513038 --- a/app/programManagement.py +++ b/app/programManagement.py @@ -1,6 +1,6 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser - +from app.models import Programs, Divisions, Users @app.route("/admin/programManagement/", methods=["GET", "POST"]) def adminProgramManagement(pid): diff --git a/app/redirectAdmin.py b/app/redirectAdmin.py old mode 100644 new mode 100755 index 0d697af..684342e --- a/app/redirectAdmin.py +++ b/app/redirectAdmin.py @@ -1,4 +1,5 @@ -from allImports import * +from app.allImports import * +from app.models import Programs, Divisions, Users @app.route("/redirect/program_management", methods=["GET"]) def redirectProgramManagement(): diff --git a/app/removeCourse.py b/app/removeCourse.py old mode 100644 new mode 100755 index 17d1252..565d99e --- a/app/removeCourse.py +++ b/app/removeCourse.py @@ -1,8 +1,10 @@ -from allImports import * +from app.allImports import * from app.logic import databaseInterface from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url from flask import json, jsonify +from app.models import Courses, Semesters, UsersCourses + def SEID_courses_dict(): dictionary = dict() @@ -63,4 +65,4 @@ def getJson(SEID): jsonStr = json.dumps(courseList) return jsonify(Courses=jsonStr) except Exception as e: - print str(e) + print(str(e)) diff --git a/app/static/js/local/courses.js b/app/static/js/local/courses.js old mode 100644 new mode 100755 index 5ae6cc8..56aac62 --- a/app/static/js/local/courses.js +++ b/app/static/js/local/courses.js @@ -57,3 +57,39 @@ function showCourses(program) { $('#coursesIcon-'+ program).toggleClass('glyphicon-plus') $('#coursesIcon-'+ program).toggleClass('glyphicon-minus') } + +var cid = 0; +$('input[type=checkbox]').change(function () { + cid = $(this).data("cid"); + //Ensures state of None Required and all the other checkboxes can't be in an impossible state + if($(this).prop('name') == "NoneRequired" && $(this).prop("checked")) { + console.log("Clicked none required"); + var courseCheckboxes = $("td#" +cid).find("input:checkbox"); + console.log(courseCheckboxes); + var first = true; + $(courseCheckboxes).each(function() { + console.log($(this)); + $(this).prop('checked', first); + if (first) { + first = false; + } + }); + } else if ($(this).prop("checked")) { + $("td#" +cid).find("input:checkbox#NoneRequired").prop("checked", false); + } + + //Submits the form + var rightForm = $("td#" +cid).find("form#courseMaterials"); + $.ajax({ + type: "POST", + url: rightForm.attr('action'), + data: rightForm.serialize(), // serializes the form's elements. + success: function(data) + { + } + }); +}); + +$('form#courseMaterials').submit(function(e){ + e.preventDefault(); +}); \ No newline at end of file diff --git a/app/systemManagement.py b/app/systemManagement.py old mode 100644 new mode 100755 index 61a6226..ee539aa --- a/app/systemManagement.py +++ b/app/systemManagement.py @@ -1,8 +1,9 @@ -from allImports import * +from app.allImports import * from app.logic.getAuthUser import AuthorizedUser from app.logic.redirectBack import redirect_url from app.logic.getSystemManagement import GetSystemManagement from app.logic import databaseInterface +from app.models import Semesters @app.route("/admin/systemManagement", methods=["GET", "POST"]) def systemManagement(): @@ -37,7 +38,7 @@ def addSemester(): #Class from logic folder system = GetSystemManagement() logList = system.add_semester(data) - print logList + print(logList) #TODO: figure out how to log log.writer(logList[0],page,logList[1]) flash(logList[1]) diff --git a/app/templates/admin/editSystem.html b/app/templates/admin/editSystem.html old mode 100644 new mode 100755 index ca00ae9..0d03ee1 --- a/app/templates/admin/editSystem.html +++ b/app/templates/admin/editSystem.html @@ -115,7 +115,7 @@

Add an Administrator

{# Remove Administrator Form #} {# Controller: editAdmin.py #} -
+

Remove an Administrator

diff --git a/app/templates/snips/coursesRows.html b/app/templates/snips/coursesRows.html old mode 100644 new mode 100755 index 3ad476e..f62813b --- a/app/templates/snips/coursesRows.html +++ b/app/templates/snips/coursesRows.html @@ -29,6 +29,34 @@ {% endif %} + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ {% if course.CID.lastModified == None %}

Course has not yet been modified.

diff --git a/app/templates/snips/footer.html b/app/templates/snips/footer.html old mode 100644 new mode 100755 index e260662..52e14ed --- a/app/templates/snips/footer.html +++ b/app/templates/snips/footer.html @@ -1,4 +1,4 @@ -