From Scoop to Bloop by Leonard Richardson (leonardr@clark04.com) Bloop is a heavily modified version of Scoop 0.8 written for the 2004 Wesley Clark persidential campaign. It gives the diaries a much more prominent role than in stock Scoop. The goal is to create a site containing a lot of interlocking communities instead of a site with a lot of little subsites and a diary feature. This document summarizes the major changes that Cameron Barrett (cameron@clark04.com) and I made to turn Scoop into Bloop. Bloop will probably not be very useful except to people already experienced with Scoop. However, we hope that some of our changes will be found useful and merged into Scoop. Nomenclature changes -------------------- "diary" => "blog" "section" => "community" "topic" => "category" Blog-centric ------------ Bloop does not have 'stories' per se. It only has blog entries. Blog entries are not neccessarily in section 'Blog'; they may instead belong to any one community. This was implemented by basically changing the personal blog code to display all of the user's entries in the 'stories' table. Section 'Blog' now means that the blog entry is *only* in the user's blog, and not in some community as well. Each community has a front page publish threshold. If someone posts offensive or inappropriate material to a community, the other community members will vote it down (see below) and it will disappear from the front page (but not from the offending user's blog). The community editor can then move it out of the community altogether. Blog entries may also belong to any one category. The old system where the category of a blog entry was "blog_$uid" no longer exists; a story is always a blog entry of its author. Vhosting -------- A view of a community, a category, or a user blog can be reached by using its name as the subdomain of the site. For instance, to get the 'foo' community you can access http://foo.mysite.com/. Spaces in names are converted to dashes, so the blog of user 'bob jones' is accessible at http://bob-jones.mysite.com/. Communities take precedence over categories, which take precedence over users. You can't create a user account with the same name as a community or category. It's up to admins not to create categories with the same name as communities. Communities ----------- We divide communities into several predefined types, and display on each page a series of drop-down boxes that a user can use to jump to a community's homepage. A user can join any number of communities; there's a "Join/Leave this Community" link in the section menu. The communities a user has joined show up in a special drop-down box, and are stored in a user preference. Community home pages show recent comments and blog posts from community members. A user can post to any community, even ones they're not a member of. However, only the ones they're a member of show up in the drop-down list when they create a blog entry. Permissions ----------- Our model involves a community editor or two for each community, someone responsible for promoting and mantaining the community. We wanted an editor to have the special permission in their community, but we couldn't use groups for this; we would have to create a group for each community, and we have over 70 communities. If a user was responsible for multiple communities we'd have to create a group especially for them. It wouldn't scale. Instead, we have an admin-editable user preference containing the communities of which the user is an editor. A community editor can edit stories published to their community (which includes moving them out of the community), and can delete comments posted to a story in their community. This is implemented with two methods: have_story_edit_permission and have_comment_delete_permission. These methods are called instead of the customary have_perm check. have_story_edit_permission is also used to let a user edit their own stories after publication. Rating system ------------- Instead of being community-edited and moderated like stories, blog entries are rated after the fact like comments. The rating system is a simple +1/-1 like the story moderation system, instead of the 1-5 rating of comments. A special page called "best of the blogs" shows all stories which have achieved a rating above a certain threshold. Comments -------- Comment controls have been moved into a box on the right-hand side of the screen. Most controls that could have multiple values (eg. the comment display format) have been changed to booleans so that it suffices to click a link to switch from one to the other. New comment features include an unthreaded view (in which comments are displayed in the order they were posted), a comment rating threshold, and a simple comment pagination system. One community, 'chat', is treated specially: whenever the latest story in the community reaches a certain number of thresholds, a new story is automatically created in that community. The front page displays the most recent story in that community. This gives a place on the site for unstructured chat without having a thread that gets too long to be usable. Ease of use ----------- We've improved Scoop's ease of use. Much of this was achieved by removing features, like PGP keys, which confuse inexpert users. In general, features were hidden by simply not showing them in the UI. Customization ------------- We added some customization features. For instance, users can upload a photo of themselves as a blog icon (similar to the section and topic icons). These are displayed on the blog homepage and on any blog entries published on the front page. Users can also name their blogs. RSS support ----------- Bloop generates a dynamic RSS feed for every community, every category, every user blog, 'best of the blogs', and the front page. It supports RSS 1.0 and RSS 2.0. Rewrite rules are used to map index.xml, index.rdf, etc. to the appropriate feeds.