Archive for Programming

Seeking Computer Science Teacher for 2014-15

Our new, innovative computer science program emphasizes high student engagement, accessibility to all students, and opportunities for advanced study. University Prep is a grades 6-12 independent school in Seattle, WA. I am happy to answer your questions about the position.

Computer Science Teacher
Full-time, academic year position
Starts August 2014

University Prep seeks an innovative computer science teacher to deliver a program of study in grades 6-12, including three levels of computer science classes, supporting instruction for computational thinking across the curriculum, and advising student clubs. This is a new position, part of a school initiative to increase emphasis on computer science in the program and meet rapidly growing student interest in the subject.

Candidates must possess demonstrated competence and experience in the content area and pedagogy. A master’s degree or equivalent experience in computer science and recent successful teaching experience are desired. An understanding of new perspectives on teaching computer science will be helpful. Successful candidates will have the flexibility, energy, enthusiasm, high expectations, and understanding of the developmental needs of 6th – 12th grade students.

University Prep is committed to the diversity of its workplace and to making computer science accessible to all students.

Reports to:
Director of the Upper School

Teach one Middle School and two Upper School elective courses in computer science, with the goals of high engagement, broad accessibility, and opportunities for advanced study.

Collaborate with Middle School teachers in other disciplines (currently math and science) to integrate computer science and computational thinking activities into these required courses.

Support student-led clubs in applied computing fields. These vary from year to year based on student initiative and may include robotics, engineering, 3D printing, programming, and app design.

Articulate and refine the vision for broadly inclusive, authentic instruction in computer science at U Prep. In collaboration with the academic dean, division directors, and academic technology director, develop future strategic directions for the computer science program, including consideration of a U Prep graduation requirement in computer science.

Describe the computer science program to current and prospective students, families, and peers at other educational institutions. Actively network with local and national organizations, such as the UW Computer Science Department and Puget Sound CSTA, to enrich and share U Prep’s work in computer science

Other duties as assigned

If you are interested in applying for this position, please send your résumé to Debbie Playter at

No phone calls or drop-ins, please!

BeautyTips for Drupal forms

The BeautyTips module has become a popular and flexible way to add popup tips to any part of Drupal website pages. Popup tips provide an important usability enhancement to forms, displaying additional information to the user without cluttering the page.

It is simplest to load BeautyTips libraries on every page and add the class “beautytips” to any page element to display its title in a popup. For additional control, one may invoke BeautyTips and define custom styles within your a custom module. Here is an example from our admission website:

In your custom module:

// load beautytips js and define custom style for all admission pages
$options[‘bt_admission_tips’] = array(
‘cssSelect’ => ‘.bb_admission_beautytip’,
‘trigger’ => array(‘hover’),
‘contentSelector’ => ‘$(this).attr(“description”)’,
‘width’ => 350,
‘style’ => ‘hulu’,
‘positions’ => array(‘right’,’top’,’most’),
‘shrinkToFit’ => TRUE,

In your form array:

$form[‘field_name’] = array(
‘#type’      => ‘textfield’,
‘#description’ => t(“Explanatory text for this field. <span class=\”bb_admission_beautytip\” description=\”here is an example tooltip\”>more info</span>”),
‘#required’     => TRUE,

The tooltip appears when you hover over the text (or any other page element, such as an image).

Or define a function for more complicated popups:

  $form[‘grade_apply’] = array(
‘#type’      => ‘select’,
‘#title’        => t(‘Grade for which this student is inquiring’),
‘#options’  =>  _bb_admission_load_grades(),
‘#default_value’ => t($applicant->grade_apply),
‘#description’ => t(“Please note: grade is based on the student’s age on September 1 of the year of entry.” . _bb_admission_tip(‘dob_chart’)),
‘#required’     => TRUE,

// define tooltips for all admission pages
function _bb_admission_tip($tip) {
switch ($tip) {
case ‘dob_chart’:
return ‘ <img
description=”<h3>DOB Chart for ‘ . _bb_next_academic_year() . ‘</h3>
<p><table border=1 cellpadding=3>
<tr valign=top><td><b>Age on Sep 1, ‘ . _bb_next_fall_year() . ‘</b></td><td><b>Grade</b></td></tr>
<tr valign=top><td>4</td><td>Preschool</td></tr>
<tr valign=top><td>5</td><td>Kindergarten</td></tr>
<tr valign=top><td>6</td><td>First</td></tr>
<tr valign=top><td>7</td><td>Second</td></tr>
<tr valign=top><td>8</td><td>Third</td></tr>
<tr valign=top><td>9</td><td>Fourth</td></tr>
<tr valign=top><td>10</td><td>Fifth</td></tr>
<tr valign=top><td>11</td><td>Sixth</td></tr>
<tr valign=top><td>12</td><td>Seventh</td></tr>
<tr valign=top><td>13</td><td>Eighth</td></tr>
<tr valign=top><td>14</td><td>Ninth</td></tr>
<tr valign=top><td>15</td><td>Tenth</td></tr>
<tr valign=top><td>16</td><td>Eleventh</td></tr>
<tr valign=top><td>17</td><td>Twelfth</td></tr>

Catlin Gabel Computer Science

Student project: a robot that will self-navigate across campus

Andrew Merrill describes the high school’s computer science offerings. Project work and experiential learning are emphasized, Advanced Placement examinations deemphasized.

1) A yearlong introduction to computer programming.  I’m currently using Python as the language.  The projects cover a wide range of topics, including a recommendation engine for movies, 2D and 3D graphics, the iterated prisoners dilemma, etc.

2) A yearlong advanced computer science course, which used to be comparable to the AB level AP class.  I’m currently using Java, left over from AP days, but the focus of the class is on algorithms and data structures.  Most of my students in the class used to take the AB level AP exam, but now that that isn’t offered any more, I’m not sure what they’ll do.  I don’t see much point in the A level AP exam, other than as a college admission item (as distinct from a college preparation or placement item).  That is, the exam might help students get into college, but I doubt it will be of much value when they get there.

3) A yearlong post-AP level class that varies in content and approach depending on student interest.  Some years it is an advanced topics course, where student students explore and write programs in a series of more advanced comp sci topics (such as artificial intelligence, cryptography, 3D rendering, digital logic circuits, socket-based networking, threading, etc.).  Other years it turns into an independent research class, where each student designs and carries out an independent project (such as writing a physics engine, writing a compiler, writing an operating system, writing a iOS apps, autonomous robot navigation, automatic music transcription, automatic parallelization, CUDA programming, etc.)  The topics courses are intended as a sampler of the kind of work done in upper level college computer science courses, while the research class often results in science fair projects and occasionally publishable papers.

Online Admission Application

This summer, I put the finishing touches on our new online admission application. We have had online inquiries for two years, including parent information, student information, tour and visit scheduling, and application forms download (PDF). I ported the code from a previous version that I wrote for my previous school and then modified it for this multi-divisional institution.

Over the years, online admission apps have evolved from a convenience for international applicants to an expectation of many parents. Many of the new features are pretty simple: a student statement requires a lot of thought from the author but only a set of textfields from the site!

I tried a new approach with teacher evaluations. The website allows the parent to send an invitation email to a teacher, who then clicks on a link in the email to visit our website and write the evaluation. I am looking forward to seeing how well that system works and making changes if necessary.

The application pulls applicant information from Education Edge as needed. It also shows the status of received forms by querying EE checklists, which our staff update as forms are received. Online payment uses Ubercart functions to create a virtual “cart” behind the scenes and submit payment details for processing.

Having a website system changes some aspects of the application process. The instant we open the website, families may start working on their applications. Free responses are limited not by a number of pages or words but rather by string length in characters. Families will be able to start and complete an application just before midnight at the application deadline, if they so choose. Admission staff will be able to measure the number of incomplete applications in process if they wish. We have a “finalize” link for families to submit their app, but we will need to decide what to do with applications that are complete but not actually marked as final and submitted.

A related project of note: CiviSchool has an admission component

The name “Dwee” is fictitious (in case you were not sure)!

Open Blackbaud group

Come join the Open Blackbaud group! Adam Gerson and I want to get together individuals who are writing SQL queries directly against Blackbaud database tables. We have found a number of people doing this sort of work on their own, so it seems like a good time to share our new knowledge. Already, Adam, Tom Phelan, and I have posted a number of queries that others may find useful.


Calendar request web form for MS Outlook

For a while, we have used the moderated folder and custom form features of Microsoft Outlook and Microsoft Exchange to allow users to request school vehicles for trips and other purposes. It didn’t work well. Our users view this public folder calendar through Outlook, Entourage, and Outlook Web Access. Only Outlook supports custom forms. Public folders were difficult to find. They don’t sync well with Entourage. It was a mess.

With our upgrade to Exchange 2007, we decided to move away from public folders and create buses as resources instead. At the same time, we wanted to build an easier-to-use request form for users. We wondered whether we could build a simple web script (in Perl or PHP) and send Outlook a calendar object that it could use.

It worked! Uncharacteristically, Microsoft uses an open, standard format for calendar entries. Below, I have reproduced part of a script I wrote that sends a .vcs (vcalendar) file as an attachment that our transportation coordinator may open in Outlook, review, and add to a calendar. May other potential uses for this exist.

Please do try this code and let me know any improvements you make. This is only part of our script code. It won’t work on your server as is!


use Time::Local;
use CGI qw(:standard);
use Net::SMTP;

sub write_form {

param(-name=>'action', -value=>'save_form');

$output = start_form .
p . "Please complete the following form to request a school vehicle." .
"<div style=\"border:1px solid black; padding:5px; margin:20px 0 20px 0;\"><b>Required Information</b>" .
p . "Activity: " . textfield(-name=>'activity', -size=>60) .
p . "Destination: " . textfield(-name=>'destination', -size=>60) .
p . "Depart date: " . popup_menu(-name=>'depart_month', -values=>['',@months], -labels=>\%month_labels) . ' ' . popup_menu(-name=>'depart_day', -values=>['',@mdays]) . ' ' . popup_menu(-name=>'depart_year', -values=>['',@years], -default=>$year) . ' Hour: ' . popup_menu(-name=>'depart_hour', -values=>['',@hours], -labels=>\%hours_labels) . ' Min: ' . popup_menu(-name=>'depart_min', -values=>['',@mins]) .
p . "Return date: " . popup_menu(-name=>'return_month', -values=>['', @months], -labels=>\%month_labels) . ' ' . popup_menu(-name=>'return_day', -values=>['',@mdays]) . ' ' . popup_menu(-name=>'return_year', -values=>['',@years], -default=>$year) . ' Hour: ' . popup_menu(-name=>'return_hour', -values=>['',@hours], -labels=>\%hours_labels) . ' Min: ' . popup_menu(-name=>'return_min', -values=>['',@mins]) .
p . "Driver: " . textfield(-name=>'driver', -size=>'30') .
'  ' . "Contact: " . textfield(-name=>'contact', -size=>'30') .
p . "Number of students + adults: " . textfield(-name=>'total_number', -size=>'3') .
p . "Depart from: " . checkbox_group(-name=>'depart_from', -values=>['Gym','Theater']) .
p . "Division/Department: " . textfield(-name=>'division_department', -size=>'20') . "</div>" .

"<div style=\"border:1px solid black; padding:5px; margin:20px 0 20px 0;\"><b>Optional Information</b>" .
p . "Rental vehicle types (e.g., minivan, SUV, cargo van): " . textfield(-name=>'rental_vehicle_types', -size=>'40') .
p . "Other details: " . checkbox_group(-name=>'other_details', -values=>['Cargo van','Drop off only','Pick up only','Overnight trip']) .
p . "Special requests: " . textfield(-name=>'special_requests', -size=>'60') . "</div>" .
p . submit(-name=>'submit', -value=>'Submit Request') . hidden(-name=>'action') . endform;

$template =~ s/\$body/$output/;
$template =~ s/\$title/Request Transportation/g;
print header . $template;


sub save_form {

# check for empty minute fields
if (!param('depart_min')) {param(-name=>'depart_min', -value=>'00');}
if (!param('return_min')) {param(-name=>'return_min', -value=>'00');}

# convert dates to GMT
$depart_localtime = timelocal(0,param('depart_min'),param('depart_hour'),param('depart_day'),param('depart_month'),param('depart_year'));
$return_localtime = timelocal(0,param('return_min'),param('return_hour'),param('return_day'),param('return_month'),param('return_year'));
($s,$n,$h,$d,$m,$y) = gmtime($depart_localtime); $y+=1900;
$vcs_depart_time = $y . sprintf("%02d",$m) . sprintf("%02d",$d) . 'T' . sprintf("%02d",$h) . sprintf("%02d",$n) . sprintf("%02d",$s) . 'Z';
($s,$n,$h,$d,$m,$y) = gmtime($return_localtime); $y+=1900;
$vcs_return_time = $y . sprintf("%02d",$m) . sprintf("%02d",$d) . 'T' . sprintf("%02d",$h) . sprintf("%02d",$n) . sprintf("%02d",$s) . 'Z';

# format vcs file
PRODID:-//Microsoft Corporation//Outlook MIMEDIR//EN
LOCATION:" . param('destination') . "
DESCRIPTION;ENCODING=QUOTED-PRINTABLE:Activity: " . param('activity') . "=0D=0ADestination: " . param('destination') . "=0D=0ADepart time: " . param('depart_month') . "/" . param('depart_day') . "/" . param('depart_year') . " " . param('depart_hour') . ":" . param('depart_min') . "=0D=0AReturn time: " . param('return_month') . "/" . param('return_day') . "/" . param('return_year') . " " . param('return_hour') . ":" . param('return_min') . "=0D=0ADriver: " . param('driver') . "=0D=0AContact: " . param('contact') . "=0D=0ANumber of students + adults: " . param('total_number') . "=0D=0ADepart from: " . join(", ", param('depart_from')) . "=0D=0ADivision/Department: " . param('division_department') . "=0D=0ARental vehicle types: " . join(", ", param('rental_vehicle_types')) . "=0D=0AOther details: " . join(", ", param('other_details')) . "=0D=0ASpecial requests:" . param('special_requests') . "=0D=0A
SUMMARY:" . param('activity') . "

# send mail
$smtp = Net::SMTP->new('localhost');
$smtp->datasend("To: Transportation Coordinator\n");
$smtp->datasend("From: $fullname\n");
$smtp->datasend("Subject: Transportation request\n");
$smtp->datasend("MIME-Version: 1.0\n");
$smtp->datasend("Content-Disposition: attachment; filename=\"request.vcs\"\n");
$smtp->datasend("Content-Type: application/text; name=request.vcs\n");
$smtp->datasend($vcs . "\n\n");

# return html
$output = "Thank you. The transportation coordinator will review this request and then assign it to a vehicle. Please check the transportation calendar in a day or two to confirm your reservation.<P><a href=$cgiurl>Submit another transportation request</a>";
$template =~ s/\$body/$output/;
$template =~ s/\$title/Transportation Request Sent/g;
print header . $template;


Curriculum map in Drupal

Two weeks to go until live! This week, I migrated our school curriculum map from a custom system I authored into Drupal. This allows us to ensure the longevity of this web site resource, take advantage of Drupal’s strengths in structuring content storage and display, and provide teachers with a very usable editing interface. The curriculum map stores over a thousands nodes and can be added to an existing Drupal site. This article assumes familiarity with Drupal 6 views, content construction kit, blocks, and very basic custom function programming. This isn’t a step-by-step tutorial (maybe one day).

Curriculum map course content type holds courses. The description field is not yet populated but available for course descriptions. Taxonomy categories for division, grades, and subjects are applied to this content type. A node reference field is used to connect each curriculum map course node to as many curriculum map units as necessary. The autocomplete node reference widget is used to allow the user to re-order the units as desired. It may be difficult for a user to find the correct unit node using autocomplete if it is not named creatively. It may be a good upgrade to use a view to display more identifying information than the title for the autocomplete search.

Curriculum map unit content type has a textarea field for each curriculum map category. We use the following: essential questions, habits of mind, content, skills and processes, assessment, resources, multicultural dimension, and integrated learning. In retrospect, having so many categories created a lot of work for teachers, who had to populate some of these categories x each unit x each course they teach.

We authored module cgs_curriculum_map.module to migrate content from our old system into Drupal. It creates content and unit nodes, establishes node reference links between them, populates content fields, and attaches taxonomy terms. This is not necessary for schools starting a curriculum map from scratch.

When the system displays a curriculum map course node, the units also load in a table below the course description. This is accomplished by loading a block view that displays the curriculum map category content for each unit node referenced in the course node. The view is loaded into the content_bottom template region, so that it appears just below the course description field. A simple function in cgs_curriculum_map.module returns a + delimited list of node ids of the unit nodes attached to the currently loaded course node. The display setting for the node reference field in the course content type is set to hidden to prevent unit links from appearing above the unit content itself.

If a user wants to display a single unit in a more readable form, one may link the unit title to its node. The conventional node CCK field display presents fairly well.

A page view with exposed filters lists courses, so that a user may view courses in the desired divisions, grades, or subjects. This is a good starting point for a user.

The user interface for adding new units is currently weak. It would be clever to load the curriculum map unit node add form in a lightbox above the curriculum map course page, so that a teacher could create a new unit on the fly and still have it show up in the node reference autocomplete field. Also, some node edit form elements are named in such a way that may confuse teachers. For example, the edit tab on the curriculum map course node page will likely be construed as providing editing access to the unit nodes (you actually have to view the unit before you can edit it).

I am currently having difficulty using both arguments and filters together. The argument limits the initial course list to a single division in the division pages, but the filters attach additional criteria using ? arguments. When both exist, the view returns no nodes. It may be that the view is applying terms from one taxonomy to the other, where they don’t exist, causing the empty result set.

Use pathauto on the curriculum map content types and menu block visibility to load the correct secondary navigation menu when the view is displaying curriculum map entries.

curriculum map list view

curriculum map course view

Becoming a contributor

If I can contribute to an open-source project, then so can you! After years of using open-source web site software, I have finally begun to contribute back to the open-source community, in this case Drupal. The Drupal community of (mostly) volunteer programmers contribute hundreds of modules that expand and improve the Drupal project as a whole. At first, I gave back by registering an account on and posting comments on other people’s module issues pages. Then, I began to create new issues when I needed support for a module or found a problem with a module. Finally, I am now contributing small module code of my own to one project, LDAP Integration.

LDAP Integration allows your LDAP users (MS Active Directory, in our case) to log into our Drupal site. A user attempts to log in, Drupal checks their credentials against Active Directory, and then Drupal creates an account for the user if one does not already exist. Two additional components automatically generate group memberships and populate profile fields with LDAP data.

I wanted an additional feature — to create Drupal accounts for all of the Active Directory accounts we have ahead of time, so that they could have content assigned to them before they had even created an account. Why would I want to do this? At our school, we are building a new web site and migrating content from the old site. As we build the site, we want to attribute authorship of each article to the correct person, even if he or she has not yet logged into the site for the first time. We also have a Contacts block on some pages, which should show the user information for the contact person even if they have not yet logged into the new site. Finally, we have additional group memberships beyond Active Directory (e.g., content manager) that we want to assign and test whether the user has logged in before or not. You may have other similar needs for your site.

I learned how to create the .info file to define a new module, the .install file to create any database tables or store any Drupal variables when the module is activated. I learned to write a .module file that defines hook functions that fire when certain functions are called elsewhere in the site and also contains the rest of the programming logic for my module. At times, I borrowed code or called functions from ldapauth.module. Elsewhere, I wrote my own code. Learning the Drupal API has been tremendous. The functions of the core code and modules are well-documented, so that one may use them in one’s own modules. This makes writing a custom module both fast, Drupal standards-compliant, and adaptable to future changes in code.

Contributing code to the community has caused additional benefits. Other, more experienced, eyes have reviewed my code and suggested important changes. Others have weighed in on the strategy and design of the module. Unfortunately, “other” has been largely one enthusiastic Drupal user. Although his feedback has been excellent, I do wish that more individuals tried the module. Right now, we are stuck because the module is not running correctly for this one tester, who has an OpenLDAP directory. I only have Active Directory, so I cannot test or confirm his issue.

I now have a module that is working for our new site, that others have reviewed and improved. If we can gain another tester to solve the OpenLDAP issue, then I may also have made a useful contribution to other people’s sites. This contribution is permanently archived for others to find when they discover a similar need to ours. The conversation continues on the LDAPsync component page.

This success encourages me to write more custom modules for our site, as needed. For example, I have written my own mini-version of node_autotitle to create custom titles for athletics event nodes. I have written a custom Contacts block to automatically display the users associated with particular types of content, based on specific criteria. I have ported existing PHP code from custom work of years past to embed faculty/staff, student, and alumni directories into the site and make them available only to certain users based on the Drupal permissions system.

Though operating within the Drupal framework creates more work sometimes, it is extremely powerful and beats coding from scratch by a long way.

LDAP integration component page

Seeking Drupal Consultant

Catlin Gabel seeks a Drupal expert on a consulting basis to advise and assist school technology staff with the development of a new version of our public-facing web site, The consultant will explain Drupal best practices to the school’s development team, provide suggestions for techniques to solve specific problems, and directly assist with site configuration and programming as needed. Please visit for examples of the ideas we are currently exploring.

To apply, please send:
– A letter describing your interest in this project
– A résumé of your Drupal development experience and computer science education
– The URLs of sites that you have developed and/or a web-based portfolio
– References to prior Drupal site clients, especially in the nonprofit and education sectors

We will select finalists based on these materials and then request an in-person or Skype interview.

Richard Kassissieh
Director of Information Technology
Catlin Gabel School
kassissiehr (at)

Introduction To Drupal For Schools

I presented this talk today at the BAISNet meeting on open-source software hosted at Lick-Wilmerding School. Some of the links point to internal, password-protected resources. Contact me if you would like a tour.

In the early days of the web, schools designed and developed their own web sites. Then we purchased professional graphic design and content management systems. In recent years, full-service companies have sprung up to deliver schools a complete solution. This is one possible — but not the only — modern solution for a course web site. How did we move so far away from managing our own web sites? Is it possible to turn back?

With a little DIY spirit and open-source software, it is possible. Open-source content management systems have matured and arrived. They are now a viable choice for a professional, modern, effective school public-facing web site. In a time of cost consciousness, it is imperative for us to learn this field and build our own web sites once again.

We know how to evaluate and tell other people about commercial software. Read the company’s sales materials, ask other schools for references, review a live demo or an existing site, determine the terms of a contract, monitor the site as it is developed/delivered, contract with a trainer. After the site is launched, requests tweaks/new features as desired.

The open-source ecosystem is very different from the familiar landscape of commercial software. Open-source software does not have huge advertising budgets. You won’t see The Network or The Trusted Voice or taste tests.

The key to evaluating open-source software is to enter the community and try the software. Take Drupal as an example. You can search the forums for helpful community members, view everyone’s support issues, browse hundreds of community-contributed modules, read community-authored user and developer guides, read case studies by real users, join affinity groups, and build a test site to evaluate the suitability of the software for your purposes. Hire a Drupal developer or another if you like.

You may have concerns about running your public-facing web site on open-source software. That’s all right. Start with lower-stakes projects and get to know the software and the process well. Build up your own familiarity and comfort level through experience. has over 350,000 registered users. Version 1.0 was released in 2001. The current version is 6.9.

Peer schools using Drupal include Burke’s, Seattle Academy, Billings, and Meridian. College Prep uses Plone. Notable, Amherst College runs its main, public-facing web site on Drupal.

Other options: Plone, Joomla, WordPress

Once you go through this process and become a convert, how do you convince others? It may help to guide your school colleagues through a "lite" version of the steps you experienced. At Catlin Gabel, we formed a committee of ten major stakeholders in the web site project (admission, development, human resources, technical staff). I added to this group a parent who also works for an organization that provides technology consulting services to environmental organizations. We redesign our web site about once every six years. Drew redesigns organization web sites as his daily work. One of the most compelling answers was, "What about all of the R&D that companies put into their products? Open source communities probably devote a hundred times’ R&D into their ‘products.’"

Social Features

I pushed Drupal at my school because of its emphasis on social features. The White House has a blog. The Vatican has a YouTube channel. 40-somethings are joining Facebook in droves. Now is the time to introduce social features to your public-facing web site. Drupal is built around social features. Blogs, RSS feeds, tags, media support, and a powerful content management system are all strengths in Drupal.

Education-specific Drupal distributions: Social Media Classroom, DrupalEd, FunnyMonkey Commons. Will we see a distribution specifically for a school’s public-facing web site? Shall we create it together?

At Catlin Gabel, I first launched a community intranet portal to facilitate anyone’s media publishing. This site is organized around media types. All users may post articles, audio files, movies, and calendar entries, maintain a blog, and build an electronic portfolio. We also host other community content here, such as a carpool map, school archive, and summer jobs bulletin board.

With this experience under our belts, we are now taking on our main, public-facing web site. We plan to fully integrate community features throughout the site, not just in a dedicated section. Our constituents seek to engage with the school through its web site. Middle and upper school students seek authentic representations of student experience at the school. Commenting on all News articles. Making comments visible to all registered users. Providing user accounts to faculty, staff, students, alumni, parents, applicants, board members, and friends of the school. Approved "site editors" will be able to edit all static pages (not restricted to own department). Every user will have a blog, and blog content will be aggregated by topic (tags or content searches). Existing newsletters will fold into the blog and news functions.

Specific Features of Drupal

Drupal has a very small core and then hundreds of contributed modules. Let’s take a look at the core.

  • River of news
  • RSS feeds
  • User profiles
  • Search
  • Blog for each user
  • RSS aggregator
  • Forums
  • Commenting
  • Contact forms
  • File upload
  • Taxonomy (tagging)
  • Hierarchical content type (book)
  • Menu, theme, and content independent of each other
  • Revisions

Now let’s take a look at some commonly-used contributed modules:

  • Content Construction Kit (CCK) — page, news item, calendar event, athletic event, trip, curriculum map entry …
  • Views — define criteria to select content and then a format to display it
  • Calendar — control over categories, display formats
  • Image — image galleries, embedded images
  • Organic Groups — classrooms, clubs, teams, affinity groups
  • Notifications — email subscriptions by content type, keyword, or author
  • WYSIWYG editors — button-level control, link buttons to custom code
  • LDAP integration — same username/password as your other network systems
  • JavaScript functions (jQuery) — usability enhancements (AJAX)
  • Wiki — wiki markup if desired, otherwise revisions + editing rights + diff
  • Page functions — print, email, PDF

Fine-grained control

  • Position of administration functions
  • Per-item control of menus (user and administration)
  • Role definitions and permissions
  • Per-field control over content definitions
  • Ability to embed PHP code and write custom modules (Blackbaud integration)

Exciting additional features demonstrate the Drupal community’s ability to integrate promising new technologies.

Getting Started

My journey: insideCatlin, public-facing shadow site, Shasta Mountain Guides, 3D Cell Explorer, San Diego Hat Co, summer school registration, test installation for new site

Lessons learned: start small, grow gradually, distinguish yourself with modern features, don’t just talk about open-source, rather provide hands-on demos.

That’s it for this session. Will get into specific site design issues in the second session.