Homework 3 Solution






Bottle: Python Web Framework


Install the Bottle Python web framework, following the instructions here:



Check to make sure your Python installation has sqlite3 installed.




If you need to install Python, consider using the Anaconda distribution or the Miniconda environment manager:






Use your favorite text editor or IDE. If you don’t have one, give Visual Studio Code a try:



You can point Visual Studio Code toward the Python environment you want to use for your application following the instructions here:





Build a website along the lines of the prior homework assignments using the Bottle framework.


Optimize your website for underpowered clients with limited power and computing resources; minimize your use of JavaScript use (client side) and maximize the work done on the server side.


Your Bottle website supports five routes:


/index: displays the home page


/list: displays the todo list


/new: displays a form for entering a new task (todo list item)


/edit/<id:int>: displays form for editing the task (todo list item) with key id, prepopulated with the current values





/delete/<id:int>: deletes the task (todo list item) with key id.




Store your tasks in an sqlite3 data base todo.db which consists of a table task with the following attributes:


Attribute Type & Constraints
id INTEGER primary key
title TEXT
description TEXT
posted DATE
due DATE
updated DATE
status BOOL (i.e. 0 or 1)



Instead of DATE you may also use DATETIME;


For SQL datatypes as defined by major relational databases, see




You may want to use a tool like DB Browser for SQLite to inspect and modify your database for test purposes.





The /index route displays the home page of the site. You may use your homepage from hw2. Make sure the home page allows for navigation to the todo list page (via the /list route).




This route displays the todo list, showing for each task its title, description, and the posted, last updated, and due date.


Associate with each list item an Edit and Delete button, which when clicked will generate a request along the /edit and /delete route, respectively.


Note: In both cases you will need to communicate the task id for the task to be edited or deleted to the backend. The task id should not be visible to the user, but it must be part of the todo list document as a hidden component.


This page also needs to provide an New Task button, which when clicked will display a form for entering a new task (via the /new route).


The user will be able to sort the list by posted, last updated, and due date, and filter it for completed or incomplete tasks. By default, the list is ordered by posted date, and unfiltered, i.e. all tasks, completed or incomplete, are shown. Any re-display of the todo list preserves the most recent sort and filter settings.



In keeping with our design goal of optimizing for resource-constrained clients, all re-ordering and filtering is done on the server.


Hint: Consider including a hidden form in your document whose input fields record the sorting and filtering settings. Click event handlers can modify the input values of the form, set the action required, and submit the form to prompt the needed action on the server.




The response to a request along this route displays a form with fields for the task attributes title, description, and due date.


When the form is submitted, the posted and updated date will be set to the current date/time, and the status is initially false (0). After storing the new task in the database, the todo list will be re-displayed (as per the most recent sort and filter settings).


Hint: You can have the database do the work for you by constructing a query that performs the sorting and filtering required.




The response to a request along this route displays a form in which all current task attributes are visible except for the task id. The posted and updated are visible but not modifiable.


When the form is submitted, the updated date will be set to the current time/date. After updating the task in the database, the todo list will be re-displayed (as per the most recent sort and filter settings).




This request will delete the task with key id from the database, and then re-display the todo list (as per the most recent sort and filter settings).




Make the header read “cmps183: Homework 3”.



File organization


Folder structure:


  1. Put the html files in folder called cmps183hw3.
  2. Define your routes and endpoint functions in a file py.
  3. Include your sqlite3 database db; it should contain at least 6 tasks.
  4. Put your templates in a subfolder called templates.
  5. Put your css files in a subfolder called css.
  6. Put your javascript files in subfolder called scripts.


  1. Put your pictures in a folder called images.


Keep this folder structure in mind when you define hyperlinks in your html files.



Submission instructions


  • Create a zip file for folder cmps183hw3.


  • If you registered for Homework 2 then you are already registered for Homework 3. Otherwise, self-register for the assignment at Crowdgrader.org with this sign-up link.


(https://www.crowdgrader.org/crowdgrader/venues/join/3672/wuvate_mawona_wipavo_tanupo ) Important: Please, use your UCSC email address to register.


Then go to this CrowdGrader assignment.


(https://www.crowdgrader.org/crowdgrader/venues/view_venue/3672 ) Note: You will need to log in with the email address that you signed up with.


  • Click on the Submit link at the top left.
  • Attach the zip file you created in step 1.


  • Add any comments, if you wish, by clicking on Edit Content. Be sure to specify any information that a user should be aware of.


  • That’s it.


If you cannot log in, most likely you signed up with a different email account.


Review Instructions


Part of the assignment (20%) is to review 4 submissions of your peers. A grading rubric is available on Crowdgrader.


The primary purpose of the review is to learn from each other and to give honest feedback.


To do the reviews go to the assignment URL.




There is no issue with discussing the homework and possible solutions within your project team or other group. However, for the homework assignments each student needs to write his or her own code. This is the only way you will actually learn how to do it yourself. If you cheat, you primarily cheat yourself.


error: Content is protected !!