With this article we want to show our friends, comrades, colleagues and families what we did in the five weeks before linksunten.indymedia.org started. We're going to explain what we did to build a Drupal 6.9 website. Besides designing the page and administering 88 (part-) modules, we also completely coded one module, pushed two from an early development state to usable versions and patched six modules, correcting bugs and adding features.
With the NATO-summit and the Convergence-Center coming a lot of things concerning the webpage are changing, and we won't be able to document everything here. But feel free to ask. Just write a mail to our tech-list.
Content: Political Premises | Design | Frontpage composition | Posting content | Media-upload | Displaying content | Moderation of additions and comments | Summary of patched and developed modules | List of activated modules | Additions
Indymedia is a decentrally organised, worldwide network of social movements. The platform indymedia.org provides these movements with the possibility to spread - free from state controls and capitalistic interests - reports, experiences, analysis, dreams and opinions to build a counter-public. Through Indymedia we are able to write our history ourselves: Movements get to leave traces of their passion for future generations because forgotten struggles are lost struggles.
From Indymedia linksunten's Mission Statement
Most important for all Indymedia Sites is the concept of Open Publishing, which means that there are no editors and everybody can simply publish content. Every contribution and every addition appears immediately on the site. In the fog of teargas in Seattle 1999 this concept was revolutionary. At that time it anticipated the blogosphere of modern web2.0. But in the past ten years much has changed in that matter. By now it's possible for many people to maintain a webpage or a blog with little means. Indymedia's strength is nowadays not so much a technical but more a conceptual strength. It's a news network of regional, social movements connected with other IMCs (Independent Media Centres) worldwide, empowering the voices from the left and below and relating them to each other.
To implement the indymedia concept in the region, to keep the site usable and to guard it against abuse, we drafted editorial guidelines, in which we state which kinds of contributions we wish, and which kinds we don't. We also state how to deal with all contributions. We decided upon the guidelines without giving much thought to the technical realization. We wanted to decide free of technical restrictions on how we wish Indymedia linksunten to be, and afterwards move on to the implementation.
We intentionally chose Drupal over one of the CMS coded by Indymedia activists. The Indymedia CMSs are only developed by Indymedia activists, while Drupal, with it's huge community, fully taps into the potential of free software. A Drupal system is based upon a core, whose modules take care of basic functionality, and a number of contributed modules that can be installed if needed. Especially the contributed modules are developed by a lot of people with all kind of motivations. Therefore the system grows dynamically and sustainably.
We decided to use a simple design so as not to distract the reader. Instead each single author can decide upon the design of their article.
Still with the Lightbox2-module we build in a little fancy design element. By clicking Lightbox places images from the current page in a gallery above the page, while the page itself fades out. Pictures, which are implemented through HTML or our WYSIWYG-Editor, must be additionally attached with the option rel="lightbox" (for single pictures) or rel="lightbox[node_images][]" (for image galleries) within the link-tag.
On the frontpage we work with a three column design. On all other pages we use a two column design, with blocks for language selection, searching, navigation and categories in the left sidebar. The rest of the page is reserved for the content. All blocks are - thanks to the collapsiblock module - collapsible. Within the category menu the jquerymenu module makes subpoints collapsible. The most important links are placed in the header on every page.
All text contributions are shown immediately on the frontpage. Depending on the sorting through the author the contributions show in the Newswire, the Pressarchive or in the list of upcoming events and are linked through the calender. Good articles will additionaly be added to the middle column. Politically important topics will be exposed as specials on the top. Particularly good articles are also shown in the Kaleidoskop in the left column. In this column there is also a block with links to all Indymedia projects worldwide. We use the block module to manage the display.
The posting area is the most important part of the homepage. Users willing to post content have to decide what kind of contribution they want to post. With most of the contribution types they have to fill out a title, an author and a body field. Required fields are marked as such. To make contributions clearer to readers and to help with sorting contributions it's helpful to fill out more than the required fields. Users can add documents in various formats, more on that topic in the chapter "media upload".
The node module part of the Drupal core serves the title and body field as well as a drop down menu to choose the language of a contribution. To manage categories we use the taxonomy module which is also part of the core. We use the content taxonomy (part of the CCK project) and the taxonomy manager module, which allow a comfortable submission for the input and later on the display of the categories. CCK fields are freely definable content fields for nodes. We also use CCK fields for the author field (CCK text) and the date fields (CCK date) as well as the source information (cck link) for copied press articles.
To facilitate the posting of well designed contributions we installed the "what you see is what you get" TinyMCE HTML editor, which makes it possible to design text similar to word processor programs. Users can also switch off the editor and format text in html. Within the editor authors can also open a popup window for the image assist module to implement images in the text. Those images can either already be on the server or uploaded by the author. Both modules require javascript to be activated.
For self-written content authors also have to choose one of the free licenses provided by the creative commons lite module. We don't accept proprietary content. Unregistered users have to solve a easy math problem provided by the math captcha module to post content or to register. This way we protect the site against commercial spam robots.
To make the design of the posting pages functional and clear we used the hook_form_alter function.
Single images and audio files can be directly published as image or audio nodes respectively. Those nodes can be categorized and a date can be added. Media files can also be published as attachments to text contributions. In this case they inherit the categories and the date from the parent article. All media nodes can be commented on and moderated separately.
The upload process is managed by the upload module, which is part of the Drupal core. Our upload media module then converts attached images and audios into nodes. Afterwards those media nodes are again attached to their parent article using a CCK nodereference field. Images can be displayed with the Lightbox and audios can be listened to through an audio flash player. The first attached image will be displayed as a start image, if there isn't a different image chosen via another cck nodereference field. The media upload module ensures that attached and single uploaded images and audios are treated the same way.
The display of (almost all) content is managed with the views module, which is capable of displaying blocks, pages and feeds for lists of nodes (or comments, users and logs). Within views administrators can define display options, sort criteria, filters, arguments and relationships.
The taxonomy view for example uses the argument "term" for displaying in the category "Paris" only contributions tagged as Paris. Differing from the built-in taxonomy view, we restricted the view to show only text contributions.
The nodequeue module allows moderators to merge contributions to lists that can be sorted manually. We use nodequeues to "feature", "special" or "kaleidoskop" articles. The display of those queues as blocks for the frontpage, pages for the Archive and feeds for exporting is again managed by views.
We use the hidden module to "hide commercial advertising, spam, conspiracy theories and any religious statements as well as double postings. Hidden articles can still be viewed in the trash archive, but can neither be commented nor found by search engines. In order to make these decisions understandable, we will give a reason for every piece of censorship or hiding." (From the editorial guidelines)
To "censor any fascist, racist, nationalist, antisemitic, homophobic and sexist content" we use the flag module. After the censor flag is set, the flag action "unpublish post" is automatically started. In case the flag is withdrawn the reverse action is started. Again using views, we created a list of censored contributions only showing the article type, the title, author and publishing date. This way we ensure a maximum of transparency.
The calender module (also part of the views project) serves as – surprise, surprise – a calender, but also as a list of upcoming events, in our case showing the five next events. We defined the calender to show every event posted for a certain date, but also reports relating to a certain date. This way it's possible to use the calender to easily research the coverage for each day. The calender view uses the data in the "happened at"- respectively event-date-field filled in during the publishing process.
Moderation of additions and comments
Additional information may be added to any article. Additions will be displayed in a tree structure. Editors can mark additions subsequently as comments. As for comments, only the headline will be displayed and the content of a specific comment, or if desired all, can be opened with a mouse click.
From the editorial guidelines
Additions and comments can be displayed in a threaded view or chronological list via the built-in feature of the comment module, part of the Drupal core. To realize the separation of additions and comments we use the comment moderation module, which is based on the voting API module. The module uses javascript for both the moderation and the display.
We found the module in an early development state and went on developing. It's been coded for the relaunch of dot kde. The way we use the module it allows us to vote on additions. Each user with sufficient rights (in our case the moderators) has one vote. We use the module to categorize additions in on- and offtopic.
For hiding and censoring we use the same technique as for nodes, but had to code the publish action for that. We added features to the comment revision module to keep a transparent track of changes made to additions. We also patched the comment mover module, which enables moderators to move additions.
Summary of patched and developed modules
For not storing any user email addresses we developed the no mail module. To register an account at a Drupal homepage users have to declare by default an email address. The login name and the password are then sent unencrypted to this email address. The no mail module hides the email address input field, creates a fake email address (timestamp@domain.tld) and enables administrators to give a catch-all address to receive all automated mail send out by the system. At the end of each registration only a mail with the content "New account registered" is sent to the catch-all address and the fake address.
- To manage Audios and images, we extended the image-upload-module to the media-upload-module.
- To achieve the goals for additions and comments set in the editorial guidelines we further developed the comment-moderation-module.
- We also extended the comment-revision-module and fixed a bug in the comment-mover-module.
- In the hidden module we also fixed some bugs and integrated the possibility to not being able to give a public not-standardized-reason.
- To allow collaborative contributions we patched the coherent-access-module.
- We also patched the Audio GetID3-, the boost-, the collapsiblock-, the WYSIWYG-, the lightbox2- and the voting-API-module.
All patches and modules coded by us are attached to the german article linksunten.indymedia.org auf Drupal 6.9.
To get the following table we used a PHP-snippet from drupal.org.
Name | Version | Description | URL |
Active Translation | 6.x-1.2 | Allows the original, untranslated node to be displayed when a translation is not available. | http://drupal.org/project/active_translation |
Admin Role (Part of Administration) | 6.x-1.1 | Automatically assign all permissions to an admin role. | http://drupal.org/project/adminrole |
Advanced help | 6.x-1.1 | Allow advanced help and documentation. | http://drupal.org/project/advanced_help |
Audio (Part of Audio) | 6.x-1.x-dev | Allows you to upload and playback audio files. | http://drupal.org/project/audio |
Audio getID3 (Part of Audio) | 6.x-1.x-dev | Adds the ability to read artist info from and write to audio files. Requires that the getID3 library be installed. | http://drupal.org/project/audio |
Backup and Migrate | 6.x-1.2 | Backup or migrate the Drupal Database quickly and without unnecessary data. | http://drupal.org/project/backup_migrate |
Block (Part of Core - required) | 6.9 | Controls the boxes that are displayed around the main content. | http://drupal.org/project/drupal |
Boost (Part of Caching) | 6.x-1.0-alpha1 | Provides a performance and scalability boost through caching Drupal pages as static HTML files. | http://drupal.org/project/boost |
Calendar (Part of Date/Time) | 6.x-2.0-rc6 | Views plugin to display views containing dates as Calendars. | http://drupal.org/project/calendar |
CAPTCHA (Part of Spam control) | 6.x-2.x-dev | Base CAPTCHA module for adding challenges to arbitrary forms. | http://drupal.org/project/captcha |
Coherent Access (Part of Access control) | 6.x-1.0 | Provides user level node access for viewing and editing. | http://drupal.org/project/coherent_access |
Collapsiblock (Part of User Interface) | 6.x-1.x-dev | Makes blocks collapsible. | http://drupal.org/project/collapsiblock |
Color (Part of Core - optional) | 6.9 | Allows the user to change the color scheme of certain themes. | http://drupal.org/project/drupal |
Comment (Part of Core - optional) | 6.9 | Allows users to comment on and discuss published content. | http://drupal.org/project/drupal |
Comment Moderation (Part of Moderation) | 6.x-0.3 | Provides community based comment moderation and tools for administrators to moderate comments. | |
Comment mover | 6.x-1.x-dev | Move comments to other threads or convert them to nodes. | http://drupal.org/project/comment_mover |
GB Comment Revisions (Part of Moderation) | 6.x-2.x-dev | Comment Revisions enables you to keep revisions of comments like drupal core enables for nodes. | http://drupal.org/project/comment_revisions |
Content (Part of CCK) | 6.x-2.1 | Allows administrators to define new content types. | http://drupal.org/project/cck |
Content Permissions (Part of CCK) | 6.x-2.1 | Set field-level permissions for CCK fields. | http://drupal.org/project/cck |
Content Taxonomy (Part of CCK) | 6.x-1.0-beta5 | Defines a field type for taxonomy terms | http://drupal.org/project/content_taxonomy |
Content Taxonomy Autocomplete (Part of CCK) | 6.x-1.0-beta5 | Defines a autocomplete widget type for content_taxonomy | http://drupal.org/project/content_taxonomy |
Content Taxonomy Options (Part of CCK) | 6.x-1.0-beta5 | Defines a option widget type for content_taxonomy for selects, radios/checkboxes | http://drupal.org/project/content_taxonomy |
Content Taxonomy Tree (Part of CCK) | 6.x-1.0-beta5 | Defines a dynamic tree widget for Content Taxonomy | http://drupal.org/project/content_taxonomy |
Creative Commons Lite (Part of Licenses) | 6.x-1.2 | Allow User to add Creative Commons Licenses for selected content type. | http://drupal.org/project/creativecommons_lite |
Date (Part of Date/Time) | 6.x-2.0-rc6 | Defines CCK date/time fields and widgets. | http://drupal.org/project/date |
Date API (Part of Date/Time) | 6.x-2.0-rc6 | A Date API that can be used by other modules. | http://drupal.org/project/date |
Date Timezone (Part of Date/Time) | 6.x-2.0-rc6 | Needed when using Date API. Overrides site and user timezone handling to set timezone names instead of offsets. | http://drupal.org/project/date |
Database logging (Part of Core - optional) | 6.9 | Logs and records system events to the database. | http://drupal.org/project/drupal |
Filter (Part of Core - required) | 6.9 | Handles the filtering of content in preparation for display. | http://drupal.org/project/drupal |
Flag | 6.x-1.0-beta6 | Create customized flags that users can set on nodes. | http://drupal.org/project/flag |
Flag actions | 6.x-1.0-beta6 | Execute actions on Flag events. | http://drupal.org/project/flag |
getID3() | 6.x-1.1 | getID3() extracts useful information from multimedia file formats. | http://drupal.org/project/getid3 |
Graphstat | 6.x-1.0 | Creates graphs based on data recorded by the statistics, node, user and comment modules. | http://drupal.org/project/graphstat |
Help (Part of Core - optional) | 6.9 | Manages the display of online help. | http://drupal.org/project/drupal |
Hidden (Part of Indymedia) | 6.x-1.x-dev | Hide nodes or comments | http://drupal.org/project/hidden |
Internationalization (Part of Multilanguage) | 6.x-1.0 | Extends Drupal support for multilingual features. | http://drupal.org/project/i18n |
Block translation (Part of Multilanguage) | 6.x-1.0 | Enables multilingual blocks and block translation. | http://drupal.org/project/i18n |
Content type translation (Part of Multilanguage) | 6.x-1.0 | Translates content type related strings: name, description, help text... | http://drupal.org/project/i18n |
Menu translation (Part of Multilanguage) | 6.x-1.0 | Supports translatable custom menu items. | http://drupal.org/project/i18n |
String translation (Part of Multilanguage) | 6.x-1.0 | Provides support for translation of user defined strings. | http://drupal.org/project/i18n |
Synchronize translations (Part of Multilanguage) | 6.x-1.0 | Synchronizes taxonomy and fields accross translations of the same content. | http://drupal.org/project/i18n |
Taxonomy translation (Part of Multilanguage) | 6.x-1.0 | Enables multilingual taxonomy. | http://drupal.org/project/i18n |
Image (Part of Image) | 6.x-1.0-alpha4 | Allows uploading, resizing and viewing of images. | http://drupal.org/project/image |
Image assist (Part of Image) | 6.x-2.0-alpha2 | This module allows users to upload and insert inline images into posts. It automatically generates an Add image link under the textarea fields of your choice. | http://drupal.org/project/img_assist |
Incoming (Part of Other) | 6.x-1.x-dev | Receive an alert when the amount of incoming traffic to your site changes significantly. | http://drupal.org/project/incoming |
Indymedia cities (Part of Indymedia) | 6.x-1.2 | Makes and updates cities list block. | http://drupal.org/project/indymedia_cities |
IP anonymize (Part of Indymedia) | 6.x-1.1 | Establishes an IP address retention policy. | http://drupal.org/project/ip_anon |
Calendar Popup (Part of Date/Time) | 6.x-2.0-rc6 | Replaces the links to calendar items with a javascript popup that gracefully regresses if javascript is not enabled | http://drupal.org/project/calendar |
Jquery Menu (Part of Advanced Navigation Pack) | 6.x-1.9 | Enables expandable jquery menus. | http://drupal.org/project/jquerymenu |
Javascript tools (Part of User Interface) | 6.x-1.0 | Provides common JavaScript methods used by other modules. | http://drupal.org/project/jstools |
Localization client | 6.x-1.6 | Provides on-page localization | http://drupal.org/project/l10n_client |
Lightbox2 | 6.x-1.9 | Enables Lightbox2 for Drupal | http://drupal.org/project/lightbox2 |
Link (Part of CCK) | 6.x-2.5 | Defines simple link field types. | http://drupal.org/project/link |
linksunten forms (Part of linksunten) | Keep it simple for linksunten.indymedia.org | ||
Locale (Part of Core - optional) | 6.9 | Adds language handling functionality and enables the translation of the user interface to languages other than English. | http://drupal.org/project/drupal |
Math CAPTCHA (Part of Spam control) | 6.x-1.0-beta2 | Provide math CAPTCHAs like 'two + three = ?' and '2 times ? = 6' | http://drupal.org/project/captcha_pack |
Menu (Part of Core - optional) | 6.9 | Allows administrators to customize the site navigation menu. | http://drupal.org/project/drupal |
No Mail | 6.x-09-01-13 | Stop asking for mail addresses. | |
Node (Part of Core - required) | 6.9 | Allows content to be submitted to the site and displayed on pages. | http://drupal.org/project/drupal |
Nodequeue (Part of Nodequeue) | 6.x-2.0 | Create queues which can contain nodes in arbitrary order | http://drupal.org/project/nodequeue |
Node Reference (Part of CCK) | 6.x-2.1 | Defines a field type for referencing one node from another. | http://drupal.org/project/cck |
Nodetype | 6.x-1.0 | Allows you to change the content type of posts while editing them. | http://drupal.org/project/nodetype |
Number (Part of CCK) | 6.x-2.1 | Defines numeric field types. | http://drupal.org/project/cck |
Option Widgets (Part of CCK) | 6.x-2.1 | Defines selection, check box and radio button widgets for text and numeric fields. | http://drupal.org/project/cck |
Path (Part of Core - optional) | 6.9 | Allows users to rename URLs. | http://drupal.org/project/drupal |
PHP filter (Part of Core - optional) | 6.9 | Allows embedded PHP code/snippets to be evaluated. | http://drupal.org/project/drupal |
Search (Part of Core - optional) | 6.9 | Enables site-wide keyword searching. | http://drupal.org/project/drupal |
Statistics (Part of Core - optional) | 6.9 | Logs access statistics for your site. | http://drupal.org/project/drupal |
Syslog (Part of Core - optional) | 6.9 | Logs and records system events to syslog. | http://drupal.org/project/drupal |
System (Part of Core - required) | 6.9 | Handles general site configuration for administrators. | http://drupal.org/project/drupal |
Taxonomy (Part of Core - optional) | 6.9 | Enables the categorization of content. | http://drupal.org/project/drupal |
Taxonomy Manager | 6.x-1.0-beta2 | Tool for administrating taxonomy terms. | http://drupal.org/project/taxonomy_manager |
Advanced Taxonomy Blocks (Part of Advanced Navigation Pack) | 6.x-1.8 | Creates A expandable taxonomy block for all vocabularies and separate blocks for each vocab if desired. | http://drupal.org/project/taxonomyblocks |
Text (Part of CCK) | 6.x-2.1 | Defines simple text field types. | http://drupal.org/project/cck |
Token | 6.x-1.11 | Provides a shared API for replacement of textual placeholders with actual data. | http://drupal.org/project/token |
Tracker (Part of Core - optional) | 6.9 | Enables tracking of recent posts for users. | http://drupal.org/project/drupal |
Content translation (Part of Core - optional) | 6.9 | Allows content to be translated into different languages. | http://drupal.org/project/drupal |
Translation helpers | 6.x-1.x-dev | Provides methods for other modules to use with translated content. | http://drupal.org/project/translation_helpers |
Translation overview | 6.x-2.0 | Provides an overview of the translation status of the site's content. | http://drupal.org/project/translation_overview |
Update status (Part of Core - optional) | 6.9 | Checks the status of available updates for Drupal and your installed modules and themes. | http://drupal.org/project/drupal |
Upload (Part of Core - optional) | 6.9 | Allows users to upload and attach files to content. | http://drupal.org/project/drupal |
Upload media | 6.x-0.2-dev | Image and audio nodes will be created from images and audios uploaded as attachments. | |
User (Part of Core - required) | 6.9 | Manages the user registration and login system. | http://drupal.org/project/drupal |
Views (Part of Views) | 6.x-2.2 | Create customized lists and queries from your database. | http://drupal.org/project/views |
Views Custom Field (Part of Views) | 6.x-1.x-dev | Provides a number of custom fields (rownumber, phpcode, ...). | http://drupal.org/project/views_customfield |
Views UI (Part of Views) | 6.x-2.2 | Administrative interface to views. Without this module, you cannot create or edit your views. | http://drupal.org/project/views |
Voting API (Part of Voting) | 6.x-2.0-rc2 | Provides a shared voting API for other modules. | http://drupal.org/project/votingapi |
Wysiwyg (Part of User interface) | 6.x-1.x-dev | Allows users to edit contents with client-side editors. | http://drupal.org/project/wysiwyg |
kudos
i love these writeups. that's how it should be done. i'm a technial minded person acquanted with drupal and it's wonderful to see it use in this manner.
… just wanted to leave some kudos … keep on revoltin'