Skip to content

Commit 992fd00

Browse files
committed
Reduced duplicate code byt moving helper funcs to utils
1 parent 52492de commit 992fd00

4 files changed

Lines changed: 59 additions & 65 deletions

File tree

conditional/blueprints/dashboard.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
from sqlalchemy import desc, func
21
import structlog
32
from flask import Blueprint, request
43

5-
from conditional import db, start_of_year, auth
6-
from conditional.models.models import Conditional, MajorProjectSkill
4+
from conditional import start_of_year, auth
5+
from conditional.models.models import Conditional
76
from conditional.models.models import HouseMeeting
8-
from conditional.models.models import MajorProject
97
from conditional.models.models import MemberHouseMeetingAttendance
108
from conditional.models.models import MemberSeminarAttendance
119
from conditional.models.models import TechnicalSeminar
1210
from conditional.models.models import SpringEval
1311
from conditional.util.auth import get_user
1412
from conditional.util.flask import render_template
1513
from conditional.util.housing import get_queue_position
14+
from conditional.util.major_project import get_project_list
1615
from conditional.util.member import gatekeep_values, get_active_members, get_freshman_data, get_voting_members, \
1716
get_cm, get_hm, is_gatekeep_active, req_cm
1817
from conditional.util.user_dict import user_dict_is_active, user_dict_is_bad_standing, user_dict_is_intromember, \
@@ -83,22 +82,7 @@ def display_dashboard(user_dict=None):
8382

8483
data['housing'] = housing
8584

86-
proj_list = db.session.query(
87-
MajorProject.id,
88-
MajorProject.date,
89-
MajorProject.uid,
90-
MajorProject.name,
91-
MajorProject.tldr,
92-
MajorProject.time_spent,
93-
MajorProject.description,
94-
MajorProject.links,
95-
MajorProject.status,
96-
func.array_agg(MajorProjectSkill.skill).label("skills")
97-
).outerjoin(MajorProjectSkill,
98-
MajorProject.id == MajorProjectSkill.project_id
99-
).group_by(MajorProject.id
100-
).where(MajorProject.date >= start_of_year()
101-
).order_by(desc(MajorProject.date), desc(MajorProject.id))
85+
proj_list = get_project_list()
10286

10387
data['major_projects'] = [
10488
{

conditional/blueprints/major_project_submission.py

Lines changed: 5 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,29 @@
77
from flask import jsonify
88
from flask import redirect
99

10-
import botocore
1110
import requests
1211
import boto3
1312
import structlog
1413

15-
from sqlalchemy import func, desc
1614
from 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
1917
from conditional.models.models import MajorProject
2018
from conditional.models.models import MajorProjectSkill
2119

2220
from conditional.util.context_processors import get_member_name
2321
from conditional.util.ldap import ldap_get_member
2422
from conditional.util.flask import render_template
23+
from conditional.util.s3 import list_files_in_folder
2524
from conditional.util.user_dict import user_dict_is_eval_director
25+
from conditional.util.major_project import get_project_list
2626

2727
collections.Callable = collections.abc.Callable
2828

2929
logger = structlog.get_logger()
3030

3131
major_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})"

conditional/util/major_project.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from sqlalchemy import desc, func
2+
3+
from conditional import db, start_of_year
4+
from conditional.models.models import MajorProject
5+
from conditional.models.models import MajorProjectSkill
6+
7+
8+
def get_project_list():
9+
proj_list = db.session.query(
10+
MajorProject.id,
11+
MajorProject.date,
12+
MajorProject.uid,
13+
MajorProject.name,
14+
MajorProject.tldr,
15+
MajorProject.time_spent,
16+
MajorProject.description,
17+
MajorProject.links,
18+
MajorProject.status,
19+
func.array_agg(MajorProjectSkill.skill).label("skills")
20+
).outerjoin(MajorProjectSkill,
21+
MajorProject.id == MajorProjectSkill.project_id
22+
).group_by(MajorProject.id
23+
).where(MajorProject.date >= start_of_year()
24+
).order_by(desc(MajorProject.date), desc(MajorProject.id))
25+
26+
return proj_list

conditional/util/s3.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import boto3
2+
import botocore
3+
from flask import app
4+
5+
6+
def list_files_in_folder(bucket_name, folder_prefix):
7+
8+
s3 = boto3.client(
9+
service_name="s3",
10+
aws_access_key_id=app.config['AWS_ACCESS_KEY_ID'],
11+
aws_secret_access_key=app.config['AWS_SECRET_ACCESS_KEY'],
12+
endpoint_url=app.config['S3_URI']
13+
)
14+
15+
try:
16+
response = s3.list_objects(Bucket=bucket_name, Prefix=folder_prefix)
17+
if 'Contents' in response:
18+
return [obj['Key'] for obj in response['Contents']]
19+
20+
return []
21+
22+
except botocore.exceptions.ClientError as e:
23+
print(f"Error listing files in the folder: {e}")
24+
return []

0 commit comments

Comments
 (0)