Hey guys, I heard there was this app called Doodle. It's closed source. Let's make an open-source Doodle killer and call it Clockworks!
We have a mailing list - if you're interested in helping design the
app, just let one of the developers know
and we'll add you to our mailing list, clockworks. Or if you just
want to hear more about what we're up to, blanche yourself to the
public list clockworks-announce.
Getting started
Clockworks is in pre-pre-alpha phase; most of the functionality hasn't been done yet.
The best way to get started with Clockworks is to get yourself added to the project, grab a copy of the code, get it running on your laptop, and then poke around the source code. We also have a Hiveminder project with bite-sized tasks that you can work on (ping a project maintainer to get invited.)
First, make sure you have Git installed on your system. You can grab it here. Verify that it installed by popping open a terminal and running git --version
Next, grab the source code. If you have Debathena installed on your machine, you can clone the source using git clone /mit/clockworks/clockworks.git. If not, you can use a dialup to get to the directory; git clone ssh://username@linerva.mit.edu/mit/clockworks/clockworks.git works well. If the clone succeeds, you will now have a folder named "clockworks". cd clockworks
Now, to install the application. Assuming that you have a reasonable version of Python on your system, running ./nosudo-virtualenv.sh should set up the environment. If it succeeds, you'll see the help output for a command named paster.
Run the application by changing into your environment with source tg2env/bin/activate and then typing paster serve --reload development.ini. And voila; a very boilerplate TurboGears install should be facing you at http://localhost:8080
If these steps fail (which happens on some configurations of OS X and almost invariably on Windows), talk to us and we can get you set up with a copy running on scripts.mit.edu or xvm.mit.edu.
Once you're running, here are some paths to take:
- Take a break and read some TurboGears documentation to get a feel for the framework
- Browse through the todo list, pick a task that seems interesting, and start working on figuring out how to make it work
- Browse the source, fiddle with some variables, see what changes
- Decide what clockworks should look like, and take off
Development info
Our Git repository is located in AFS in the clockworks locker: /mit/clockworks/clockworks.git
Phase 1
Doodle clone. 100% duplication of Doodle functionality. Modifications to improve usability as necessary.
Pitfalls to avoid
What do people not like about Doodle?
- Too much clicking
- We can deal with this by collapsing the three-page wizard Doodle has into a single page. Be careful not to sacrifice too much simplicity for such a setup.
- No obvious "I can, but would rather not"
- Alleviated also by the above; this might want to be the default poll setup.
- Trac, one of the first Python web applications to hit mainstream, was long bemoaned for being complex to install. Try not to have the same story
What to do?
Work through the TurboGears tutorial (the tutorial seems to focus on SQLObject, which is not necessarily the best thing. Maybe someone can find some better docs?)
Setup database configuration and installer (an auxiliary issue is the presence of an installer for people). (ezyang)
- Learn SQLAlchemy (ezyang)
Make sure the default scaffolding works on Scripts (this includes running TurboGears as CGI). Any work done here should be considered for a TurboGears auto-installer, the equivalent of tgsetup) (ezyang)
Write a .gitignore file for generated/not versionable items
Get friendly URLs working
Setup a zephyrbot that watches the repository
- Configure the default TurboGears scaffolding
- Learn Genshi, the templating engine
- Learn Widgets (we'll be using them for all of the forms in this website)
- Polish up and get SSL authentication working with TurboGears Identity (the two should be integrated together in a sane manner.)
- Write model classes for all of our tables
- Write controllers for each of the pages
Architecture
- Language: Python 2.5+
- Framework: TurboGears 2.0
- SCM: Git
- JavaScript: Mochikit
- Database: SQLite for development, ? for production
- ORM: SQLAlchemy
- Templating: Genshi
Other ideas:
- Use 15 minute timeslices to simplify interface
Principles
- Simplicity
- Extendibility
- Open Source
Schema
You can view the database schema in model.py. Some notable features:
- All
user.user_id foreign keys are paired with an anon_name field. If user_id is null, then the associated entity was posted by an anonymous user, and anon_name contains the name they submitted for themselves
- The current
time_slots table uses DateTime and Interval to define events. We should consider whether or not 15 minute timeslices will be the native representation in the database, or simply a simpler model for the interface
length is likely common through all possible times for an event, so it's stored in both time_slots and event
events.timezone represents the timezone that the event is occurring in, so we can give user-friendly times. If this field is null, then the creator's user.timezone field is used (if that is also null, we should probably use EST)
key and admin_key in event refer to random values that will compose the URLs for events.
- For full backwards compatibility,
hidden and extended are stored as boolean attributes (the former refers to hiding the responses of users, the latter refers to allowing Yes/No/IfNeedBe responses). We may want to consider an alternate model for these properties
- The schema is not very generalized. Certain parts should definitely be generalized, but let's try to avoid the architecture astronaut syndrome.
Page Inventory
List of "screens" in Doodle
- /: Home page (including login)
- /help: Help pages (screencasts, interactive JavaScript, etc.)
- /new: Schedule event (should be one-page-able)
- General info (title, description, name, email)
- Days (calendar, should be AJAX)
- Times (timezone (JS fill-in), add more timeslots, copypaste first row)
- Options (yes-no-ifneedbe, hidden poll, limit OKs)
- Poll created (admin, participant links)
- /events/event-name: View poll (timezone, name, times, information, functions)
- /events/event-name/edit: Edit entry (completely wiki!)
- Delete entry
- /events/event-name/comment: Add a comment
- /events/event-name/export: Calendar export (both ways)
- File export (excel, pdf)
- /events/event-name/feed: Subscribe (atom, and then social feed services)
- /events/event-name/embed: Embed poll (iframe)
- /events/event-name/admin: Admin poll (participation link)
- /events/event-name/admin/edit: Edit poll (all original options)
- /events/event-name/admin/history: History
- /events/event-name/admin/reset: Delete all participants/comments
- /events/event-name/admin/delete: Delete poll
- /signup: Signup page
- /myclockworks: List of polls created by user, list of polls the user has participated in, links to creating a new event
- /myclockworks/account provides links to the following four links
- /myclockworks/changeEmail
- /myclockworks/changePassword
- /myclockworks/editInformation
- /myclockworks/delete
- Note: Doodle functions by creating two links per event: one for the public and one for administrator, but anyone can follow either link if they know what it is
Phase 2
Doodle killer. Extra features. Pump it up.
- Better UI
- Integration
- Basic: integration with ICS calendars, GoogleCalendar, Exchange, and TechTime (for faculty)
- Advanced: integration with MIT's course schedules, Facebook
- Would store persistent profiles of calendar data for users
- Automatically prioritize and schedule events for you
- Create mobile phone friendly version
- View of a single calendar month should show "ghosts" of days from immediately previous and immediately past months, to fill out all the weeks.
- Ability to convert Yes/No polls into Yes/Maybe/No polls (and vice versa)
- When setting up a new poll, ability to copy-paste the times for any arbitrary row into any number of other arbitrary rows
- "Generic week" function
- Indicates that the response is for a weekly meeting, not a specific date.
Developers
- Geoffrey Thomas
- Paul Baranay
- Edward Yang
- Paul Weaver
- Xavid Pretzer
- Christian Ternus
- David Benjamin
- You?