diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 000000000..d2eaf2cdb --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,15 @@ +{ + "ExpandedNodes": [ + "", + "\\server", + "\\server\\controllers", + "\\server\\templates", + "\\server\\templates\\staff", + "\\server\\templates\\staff\\course", + "\\server\\templates\\staff\\course\\assignment", + "\\server\\templates\\student", + "\\server\\templates\\student\\assignment" + ], + "SelectedNode": "\\server\\controllers\\admin.py", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/ok/v16/.suo b/.vs/ok/v16/.suo new file mode 100644 index 000000000..d945a6d86 Binary files /dev/null and b/.vs/ok/v16/.suo differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 000000000..b1fa00382 Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/server/controllers/admin.py b/server/controllers/admin.py index b615f4af3..5d6766257 100644 --- a/server/controllers/admin.py +++ b/server/controllers/admin.py @@ -563,6 +563,23 @@ def assignment(cid, aid): form=form, courses=courses, autograder_url=current_course.autograder_url, current_course=current_course) +@admin.route("/course//assignments", methods=['POST']) +@is_staff(course_arg='cid') +def delete_assignment(cid): + assign = Assignment.query.filter_by(id=request.args.get("aid"), course_id=cid).one_or_none() + if not assign: + return abort(404) + if not Assignment.can(assign, current_user, 'edit'): + flash('Insufficient permissions', 'error') + return abort(401) + form = forms.CSRFForm() + if form.validate_on_submit(): + Backup.query.filter_by(assignment=assign).delete() + db.session.delete(assign) + db.session.commit() + flash("Successfully deleted assignment", "success") + return redirect(url_for('.course_assignments', cid=cid)) + @admin.route("/course//assignments//stats") @is_staff(course_arg='cid') def assignment_stats(cid, aid): diff --git a/server/templates/staff/course/assignment/assignment.html b/server/templates/staff/course/assignment/assignment.html index 9f0503699..be5be917d 100644 --- a/server/templates/staff/course/assignment/assignment.html +++ b/server/templates/staff/course/assignment/assignment.html @@ -4,173 +4,227 @@ {% block title %} {{ assignment.display_name }} - {{ current_course.display_name_with_semester }}{% endblock %} {% block main %} -
-

+
+

{{ assignment.display_name }} {{ current_course.offering }} -

-

+ -
+ + - -
- {% include 'alerts.html' %} -
-
-
-
-

Info

-
- -
-
- -
+ +
+ {% include 'alerts.html' %} +
+
+
+
+

Info

+
+ +
+
+ +
-
-
+
+
-
{{ utils.local_time(assignment.due_date, current_course) }}
- Due Date +
{{ utils.local_time(assignment.due_date, current_course) }}
+ Due Date
-
-
+
+
{{ utils.local_time(assignment.lock_date, current_course) }}
Lock Date
-
- +
+ -
- - -
- -
-
+ + +
+ +
+ +
- -
-
+ +
+
-
-

Actions

+
+

Actions

-
- -
-
-
- -
- +
+
+
+ +
+
-
+
-
-
+
+
-

Edit {{ assignment.display_name }} Assignment

-
- -
+

Edit {{ assignment.display_name }} Assignment

+
+ +
{% call forms.render_form(form, action_url="", action_text='Update Assignment', class_='form') %} - {{ forms.render_field(form.display_name, label_visible=true, placeholder='Hog', type='text') }} - {{ forms.render_field(form.name, label_visible=true, placeholder='cal/cs61a/fa16/proj01', type='text') }} - {{ forms.render_field(form.max_group_size, label_visible=true, type='number', min='1') }} - {{ forms.render_field(form.due_date, label_visible=true, placeholder=utils.new_due_date(current_course), type='text', class='form-control datetime-picker') }} - {{ forms.render_field(form.lock_date, label_visible=true, placeholder=utils.new_lock_date(current_course), type='text', class='form-control datetime-picker') }} - {{ forms.render_field(form.url, label_visible=true, placeholder='http://cs61a.org/proj/hog/ (Optional)', type='text') }} - {{ forms.render_checkbox_field(form.visible, label_visible=true) }} - {{ forms.render_field(form.autograding_key, label_visible=true, placeholder='5abc... (Optional)', type='text') }} - {{ forms.render_checkbox_field(form.continuous_autograding, label_visible=true) }} - {{ forms.render_checkbox_field(form.revisions_allowed, label_visible=true) }} - {{ forms.render_checkbox_field(form.uploads_enabled, label_visible=true) }} - {{ forms.render_field(form.upload_info, label_visible=true, placeholder='Upload the following files: test.py', type='text') }} + {{ forms.render_field(form.display_name, label_visible=true, placeholder='Hog', type='text') }} + {{ forms.render_field(form.name, label_visible=true, placeholder='cal/cs61a/fa16/proj01', type='text') }} + {{ forms.render_field(form.max_group_size, label_visible=true, type='number', min='1') }} + {{ forms.render_field(form.due_date, label_visible=true, placeholder=utils.new_due_date(current_course), type='text', class='form-control datetime-picker') }} + {{ forms.render_field(form.lock_date, label_visible=true, placeholder=utils.new_lock_date(current_course), type='text', class='form-control datetime-picker') }} + {{ forms.render_field(form.url, label_visible=true, placeholder='http://cs61a.org/proj/hog/ (Optional)', type='text') }} + {{ forms.render_checkbox_field(form.visible, label_visible=true) }} + {{ forms.render_field(form.autograding_key, label_visible=true, placeholder='5abc... (Optional)', type='text') }} + {{ forms.render_checkbox_field(form.continuous_autograding, label_visible=true) }} + {{ forms.render_checkbox_field(form.revisions_allowed, label_visible=true) }} + {{ forms.render_checkbox_field(form.uploads_enabled, label_visible=true) }} + {{ forms.render_field(form.upload_info, label_visible=true, placeholder='Upload the following files: test.py', type='text') }} {% endcall %}
-
-
+
+
- -{% endblock %} + + {% endblock %}