Assignment Handout

Contributors: Alicia Wang, Conner Swenberg

Assignment Scope

Due Date: Wednesday 4/24, 11:59pm

You will be building a CMS-style classroom manager. You will need to assign instructors to courses to manage assignments as well as students.

1. Download Starter Code

We have provided the starting files you will need to complete this assignment for your convenience. This also simplifies your submission by just having to zip this same folder.

2. Implement API Specification

We have shown you how to use the Flask framework to set up routes and respond to network requests. Your assignment is to implement a series of routes following the provided specification for responding to sample requests. This assignment has 7 routes for you to implement. If you are struggling with the assignment, we recommend referring to the Demo to see a concrete example.

pageAPI Specification

3. Submit Assignment

3a. Fill out your README.txt

A README.txt file is included in the starter code for you to fill out after completing the assignment. Also note that you will not receive extra credit for extra credit challenges you complete if you do not let us know for when we grade!

README.txt
Name: Jane Smith
NetID: js123

Challenges Attempted: <all the Tiers you completed here>

3b. Make sure you have proper Python styling in your code

Common mistakes in styling are:

  • NOT HAVING documentation/comments in each of your methods

  • Naming variables with CamelCase instead of snake_case

  • Too much/too little empty spaces/empty lines

  • Leaving in commented code

3c. Verify your routes using Postman Tests and submit an exported JSON of them

Take some time looking through the guide to learn how to make tests using Postman. You should submit your Postman collection along with your CMS submission. The best way to get full credit for your tests is to ensure that you check that the response from your API matches what the API specification is expecting to receive. Please make sure that all your tests pass when we run your collection (make sure to clear your database before running to ensure you get the result we will get).

While that should be enough to get full credit, your tests can be cleaner and easier to change if you use variables or environments. It's up to you how much you want to learn and incorporate into your tests - the better you get at it the easier the assignments will be in the future and the likelier your API will pass the test cases we release on the first try.

If you'd prefer to learn how to use Postman through a video, here is a link to everything you'll need to know for this class; however, the audio quality is quite poor due to a technical error. If you think you would benefit from a re-recording of a Postman demo, indicate that on the feedback form and we will be happy to record one.

3d. Zip and submit your assignment files

Next, zip the starter folder and submit on CMS. For reference, your directory structure should look like the following:

pa4/
 |-README.txt
 |-postman_collection.json
 |-src/
    |-app.py
    |-db.py
    |-requirements.txt

For clarification, this means that you SHOULD NOT include your virtual environment, pycache, or .db file in your final submission. Doing so will lose you a few points on the project.

3e. Submit Feedback Form

To receive credit for your assignment, you must fill out the feedback form so that we can better understand how effectively we are teaching and how long students are spending on assignments.

Optional Challenges

Tier I

+1 point

Additional Routes

Add the following routes:

Drop a student from a course: /api/courses/{course_id}/drop/

  • Post body: {"user_id": <USER INPUT>}

  • Return:

    • {"error": "Course not found"}

    • {"error": "User not found"}

    • {"error": "User has not been added to this course"}

    • {<SERIALIZED USER>}

Update an assignment: /api/assignments/{assignment_id}/

  • Post body: new values for title, due_date, or both

  • Return:

    • {"error": "Assignment not found"}

    • {<UPDATED ASSIGNMENT>}

Tier II

+1 points +1 point more if Tier I completed

Grading Submissions

Add a Submission model and functionality to allow instructors to assign numeric grades to students’ submissions. Note: For now, the content of the submission is arbitrary and you can just use a text field "content". This includes the following routes:

Submit an assignment: /api/assignments/{assignment_id}/submit/

  • Post Body: {"user_id": <USER INPUT>, "content": <USER INPUT>}

  • Return:

    • {"error": "Assignment not found"}

    • {"error": "User not found"}

    • {"error": "User does not have this assignment"}

    • {<SERIALIZED SUBMISSION>}

Grade an assignment: /api/assignments/{assignment_id}/grade/

  • Post Body: {"submission_id": <USER INPUT>, "score": <USER INPUT>}

  • Return:

    • {"error": "Assignment not found"}

    • {"error": "Submission not found"}

    • {"error": "Submission does not match this assignment"}

    • {<SERIALIZED SUBMISSION>}

Tier III

+2 points +1 point more if Tier I & II completed

Submission File Uploads

Extend your submission functionality with real file uploads. Set up an Amazon Web Services account and connect to the S3 service using the boto3 package. You will need to learn how to set up your own AWS account, and successfully connect to S3 buckets.

Recommended approach: Use the same submit/ route as in Tier II, but change your request body type in postman from raw JSON to form-data. The form-data body type allows you to send a combination of files and text data in the same request. Upon receiving the request, parse the uploaded file from the request and send them as a payload to S3 using boto3. The boto3 methods will return you a string URL of where the file was stored. Save this URL in the content field of your submission. You can test if the file upload worked correctly by copying this link into your browser → the file should download and appear.

Total Points to Gain: 6

Last updated