Switch to side-by-side view

--- a/pyforge/pyforge/model/auth.py
+++ b/pyforge/pyforge/model/auth.py
@@ -1,6 +1,8 @@
 from base64 import b64encode
 from random import randint
 from hashlib import sha256
+
+from pylons import c
 
 from ming import Document, Session, Field
 from ming import schema as S
@@ -28,6 +30,18 @@
     open_ids=Field([str])
     password=Field(str)
 
+    def role_iter(self):
+        yield '*anonymous'
+        if self._id:
+            yield '*authenticated'
+        if self._id:
+            for pr in ProjectRole.m.find(dict(user_id=self._id)):
+                for role in pr.role_iter():
+                    yield role
+
+    def project_role(self):
+        return ProjectRole.m.get(user_id=self._id)
+
     def set_password(self, password):
         self.password = encode_password(password)
 
@@ -36,6 +50,19 @@
         salt = str(self.password[6:6+self.SALT_LEN])
         check = encode_password(password, salt)
         return check == self.password
+
+    def register_project(self, pid):
+        from .project import Project
+        p = Project.make(dict(
+                _id=pid + '/', name=pid,
+                database='project:%s' % pid,
+                is_root=True))
+        c.project = p
+        p.allow_user(self, 'create', 'read', 'delete', 'plugin', 'security')
+        p.install_app('admin', 'admin')
+        p.m.insert()
+        p.add_user_role(self)
+        return p
 
 User.anonymous = User.make(dict(
         _id=None, username='*anonymous', display_name='Anonymous Coward'))
@@ -59,6 +86,8 @@
             yield self._id
             visited.add(self._id)
             for r in self.roles:
-                for rr in ProjectRole.m.get(r).role_iter(visited):
+                pr = ProjectRole.m.get(_id=r)
+                if pr is None: continue
+                for rr in pr.role_iter(visited):
                     yield rr