fix person bugs
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Sun, 10 Mar 2013 02:00:33 +0000 (21:00 -0500)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Sun, 10 Mar 2013 02:00:33 +0000 (21:00 -0500)
PLC/Methods/AddPerson.py
PLC/Persons.py

index fba00c3..ebf9ea9 100644 (file)
@@ -5,7 +5,8 @@ from PLC.Persons import Person, Persons
 from PLC.Auth import Auth
 
 can_update = lambda (field, value): field in \
-             ['name', 'email', 'password', 'enabled']
+             ['first_name', 'last_name', 'email', 'password', \
+              'enabled', 'title', 'url', 'bio', 'phone']
 
 class AddPerson(Method):
     """
@@ -35,4 +36,4 @@ class AddPerson(Method):
         person = Person(self.api, person_fields)
         person.sync()
 
-        return person.id
+        return person['person_id']
index 742afd9..a990099 100644 (file)
@@ -32,6 +32,7 @@ class Person(AlchemyObj):
 
     tablename = 'persons'
 
+        self.refresh(api)
     fields = {
         'person_id': Parameter(int, "User identifier", primary_key=True),
         'keystone_id': Parameter(str, "Keystone User identifier"),
@@ -77,6 +78,18 @@ class Person(AlchemyObj):
         if not email_re.match(email):
             raise invalid_email
 
+        # check only against users on the same peer
+        if 'peer_id' in self:
+            namespace_peer_id = self['peer_id']
+        else:
+            namespace_peer_id = None
+
+        conflicts = Person().select(filter={'email':email,'peer_id':namespace_peer_id})
+
+        for person in conflicts:
+            if 'person_id' not in self or self['person_id'] != person.person_id:
+                raise PLCInvalidArgument, "E-mail address already in use"  
+        
         return email
 
     def can_update(self, person):
@@ -92,7 +105,7 @@ class Person(AlchemyObj):
 
         assert isinstance(person, Person)
 
-        if self.person_id == person.person_id:
+        if self['person_id'] == person['person_id']:
             return True
 
         if 'admin' in self['roles']:
@@ -195,6 +208,8 @@ class Person(AlchemyObj):
                 self.object = users[0]
             self['keystone_id'] = self.object.id
             AlchemyObj.insert(self, dict(self))
+            person = AlchemyObj.select(self, filter={'keystone_id': self['keystone_id']})[0]
+            self['person_id'] = person.person_id
         else:
             self.object = self.api.client_shell.keystone.users.update(self['person_id'], nova_person)
             AlchemyObj.update(self, {'person_id': self['person_id']}, dict(self))
@@ -209,10 +224,11 @@ class Person(AlchemyObj):
         self.api.client_shell.keystone.users.delete(nova_user)
 
         # delete relationships
-        SlicePerson().delete.filter({'person_id': self['person_id']})
+        for slice_person in SlicePerson().select(filter={'person_id': self['person_id']}):
+            slice_person.delete() 
 
         # delete person
-        AlchemyObj.delete(self, dict(self))
+        AlchemyObj.delete(self, filter={'person_id':  self['person_id']})
 
  
 class Persons(list):
@@ -260,4 +276,5 @@ class Persons(list):
             if not columns or 'slice_ids' in columns:
                 person_slices = SlicePerson().select(filter={'person_id': person['person_id']})
                 person['slice_ids'] = [rec.slice_id for rec in person_slices]
-            self.append(person) 
+            self.append(person)
+