Removed tours link from main page
[wiki.git] / projects / clockworks.mdwn
1 [[!meta title="Clockworks"]]
2
3 Hey guys, I heard there was this app called [Doodle](http://www.doodle.com/main.html). It's closed source. Let's make an open-source Doodle killer and call it Clockworks!
4
5 We have a mailing list - if you're interested in helping design the
6 app, just [let one of the developers know](mailto:clockworks@mit.edu)
7 and we'll add you to our mailing list, **clockworks**. Or if you just
8 want to hear more about what we're up to, blanche yourself to the
9 public list **clockworks-announce**.
10
11 ## Getting started
12
13 Clockworks is in pre-pre-alpha phase; most of the functionality hasn't been done yet.
14
15 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.)
16
17 First, make sure you have Git installed on your system. You can grab it [here](http://git-scm.com/download). Verify that it installed by popping open a terminal and running **git --version**
18
19 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**
20
21 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.
22
23 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
24
25 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.
26
27 Once you're running, here are some paths to take:
28
29 1. Take a break and read some TurboGears documentation to get a feel for the framework
30 2. Browse through the todo list, pick a task that seems interesting, and start working on figuring out how to make it work
31 3. Browse the source, fiddle with some variables, see what changes
32 4. Decide what clockworks should look like, and take off
33
34
35 ## Development info
36
37 Our Git repository is located in AFS in the clockworks locker: /mit/clockworks/clockworks.git
38
39 ## Phase 1
40
41 Doodle clone. 100% duplication of Doodle functionality. Modifications to improve usability as necessary.
42
43 ### Pitfalls to avoid
44
45 What do people not like about Doodle?
46
47 * Too much clicking
48  * 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.
49 * No obvious "I can, but would rather not"
50  * Alleviated also by the above; this might want to be the default poll setup.
51 * 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
52
53 ### What to do?
54
55 * <del>Work through the [TurboGears tutorial](http://docs.turbogears.org/1.0/Wiki20/Page1) (the tutorial seems to focus on SQLObject, which is not necessarily the best thing. Maybe someone can find some better docs?)</del>
56 * <del>Setup database configuration and installer (an auxiliary issue is the presence of an installer for people). (**ezyang**)</del>
57 * Learn SQLAlchemy (**ezyang**)
58 * <del>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**)</del>
59 * <del>Write a .gitignore file for generated/not versionable items</del>
60 * <del>Get friendly URLs working</del>
61 * <del>Setup a zephyrbot that watches the repository</del>
62 * [Configure](http://turbogears.org/2.0/docs/main/Config.html) the default TurboGears scaffolding
63 * Learn [Genshi](http://turbogears.org/2.0/docs/main/Genshi.html), the templating engine
64 * Learn [Widgets](http://turbogears.org/2.0/docs/main/ToscaWidgets/forms.html) (we'll be using them for all of the forms in this website)
65 * Polish up and get SSL authentication working with TurboGears Identity (the two should be integrated together in a sane manner.)
66 * Write model classes for all of our tables
67 * Write controllers for each of the pages
68
69 ### Architecture
70
71 * **Language**: Python 2.5+
72 * **Framework**: TurboGears 2.0
73 * **SCM**: Git
74 * **JavaScript**: Mochikit
75 * **Database**: SQLite for development, ? for production
76 * **ORM**: SQLAlchemy
77 * **Templating**: Genshi
78
79 Other ideas:
80
81 * Use 15 minute timeslices to simplify interface
82
83 ### Principles
84
85 * Simplicity
86 * Extendibility
87 * Open Source
88
89 ### Schema
90
91 You can view the database schema in *model.py*. Some notable features:
92
93 * 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
94 * 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
95 * `length` is likely common through all possible times for an event, so it's stored in both `time_slots` and `event`
96 * `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)
97 * `key` and `admin_key` in `event` refer to random values that will compose the URLs for events.
98 * 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
99 * The schema is not very generalized. Certain parts should definitely be generalized, but let's try to avoid the architecture astronaut syndrome.
100
101 ### Page Inventory
102
103 List of "screens" in Doodle
104
105 * **/**: Home page (including login)
106 * **/help**: Help pages (screencasts, interactive JavaScript, etc.)
107 * **/new**: Schedule event (should be one-page-able)
108   * General info (title, description, name, email)
109   * Days (calendar, should be AJAX)
110   * Times (timezone (JS fill-in), add more timeslots, copypaste first row)
111   * Options (yes-no-ifneedbe, hidden poll, limit OKs)
112   * Poll created (admin, participant links)
113 * **/events/*event-name***: View poll (timezone, name, times, information, functions)
114   * **/events/*event-name*/edit**: Edit entry (completely wiki!)
115   * Delete entry
116   * **/events/*event-name*/comment**: Add a comment
117   * **/events/*event-name*/export**: Calendar export (both ways)
118   * File export (excel, pdf)
119   * **/events/*event-name*/feed**: Subscribe (atom, and then social feed services)
120   * **/events/*event-name*/embed**: Embed poll (iframe)
121 * **/events/*event-name*/admin**: Admin poll (participation link)
122   * **/events/*event-name*/admin/edit**: Edit poll (all original options)
123   * **/events/*event-name*/admin/history**: History
124   * **/events/*event-name*/admin/reset**: Delete all participants/comments
125   * **/events/*event-name*/admin/delete**: Delete poll
126 * **/signup**: Signup page
127 * **/myclockworks**: List of polls created by user, list of polls the user has participated in, links to creating a new event
128   * **/myclockworks/account** provides links to the following four links
129   * **/myclockworks/changeEmail**
130   * **/myclockworks/changePassword**
131   * **/myclockworks/editInformation**
132   * **/myclockworks/delete**
133   * 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
134
135 ## Phase 2
136
137 Doodle killer. Extra features. Pump it up.
138
139 * Better UI
140 * Integration
141   * Basic: integration with ICS calendars, GoogleCalendar, Exchange, and TechTime (for faculty)
142   * Advanced: integration with MIT's course schedules, Facebook
143   * Would store persistent profiles of calendar data for users
144 * Automatically prioritize and schedule events for you
145 * Create mobile phone friendly version
146 * View of a single calendar month should show "ghosts" of days from immediately previous and immediately past months, to fill out all the weeks.
147 * Ability to convert Yes/No polls into Yes/Maybe/No polls (and vice versa)
148 * When setting up a new poll, ability to copy-paste the times for any arbitrary row into any number of other arbitrary rows
149 * "Generic week" function
150   * Indicates that the response is for a weekly meeting, not a specific date.
151
152 ## Developers
153
154 * Geoffrey Thomas
155 * Paul Baranay
156 * Edward Yang
157 * Paul Weaver
158 * Xavid Pretzer
159 * Christian Ternus
160 * David Benjamin
161 * <a href="mailto:clockworks@mit.edu">You?</a>