Moved `User().fetchprofile()` functionality to `Search().users()`
[diaspy.git] / diaspy / people.py
index 8107ab2194efdd2a94919c055cc26bed87d490bd..f3d0048467e4a78f36cc9e4092fe3047e7c840df 100644 (file)
@@ -1,6 +1,8 @@
 import re
 from diaspy.streams import Outer
 from diaspy.models import Aspect
+from diaspy import errors
+from diaspy import search
 
 
 class User():
@@ -11,11 +13,11 @@ class User():
 
     The parameter fetch should be either 'posts', 'data' or 'none'. By
     default it is 'posts' which means in addition to user data, stream
-    will be fetched. If user has not posted yet diaspy will not be able 
-    to extract the information from his/her posts. Since there is no official 
-    way to do it we rely on user posts. If this will be the case user 
+    will be fetched. If user has not posted yet diaspy will not be able
+    to extract the information from his/her posts. Since there is no official
+    way to do it we rely on user posts. If this will be the case user
     will be notified with appropriate exception message.
-    
+
     If fetch is 'data', only user data will be fetched. If the user is
     not found, no exception will be returned.
 
@@ -23,28 +25,32 @@ class User():
     optional parameters. GUID takes precedence over handle when fetching
     user stream. When fetching user data, handle is required.
     """
-    data = {}
-    stream = []
-
     def __init__(self, connection, guid='', handle='', fetch='posts', id=0):
         self._connection = connection
+        self.stream = []
         self.data = {
             'guid': guid,
             'handle': handle,
-            'id': id
+            'id': id,
         }
         self._do_fetch(fetch)
 
     def __getitem__(self, key):
         return self.data[key]
 
+    def __str__(self):
+        return self['guid']
+
+    def __repr__(self):
+        return '{0} ({1})'.format(self['diaspora_name'], self['guid'])
+
     def _do_fetch(self, fetch):
         if fetch == 'posts':
             if self['handle'] and self['guid']: self.fetchguid()
             elif self['guid'] and not self['handle']: self.fetchguid()
             elif self['handle'] and not self['guid']: self.fetchhandle()
         elif fetch == 'data' and len(self['handle']):
-            self.fetchprofile()
+            self._postproc(search.Search(self._connection).users(query=handle)[0])
 
     def _sephandle(self):
         """Separate D* handle into pod pod and user.
@@ -56,8 +62,14 @@ class User():
         handle = self['handle'].split('@')
         pod, user = handle[1], handle[0]
         return (pod, user)
-        
-    def _finalize_data(self, data, names):
+
+    def _finalize_data(self, data):
+        names = [('id', 'id'),
+                 ('handle', 'diaspora_id'),
+                 ('guid', 'guid'),
+                 ('name', 'diaspora_name'),
+                 ('avatar', 'image_urls'),
+                 ]
         final = {}
         for d, f in names:
             final[f] = data[d]
@@ -74,14 +86,8 @@ 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')
-        names = [('id', 'id'),
-                 ('diaspora_id', 'diaspora_id'),
-                 ('guid', 'guid'),
-                 ('name', 'diaspora_name'),
-                 ('avatar', 'image_urls'),
-                 ]
-        self.data = self._finalize_data(request[0]['author'], names)
+        if not len(request): raise errors.UserError('cannot extract user data: no posts to analyze')
+        self.data = self._finalize_data(request[0]['author'])
         self.stream = Outer(self._connection, location='people/{0}.json'.format(self['guid']))
 
     def fetchhandle(self, protocol='https'):
@@ -96,23 +102,6 @@ class User():
         """
         request = self._connection.get('people/{0}.json'.format(self['guid']))
         self._postproc(request)
-        
-    def fetchprofile(self, protocol='https'):
-        """Fetch user data using Diaspora handle.
-        """
-        request = self._connection.get('people.json?q={0}'.format(self['handle']))
-        if request.status_code != 200:
-            raise Exception('wrong error code: {0}'.format(request.status_code))
-        else:
-            request = request.json()
-        if len(request):
-            names = [('id', 'id'),
-                     ('handle', 'diaspora_id'),
-                     ('guid', 'guid'),
-                     ('name', 'diaspora_name'),
-                     ('avatar', 'image_urls'),
-                     ]
-            self.data = self._finalize_data(request[0], names)
 
 
 class Contacts():