|
1 | 1 | import json |
2 | | -import os |
3 | | - |
4 | 2 | import requests |
| 3 | +<<<<<<< HEAD |
5 | 4 | import boto3 |
| 5 | +======= |
| 6 | +>>>>>>> parent of d5f968b (S3 support added) |
6 | 7 |
|
7 | 8 | from flask import Blueprint |
8 | 9 | from flask import request |
|
12 | 13 | from sqlalchemy import desc |
13 | 14 |
|
14 | 15 | import structlog |
15 | | -from werkzeug.utils import secure_filename |
16 | 16 |
|
17 | 17 | from conditional.util.context_processors import get_member_name |
18 | 18 |
|
|
26 | 26 |
|
27 | 27 | logger = structlog.get_logger() |
28 | 28 |
|
29 | | -major_project_bp = Blueprint('major_project_bp', __name__) |
| 29 | +major_project_bp = Blueprint("major_project_bp", __name__) |
30 | 30 |
|
31 | 31 |
|
32 | | -@major_project_bp.route('/major_project/') |
| 32 | +@major_project_bp.route("/major_project/") |
33 | 33 | @auth.oidc_auth("default") |
34 | 34 | @get_user |
35 | 35 | def display_major_project(user_dict=None): |
36 | 36 | log = logger.new(request=request, auth_dict=user_dict) |
37 | | - log.info('Display Major Project Page') |
| 37 | + log.info("Display Major Project Page") |
38 | 38 |
|
39 | 39 | major_projects = [ |
40 | 40 | { |
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))] |
| 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 | + } |
| 49 | + for p in MajorProject.query.filter( |
| 50 | + MajorProject.date > start_of_year() |
| 51 | + ).order_by(desc(MajorProject.id)) |
| 52 | + ] |
52 | 53 |
|
53 | 54 | major_projects_len = len(major_projects) |
54 | 55 | # 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 | | - |
67 | | - |
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 |
82 | | - |
83 | | - |
84 | | - |
85 | | -@major_project_bp.route('/major_project/submit', methods=['POST']) |
| 56 | + return render_template( |
| 57 | + "major_project_submission.html", |
| 58 | + major_projects=major_projects, |
| 59 | + major_projects_len=major_projects_len, |
| 60 | + username=user_dict["username"], |
| 61 | + ) |
| 62 | + |
| 63 | +@major_project_bp.route("/major_project/submit", methods=["POST"]) |
86 | 64 | @auth.oidc_auth("default") |
87 | 65 | @get_user |
88 | 66 | def submit_major_project(user_dict=None): |
89 | 67 | log = logger.new(request=request, auth_dict=user_dict) |
90 | | - log.info('Submit Major Project') |
| 68 | + log.info("Submit Major Project") |
91 | 69 |
|
92 | 70 | 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) |
| 71 | + name = post_data["projectName"] |
| 72 | + description = post_data["projectDescription"] |
103 | 73 |
|
104 | | - if name == "" or len(description.strip().split()) < 50: # check for 50 word minimum |
| 74 | + if name == "" or description == "": |
105 | 75 | return jsonify({"success": False}), 400 |
106 | | - project = MajorProject(user_id, name, tldr, time_spent, description) |
| 76 | + project = MajorProject(user_dict["username"], name, description) |
107 | 77 |
|
| 78 | + username = user_dict['username'] |
| 79 | + send_slack_ping({"text":f"<!subteam^S5XENJJAH> *{get_member_name(username)}* ({username})" |
| 80 | + f" submitted their major project, *{name}*!"}) |
108 | 81 | db.session.add(project) |
109 | 82 | 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 | | - |
134 | 83 | return jsonify({"success": True}), 200 |
135 | 84 |
|
136 | 85 |
|
137 | | -@major_project_bp.route('/major_project/review', methods=['POST']) |
| 86 | +@major_project_bp.route("/major_project/review", methods=["POST"]) |
138 | 87 | @auth.oidc_auth("default") |
139 | 88 | @get_user |
140 | 89 | def major_project_review(user_dict=None): |
141 | 90 | log = logger.new(request=request, auth_dict=user_dict) |
142 | 91 |
|
143 | | - if not ldap_is_eval_director(user_dict['account']): |
| 92 | + if not ldap_is_eval_director(user_dict["account"]): |
144 | 93 | return redirect("/dashboard", code=302) |
145 | 94 |
|
146 | 95 | post_data = request.get_json() |
147 | | - pid = post_data['id'] |
148 | | - status = post_data['status'] |
| 96 | + pid = post_data["id"] |
| 97 | + status = post_data["status"] |
149 | 98 |
|
150 | | - log.info(f'{status} Major Project ID: {pid}') |
| 99 | + log.info(f"{status} Major Project ID: {pid}") |
151 | 100 |
|
152 | 101 | print(post_data) |
153 | | - MajorProject.query.filter( |
154 | | - MajorProject.id == pid). \ |
155 | | - update( |
156 | | - { |
157 | | - 'status': status |
158 | | - }) |
| 102 | + MajorProject.query.filter(MajorProject.id == pid).update({"status": status}) |
159 | 103 | db.session.flush() |
160 | 104 | db.session.commit() |
161 | 105 | return jsonify({"success": True}), 200 |
162 | 106 |
|
163 | 107 |
|
164 | | -@major_project_bp.route('/major_project/delete/<pid>', methods=['DELETE']) |
| 108 | +@major_project_bp.route("/major_project/delete/<pid>", methods=["DELETE"]) |
165 | 109 | @auth.oidc_auth("default") |
166 | 110 | @get_user |
167 | 111 | def major_project_delete(pid, user_dict=None): |
168 | 112 | log = logger.new(request=request, auth_dict=user_dict) |
169 | | - log.info(f'Delete Major Project ID: {pid}') |
| 113 | + log.info(f"Delete Major Project ID: {pid}") |
170 | 114 |
|
171 | | - major_project = MajorProject.query.filter( |
172 | | - MajorProject.id == pid |
173 | | - ).first() |
| 115 | + major_project = MajorProject.query.filter(MajorProject.id == pid).first() |
174 | 116 | creator = major_project.uid |
175 | 117 |
|
176 | | - if creator == user_dict['username'] or ldap_is_eval_director(user_dict['account']): |
177 | | - MajorProject.query.filter( |
178 | | - MajorProject.id == pid |
179 | | - ).delete() |
| 118 | + if creator == user_dict["username"] or ldap_is_eval_director(user_dict["account"]): |
| 119 | + MajorProject.query.filter(MajorProject.id == pid).delete() |
180 | 120 | db.session.flush() |
181 | 121 | db.session.commit() |
182 | 122 | return jsonify({"success": True}), 200 |
183 | 123 |
|
184 | 124 | return "Must be project owner to delete!", 401 |
185 | 125 |
|
| 126 | + |
186 | 127 | def send_slack_ping(payload): |
187 | | - requests.post(app.config['WEBHOOK_URL'], json.dumps(payload), timeout=120) |
| 128 | + requests.post(app.config["WEBHOOK_URL"], json.dumps(payload), timeout=120) |
0 commit comments