예제 #1
0
    def fetch_voters_by_api(self, offset=0):
        '''
        Update and save fields:
            * votes_count - count of likes
        Update relations:
            * voters - users, who vote for this answer
        '''
        number_on_page = 100
        params = {
            'owner_id': self.poll.post.remote_id.split('_')[0],
            'poll_id': self.poll.pk,
            'answer_ids': self.pk,
            'offset': offset,
            'count': number_on_page,
            'fields': USER_FIELDS,
        }

        result = api_call('polls.getVoters', used_access_tokens=ACCESS_TOKEN, **params)[0]

        if offset == 0:
            try:
                self.votes_count = int(result['users'][0])
                pp = Poll.remote.fetch(self.poll.pk, self.poll.post)
                if pp and pp.votes_count:
                    self.rate = (float(self.votes_count) / pp.votes_count) * 100
                else:
                    self.rate = 0
                self.save()
            except Exception, err:
                log.warning('Answer fetching error with message: %s' % err)
            self.voters.clear()
예제 #2
0
    def fetch_repost_items(self, offset=0, count=1000, *args, **kwargs):
        if count > 1000:
            raise ValueError("Parameter 'count' can not be more than 1000")

        # owner_id
        # идентификатор пользователя или сообщества, на стене которого находится запись. Если параметр не задан, то он считается равным идентификатору текущего пользователя.
        # Обратите внимание, идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-" — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1)
        kwargs['owner_id'] = self.wall_owner.remote_id
        if isinstance(self.wall_owner, Group):
            kwargs['owner_id'] *= -1
        # post_id
        # идентификатор записи на стене.
        kwargs['post_id'] = self.remote_id.split('_')[1]
        # offset
        # смещение, необходимое для выборки определенного подмножества записей.
        kwargs['offset'] = int(offset)
        # count
        # количество записей, которое необходимо получить.
        # положительное число, по умолчанию 20, максимальное значение 100
        kwargs['count'] = int(count)

        log.debug('Fetching repost users ids of post %s, offset %d' % (self.remote_id, offset))

        response = api_call('wall.getReposts', **kwargs)
        return response['items']
예제 #3
0
    def update_users(self, offset=0):
        '''
        Fetch all users for this group, save them as IDs and after make m2m relations
        '''
        try:
            stat = GroupStatMembers.objects.get_or_create(group=self, time=None)[0]
        except MultipleObjectsReturned:
            GroupStatMembers.objects.filter(group=self, time=None).delete()
            stat = GroupStatMembers.objects.create(group=self)
            offset = 0

        offset = offset or stat.offset

        while True:
            response = api_call('groups.getMembers', gid=self.remote_id, offset=offset)
            ids = response['users']

            if len(ids) == 0:
                break

            # add new ids to group stat members
            stat.add_members(ids)
            stat.offset = offset
            stat.save()
            offset += 1000

        # save stat with time and other fields
        stat.save_final()
        signals.group_users_updated.send(sender=Group, instance=self)
예제 #4
0
    def fetch_repost_items(self, offset=0, count=1000, *args, **kwargs):
        if count > 1000:
            raise ValueError("Parameter 'count' can not be more than 1000")

        # owner_id
        # идентификатор пользователя или сообщества, на стене которого находится запись. Если параметр не задан, то он считается равным идентификатору текущего пользователя.
        # Обратите внимание, идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-" — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1)
        kwargs['owner_id'] = self.wall_owner.remote_id
        if isinstance(self.wall_owner, Group):
            kwargs['owner_id'] *= -1
        # post_id
        # идентификатор записи на стене.
        kwargs['post_id'] = self.remote_id.split('_')[1]
        # offset
        # смещение, необходимое для выборки определенного подмножества записей.
        kwargs['offset'] = int(offset)
        # count
        # количество записей, которое необходимо получить.
        # положительное число, по умолчанию 20, максимальное значение 100
        kwargs['count'] = int(count)

        log.debug('Fetching repost users ids of post %s, offset %d' %
                  (self.remote_id, offset))

        response = api_call('wall.getReposts', **kwargs)
        return response['items']
예제 #5
0
 def get_by_slug(self, slug):
     '''
     Return existed User, Group, Application by slug or new intance with empty pk
     '''
     try:
         assert self.model.slug_prefix and slug.startswith(self.model.slug_prefix)
         remote_id = int(re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0])
     except (AssertionError, ValueError, IndexError):
         try:
             return self.model.objects.get(screen_name=slug)
         except self.model.DoesNotExist:
             try:
                 response = api_call('resolveScreenName', **{'screen_name': slug})
             except VkontakteError, e:
                 log.error("Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s" % (slug, e))
                 return None
             try:
                 assert self.model._meta.module_name == response['type']
                 remote_id = int(response['object_id'])
             except TypeError:
                 log.error("Method get_by_slug returned response in strange format: %s. Slug is '%s'" % (response, slug))
                 return None
             except ValueError:
                 return None
             except AssertionError:
                 log.error("Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'" % (response['type'], self.model._meta.module_name, slug))
                 return None
예제 #6
0
    def get_by_slug(self, slug):
        '''
        Return existed User, Group, Application by slug or new intance with empty pk
        '''
        try:
            assert self.model.slug_prefix and slug.startswith(
                self.model.slug_prefix)
            remote_id = int(
                re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0])
        except (AssertionError, ValueError, IndexError):
            try:
                response = api_call('resolveScreenName',
                                    **{'screen_name': slug})
            except VkontakteError, e:
                log.error(
                    "Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s"
                    % (slug, e))
                return None

            if response['type'] not in self.model.resolve_screen_name_types:
                raise WrongResponseType(
                    "Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'"
                    % (response['type'], self.model.resolve_screen_name_types,
                       slug))

            try:
                remote_id = int(response['object_id'])
            except (KeyError, TypeError, ValueError), e:
                # TODO: raise error
                log.error(
                    "Method get_by_slug returned response in strange format: %s. Slug is '%s'"
                    % (response, slug))
                return None
예제 #7
0
    def api_call(self, method='get', **kwargs):
        if self.model.methods_access_tag:
            kwargs['methods_access_tag'] = self.model.methods_access_tag

        method = self.methods[method]
        if self.model.methods_namespace:
            method = self.model.methods_namespace + '.' + method

        return api_call(method, **kwargs)
예제 #8
0
    def api_call(self, method='get', **kwargs):
        if self.model.methods_access_tag:
            kwargs['methods_access_tag'] = self.model.methods_access_tag

        method = self.methods[method]
        if self.model.methods_namespace:
            method = self.model.methods_namespace + '.' + method

        return api_call(method, **kwargs)
예제 #9
0
    def fetch_reposts_api(self, offset=0, count=1000, *args, **kwargs):
        if count > 1000:
            raise ValueError("Parameter 'count' can not be more than 1000")

        # owner_id
        # идентификатор пользователя или сообщества, на стене которого находится запись. Если параметр не задан, то он считается равным идентификатору текущего пользователя.
        # Обратите внимание, идентификатор сообщества в параметре owner_id необходимо указывать со знаком "-" — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1)
        kwargs['owner_id'] = self.wall_owner.remote_id
        if isinstance(self.wall_owner, Group):
            kwargs['owner_id'] *= -1
        # post_id
        # идентификатор записи на стене.
        kwargs['post_id'] = self.remote_id.split('_')[1]
        # offset
        # смещение, необходимое для выборки определенного подмножества записей.
        kwargs['offset'] = int(offset)
        # count
        # количество записей, которое необходимо получить.
        # положительное число, по умолчанию 20, максимальное значение 100
        kwargs['count'] = int(count)

        if offset == 0:
            self.repost_users.clear()

        log.debug('Fetching reposts of post ID=%s of owner "%s", offset %d' % (self.remote_id, self.wall_owner, offset))

        response = api_call('wall.getReposts', **kwargs)
        new_users_ids = []
        profiles = dict([(profile['uid'], profile) for profile in response['profiles']])
        for post in response['items']:
            user_id = post.get('from_id')
            # TODO: implement schema for group reposting support with links to texts via though model
            if user_id and user_id > 0:
                try:
                    user_instance = User.objects.get(remote_id=user_id)
                except User.DoesNotExist:
                    user_instance = User.objects.create(remote_id=user_id)
                    if user_id in profiles:
                        user_instance.parse(profiles[user_id])
                        user_instance.save()
                    else:
                        new_users_ids += [user_id]

                self.repost_users.add(user_instance)

        # update info of new users, that was not found in 'profiles' dict
        if new_users_ids:
            User.remote.fetch(ids=new_users_ids)

        return self.repost_users.all()
예제 #10
0
    def fetch_likes(self, owner_id, item_id, offset=0, count=1000, filter='likes', *args, **kwargs):
        if count > 1000:
            raise ValueError("Parameter 'count' can not be more than 1000")
        if filter not in ['likes', 'copies']:
            raise ValueError("Parameter 'filter' should be equal to 'likes' or 'copies'")
        if self.likes_type is None:
            raise ImproperlyConfigured("'likes_type' attribute should be specified")

        # type
        # тип Like-объекта. Подробнее о типах объектов можно узнать на странице Список типов Like-объектов.
        kwargs['type'] = self.likes_type
        # owner_id
        # идентификатор владельца Like-объекта (id пользователя или id приложения). Если параметр type равен sitepage, то в качестве owner_id необходимо передавать id приложения. Если параметр не задан, то считается, что он равен либо идентификатору текущего пользователя, либо идентификатору текущего приложения (если type равен sitepage).
        kwargs['owner_id'] = owner_id
        # item_id
        # идентификатор Like-объекта. Если type равен sitepage, то параметр item_id может содержать значение параметра page_id, используемый при инициализации виджета «Мне нравится».
        kwargs['item_id'] = item_id
        # page_url
        # url страницы, на которой установлен виджет «Мне нравится». Используется вместо параметра item_id.

        # filter
        # указывает, следует ли вернуть всех пользователей, добавивших объект в список "Мне нравится" или только тех, которые рассказали о нем друзьям. Параметр может принимать следующие значения:
        # likes – возвращать всех пользователей
        # copies – возвращать только пользователей, рассказавших об объекте друзьям
        # По умолчанию возвращаются все пользователи.
        kwargs['filter'] = filter
        # friends_only
        # указывает, необходимо ли возвращать только пользователей, которые являются друзьями текущего пользователя. Параметр может принимать следующие значения:
        # 0 – возвращать всех пользователей в порядке убывания времени добавления объекта
        # 1 – возвращать только друзей текущего пользователя в порядке убывания времени добавления объекта
        # Если метод был вызван без авторизации или параметр не был задан, то считается, что он равен 0.
        kwargs['friends_only'] = 0
        # offset
        # смещение, относительно начала списка, для выборки определенного подмножества. Если параметр не задан, то считается, что он равен 0.
        kwargs['offset'] = int(offset)
        # count
        # количество возвращаемых идентификаторов пользователей.
        # Если параметр не задан, то считается, что он равен 100, если не задан параметр friends_only, в противном случае 10.
        # Максимальное значение параметра 1000, если не задан параметр friends_only, в противном случае 100.
        kwargs['count'] = int(count)

        response = api_call('likes.getList', **kwargs)
        return response['users']
예제 #11
0
    def get_by_slug(self, slug):
        '''
        Return existed User, Group, Application by slug or new intance with empty pk
        '''
        try:
            assert self.model.slug_prefix and slug.startswith(self.model.slug_prefix)
            remote_id = int(re.findall(r'^%s(\d+)$' % self.model.slug_prefix, slug)[0])
        except (AssertionError, ValueError, IndexError):
            try:
                response = api_call('resolveScreenName', **{'screen_name': slug})
            except VkontakteError, e:
                log.error("Method get_by_slug returned error instead of response. Slug: '%s'. Error: %s" % (slug, e))
                return None

            if response['type'] not in self.model.resolve_screen_name_types:
                raise WrongResponseType("Method get_by_slug returned instance with wrong type '%s', not '%s'. Slug is '%s'" % (response['type'], self.model.resolve_screen_name_types, slug))

            try:
                remote_id = int(response['object_id'])
            except (KeyError, TypeError, ValueError), e:
                # TODO: raise error
                log.error("Method get_by_slug returned response in strange format: %s. Slug is '%s'" % (response, slug))
                return None
예제 #12
0
    def get_query(self, q, request):
        response = api_call('ads.getSuggestions', **{'section': self.section, 'q': q})
#        print response
        return response
예제 #13
0
 def get_objects(self, ids):
     response = api_call('ads.getSuggestions', **{'section': self.section, 'cities': '1'})
     return [item['name'] for item in response if item['id'] in ids]                
예제 #14
0
 def get_objects(self, ids):
     if ids:
         response = api_call('ads.getSuggestions', **{'section': self.section})
         return [item['name'] for item in response if item['id'] in ids]
     else:
         return []
예제 #15
0
# -*- coding: utf-8 -*-


from vkontakte_api.utils import api_call

friends_ids = api_call('friends.get', **{'fields': 'nickname', 'count': 1})#,domain,sex,bdate,city,country,timezone,photo_50,photo_100,photo_200_orig,has_mobile,contacts,education,online,relation,last_seen,status,can_write_private_message,can_see_all_posts,can_post,universities'})

for friend in friends_ids:
    print friend
    #break