Index: treasury/settings.py
===================================================================
--- treasury/settings.py	(revision 719e4bb9d4a1fcc620dcb25c2a048d747b4c8d2d)
+++ treasury/settings.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -1,3 +1,7 @@
 # Django settings for treasury project.
+import os
+
+APP_ROOT = os.path.dirname(__file__)
+DEFAULT_DOMAIN = 'mit.edu'
 
 DEBUG = True
@@ -5,11 +9,11 @@
 
 ADMINS = (
-    # ('Your Name', 'your_email@domain.com'),
+    ('Alex Dehnert', 'adehnert@mit.edu'),
 )
 
 MANAGERS = ADMINS
 
-DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = 'treasury.sqlite'             # Or path to database file if using sqlite3.
 DATABASE_USER = ''             # Not used with sqlite3.
 DATABASE_PASSWORD = ''         # Not used with sqlite3.
@@ -70,10 +74,15 @@
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
+    APP_ROOT + '/templates/',
 )
 
 INSTALLED_APPS = (
+    'django.contrib.admin',
+    'django.contrib.admindocs',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.sites',
+    'treebeard',
+    'vouchers',
 )
Index: treasury/urls.py
===================================================================
--- treasury/urls.py	(revision 719e4bb9d4a1fcc620dcb25c2a048d747b4c8d2d)
+++ treasury/urls.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -2,16 +2,16 @@
 
 # Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
+from django.contrib import admin
+admin.autodiscover()
 
 urlpatterns = patterns('',
     # Example:
-    # (r'^treasury/', include('treasury.foo.urls')),
+    (r'^vouchers/', include('treasury.vouchers.urls')),
 
     # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
     # to INSTALLED_APPS to enable admin documentation:
-    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+    (r'^admin/doc/', include('django.contrib.admindocs.urls')),
 
     # Uncomment the next line to enable the admin:
-    # (r'^admin/(.*)', admin.site.root),
+    (r'^admin/(.*)', admin.site.root),
 )
Index: treasury/vouchers/admin.py
===================================================================
--- treasury/vouchers/admin.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
+++ treasury/vouchers/admin.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -0,0 +1,11 @@
+import vouchers
+from django.contrib import admin
+
+class BudgetAreaAdmin(admin.ModelAdmin):
+    pass
+    #fields = [ 'path', 'name', 'comment', 'owner', 'interested', ]
+
+admin.site.register(vouchers.models.BudgetArea, BudgetAreaAdmin)
+admin.site.register(vouchers.models.BudgetTerm)
+admin.site.register(vouchers.models.BudgetAreaTerm)
+admin.site.register(vouchers.models.ReimbursementRequest)
Index: treasury/vouchers/models.py
===================================================================
--- treasury/vouchers/models.py	(revision 719e4bb9d4a1fcc620dcb25c2a048d747b4c8d2d)
+++ treasury/vouchers/models.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -1,3 +1,82 @@
 from django.db import models
+import treebeard.mp_tree
+import settings
 
-# Create your models here.
+class BudgetArea(treebeard.mp_tree.MP_Node):
+    name = models.CharField(max_length=50)
+    comment = models.TextField(blank=True)
+    always = models.BooleanField(blank=True, default=False)
+
+    # Contact / ACL information
+    # If not specified, inherit from parent
+    owner = models.EmailField(help_text = 'Email address of the officer responsible for the area', blank=True) # owner of the budget area
+    interested = models.EmailField(help_text='Email address of parties interested in the area', blank=True) # interested parties (ie, whole committee)
+    use_owner = models.BooleanField(default=False, blank=True)
+
+    def contact_address(self,):
+        address = ''
+        if self.use_owner:
+            address = self.owner or self.interested
+        else:
+            address = self.interested or self.owner
+        return address or self.get_parent().contact_address()
+
+    def mark_used(self, term, comment=""):
+        BudgetAreaTerm.objects.get_or_create(
+            budget_area=self,
+            budget_term=term,
+            defaults={'comment':comment}
+        )
+
+    @classmethod
+    def get_by_path(cls, path):
+        root = BudgetArea.objects.get(name=path[0], depth=1)
+        node = root
+        for name in path[1:]:
+            node = node.get_children().filter(name=name)[0]
+        return node
+
+    def dump_to_html(self):
+        struct = self.dump_bulk()
+        return self.struct_to_html(struct, depth=0)
+
+    def struct_to_html(self, struct, depth=0):
+        def format_data(data):
+            return "<em>"+data['name']+"</em> "+unicode(data)
+        prefix = "\t"*depth
+        html = prefix+"<ul>\n"
+        html = html + "\n".join(
+            [("%(prefix)s\t<li>%(data)s\n%(children)s\t%(prefix)s</li>\n" % {
+                'prefix':prefix,
+                'data':format_data(elem['data']),
+                'children':('children' in elem and self.struct_to_html(elem['children'], depth+1) or '')
+            }) for elem in struct])
+        html = html + prefix + "</ul>\n"
+        return html
+
+    def __unicode__(self,):
+        return u"%s [%s] (%s)" % (self.name, self.contact_address(), self.always, )
+
+class BudgetTerm(models.Model):
+    name = models.CharField(max_length=20)
+    start_date = models.DateField()
+    end_date = models.DateField()
+    submit_deadline = models.DateField()
+
+class BudgetAreaTerm(models.Model):
+    budget_area = models.ForeignKey(BudgetArea)
+    budget_term = models.ForeignKey(BudgetTerm)
+    comment = models.TextField(blank=True, )
+
+class ReimbursementRequest(models.Model):
+    submitter = models.CharField(max_length=10) # MIT username of submitter
+    check_to_name = models.CharField(max_length=50)
+    check_to_email = models.EmailField()
+    check_to_addr = models.TextField(blank=True)
+    amount = models.DecimalField(max_digits=7, decimal_places=2)
+    budget_area = models.ForeignKey(BudgetArea)
+    budget_term = models.ForeignKey(BudgetTerm)
+
+def coerce_full_email(email):
+    if '@' in email: return email
+    else: return email + '@' + settings.DEFAULT_DOMAIN
Index: treasury/vouchers/urls.py
===================================================================
--- treasury/vouchers/urls.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
+++ treasury/vouchers/urls.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -0,0 +1,6 @@
+from django.conf.urls.defaults import *
+import treasury.vouchers.views
+
+urlpatterns = patterns('',
+    (r'^accounts/display_tree', treasury.vouchers.views.display_tree),
+)
Index: treasury/vouchers/views.py
===================================================================
--- treasury/vouchers/views.py	(revision 719e4bb9d4a1fcc620dcb25c2a048d747b4c8d2d)
+++ treasury/vouchers/views.py	(revision 13a23ce1b69fc795bff17ee750050657eb37a393)
@@ -1,1 +1,6 @@
-# Create your views here.
+from django.http import HttpResponse
+import treasury.vouchers.models
+
+def display_tree(request):
+    root = treasury.vouchers.models.BudgetArea.get_by_path(['Accounts'])
+    return HttpResponse(root.dump_to_html())
