The V48Hours Reviews Database is user-driven 'film critic' site of sorts, where people who have participated in the 48 Hour Film Challenge can come together and offer feedback on each other's short films.
Due to the high number of films/participants in the competition (over 800 teams = several thousand users accessing it constantly for around a month) the site needed to be indexed and navigable (by region), scale up to large amounts of traffic for a short period of time, and offer a simple portal for not-particularly-tech-savvy users to easily add their 2c worth to a film they've seen. The theme is a custom Zen sub-theme, and it's powered primarily by Views and CCK.
Design
Front page
The front page was intended as a quick 'launchpad' of sorts for the more basic/casual users to either find reviews on their own film, or add a review to a film using a simple interface. To speed up the interaction, the page is built as a series of panels within a Coda Slider (slightly hacked to allow #/cross-linking by name instead of number). Registration, login (either using Drupal or via the excellent Facebook Connect module), adding a review, or finding a film via an autocomplete text field can all be done without leaving the front page.
Tabular data
For a more side-by-side comparison of films users can click through to a table of all the films, with metadata and voting stats displayed for each. Films are categorised using a hybrid node/taxonomy system: films are nodes, and have a node reference hierarchy relating back to their heat and city/region, but also are tagged with a matching taxonomy hierarchy for easier sorting via an exposed filter.
Popups
To again offer users an inline/immediate way to either search or add reviews, modal popups were decided on as a way of presenting input forms. Using the Popups API together with the Node Reference URL Widget users can easily add a review to a film without having to reselect it's parent city and heat.
Features
Voting
Voting is handled by Voting API, with the Fivestar widget for voting on films and Vote Up/Down for rating reviews themselves. Initially the 'most popular film' was calculated via a simple average, but we found users that gave their own film 5 stars (sometimes before it had even screened) kept getting bumped to the top of the listing. Now the IMDB Voting module is used to calculate the top film of the listing you're currently viewing. Other statistics such as total reviews are presented by performing a COUNT on a master view listing. The films and their associated metadata are provided to me as Excel spreadsheets, which I format then import using the Node Import module.
Subscriptions and notifications
I wanted to see if I could have a subscriptions system without having to implement the heavy-duty Notifications framework. Just a simple way of notifying interested users when a film they've subscribed to receives a new review. I've been wanting to use the Flag module to toggle a subscription on/off for a while now, and this was a great opportunity to tackle that. Users can flag a film node, indicating they've subscribed; then when a review is added to a film a custom Rules action fires, using VBO and Views Send to spool up a series of emails to users that flagged that node, which are sent on the next cron run.
Integration
As well as Facebook integration via Facebook Connect, another (non-Drupal) website exists for users to upload their completed films to, or embed from Youtube or Vimeo. I had no database access to this website, but wanted to offer some integration (films in the reviews database link through to their respective page in the screening room - if they have been added to it). To achieve this the database generates what would be the URL of the film on the screening room site, and performs a drupal_http_request (using HEAD) to determine whether the page exists or gives a 404. This is done using Computed Field, and is updated every 24 hours using drush and VBO, or every time a review is added to a film.
In addition to this a listing of the most recent 10 reviews is displayed on the main V48Hours webpage (again non-Drupal) using a JSON feed provided by Views Datasource.
Other modules
- Finder (provides the autocomplete search field)
- Hierarchial Select and Hierarchical Select Node Reference
- User Stats (IP tracking and post count)
Conclusion
This was a ground-up rewrite of an earlier taxonomy-only reviews database with much fewer features I'd done for use in 2010. This replaced it, although the existing reviews were downloaded and re-imported and can be accessed via a drop-down year select box.
Work was completed over approximately 1 week, and was a solo effort.
Hosting is provided by Xplain Hosting, which offers scalable performance/plans using the Amazon Web Services cloud, and allows me to manage the site via SVN and SSH.
The separate screening room site and main V48Hours website are designed and maintained by Cactuslab.
Comments
Very nice. I'm surprised
Very nice. I'm surprised you're able to complete the project in just over a week. What's the pros/cons of converting your previous taxonomy based system over to this current node/taxonomy based system?
MoviesWithButter
http://www.movieswithbutter.com
nodes vs taxonomy
Thanks! 1 week was a bit crazy, but was all the time I had between clients so had to make it work.
films-as-taxonomy
The old system... primary advantage here was ease-of-import (via Taxonomy CSV)and low overheads. Taxonomy is built to handle flat hierarchies such as this (and when they become polyhierarchial - for example when a film is featured in both a heat and regional final), and does so quickly and efficiently. However - at least in Drupal 6 - taxonomy can't hold more than the core fields associated with it (synonyms and description), which I put to hackish use to store a film's genre. But data stored in this way isn't really indexable/sortable, and so to store more complex data (genre, seperate fields for team name and film name, awards for films, etc), as well as more complex VotingAPI calculations (averages per film) I needed to move to a fims-as-nodes system.
NOTE: I did look at solutions like Taxonomy Node and NAT, but neither seemed to link nodes<->taxonomy in quite the way I would have needed.
films-as-nodes
The new system... more overhead than the previous lightweight taxonomy system, but infinitely more powerful/flexible. As films, heats, and cities are all nodes now, each can hold CCK data that can be queried/displayed/sorted as needed (as well as things like a Computed Field for querying external sites via cron update). I do still run a flat taxonomy hierarchy of just cities and heats in parallel to this (to use as an exposed filter in Views), as even though I can create an identical Hierarchical Select filter using relationships and hs_nodereference the entire nodereference lineage of city->heat isn't saved to each film (only the heat nodereference is saved: so you can't display all the films from Wellington for example, just Wellington > Heat 1). Taxonomy on the other hand saves the entire lineage to the film node, so filtering by any level isn't a problem.