Improvements and changes in Aspect().getUsers()
authorMarek Marecki <triviuss@gmail.com>
Thu, 4 Jul 2013 13:53:56 +0000 (15:53 +0200)
committerMarek Marecki <triviuss@gmail.com>
Thu, 4 Jul 2013 13:53:56 +0000 (15:53 +0200)
diaspy/errors.py
diaspy/models.py
diaspy/people.py

index e5a6167d4579f4b0bef3ed967121879712845179..90cc28dc3db72146cf1369b35eb04000759aed4c 100644 (file)
@@ -16,6 +16,12 @@ class LoginError(DiaspyError):
     pass
 
 
+class UserError(DiaspyError):
+    """Exception raised when something related to users goes wrong.
+    """
+    pass
+
+
 def react(r, message='', accepted=[200, 201, 202, 203, 204, 205, 206], exception=DiaspyError):
     """This method tries to decides how to react
     to a response code passed to it. If it's an
index c412d51ef461d7b5ee77194f46d6386d9c610e45..0a7e3cd7f69f98a7e4b0e3092d9d7a18bc518ba8 100644 (file)
@@ -49,25 +49,32 @@ class Aspect():
                 break
         return id
 
-    def getUsers(self):
-        """Returns list of GUIDs of users who are listed in this aspect.
+    def _getajax(self):
+        """Returns HTML returned when editing aspects via web UI.
         """
         start_regexp = re.compile('<ul +class=["\']contacts["\'] *>')
-        userline_regexp = re.compile('<a href=["\']/people/[a-z0-9]{16,16}["\']>[a-zA-Z0-9()@. _-]+</a>')
-        personid_regexp = 'alt=["\']{0}["\'] class=["\']avatar["\'] data-person_id=["\'][0-9]+["\']'
-        method_regexp = 'data-method="delete" data-person_id="{0}"'
-
         ajax = self._connection.get('aspects/{0}/edit'.format(self.id)).text
 
         begin = ajax.find(start_regexp.search(ajax).group(0))
         end = ajax.find('</ul>')
-        ajax = ajax[begin:end]
+        return ajax[begin:end]
+
+    def _extractusernames(self, ajax):
+        """Extracts usernames and GUIDs from ajax returned by Diaspora*.
+        Returns list of two-tuple: (guid, diaspora_name).
+        """
+        userline_regexp = re.compile('<a href=["\']/people/[a-z0-9]{16,16}["\']>[a-zA-Z0-9()@. _-]+</a>')
+        return [(line[17:33], re.escape(line[35:-4])) for line in userline_regexp.findall(ajax)]
+
+    def getUsers(self):
+        """Returns list of GUIDs of users who are listed in this aspect.
+        """
+        personid_regexp = 'alt=["\']{0}["\'] class=["\']avatar["\'] data-person_id=["\'][0-9]+["\']'
+        method_regexp = 'data-method="delete" data-person_id="{0}"'
+
+        ajax = self._getajax()
+        usernames = self._extractusernames(ajax)
 
-        usernames = [(line[17:33], line[35:-4]) for line in userline_regexp.findall(ajax)]
-        for i, data in enumerate(usernames):
-            guid, name = data
-            for char in ['(', ')', '.']: name = name.replace(char, '\\'+char)
-            usernames[i] = (guid, name)
         personids = [re.compile(personid_regexp.format(name)).search(ajax).group(0) for guid, name in usernames]
         for n, line in enumerate(personids):
             i, id = -2, ''
index 8107ab2194efdd2a94919c055cc26bed87d490bd..2e94fab9acd232c8c4c297a7d1705c12ffbef46e 100644 (file)
@@ -1,6 +1,7 @@
 import re
 from diaspy.streams import Outer
 from diaspy.models import Aspect
+from diaspy import errors
 
 
 class User():
@@ -74,7 +75,7 @@ class User():
             raise Exception('wrong error code: {0}'.format(request.status_code))
         else:
             request = request.json()
-        if not len(request): raise Exception('Cannot extract user data: no posts to analyze')
+        if not len(request): raise errors.UserError('cannot extract user data: no posts to analyze')
         names = [('id', 'id'),
                  ('diaspora_id', 'diaspora_id'),
                  ('guid', 'guid'),