77from flask import jsonify
88from flask import redirect
99
10- import botocore
1110import requests
1211import boto3
1312import structlog
1413
15- from sqlalchemy import func , desc
1614from werkzeug .utils import secure_filename
1715
18- from conditional import db , start_of_year , get_user , auth , app
16+ from conditional import db , get_user , auth , app
1917from conditional .models .models import MajorProject
2018from conditional .models .models import MajorProjectSkill
2119
2220from conditional .util .context_processors import get_member_name
2321from conditional .util .ldap import ldap_get_member
2422from conditional .util .flask import render_template
23+ from conditional .util .s3 import list_files_in_folder
2524from conditional .util .user_dict import user_dict_is_eval_director
25+ from conditional .util .major_project import get_project_list
2626
2727collections .Callable = collections .abc .Callable
2828
2929logger = structlog .get_logger ()
3030
3131major_project_bp = Blueprint ("major_project_bp" , __name__ )
3232
33- def list_files_in_folder (bucket_name , folder_prefix ):
34-
35- s3 = boto3 .client (
36- service_name = "s3" ,
37- aws_access_key_id = app .config ['AWS_ACCESS_KEY_ID' ],
38- aws_secret_access_key = app .config ['AWS_SECRET_ACCESS_KEY' ],
39- endpoint_url = app .config ['S3_URI' ]
40- )
41-
42- try :
43- response = s3 .list_objects (Bucket = bucket_name , Prefix = folder_prefix )
44- if 'Contents' in response :
45- return [obj ['Key' ] for obj in response ['Contents' ]]
46-
47- return []
48-
49- except botocore .exceptions .ClientError as e :
50- print (f"Error listing files in the folder: { e } " )
51- return []
52-
5333@major_project_bp .route ("/major_project/" )
5434@auth .oidc_auth ("default" )
5535@get_user
@@ -58,23 +38,7 @@ def display_major_project(user_dict=None):
5838 log .info ("Display Major Project Page" )
5939
6040 # There is probably a better way to do this, but it does work
61-
62- proj_list = db .session .query (
63- MajorProject .id ,
64- MajorProject .date ,
65- MajorProject .uid ,
66- MajorProject .name ,
67- MajorProject .tldr ,
68- MajorProject .time_spent ,
69- MajorProject .description ,
70- MajorProject .links ,
71- MajorProject .status ,
72- func .array_agg (MajorProjectSkill .skill ).label ("skills" )
73- ).outerjoin (MajorProjectSkill ,
74- MajorProject .id == MajorProjectSkill .project_id
75- ).group_by (MajorProject .id
76- ).where (MajorProject .date >= start_of_year ()
77- ).order_by (desc (MajorProject .date ), desc (MajorProject .id ))
41+ proj_list = get_project_list ()
7842
7943 bucket = app .config ['S3_BUCKET_ID' ]
8044
@@ -104,6 +68,7 @@ def display_major_project(user_dict=None):
10468 major_projects = major_projects ,
10569 major_projects_len = major_projects_len ,
10670 username = user_dict ["username" ])
71+
10772@major_project_bp .route ("/major_project/upload" , methods = ["POST" ])
10873@auth .oidc_auth ("default" )
10974@get_user
@@ -115,7 +80,6 @@ def upload_major_project_files(user_dict=None):
11580 return "No file" , 400
11681
11782 # Temporarily save files to a place, to be uploaded on submit
118-
11983 for _ , file in request .files .lists ():
12084 file = file [0 ]
12185 safe_name = secure_filename (file .filename )
@@ -149,7 +113,6 @@ def submit_major_project(user_dict=None):
149113 log .info (user_id )
150114
151115 # All fields are required in order to be able to submit the form
152- # TODO: Do we want any of the fields to have enforced min or max lengths?
153116 if not name or not tldr or not time_spent or not description :
154117 return jsonify ({"success" : False }), 400
155118
@@ -159,8 +122,6 @@ def submit_major_project(user_dict=None):
159122 db .session .add (project )
160123 db .session .commit ()
161124
162-
163- # project_id = project.id
164125 project = MajorProject .query .filter (
165126 MajorProject .name == name ,
166127 MajorProject .uid == user_id
@@ -205,7 +166,6 @@ def submit_major_project(user_dict=None):
205166
206167
207168 # Send the slack ping only after we know that the data was properly saved to the DB
208- # TODO: Maybe add more info to the slack ping?
209169 send_slack_ping (
210170 {
211171 "text" : f"<!subteam^S5XENJJAH> *{ get_member_name (user_id )} * ({ user_id } )"
0 commit comments