<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>Guildr/guildr/guild.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -135,7 +135,7 @@ identity.soprovider.model.permission=&quot;guildr.model.Permission&quot;
 # running, or you have loaded the configuration specifying what encryption to
 # use (in situations where identity may not yet be running, like tests).
 
-# identity.soprovider.encryption_algorithm=None
+identity.soprovider.encryption_algorithm=&quot;sha1&quot;
 
 # compress the data sends to the web browser
 # [/]</diff>
      <filename>Guildr/guildr/config/app.cfg</filename>
    </modified>
    <modified>
      <diff>@@ -3,18 +3,25 @@ from turbogears import controllers, expose, flash
 # from guildr import model
 from turbogears import identity, redirect
 from cherrypy import request, response
+from model import Guild
+from guild import GuildController
 # from guildr import json
 # import logging
 # log = logging.getLogger(&quot;guildr.controllers&quot;)
 
 class Root(controllers.RootController):
+    
+    guild = GuildController()
+    
+    @expose()
+    def flash(self, to):
+        flash(str(to))
+        raise redirect(&quot;/&quot;)
+    
     @expose(template=&quot;guildr.templates.welcome&quot;)
     # @identity.require(identity.in_group(&quot;admin&quot;))
     def index(self):
-        import time
-        # log.debug(&quot;Happy TurboGears Controller Responding For Duty&quot;)
-        flash(&quot;Your application is now running&quot;)
-        return dict(now=time.ctime())
+        return dict(guilds=Guild.selectBy(disabled=False))
 
     @expose(template=&quot;guildr.templates.login&quot;)
     def login(self, forward_url=None, previous_url=None, *args, **kw):</diff>
      <filename>Guildr/guildr/controllers.py</filename>
    </modified>
    <modified>
      <diff>@@ -7,21 +7,47 @@ from turbogears.database import PackageHub
 from sqlobject import SQLObject, SQLObjectNotFound, RelatedJoin
 # import some datatypes for table columns from SQLObject
 # (see http://www.sqlobject.org/SQLObject.html#column-types for more)
-from sqlobject import StringCol, UnicodeCol, IntCol, DateTimeCol
+from sqlobject import StringCol, UnicodeCol, IntCol, DateTimeCol, ForeignKey, MultipleJoin, BoolCol, EnumCol
 from turbogears import identity
 
 __connection__ = hub = PackageHub('guildr')
 
-
-# your data model
-
-
-# class YourDataClass(SQLObject):
-#     pass
-
-
-# the identity model
-
+class PluginConfig(SQLObject):
+    setting = UnicodeCol(length=255,notNone=True)
+    value = UnicodeCol(notNone=True)
+    plugin = ForeignKey(&quot;Plugin&quot;)
+    guser = ForeignKey(&quot;GuildUser&quot;)
+
+class PluginDatum(SQLObject):
+    name = UnicodeCol(length=255, notNone=True)
+    value = UnicodeCol(notNone=True)
+    plugin = ForeignKey(&quot;Plugin&quot;)
+    guser = ForeignKey(&quot;GuildUser&quot;)
+
+class Plugin(SQLObject):
+    name = UnicodeCol(length=255,notNone=True)
+    guilds = RelatedJoin('Guild', joinColumn='plugin_id',
+                              intermediateTable='guild_plugin',
+                              otherColumn='guild_id')
+    configs = MultipleJoin(&quot;PluginConfig&quot;)
+    data = MultipleJoin(&quot;PluginDatum&quot;)
+    file = UnicodeCol(notNone=True)
+
+class GuildUser(SQLObject):
+    tuser = ForeignKey(&quot;User&quot;)
+    guild = ForeignKey(&quot;Guild&quot;)
+    access = EnumCol(enumValues=[&quot;regular&quot;,&quot;admin&quot;],default=&quot;regular&quot;,notNone=True)
+    configs = MultipleJoin(&quot;PluginConfig&quot;)
+    data = MultipleJoin(&quot;PluginDatum&quot;)
+
+class Guild(SQLObject):
+    members = MultipleJoin(&quot;GuildUser&quot;)
+    disabled = BoolCol(notNone=True,default=False)
+    name = UnicodeCol(length=255, notNone=True)
+    website = UnicodeCol(length=255, notNone=True,default=&quot;&quot;)
+    plugins = RelatedJoin('Plugin', joinColumn='guild_id',
+                              intermediateTable='guild_plugin',
+                              otherColumn='plugin_id')
 
 class Visit(SQLObject):
     &quot;&quot;&quot;
@@ -98,6 +124,9 @@ class User(SQLObject):
     groups = RelatedJoin('Group', intermediateTable='user_group',
                          joinColumn='user_id', otherColumn='group_id')
 
+    guilds = MultipleJoin(&quot;GuildUser&quot;)
+    banned = BoolCol(notNone=True,default=False)
+
     def _get_permissions(self):
         perms = set()
         for g in self.groups:
@@ -125,4 +154,4 @@ class Permission(SQLObject):
     groups = RelatedJoin('Group',
                          intermediateTable='group_permission',
                          joinColumn='permission_id',
-                         otherColumn='group_id')
+                         otherColumn='group_id')
\ No newline at end of file</diff>
      <filename>Guildr/guildr/model.py</filename>
    </modified>
    <modified>
      <diff>@@ -15,10 +15,14 @@ tr th {text-align:left;background-color:#f0f0f0;color:#333;}
 tr.odd td {background-color:#edf3fe;}
 tr.even td {background-color:#fff;}
 
+#real_main_content {
+  background-color: white;
+}
+
 #header {
   height: 80px;
-  width: 777px;
-  background: blue URL('../images/header_inner.png') no-repeat;
+  width: 100%;
+  background: #ddd URL('../images/header_inner.png') no-repeat;
   border-left: 1px solid #aaa;
   border-right: 1px solid #aaa;
   margin: 0 auto 0 auto;
@@ -31,9 +35,9 @@ a.link, a, a.active {
 
 #main_content {
   color: black;
-  font-size: 127%;
+  font-size: large;
   background-color: white;
-  width: 757px;
+  width: 100%;
   margin: 0 auto 0 auto;
   border-left: 1px solid #aaa;
   border-right: 1px solid #aaa;
@@ -47,7 +51,7 @@ a.link, a, a.active {
   padding: 1em;
   float: right;
   width: 200px;
-  font-size: 88%;
+  font-size: small;
 }
 
 #sidebar h2 {
@@ -90,14 +94,15 @@ h2 {
 }
 
 #footer {
+  clear: both;
   border: 1px solid #aaa;
   border-top: 0px none;
   color: #999;
   background-color: white;
   padding: 10px;
-  font-size: 80%;
+  font-size: xx-small;
   text-align: center;
-  width: 757px;
+  width: 110%;
   margin: 0 auto 1em auto;
 }
 </diff>
      <filename>Guildr/guildr/static/css/style.css</filename>
    </modified>
    <modified>
      <diff>@@ -3,48 +3,41 @@
 &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:py=&quot;http://purl.org/kid/ns#&quot;
     py:extends=&quot;sitetemplate&quot;&gt;
 
-&lt;head py:match=&quot;item.tag=='{http://www.w3.org/1999/xhtml}head'&quot; py:attrs=&quot;item.items()&quot;&gt;
-    &lt;meta content=&quot;text/html; charset=UTF-8&quot; http-equiv=&quot;content-type&quot; py:replace=&quot;''&quot;/&gt;
-    &lt;title py:replace=&quot;''&quot;&gt;Your title goes here&lt;/title&gt;
-    &lt;meta py:replace=&quot;item[:]&quot; name=&quot;description&quot; content=&quot;master template&quot;/&gt;
-    &lt;style type=&quot;text/css&quot; media=&quot;screen&quot;&gt;
-        #pageLogin
-        {
-            font-size: 10px;
-            font-family: verdana;
-            text-align: right;
-        }
-    &lt;/style&gt;
-    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../static/css/style.css&quot;
-        py:attrs=&quot;href=tg.url('/static/css/style.css')&quot;/&gt;
-&lt;/head&gt;
+    &lt;head py:match=&quot;item.tag=='{http://www.w3.org/1999/xhtml}head'&quot; py:attrs=&quot;item.items()&quot;&gt;
+        &lt;meta content=&quot;text/html; charset=UTF-8&quot; http-equiv=&quot;content-type&quot; py:replace=&quot;''&quot;/&gt;
+        &lt;title py:replace=&quot;''&quot;&gt;Your title goes here&lt;/title&gt;
+        &lt;meta py:replace=&quot;item[:]&quot; name=&quot;description&quot; content=&quot;master template&quot;/&gt;
+        &lt;style type=&quot;text/css&quot; media=&quot;screen&quot;&gt;
+            #pageLogin
+            {
+                font-size: 10px;
+                font-family: verdana;
+                text-align: right;
+            }
+        &lt;/style&gt;
+        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;../static/css/style.css&quot;
+            py:attrs=&quot;href=tg.url('/static/css/style.css')&quot;/&gt;
+    &lt;/head&gt;
 
-&lt;body py:match=&quot;item.tag=='{http://www.w3.org/1999/xhtml}body'&quot; py:attrs=&quot;item.items()&quot;&gt;
-    &lt;div py:if=&quot;tg.config('identity.on') and not defined('logging_in')&quot; id=&quot;pageLogin&quot;&gt;
-        &lt;span py:if=&quot;tg.identity.anonymous&quot;&gt;
-            &lt;a href=&quot;${tg.url('/login')}&quot;&gt;Login&lt;/a&gt;
-        &lt;/span&gt;
-        &lt;span py:if=&quot;not tg.identity.anonymous&quot;&gt;
-            Welcome ${tg.identity.user.display_name or tg.identity.user.user_name}.
-            &lt;a href=&quot;${tg.url('/logout')}&quot;&gt;Logout&lt;/a&gt;
-        &lt;/span&gt;
-    &lt;/div&gt;
+    &lt;body py:match=&quot;item.tag=='{http://www.w3.org/1999/xhtml}body'&quot; py:attrs=&quot;item.items()&quot;&gt;
+        &lt;div id=&quot;real_main_content&quot;&gt;
+            &lt;div py:if=&quot;tg.config('identity.on') and not defined('logging_in')&quot; id=&quot;pageLogin&quot;&gt;
+                &lt;span py:if=&quot;not tg.identity.anonymous&quot;&gt;
+                    Welcome ${tg.identity.user.display_name or tg.identity.user.user_name}.
+                    &lt;a href=&quot;${tg.url('/logout')}&quot;&gt;Logout&lt;/a&gt;
+                &lt;/span&gt;
+            &lt;/div&gt;
+            &lt;div id=&quot;main_content&quot;&gt;
+                &lt;div id=&quot;status_block&quot; class=&quot;flash&quot;
+                    py:if=&quot;value_of('tg_flash', None)&quot; py:content=&quot;tg_flash&quot;&gt;&lt;/div&gt;
+                &lt;div py:replace=&quot;[item.text]+item[:]&quot;&gt;page content&lt;/div&gt;
+            &lt;/div&gt;
 
-    &lt;div id=&quot;header&quot;&gt;&amp;#160;&lt;/div&gt;
-
-    &lt;div id=&quot;main_content&quot;&gt;
-        &lt;div id=&quot;status_block&quot; class=&quot;flash&quot;
-            py:if=&quot;value_of('tg_flash', None)&quot; py:content=&quot;tg_flash&quot;&gt;&lt;/div&gt;
-        &lt;div py:replace=&quot;[item.text]+item[:]&quot;&gt;page content&lt;/div&gt;
-    &lt;/div&gt;
-
-    &lt;div id=&quot;footer&quot;&gt;
-        &lt;img src=&quot;${tg.url('/static/images/under_the_hood_blue.png')}&quot;
-            alt=&quot;TurboGears under the hood&quot; /&gt;
-        &lt;p&gt;TurboGears is a open source front-to-back web development framework
-            written in Python&lt;/p&gt;
-        &lt;p&gt;Copyright &amp;#169; 2007 Kevin Dangoor&lt;/p&gt;
-    &lt;/div&gt;
-&lt;/body&gt;
+            &lt;div id=&quot;footer&quot;&gt;
+                &lt;p&gt;Guildr: Awesome. Implemented in Python.&lt;/p&gt;
+                &lt;p&gt;Copyright &amp;#169; 2008 Silas Snider&lt;/p&gt;
+            &lt;/div&gt;
+        &lt;/div&gt;
+    &lt;/body&gt;
 
 &lt;/html&gt;</diff>
      <filename>Guildr/guildr/templates/master.kid</filename>
    </modified>
    <modified>
      <diff>@@ -3,45 +3,26 @@
     py:extends=&quot;'master.kid'&quot;&gt;
 &lt;head&gt;
 &lt;meta content=&quot;text/html; charset=utf-8&quot; http-equiv=&quot;Content-Type&quot; py:replace=&quot;''&quot;/&gt;
-&lt;title&gt;Welcome to TurboGears&lt;/title&gt;
+&lt;title&gt;Guildr&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;
 
-  &lt;div id=&quot;sidebar&quot;&gt;
-    &lt;h2&gt;Learn more&lt;/h2&gt;
-    Learn more about TurboGears and take part in its
-    development
-    &lt;ul class=&quot;links&quot;&gt;
-      &lt;li&gt;&lt;a href=&quot;http://www.turbogears.org&quot;&gt;Official website&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;http://docs.turbogears.org&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;http://trac.turbogears.org/turbogears/&quot;&gt;Trac
-        (bugs/suggestions)&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/turbogears&quot;&gt; Mailing list&lt;/a&gt; &lt;/li&gt;
-    &lt;/ul&gt;
-    &lt;span py:replace=&quot;now&quot;&gt;now&lt;/span&gt;
+  &lt;div id=&quot;sidebar&quot; py:if=&quot;tg.identity.anonymous&quot;&gt;
+    &lt;h2&gt;Log In&lt;/h2&gt;
+    &lt;form method=&quot;POST&quot; action=&quot;/login&quot;&gt;
+    &lt;table&gt;
+        &lt;tr&gt;&lt;td&gt;&lt;label for=&quot;user_name&quot;&gt;User Name:&lt;/label&gt;&lt;/td&gt;&lt;/tr&gt;
+        &lt;tr&gt;&lt;td&gt;&lt;input type=&quot;text&quot; id=&quot;user_name&quot; name=&quot;user_name&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;
+        &lt;tr&gt;&lt;td&gt;&lt;label for=&quot;password&quot;&gt;Password:&lt;/label&gt;&lt;/td&gt;&lt;/tr&gt;
+        &lt;tr&gt;&lt;td&gt;&lt;input type=&quot;password&quot; id=&quot;password&quot; name=&quot;password&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;
+        &lt;tr&gt;&lt;td&gt;&lt;input type=&quot;submit&quot; name=&quot;login&quot; value=&quot;Login&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;
+    &lt;/table&gt;
+    &lt;input type=&quot;hidden&quot; name=&quot;forward_url&quot; value=&quot;/&quot; /&gt;
+    &lt;/form&gt;
   &lt;/div&gt;
-  &lt;div id=&quot;getting_started&quot;&gt;
-    &lt;ol id=&quot;getting_started_steps&quot;&gt;
-      &lt;li class=&quot;getting_started&quot;&gt;
-        &lt;h3&gt;Model&lt;/h3&gt;
-        &lt;p&gt; &lt;a href=&quot;http://docs.turbogears.org/1.0/GettingStarted/DefineDatabase&quot;&gt;Design models&lt;/a&gt; in the &lt;span class=&quot;code&quot;&gt;model.py&lt;/span&gt;.&lt;br/&gt;
-          Edit &lt;span class=&quot;code&quot;&gt;dev.cfg&lt;/span&gt; to &lt;a href=&quot;http://docs.turbogears.org/1.0/GettingStarted/UseDatabase&quot;&gt;use a different backend&lt;/a&gt;, or start with a pre-configured SQLite database. &lt;br/&gt;
-          Use script &lt;span class=&quot;code&quot;&gt;tg-admin sql create&lt;/span&gt; to create the database tables.&lt;/p&gt;
-      &lt;/li&gt;
-      &lt;li class=&quot;getting_started&quot;&gt;
-        &lt;h3&gt;View&lt;/h3&gt;
-        &lt;p&gt; Edit &lt;a href=&quot;http://docs.turbogears.org/1.0/GettingStarted/Kid&quot;&gt;html-like templates&lt;/a&gt; in the &lt;span class=&quot;code&quot;&gt;/templates&lt;/span&gt; folder;&lt;br/&gt;
-        Put all &lt;a href=&quot;http://docs.turbogears.org/1.0/StaticFiles&quot;&gt;static contents&lt;/a&gt; in the &lt;span class=&quot;code&quot;&gt;/static&lt;/span&gt; folder. &lt;/p&gt;
-      &lt;/li&gt;
-      &lt;li class=&quot;getting_started&quot;&gt;
-        &lt;h3&gt;Controller&lt;/h3&gt;
-        &lt;p&gt; Edit &lt;span class=&quot;code&quot;&gt; controllers.py&lt;/span&gt; and &lt;a href=&quot;http://docs.turbogears.org/1.0/GettingStarted/CherryPy&quot;&gt;build your
-          website structure&lt;/a&gt; with the simplicity of Python objects. &lt;br/&gt;
-          TurboGears will automatically reload itself when you modify your project. &lt;/p&gt;
-      &lt;/li&gt;
-    &lt;/ol&gt;
-    &lt;div class=&quot;notice&quot;&gt; If you create something cool, please &lt;a href=&quot;http://groups.google.com/group/turbogears&quot;&gt;let people know&lt;/a&gt;, and consider contributing something back to the &lt;a href=&quot;http://groups.google.com/group/turbogears&quot;&gt;community&lt;/a&gt;.&lt;/div&gt;
-  &lt;/div&gt;
-  &lt;!-- End of getting_started --&gt;
+  &lt;table style=&quot;width:100%&quot;&gt;
+      &lt;tr&gt;&lt;th&gt;Guild Name&lt;/th&gt;&lt;th&gt;Website&lt;/th&gt;&lt;th&gt;Numer of Members&lt;/th&gt;&lt;/tr&gt;
+      &lt;tr py:for=&quot;i in guilds&quot;&gt;&lt;td&gt;&lt;a href=&quot;${tg.url('/')}guild/${i.id}&quot;&gt;${i.name}&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;${i.website}&quot;&gt;linky&lt;/a&gt;&lt;/td&gt;&lt;td&gt;${len(i.members)}&lt;/td&gt;&lt;/tr&gt;
+  &lt;/table&gt;
 &lt;/body&gt;
 &lt;/html&gt;</diff>
      <filename>Guildr/guildr/templates/welcome.kid</filename>
    </modified>
    <modified>
      <diff>@@ -3,25 +3,40 @@ Portfolio
 
 This is my portfolio repository. It contains the following projects:
 
+bugs
+----
+
+A TurboGears based bugtracker much like trac.
+
 ecAEPS
 ------
 
-A system for administering the AEPS, which is an assessment 
-given to kids that are developmentally disabled. Replaced 
+A system for administering the AEPS, which is an assessment given to 
+kids that are developmentally disabled. Replaced 
 [AEPSi](http://www.aepsinteractive.com/index.htm) for the UO
 
 googleauth
 ----------
 
-A [drupal](http://drupal.org) plugin that exposes a SAML server specifically for 
-use with Google Apps for Education -- this was a Google Summer of Code 
-(2007) project
+A [drupal](http://drupal.org) plugin that exposes a SAML server 
+specifically for use with Google Apps for Education -- this was a Google 
+Summer of Code (2007) project
+
+Guildr
+------
+
+A TurboGears project that allows people to form guilds across many sites 
+that track various meaningful statistics in order to facilitate the 
+creation of communities around them.
 
 OpenID
 ------
 
-I claim that this project is the first opensource OpenID server that actually works. I was thrashing around trying to find a working OpenID server at 2 in the morning the day 
-of the first coding sprint that the University of Oregon's ACM student club was running, and could find nothing that worked out of the box, so I wrote this. It requires the 
+I claim that this project is the first opensource OpenID server that 
+actually works. I was thrashing around trying to find a working OpenID 
+server at 2 in the morning the day of the first coding sprint that the 
+University of Oregon's ACM student club was running, and could find 
+nothing that worked out of the box, so I wrote this. It requires the 
 python JanRain OpenID libraries, SQLObject, and Kid.
 
 Whitepages</diff>
      <filename>README.markdown</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>059b8e2bc56f0766fb93f2eec77489889216b96e</id>
    </parent>
  </parents>
  <author>
    <name>Silas Snider</name>
    <email>swsnider@gmail.com</email>
  </author>
  <url>http://github.com/swsnider/portfolio/commit/f675985c84e91b11a9c732e4f03e2ecabd049a94</url>
  <id>f675985c84e91b11a9c732e4f03e2ecabd049a94</id>
  <committed-date>2008-03-31T00:30:03-07:00</committed-date>
  <authored-date>2008-03-31T00:30:03-07:00</authored-date>
  <message>added more stuff</message>
  <tree>398a2f64527c18c5bf87acc50585025ec23ef0ec</tree>
  <committer>
    <name>Silas Snider</name>
    <email>swsnider@gmail.com</email>
  </committer>
</commit>
