Project 1
This assignment is to write a Flask application that enables the user to browse books about Queen Elizabeth I. It is due on March 1, 2016.
Attention
This is a team assignment, so you must complete and submit it with your team.
Revision Log
- February 24
- Add hint for formatting author bios.
- February 23
- Actually include number of books and editions
- Document the
img
tag needed for book images - February 22
- Add explicit
name
ofnull
to author without a name - Document the number of books and editions
- February 19
- Add instructions on computing cover URLs
Overview
The purpose of this assignment is to create a browser for books on a particular topic. I am providing you with data on 970 books about Elizabeth I.
You will reuse a number of techniques from Assignment 1, as well as some new technologies:
- CSS
- Jinja template inheritance
Getting Started
-
Create a new Flask application, using your virtual environment, and set it up (Git repository,
.gitignore
,manage.py
) according to the setup instructions. -
Create a repository on your team's GitHub account so that you can share your code, and upload the basic project to that repository.
-
Download the data files, and add and commit them to your repository:
- books.yaml and authors.yaml
- books.json and authors.json (if you prefer to use the JSON files)
Overview of Data
I am giving you two data files:
books.yaml
-
This file contains information on books, as a list of dictionaries, each of which describes a book. Each book has several fields, as well as several editions (the
editions
key contains a list of editions for that book).Each book and edition also has an ID (an alphanumeric string identifying it).
One field of particular note: both book and edition objects have an
authors
key, containing a list of author IDs. authors.yaml
- This file contains information on authors, again as a list of dictionaries. Each author has an ID and a name, as well other information as available.
Explore the data files to find out what all keys they have. They are small enough that it is reasonable to open them in PyCharm.
Hint
It will likely be useful to create dictionaries mapping author IDs to their information, and book IDs to their information.
Requirements
Your program should load the data files on startup, like it did in A1. This time it's a little easier, because you don't need to loop or use glob
; just open the two data files and load them into data structures in your program.
There are several types of page you need to make.
Every page should be styled using CSS. In particular, change the default fonts, and adjust the layout to be more readable. Narrow page widths are (generally) more readable than using the entire page. We will talk in class more about how to do this.
Also, while you can write entirely separate templates for each page, it is useful to use Jinja's template inheritance feature so that things like styles are defined once, and the other page templates reuse those definitions.
Index Page
The front index page should have a suitable header/title, and display the following:
- The number of books in the data set
- The total number of editions in the data set
- The number of authors in the data set
- A link to a ‘List of Authors’, with the URL
/authors/
. - A link to a ‘List of Books’, with the URL
/books/
.
Hint
The data set has 970 books with 3218 editions.
List of Authors
The URL /authors/
should display a list of all authors, sorted by name.
Each author's name should be a link to an author page for them, with the URL /authors/‹aid›
(where ‹aid›
is the author's ID).
List of Books
The URL /books/
should display a list of all books, sorted by title.
Each books's title should be a link to a book page for that book, with the URL /books/‹bid›/
(where ‹bid›
is the book's ID).
Author Page
If ‹aid›
is a valid author ID, then the URL /authors/‹aid›
should result in an author page for the author. It should display:
- The author's name (as a heading)
- Additional relevant information. For example, some authors have a
bio
, and that should be displayed. When displaying the bio, insert paragraph breaks where there are blank lines. Blank lines will arise when 2 or more\n
characters (or\r\n
sequences) appear in a row. - A list of the books by that author, sorted by title; each title should be a link to that book.
The author view function should fail with HTTP error 404 if it is given an unknown author ID.
Hint
You can insert <br>
tags with the following code:
###jinja {% autoescape off %} {{ author.bio|escape|replace("\r\n\r\n", "<br>") }} {% endautoescape %}
This turns off auto-escaping, which replaces HTML special characters such as <
with code to make them render as the raw characters instead of HTML tags (a generally useful feature), and then uses the replace
Jinja filter to replace newlines with <br>
tags. It also uses the escape
filter to manually escape the author bio (necessary in case it contains special characters, since auto-escaping is turned off).
The code will generally look a little bit better if you wrap each paragraph block in a <p>
tag. You can do this in Python by using the split
method of the str
class to split it on consecutive newline characters.
Book Page
If ‹bid›
is a valid book ID, then the URL /books/‹bid›/
should result in a page that displays information about the book with that ID.
This information needs to include, at a minimum:
- Title
- Author(s), by name; each author's name should be a link to their author page.
- Subject(s), if available
- List of editions, sorted by publication date; each edition should be a link to an edition page with a URL of the form
/books/‹bid›/editions/‹eid›
- A cover image
Individual editions may have cover images (as the cover
field). For the book, search the editions for one that contains a cover and use that (if available). It does not matter which edition's cover you pick; you might want to pick the most recent.
Hint
Use an <img>
element to display the image. The image element does not have a closing tag.
Note
The cover
field contains a cover ID. This can be used to produce a cover URL; if the cover ID is ‹cover›
, then the cover URL is http://covers.openlibrary.org/b/id/‹cover›-M.jpg
for a medium cover image. Replace M
with S
for a small image, if you want to display an image with each edition in the book's edition list.
See the OpenLibrary Cover API for more details.
The book view function should fail with HTTP error 404 if it is given an unknown book ID.
Edition Page
The URL /books/‹bid›/editions/‹eid›
should result in a page that displays information about that particular edition of the specified book. This should include:
- Title
- Subtitle
- Author(s), by name; each author's name should be a link to their author page.
- Subject(s), if available
lc_class
, the Library of Congress call number(s), if available- ISBN numbers (
isbn_10
,isbn_13
) - Publishers
- A link back to the Book page for the book
Submitting
Prepare your submission using manage.py package
.
Only one team member should submit.