Skip to content

Commit b8fd20c

Browse files
authored
Revert @tallen42's work on the major project form (#410)
1 parent 70110fb commit b8fd20c

File tree

13 files changed

+615
-789
lines changed

13 files changed

+615
-789
lines changed
Lines changed: 47 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import json
2-
import os
3-
42
import requests
5-
import boto3
63

74
from flask import Blueprint
85
from flask import request
@@ -12,7 +9,6 @@
129
from sqlalchemy import desc
1310

1411
import structlog
15-
from werkzeug.utils import secure_filename
1612

1713
from conditional.util.context_processors import get_member_name
1814

@@ -26,162 +22,108 @@
2622

2723
logger = structlog.get_logger()
2824

29-
major_project_bp = Blueprint('major_project_bp', __name__)
25+
major_project_bp = Blueprint("major_project_bp", __name__)
3026

3127

32-
@major_project_bp.route('/major_project/')
28+
@major_project_bp.route("/major_project/")
3329
@auth.oidc_auth("default")
3430
@get_user
3531
def display_major_project(user_dict=None):
3632
log = logger.new(request=request, auth_dict=user_dict)
37-
log.info('Display Major Project Page')
33+
log.info("Display Major Project Page")
3834

3935
major_projects = [
4036
{
41-
'username': p.uid,
42-
'name': ldap_get_member(p.uid).cn,
43-
'proj_name': p.name,
44-
'status': p.status,
45-
'description': p.description,
46-
'id': p.id,
47-
'is_owner': bool(user_dict['username'] == p.uid)
48-
} for p in
49-
MajorProject.query.filter(
50-
MajorProject.date > start_of_year()).order_by(
51-
desc(MajorProject.id))]
37+
"username": p.uid,
38+
"name": ldap_get_member(p.uid).cn,
39+
"proj_name": p.name,
40+
"status": p.status,
41+
"description": p.description,
42+
"id": p.id,
43+
"is_owner": bool(user_dict["username"] == p.uid),
44+
}
45+
for p in MajorProject.query.filter(
46+
MajorProject.date > start_of_year()
47+
).order_by(desc(MajorProject.id))
48+
]
5249

5350
major_projects_len = len(major_projects)
5451
# return names in 'first last (username)' format
55-
return render_template('major_project_submission.html',
56-
major_projects=major_projects,
57-
major_projects_len=major_projects_len,
58-
username=user_dict['username'])
59-
60-
@major_project_bp.route('/major_project/upload', methods=['POST'])
61-
@auth.oidc_auth("default")
62-
@get_user
63-
def upload_major_project_files(user_dict=None):
64-
log = logger.new(request=request, auth_dict=user_dict)
65-
log.info('Uploading Major Project File(s)')
66-
52+
return render_template(
53+
"major_project_submission.html",
54+
major_projects=major_projects,
55+
major_projects_len=major_projects_len,
56+
username=user_dict["username"],
57+
)
6758

68-
if len(list(request.files.keys())) < 1:
69-
return "No file", 400
70-
71-
# Temporarily save files to a place, to be uploaded on submit
72-
73-
for _, file in request.files.lists():
74-
file = file[0] # remove it from the list because this is not the best
75-
safe_name = secure_filename(file.filename)
76-
filename = f"/tmp/{user_dict['username']}/{safe_name}"
77-
78-
os.makedirs(os.path.dirname(filename), exist_ok=True)
79-
file.save(filename)
80-
81-
return jsonify({"success": True}), 200
8259

83-
84-
85-
@major_project_bp.route('/major_project/submit', methods=['POST'])
60+
@major_project_bp.route("/major_project/submit", methods=["POST"])
8661
@auth.oidc_auth("default")
8762
@get_user
8863
def submit_major_project(user_dict=None):
8964
log = logger.new(request=request, auth_dict=user_dict)
90-
log.info('Submit Major Project')
65+
log.info("Submit Major Project")
9166

9267
post_data = request.get_json()
93-
print(post_data)
94-
name = post_data['projectName']
95-
tldr = post_data['projectTldr']
96-
time_spent = post_data['projectTimeSpent']
97-
skills = post_data['projectSkills']
98-
description = post_data['projectDescription']
99-
100-
user_id = user_dict['username']
101-
102-
print(skills)
68+
name = post_data["projectName"]
69+
description = post_data["projectDescription"]
10370

104-
if name == "" or len(description.strip().split()) < 50: # check for 50 word minimum
71+
if name == "" or description == "":
10572
return jsonify({"success": False}), 400
106-
project = MajorProject(user_id, name, tldr, time_spent, description)
73+
project = MajorProject(user_dict["username"], name, description)
10774

75+
username = user_dict["username"]
76+
send_slack_ping(
77+
{
78+
"text": f"<!subteam^S5XENJJAH> *{get_member_name(username)}* ({username})"
79+
f" submitted their major project, *{name}*!"
80+
}
81+
)
10882
db.session.add(project)
10983
db.session.commit()
110-
111-
# This allows us to get a project with a database ID
112-
project = MajorProject.query.filter(
113-
MajorProject.name == name and MajorProject.uid == user_id
114-
).first()
115-
116-
if project is None:
117-
return jsonify({"success": False}), 500
118-
119-
# Don't send slack ping until after we are sure the DB worked fine
120-
send_slack_ping({"text":f"<!subteam^S5XENJJAH> *{get_member_name(user_id)}* ({user_id})"
121-
f" submitted their major project, *{name}*!"})
122-
123-
# Acquire S3 Bucket instance
124-
s3 = boto3.resource("s3", endpoint_url="https://s3.csh.rit.edu")
125-
bucket = s3.create_bucket(Bucket="major-project-media")
126-
# Collect all the locally cached files and put them in the bucket
127-
for file in os.listdir(f"/tmp/{user_id}"):
128-
filepath = f"/tmp/{user_id}/{file}"
129-
print(filepath)
130-
bucket.upload_file(filepath, f"{project.id}-{file}")
131-
os.remove(filepath)
132-
os.rmdir(f"/tmp/{user_id}")
133-
13484
return jsonify({"success": True}), 200
13585

13686

137-
@major_project_bp.route('/major_project/review', methods=['POST'])
87+
@major_project_bp.route("/major_project/review", methods=["POST"])
13888
@auth.oidc_auth("default")
13989
@get_user
14090
def major_project_review(user_dict=None):
14191
log = logger.new(request=request, auth_dict=user_dict)
14292

143-
if not ldap_is_eval_director(user_dict['account']):
93+
if not ldap_is_eval_director(user_dict["account"]):
14494
return redirect("/dashboard", code=302)
14595

14696
post_data = request.get_json()
147-
pid = post_data['id']
148-
status = post_data['status']
97+
pid = post_data["id"]
98+
status = post_data["status"]
14999

150-
log.info(f'{status} Major Project ID: {pid}')
100+
log.info(f"{status} Major Project ID: {pid}")
151101

152102
print(post_data)
153-
MajorProject.query.filter(
154-
MajorProject.id == pid). \
155-
update(
156-
{
157-
'status': status
158-
})
103+
MajorProject.query.filter(MajorProject.id == pid).update({"status": status})
159104
db.session.flush()
160105
db.session.commit()
161106
return jsonify({"success": True}), 200
162107

163108

164-
@major_project_bp.route('/major_project/delete/<pid>', methods=['DELETE'])
109+
@major_project_bp.route("/major_project/delete/<pid>", methods=["DELETE"])
165110
@auth.oidc_auth("default")
166111
@get_user
167112
def major_project_delete(pid, user_dict=None):
168113
log = logger.new(request=request, auth_dict=user_dict)
169-
log.info(f'Delete Major Project ID: {pid}')
114+
log.info(f"Delete Major Project ID: {pid}")
170115

171-
major_project = MajorProject.query.filter(
172-
MajorProject.id == pid
173-
).first()
116+
major_project = MajorProject.query.filter(MajorProject.id == pid).first()
174117
creator = major_project.uid
175118

176-
if creator == user_dict['username'] or ldap_is_eval_director(user_dict['account']):
177-
MajorProject.query.filter(
178-
MajorProject.id == pid
179-
).delete()
119+
if creator == user_dict["username"] or ldap_is_eval_director(user_dict["account"]):
120+
MajorProject.query.filter(MajorProject.id == pid).delete()
180121
db.session.flush()
181122
db.session.commit()
182123
return jsonify({"success": True}), 200
183124

184125
return "Must be project owner to delete!", 401
185126

127+
186128
def send_slack_ping(payload):
187-
requests.post(app.config['WEBHOOK_URL'], json.dumps(payload), timeout=120)
129+
requests.post(app.config["WEBHOOK_URL"], json.dumps(payload), timeout=120)

conditional/models/models.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,16 @@ class MajorProject(db.Model):
134134
date = Column(Date, nullable=False)
135135
uid = Column(String(32), nullable=False)
136136
name = Column(String(64), nullable=False)
137-
tldr = Column(String(128), nullable=False)
138-
time = Column(Text, nullable=False)
139-
description = Column(Text, nullable=False)
137+
description = Column(Text)
140138
active = Column(Boolean, nullable=False)
141139
status = Column(Enum('Pending', 'Passed', 'Failed',
142140
name="major_project_enum"),
143141
nullable=False)
144142

145-
def __init__(self, uid, name, tldr, time, desc): # pylint: disable=too-many-positional-arguments,redefined-outer-name
143+
def __init__(self, uid, name, desc):
146144
self.uid = uid
147145
self.date = datetime.now()
148146
self.name = name
149-
self.tldr = tldr
150-
self.time = time
151147
self.description = desc
152148
self.status = 'Pending'
153149
self.active = True

0 commit comments

Comments
 (0)