Example #1
0
    def setUp(self):
        super(TestInboxLastResource, self).setUp()
        self.maxDiff = None
        self.user = FacebookCustomUser.objects.create_user(username='******',
                                                           password='******',
                                                           facebook_id=12345)
        self.user1 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12346)
        self.user2 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12347)
        self.user3 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12348)
        self.neo = NeoFourJ()
        self.neo.create_friendship(self.user, self.user1)
        self.neo.create_friendship(self.user, self.user3)
        self.neo.create_friendship(self.user1, self.user2)
        for x in range(10):
            pm_write(self.user1, self.user, 'test %s' % x)
        for x in range(10):
            pm_write(self.user2, self.user, 'test %s' % x)
        for x in range(10):
            pm_write(self.user3, self.user, 'test %s' % x)

        self.resource_url = '/api/v1/inbox/last/'
Example #2
0
    def get_object_list(self, request):
        results = {}
        current_user = request.user
        user_id = request.GET.get('user_id')
        if user_id is None:
            logger.error('user_id is required')
            raise BadRequest('user_id is required')
        try:
            user = FacebookCustomUserActive.objects.get(pk=user_id)
        except FacebookCustomUserActive.DoesNotExist as err:
            logging.exception(err)
            raise BadRequest('incorrect user_id')
        mutual_friends_ids = NeoFourJ().get_mutual_friends(current_user.id,
                                                           user.id)
        friends_ids = NeoFourJ().get_my_friends_ids(user.id)

        # Remove current user from list ICE-2194
        if current_user.id in friends_ids:
            friends_ids.remove(current_user.id)

        other_ids = list(set(friends_ids) - set(mutual_friends_ids))

        mutual_friends = MatchQuerySet.filter(current_user, mutual_friends_ids)
        for obj in mutual_friends:
            obj.mutual = True
            obj.user_type = "persice"
            results[obj.user_id] = obj
            results[obj.facebook_id] = FacebookMutualUser(
                id=obj.facebook_id,
                user_id=obj.user_id,
                distance=getattr(obj, 'distance', []),
                first_name=obj.first_name,
                last_name=obj.last_name,
                facebook_id=obj.facebook_id,
                mutual=True,
                user_type='facebook'
            )

        other = MatchQuerySet.filter(current_user, other_ids)
        for obj1 in other:
            obj1.mutual = False
            obj1.user_type = "persice"
            results[obj1.user_id] = obj1

        twitters = mutual_twitter_friends(current_user, user_id)

        for twitter in twitters:
            results[twitter.twitter_id2] = TwitterMutualUser(
                id=twitter.twitter_id2,
                user_id=twitter.twitter_id2,
                distance=[],
                twitter_id=twitter.twitter_id2,
                first_name=twitter.name2,
                image=twitter.profile_image_url2,
                username=twitter.screen_name2,
                mutual=True,
                user_type='twitter'
            )

        return sorted(results.values(), key=lambda x: -x.mutual)
Example #3
0
 def setUp(self):
     super(TestMutualConnectionsResource, self).setUp()
     self.user = FacebookCustomUser.objects.create_user(
         username='******',
         facebook_id=999234567,
         password='******',
         date_of_birth=date(1989, 5, 20))
     self.user1 = FacebookCustomUser.objects.create_user(
         username='******',
         facebook_id=99923456709,
         password='******',
         date_of_birth=date(1979, 6, 21))
     self.user2 = FacebookCustomUser.objects.create_user(
         username='******',
         facebook_id=99923456710,
         password='******',
         date_of_birth=date(1989, 6, 21))
     self.resource_url = '/api/v2/mutual-connections/'
     self.neo = NeoFourJ()
     n1 = self.neo.create_person(self.neo.person(self.user))
     n2 = self.neo.create_person(self.neo.person(self.user1))
     n3 = self.neo.create_person(self.neo.person(self.user2))
     self.neo.add_to_friends(n1, n2)
     self.neo.add_to_friends(n2, n1)
     self.neo.add_to_friends(n1, n3)
     self.neo.add_to_friends(n3, n1)
     self.neo.add_to_friends(n3, n2)
     self.neo.add_to_friends(n2, n3)
Example #4
0
 def setUp(self):
     self.user = FacebookCustomUser.objects.create_user(username='******',
                                                        password='******',
                                                        first_name='Ani',
                                                        last_name='Lendel')
     self.user1 = FacebookCustomUser.objects.create_user(username='******',
                                                         password='******',
                                                         first_name='Sneja',
                                                         last_name='Yerson')
     self.user2 = FacebookCustomUser.objects.create_user(username='******',
                                                         password='******',
                                                         first_name='Alena',
                                                         last_name='Winner')
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
Example #5
0
    def match(user_id,
              friends=False,
              is_filter=False,
              exclude_ids=None,
              user_ids=None):
        """
        :param user_id:
        :param friends:
        :param is_filter:
        :param exclude_ids:
        :param user_ids: use if you need limit friends list
        :return:
        """
        user = FacebookCustomUserActive.objects.get(pk=user_id)
        likes = list(
            FacebookLike.objects.filter(user_id=user.id).values_list(
                'facebook_id', flat=True))
        stop_words = StopWords.objects.all().values_list('word', flat=True)
        query = ElasticSearchMatchEngineManager.prepare_query(user, stop_words)
        fields = ["goals", "offers", "interests"]
        exclude_user_ids = ['members.facebookcustomuseractive.%s' % user_id]
        neo = NeoFourJ()
        if exclude_ids is None:
            exclude_ids = neo.get_my_thumbed_up_ids(user_id)

        friends_list = []
        if not friends:
            for f in exclude_ids:
                exclude_user_ids.append('members.facebookcustomuseractive.%s' %
                                        f)
        else:
            # All my friends
            #
            # fids = Friend.objects.all_my_friends(user_id)
            fids = neo.get_my_friends_ids(user_id)
            for f in fids:
                friends_list.append('members.facebookcustomuseractive.%s' % f)

        if user_ids is not None:
            for user_id in user_ids:
                friends_list.append('members.facebookcustomuseractive.%s' %
                                    user_id)
        response = ElasticSearchMatchEngineManager. \
            query_builder(user, query, fields, exclude_user_ids, stop_words,
                          is_filter=is_filter, friends_list=friends_list,
                          friends=friends, likes=likes)

        return response['hits']['hits']
Example #6
0
 def get_object_list(self, request):
     results = []
     new_obj = A()
     new_obj.new_connection_counter = NeoFourJ().\
         get_new_friends_count(request.user.id)
     results.append(new_obj)
     return results
Example #7
0
    def get_object_list(self, request):
        result = list()
        new_obj = A()
        new_obj.user_id = request.user.id
        raw_friend_id = request.GET.get('friend_id')
        if raw_friend_id:
            friend_id = int(raw_friend_id)
            new_obj.friend_id = friend_id
            user = FacebookCustomUserActive.objects.get(id=request.user.id)
            try:
                fb_obj = FacebookCustomUserActive.objects.get(id=friend_id)
                try:
                    mutual_friends = NeoFourJ().get_mutual_friends(
                        user.id, fb_obj.id)
                    new_obj.count = len(mutual_friends)
                    result.append(new_obj)
                except Exception as err:
                    new_obj.count = 0
                    result.append(new_obj)
                    logger.error(err)
            except FacebookCustomUserActive.DoesNotExist as err:
                new_obj.count = 0
                result.append(new_obj)

        return result
 def setUp(self):
     super(TestSharedInterestsResource, self).setUp()
     self.user = FacebookCustomUser.objects. \
         create_user(username='******', password='******', facebook_id=123,
                     first_name='Andrii', last_name='Soldatenko')
     self.user1 = FacebookCustomUser.objects. \
         create_user(username='******', password='******', facebook_id=124,
                     first_name='First Name', last_name='Last Name')
     s = InterestSubject.objects.create(description='learn django')
     s2 = InterestSubject.objects.create(description='learn python')
     s3 = InterestSubject.objects.create(description='learn ruby')
     Interest.objects.create(user=self.user, interest=s)
     Interest.objects.create(user=self.user, interest=s2)
     Interest.objects.create(user=self.user1, interest=s)
     Interest.objects.create(user=self.user1, interest=s2)
     Interest.objects.create(user=self.user1, interest=s3)
     self.event = Event.objects. \
         create(starts_on='2055-06-13T05:15:22.792659',
                ends_on='2055-06-14T05:15:22.792659',
                name="Play piano", location=[7000, 22965.83])
     self.membership = Membership.objects. \
         create(user=self.user, event=self.event,
                is_organizer=True, rsvp='yes')
     self.membership1 = Membership.objects. \
         create(user=self.user1, event=self.event, rsvp='yes')
     assign_perm('view_event', self.user, self.event)
     assign_perm('view_event', self.user1, self.event)
     self.detail_url = '/api/v2/shared_interests/{0}/'.format(self.event.pk)
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
Example #9
0
 def __init__(self, current_user_id, exclude_user_ids):
     self.items = []
     self.current_user = FacebookCustomUserActive.objects.get(
         pk=current_user_id)
     exclude_friends = NeoFourJ().get_my_thumbed_up_ids(current_user_id)
     self.exclude_user_ids = exclude_user_ids + [current_user_id
                                                 ] + exclude_friends
Example #10
0
    def obj_create(self, bundle, **kwargs):
        bundle = super(EventResource, self).obj_create(bundle, **kwargs)
        assign_perm('view_event', bundle.request.user, bundle.obj)
        Membership.objects.create(user=bundle.request.user, event=bundle.obj,
                                  is_organizer=True, rsvp='yes')

        if bundle.obj.access_level == 'public':
            users = FacebookCustomUserActive.objects.all(). \
                exclude(pk=bundle.request.user.id)
            assign_perm_task.delay('view_event', users, bundle.obj)
        elif bundle.obj.access_level == 'private':
            if bundle.obj.access_user_list:
                try:
                    user_ids = map(int, bundle.obj.access_user_list.split(','))
                    users = FacebookCustomUserActive.objects.\
                        filter(pk__in=user_ids)
                    assign_perm_task.delay('view_event', users, bundle.obj)
                except TypeError as e:
                    logger.error(e)
        elif bundle.obj.access_level == 'connections':
            user_ids = []
            if bundle.obj.access_user_list:
                try:
                    user_ids = map(int, bundle.obj.access_user_list.split(','))
                except TypeError as e:
                    logger.error(e)
            else:
                user_ids = NeoFourJ().get_my_friends_ids(bundle.request.user.id)

            users = FacebookCustomUserActive.objects.filter(pk__in=user_ids)
            assign_perm_task.delay('view_event', users, bundle.obj)

        return bundle
 def setUp(self):
     super(TestAttendeesResource, self).setUp()
     self.user = FacebookCustomUser.objects. \
         create_user(username='******', password='******', facebook_id=123,
                     first_name='Andrii', last_name='Soldatenko')
     self.user1 = FacebookCustomUser.objects. \
         create_user(username='******', password='******', facebook_id=124,
                     first_name='First Name', last_name='Last Name')
     self.user2 = FacebookCustomUser.objects. \
         create_user(username='******', password='******', facebook_id=125,
                     first_name='Lara', last_name='Croft')
     self.event = Event.objects. \
         create(starts_on='2055-06-13T05:15:22.792659',
                ends_on='2055-06-14T05:15:22.792659',
                name="Play piano", location=[7000, 22965.83])
     self.membership = Membership.objects. \
         create(user=self.user, event=self.event,
                is_organizer=True, rsvp='yes')
     self.membership1 = Membership.objects. \
         create(user=self.user1, event=self.event, rsvp='yes')
     self.membership2 = Membership.objects. \
         create(user=self.user2, event=self.event, rsvp='yes')
     assign_perm('view_event', self.user, self.event)
     assign_perm('view_event', self.user1, self.event)
     self.detail_url = '/api/v1/event/{0}/'.format(self.event.pk)
     self.post_data = {
         'user': '******'.format(self.user.pk),
         'events': '/api/v1/event/{0}/'.format(self.event.pk),
     }
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
Example #12
0
    def get_object_list(self, request):
        current_user = request.user.id
        friends_ids = NeoFourJ().get_my_friends_ids(current_user)
        friends = FacebookCustomUserActive.objects.filter(pk__in=friends_ids)
        results = []
        for friend in friends:
            new_obj = A()
            new_obj.id = friend.id
            new_obj.first_name = friend.first_name
            new_obj.last_name = friend.last_name
            new_obj.facebook_id = friend.facebook_id
            new_obj.friend_id = friend.id
            new_obj.image = FacebookPhoto.objects.profile_photo(
                new_obj.friend_id)

            # counter of unread messages on conversation level
            cnt = Message.objects.\
                filter(read_at__isnull=True, recipient=current_user,
                       sender=new_obj.friend_id). \
                order_by('sender', 'recipient'). \
                values('sender').annotate(cnt=Count('sender'))
            try:
                new_obj.unread_counter = cnt[0]['cnt']
            except (ValueError, KeyError, IndexError):
                new_obj.unread_counter = 0
            try:
                message = Message.objects.filter(
                    sender=new_obj.friend_id,
                    recipient=current_user).order_by('-sent_at')[0]
                new_obj.last_message_body = message.body
                new_obj.read_at = message.read_at
                new_obj.sent_at = message.sent_at.isoformat()
                new_obj.recipient_id = '/api/v1/auth/user/{}/'.format(
                    message.recipient_id)
                new_obj.sender_id = '/api/v1/auth/user/{}/'.format(
                    message.sender_id)
            except IndexError:
                try:
                    message = Message.objects.filter(
                        recipient=new_obj.friend_id,
                        sender=current_user).order_by('-sent_at')[0]
                    new_obj.last_message_body = None
                    new_obj.read_at = None
                    new_obj.sent_at = None
                    new_obj.recipient_id = '/api/v1/auth/user/{}/'.format(
                        message.recipient_id)
                    new_obj.sender_id = '/api/v1/auth/user/{}/'.format(
                        message.sender_id)
                except IndexError:
                    continue
            results.append(new_obj)

        try:
            sender_id = int(request.GET.get('sender_id'))
            return filter(lambda x: x.friend_id == sender_id, results)
        except (TypeError, ValueError):
            return sorted(results, key=lambda x: x.sent_at, reverse=True)
Example #13
0
 def get_object_list(self, request):
     raw_friend_id = request.GET.get('friend_id')
     if raw_friend_id:
         friend_id = int(raw_friend_id)
         user = FacebookCustomUserActive.objects.get(id=request.user.id)
         fb_obj = FacebookCustomUserActive.objects.get(id=friend_id)
         try:
             NeoFourJ().update_rel_seen(user.id, fb_obj.id)
         except Exception as err:
             logger.error(err)
     return list()
Example #14
0
class TestMutualConnectionsResource(JWTResourceTestCase):
    def setUp(self):
        super(TestMutualConnectionsResource, self).setUp()
        self.user = FacebookCustomUser.objects.create_user(
            username='******',
            facebook_id=999234567,
            password='******',
            date_of_birth=date(1989, 5, 20))
        self.user1 = FacebookCustomUser.objects.create_user(
            username='******',
            facebook_id=99923456709,
            password='******',
            date_of_birth=date(1979, 6, 21))
        self.user2 = FacebookCustomUser.objects.create_user(
            username='******',
            facebook_id=99923456710,
            password='******',
            date_of_birth=date(1989, 6, 21))
        self.resource_url = '/api/v2/mutual-connections/'
        self.neo = NeoFourJ()
        n1 = self.neo.create_person(self.neo.person(self.user))
        n2 = self.neo.create_person(self.neo.person(self.user1))
        n3 = self.neo.create_person(self.neo.person(self.user2))
        self.neo.add_to_friends(n1, n2)
        self.neo.add_to_friends(n2, n1)
        self.neo.add_to_friends(n1, n3)
        self.neo.add_to_friends(n3, n1)
        self.neo.add_to_friends(n3, n2)
        self.neo.add_to_friends(n2, n3)

    def tearDown(self):
        self.neo.graph.delete_all()

    def test_get_mutual_connections(self):
        resp = self.api_client.get(self.resource_url,
                                   format='json',
                                   data={"user_id": self.user1.id},
                                   authentication=self.get_credentials())
        self.assertValidJSONResponse(resp)
        data = self.deserialize(resp)
        self.assertEqual(data, [])
Example #15
0
 def setUp(self):
     super(NeoFriendsResourceTestCase, self).setUp()
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
     self.user = FacebookCustomUser.objects.create_user(username='******',
                                                        password='******',
                                                        first_name='Andrii',
                                                        last_name='So')
     self.user1 = FacebookCustomUser.objects.create_user(username='******',
                                                         password='******',
                                                         first_name='Tata',
                                                         last_name='MCJ')
     self.user2 = FacebookCustomUser.objects.create_user(username='******',
                                                         password='******',
                                                         first_name='Ti',
                                                         last_name='Bao')
     self.n1 = self.neo.create_person(self.neo.person(self.user))
     self.n2 = self.neo.create_person(self.neo.person(self.user1))
     self.n3 = self.neo.create_person(self.neo.person(self.user2))
     self.neo.add_to_friends(self.n1, self.n2)
     self.neo.add_to_friends(self.n2, self.n1)
Example #16
0
 def dehydrate(self, bundle):
     bundle.data['religious_views'] = get_religious_views(
         bundle.obj.id
     )
     bundle.data['political_views'] = get_political_views(
         bundle.obj.id
     )
     bundle.data['connected'] = NeoFourJ().check_friendship_rel(
         bundle.request.user.id,
         bundle.obj.id
     )
     return bundle
Example #17
0
def create_neo4j_node(sender, instance, created, **kwargs):
    if created:
        user = instance.user
        neo = NeoFourJ()
        if not neo.get_person(user):
            neo.create_person(neo.person(user))
            logger.info('Create Neo4j node with user: {}'.format(user.id))
Example #18
0
 def setUp(self):
     super(TestMatchEvents, self).setUp()
     haystack.connections.reload('default')
     FacebookCustomUser.objects.all().delete()
     self.user = FacebookCustomUser.objects. \
         create_user(username='******', facebook_id=1234567,
                     first_name='Andrii', password='******', gender='m',
                     date_of_birth=date(1989, 5, 20))
     self.user1 = FacebookCustomUser.objects. \
         create_user(username='******', facebook_id=12345671,
                     first_name='Sasa', gender='m', password='******',
                     date_of_birth=date(1979, 1, 9))
     user_location = UserLocation.objects.create(
         user=self.user, position=[-87.627696, 41.880745])
     user_location1 = UserLocation.objects.create(
         user=self.user1, position=[-87.627696, 41.880745])
     self.subject = Subject.objects.create(description='learning django')
     self.subject2 = Subject.objects.create(description='learn python')
     clear_index.Command().handle(interactive=False)
     rebuild_index.Command().handle(interactive=False)
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
 def setUp(self):
     super(TestEventResource, self).setUp()
     self.user = FacebookCustomUser.objects.\
         create_user(username='******', password='******',
                     first_name='Andrii', last_name='Soldatenko')
     UserLocation.objects.create(user=self.user,
                                 position=[-87.627696, 41.880745])
     self.event = Event.objects.\
         create(starts_on='2055-06-13T05:15:22.792659',
                ends_on='2055-06-14T05:15:22.792659',
                name="Play piano", location=[7000, 22965.83])
     self.membership = Membership.objects.\
         create(user=self.user, event=self.event,
                is_organizer=True, rsvp='yes')
     assign_perm('view_event', self.user, self.event)
     self.detail_url = '/api/v1/event/{0}/'.format(self.event.pk)
     self.post_data = {
         'user': '******'.format(self.user.pk),
         'events': '/api/v1/event/{0}/'.format(self.event.pk),
     }
     self.neo = NeoFourJ()
     self.neo.graph.delete_all()
Example #20
0
    def obj_update(self, bundle, skip_errors=False, **kwargs):
        new_access_level = bundle.data.get('access_level', '')
        current_access_level = bundle.obj.access_level
        event_photo = bundle.data.get('event_photo', '')
        if isinstance(event_photo, unicode) and event_photo.startswith('http'):
            bundle.data['event_photo'] = \
                event_photo.split('cloudfront.net/')[-1]
        bundle = super(EventResource, self).obj_update(bundle, **kwargs)
        if current_access_level != new_access_level:
            if new_access_level == 'public':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                assign_perm_task.delay('view_event', users, bundle.obj)

            elif new_access_level == 'private':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                remove_perm_task.delay('view_event', users, bundle.obj)

                if bundle.obj.access_user_list:
                    try:
                        user_ids = map(int,
                                       bundle.obj.access_user_list.split(','))
                        users_ = FacebookCustomUserActive.objects. \
                            filter(pk__in=user_ids)
                        assign_perm_task.delay('view_event', users_, bundle.obj)
                    except TypeError as e:
                        logger.error(e)

            elif new_access_level == 'connections':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                remove_perm_task.delay('view_event', users, bundle.obj)

                user_ids = []
                if bundle.obj.access_user_list:
                    try:
                        user_ids = map(int,
                                       bundle.obj.access_user_list.split(','))
                    except TypeError as e:
                        logger.error(e)
                else:
                    user_ids = NeoFourJ().get_my_friends_ids(
                        bundle.request.user.id
                    )

                users_ = FacebookCustomUserActive.objects. \
                    filter(pk__in=user_ids)
                assign_perm_task.delay('view_event', users_, bundle.obj)
        return bundle
Example #21
0
    def get_object_list(self, request):
        results = []
        _first_name = request.GET.get('first_name', '')
        current_user = request.user.id
        friends = NeoFourJ().get_my_friends_icontains_name(
            current_user, _first_name)
        users = FacebookCustomUserActive.objects.filter(id__in=friends)
        for friend in users:
            new_obj = A()
            new_obj.id = friend.id
            new_obj.first_name = friend.first_name
            new_obj.friend_id = friend.id
            new_obj.image = FacebookPhoto.objects.profile_photo(
                new_obj.friend_id)
            results.append(new_obj)

        return sorted(results, key=lambda x: x.first_name, reverse=False)
Example #22
0
    def dehydrate(self, bundle):
        user_id = bundle.request.user.id
        friends = NeoFourJ().get_my_friends_ids(user_id)
        try:
            bundle.data['hosted_by'] = bundle.obj.membership_set. \
                filter(is_organizer=True, rsvp='yes')[0].user.get_full_name()
        except IndexError:
            bundle.data['hosted_by'] = ''

        # Total number of event attendees
        total_attendees = bundle.obj. \
            membership_set.filter(rsvp='yes').count()
        bundle.data['total_attendees'] = total_attendees

        # the number of people with RSVP = yes AND
        # are also a connection of the user who is viewing the event
        attendees = bundle.obj. \
            membership_set.filter(user__in=friends + [user_id], rsvp='yes')
        bundle.data['friend_attendees_count'] = attendees.count()

        # spots_remaining = max_attendees - total_attendees
        # TODO: max_attendees in ICE-938
        bundle.data['spots_remaining'] = int(
            bundle.obj.max_attendees) - total_attendees

        matched_users = MatchQuerySet.attendees(user_id)
        bundle.data['attendees_yes'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='yes')
        bundle.data['attendees_no'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='no')
        bundle.data['attendees_maybe'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='maybe')

        bundle.data['cumulative_match_score'] = MatchEvent.get_cum_score(
            user_id, bundle.obj, matched_users)

        try:
            bundle.data['distance'] = MatchQuerySet.user_event(
                    bundle.request.user.id,
                    bundle.obj.pk
            )[0].distance
        except IndexError:
            bundle.data['distance'] = [10000, 'mi']
        bundle.data['organizer'] = build_organizer(bundle.obj)
        return bundle
Example #23
0
    def get_friends_score(self, current_user_id, user_object):
        user_id = int(user_object['_id'].split('.')[-1])
        mutual_bk_friends_count = len(NeoFourJ().get_my_friends_ids(user_id))

        mutual_fb_friends_count = len(
            FacebookFriendUser.objects.mutual_friends(current_user_id,
                                                      user_id))

        l = get_mutual_linkedin_connections(current_user_id, user_id)
        mutual_linkedin_connections_count = l['mutual_linkedin_count']

        t = get_mutual_twitter_friends(current_user_id, user_id)
        mutual_twitter_friends_count = t['count_mutual_twitter_friends']
        mutual_twitter_followers_count = t['count_mutual_twitter_followers']

        friends_score = mutual_bk_friends_count + mutual_fb_friends_count + \
            mutual_linkedin_connections_count + \
            mutual_twitter_followers_count + mutual_twitter_friends_count

        return friends_score
Example #24
0
    def match_events(user_id, is_filter=False, feed='my'):
        user = FacebookCustomUserActive.objects.get(pk=user_id)
        events = []
        stop_words = StopWords.objects.all().values_list('word', flat=True)

        if feed == 'my':
            events = Event.objects.filter(membership__user=user_id).filter(
                Q_(ends_on__gt=now()) | Q_(ends_on__isnull=True))
        elif feed == 'all':
            events = Event.objects.filter(
                Q_(ends_on__gt=now()) | Q_(ends_on__isnull=True))

        elif feed == 'connections':
            friends = NeoFourJ().get_my_friends_ids(user_id)
            events = Event.objects.filter(
                Q_(membership__user_id__in=friends,
                   membership__rsvp__in=['yes', 'maybe'],
                   ends_on__gt=now())
                | Q_(membership__user_id__in=friends,
                     membership__rsvp__in=['yes', 'maybe'],
                     ends_on__isnull=True)
                | Q_(membership__user_id__in=friends,
                     membership__is_organizer=True,
                     ends_on__gt=now()) | Q_(membership__user_id__in=friends,
                                             membership__is_organizer=True,
                                             ends_on__isnull=True)).distinct()
        event_ids_types = []
        for event in events:
            event_ids_types.append('events.event.%s' % event.id)
        event_ids_types = list(set(event_ids_types))
        # TODO: query possible candidate to add to cache
        query = ElasticSearchMatchEngineManager.prepare_query(user,
                                                              stop_words,
                                                              use_likes=False)
        response = ElasticSearchMatchEngineManager. \
            event_query_builder(user, event_ids_types, query=query,
                                is_filter=is_filter, stop_words=stop_words)
        return response['hits']['hits']
Example #25
0
    def setUp(self):
        super(TestMatchQuerySet, self).setUp()
        haystack.connections.reload('default')
        Goal.objects.all().delete()
        Offer.objects.all().delete()
        Subject.objects.all().delete()
        FacebookCustomUser.objects.all().delete()
        photo = SimpleUploadedFile(name='test_image.jpg', content='test')
        self.user = FacebookCustomUser.objects.\
            create_user(username='******', facebook_id=1234567,
                        first_name='Andrii', password='******', gender='m',
                        date_of_birth=date(1989, 5, 20), image=photo)
        self.user1 = FacebookCustomUser.objects.\
            create_user(username='******', facebook_id=12345671,
                        first_name='Sasa', gender='m', password='******',
                        date_of_birth=date(1979, 1, 9), image=photo)
        self.user2 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345672,
                        first_name='Ira', gender='f', password='******',
                        date_of_birth=date(1969, 1, 9), image=photo)
        self.user3 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345676,
                        first_name='Natali', gender='f', password='******',
                        date_of_birth=date(1959, 1, 9), image=photo)
        self.user4 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345675,
                        first_name='Tati', gender='f', password='******',
                        date_of_birth=date(1949, 1, 9), image=photo)
        self.user5 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345674,
                        first_name='Ken', gender='m', password='******',
                        date_of_birth=date(1939, 1, 9), image=photo)

        user_location = UserLocation.objects.create(
            user=self.user, position=[-87.627696, 41.880745])
        user_location1 = UserLocation.objects.create(
            user=self.user1, position=[60.627675, 21.881925])
        user_location2 = UserLocation.objects.create(
            user=self.user2, position=[-87.6281729688, 41.881849562])
        user_location3 = UserLocation.objects.create(
            user=self.user5, position=[-87.62839, 41.88206])
        user_location4 = UserLocation.objects.create(
            user=self.user4, position=[-87.6269801114, 41.8814058757])
        user_location5 = UserLocation.objects.create(user=self.user3,
                                                     position=[38.53, 77.02])

        self.subject = Subject.objects.create(description='learning django')
        self.subject2 = Subject.objects.create(description='learn python')
        self.subject3 = Subject.objects.create(description='teach erlang')
        self.subject4 = Subject.objects.create(description='teach javascript')

        self.subject5 = Subject.objects.create(description='teach django')
        self.subject6 = Subject.objects.create(description='teach python')
        self.subject7 = Subject.objects.create(description='learn erlang')
        self.subject8 = Subject.objects.create(description='learn javascript')
        self.subject9 = Subject.objects.\
            create(description='django under the hood')
        self.subject10 = Subject.objects.\
            create(description='learn kiteboarding and foxes')
        self.subject11 = Subject.objects.\
            create(description='like a kiteboard and fox')
        self.subject12 = Subject.objects. \
            create(description='baby')
        self.subject13 = Subject.objects. \
            create(description='child')
        self.subject14 = Subject.objects. \
            create(description='hire a dog sitter')
        self.subject16 = Subject.objects. \
            create(description='play with dogs')
        self.subject15 = Subject.objects. \
            create(description='learn to code django python')

        self.i_subject = InterestSubject.objects.\
            create(description='teach django')
        self.i_subject1 = InterestSubject.objects. \
            create(description='learn django')
        self.i_subject2 = InterestSubject.objects. \
            create(description='teach python')
        self.i_subject3 = InterestSubject.objects. \
            create(description='learn python')
        self.i_subject4 = InterestSubject.objects. \
            create(description='kiteboarding')
        StopWords.objects.create(word='learn')
        StopWords.objects.create(word=u'and')
        StopWords.objects.create(word=u'teach')
        StopWords.objects.create(word=u'to')
        clear_index.Command().handle(interactive=False)
        rebuild_index.Command().handle(interactive=False)
        self.neo = NeoFourJ()
        self.neo.graph.delete_all()
Example #26
0
class TestInboxLastResource(JWTResourceTestCase):
    def setUp(self):
        super(TestInboxLastResource, self).setUp()
        self.maxDiff = None
        self.user = FacebookCustomUser.objects.create_user(username='******',
                                                           password='******',
                                                           facebook_id=12345)
        self.user1 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12346)
        self.user2 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12347)
        self.user3 = FacebookCustomUser.objects.create_user(username='******',
                                                            password='******',
                                                            facebook_id=12348)
        self.neo = NeoFourJ()
        self.neo.create_friendship(self.user, self.user1)
        self.neo.create_friendship(self.user, self.user3)
        self.neo.create_friendship(self.user1, self.user2)
        for x in range(10):
            pm_write(self.user1, self.user, 'test %s' % x)
        for x in range(10):
            pm_write(self.user2, self.user, 'test %s' % x)
        for x in range(10):
            pm_write(self.user3, self.user, 'test %s' % x)

        self.resource_url = '/api/v1/inbox/last/'

    def test_get_list_unauthorized(self):
        self.assertHttpUnauthorized(
            self.api_client.get(self.resource_url, format='json'))

    def test_get_list_message_user(self):
        resp = self.api_client.get(self.resource_url,
                                   format='json',
                                   authentication=self.get_credentials())
        expected_last_message = {
            'facebook_id': u'12346',
            'first_name': u'',
            'friend_id': u'{}'.format(self.user1.id),
            'image': None,
            'last_message_body': u'',
            'last_name': u'',
            'read_at': None,
            'recipient_id': u'/api/v1/auth/user/{}/'.format(self.user.id),
            'sender_id': u'/api/v1/auth/user/{}/'.format(self.user1.id),
            'unread_counter': 10
        }
        actual_response = self.deserialize(resp)['objects'][1]
        # Remove sent_at
        del actual_response['sent_at']
        del actual_response['resource_uri']
        del actual_response['id']
        self.assertEqual(actual_response, expected_last_message)

    def test_get_list_message_user1(self):
        resp = self.api_client.get(
            self.resource_url,
            format='json',
            authentication=self.get_credentials(user=self.user1))
        expected_last_message = {
            u'facebook_id': u'12345',
            u'first_name': u'',
            u'friend_id': u'{}'.format(self.user.id),
            u'image': None,
            u'last_message_body': None,
            u'last_name': u'',
            u'read_at': None,
            u'recipient_id': u'/api/v1/auth/user/{}/'.format(self.user.id),
            u'sender_id': u'/api/v1/auth/user/{}/'.format(self.user1.id),
            u'unread_counter': 0
        }
        actual_response = self.deserialize(resp)['objects'][0]
        del actual_response['resource_uri']
        del actual_response['id']
        del actual_response['sent_at']
        self.assertEqual(actual_response, expected_last_message)

    def test_get_list_no_messages(self):
        resp = self.api_client.get(
            self.resource_url,
            format='json',
            authentication=self.get_credentials(user=self.user2))
        actual_response = self.deserialize(resp)['objects']
        self.assertEqual(len(actual_response), 0)

    def test_sorted(self):
        resp = self.api_client.get(self.resource_url,
                                   format='json',
                                   authentication=self.get_credentials())
        actual_response = self.deserialize(resp)['objects']
        self.assertEqual(actual_response[0]['sender_id'],
                         u'/api/v1/auth/user/{}/'.format(self.user3.id))
        self.assertEqual(actual_response[1]['sender_id'],
                         u'/api/v1/auth/user/{}/'.format(self.user1.id))
class TestEventResource(JWTResourceTestCase):
    def setUp(self):
        super(TestEventResource, self).setUp()
        self.user = FacebookCustomUser.objects.\
            create_user(username='******', password='******',
                        first_name='Andrii', last_name='Soldatenko')
        UserLocation.objects.create(user=self.user,
                                    position=[-87.627696, 41.880745])
        self.event = Event.objects.\
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="Play piano", location=[7000, 22965.83])
        self.membership = Membership.objects.\
            create(user=self.user, event=self.event,
                   is_organizer=True, rsvp='yes')
        assign_perm('view_event', self.user, self.event)
        self.detail_url = '/api/v1/event/{0}/'.format(self.event.pk)
        self.post_data = {
            'user': '******'.format(self.user.pk),
            'events': '/api/v1/event/{0}/'.format(self.event.pk),
        }
        self.neo = NeoFourJ()
        self.neo.graph.delete_all()

    def test_get_list_unauthorized(self):
        self.assertHttpUnauthorized(
            self.api_client.get('/api/v1/event/', format='json'))

    def test_get_list_json(self):
        resp = self.api_client.get('/api/v1/event/{}/'.format(self.event.id),
                                   format='json',
                                   authentication=self.get_credentials())
        self.assertValidJSONResponse(resp)

        self.maxDiff = None
        json = self.deserialize(resp)
        self.assertEqual(json['hosted_by'], 'Andrii Soldatenko')
        self.assertEqual(json['name'], 'Play piano')
        self.assertEqual(json['location'], u'7000,22965.83')
        self.assertEqual(json['total_attendees'], 1)

    def test_hosted_by(self):
        resp = self.api_client.get('/api/v1/event/',
                                   format='json',
                                   authentication=self.get_credentials())
        self.assertEqual(
            self.deserialize(resp)['objects'][0]['hosted_by'],
            'Andrii Soldatenko')

    def test_cumulative_match_score(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user2 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        UserLocation.objects.create(user=user1,
                                    position=[-87.627696, 41.880745])
        UserLocation.objects.create(user=user2,
                                    position=[-87.627696, 41.880745])
        self.subject = Subject.objects.create(description='Python')
        self.subject2 = Subject.objects.create(description='Ruby')
        self.subject3 = Subject.objects.create(description='Erlang')

        Goal.objects.create(user=self.user, goal=self.subject)
        Offer.objects.create(user=self.user, offer=self.subject2)
        Goal.objects.create(user=user1, goal=self.subject2)
        Offer.objects.create(user=user1, offer=self.subject)
        Goal.objects.create(user=user2, goal=self.subject2)

        Friend.objects.create(friend1=user1, friend2=self.user, status=1)
        Friend.objects.create(friend1=user2, friend2=self.user, status=1)
        event = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                     ends_on='2055-06-14T05:15:22.792659',
                                     name="Play piano",
                                     location=[7000, 22965.83])
        Membership.objects.create(user=self.user,
                                  event=event,
                                  is_organizer=True)
        Membership.objects.create(user=user1, event=event, rsvp='yes')
        Membership.objects.create(user=user2, event=event, rsvp='yes')
        detail_url = '/api/v1/event/{0}/'.format(event.pk)
        assign_perm('view_event', self.user, event)
        resp = self.api_client.get(detail_url,
                                   format='json',
                                   authentication=self.get_credentials())
        # TODO: because of need read test celery tasks
        self.assertEqual(self.deserialize(resp)['cumulative_match_score'], 0)

    def test_create_simple_event(self):
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'starts_on': str(now() + timedelta(days=1))
        }
        self.assertHttpCreated(
            self.api_client.post('/api/v1/event/',
                                 format='json',
                                 data=post_data,
                                 authentication=self.get_credentials()))

    def test_create_public_event(self):
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'access_level': 'public',
            'starts_on': str(now() + timedelta(days=1))
        }
        self.assertHttpCreated(
            self.api_client.post('/api/v1/event/',
                                 format='json',
                                 data=post_data,
                                 authentication=self.get_credentials()))

    def test_update_simple_event(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user2 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        Membership.objects.create(user=user1, event=self.event, rsvp='yes')
        Membership.objects.create(user=user2, event=self.event, rsvp='yes')
        self.assertEqual(
            Event.objects.filter(membership__user=self.user,
                                 name='Play piano')[0].name, 'Play piano')
        original_data = self.deserialize(
            self.api_client.get(self.detail_url,
                                format='json',
                                authentication=self.get_credentials()))
        new_data = original_data.copy()
        new_data['name'] = 'learn erlang'

        self.api_client.put(self.detail_url,
                            format='json',
                            data=new_data,
                            authentication=self.get_credentials())
        self.assertEqual(
            Event.objects.filter(membership__user=self.user,
                                 name='learn erlang')[0].name, 'learn erlang')

    def test_update_public_event_to_private(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'access_level': 'public',
            'starts_on': str(now() + timedelta(days=1))
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        original_event = self.deserialize(resp)
        detail_url = '/api/v1/event/{}/'.format(original_event['id'])

        new_data = original_event.copy()
        new_data['access_level'] = 'private'
        self.api_client.put(self.detail_url,
                            format='json',
                            data=new_data,
                            authentication=self.get_credentials())
        e = Event.objects.get(pk=int(original_event['id']))
        self.assertEqual(user1.has_perm('view_event', e), False)

    @skip
    def test_update_private_event_to_public(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'access_level': 'private',
            'starts_on': str(now() + timedelta(days=1))
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        original_event = self.deserialize(resp)
        detail_url = '/api/v1/event/{}/'.format(original_event['id'])

        new_data = original_event.copy()
        new_data['access_level'] = 'PUBLIC'
        resp = self.api_client.put(self.detail_url,
                                   format='json',
                                   data=new_data,
                                   authentication=self.get_credentials())
        e = Event.objects.get(pk=int(original_event['id']))
        self.assertEqual(user1.has_perm('view_event', e), True)

    def test_total_number_of_event_attendees(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user2 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user3 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user4 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')

        Membership.objects.create(user=user1, event=self.event, rsvp='yes')
        Membership.objects.create(user=user2, event=self.event, rsvp='no')
        Membership.objects.create(user=user3, event=self.event, rsvp='maybe')
        Membership.objects.create(user=user4, event=self.event, rsvp=None)

        resp = self.api_client.get('/api/v1/event/{}/'.format(self.event.id),
                                   format='json',
                                   authentication=self.get_credentials())
        json = self.deserialize(resp)
        self.assertEqual(json['total_attendees'], 2)

    def test_update_if_ends_on_in_past(self):
        event = Event.objects.create(starts_on=now() - timedelta(days=10),
                                     ends_on=now() - timedelta(days=9),
                                     name="Play piano",
                                     location=[7000, 22965.83])
        Membership.objects.create(user=self.user,
                                  event=event,
                                  is_organizer=True)

        detail_url = '/api/v1/event/{0}/'.format(event.pk)
        assign_perm('view_event', self.user, event)
        original_data = self.deserialize(
            self.api_client.get(detail_url,
                                format='json',
                                authentication=self.get_credentials()))
        new_data = original_data.copy()
        new_data['name'] = 'learn erlang'
        new_data['ends_on'] = now() + timedelta(days=2)
        new_data['starts_on'] = now() + timedelta(days=1)

        resp = self.api_client.patch(detail_url,
                                     format='json',
                                     data=new_data,
                                     authentication=self.get_credentials())
        self.assertEqual(
            self.deserialize(resp), {
                u'error':
                u'Users cannot edit events which have an end '
                u'date that occurred in the past.'
            })

    def test_create_event_which_ends_in_the_past(self):
        post_data = {
            'description': 'Test description',
            'ends_on': now() - timedelta(days=7),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'starts_on': now() - timedelta(days=9)
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        self.assertEqual(
            self.deserialize(resp), {
                u'event': {
                    u'error': [
                        'The event end date and time '
                        'must occur in the future.'
                    ]
                }
            })

    def test_create_event_which_starts_eq_ends(self):
        post_data = {
            'description': 'Test description',
            'ends_on': now() + timedelta(days=1),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'starts_on': now() + timedelta(days=1)
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        self.assertEqual(
            self.deserialize(resp), {
                u'event': {
                    u'error': [
                        u'The event end date and time '
                        u'must occur after the start '
                        u'date and time.'
                    ]
                }
            })

    def test_delete_simple_event(self):
        self.assertEqual(Event.objects.count(), 1)
        self.assertHttpAccepted(
            self.api_client.delete(self.detail_url,
                                   format='json',
                                   authentication=self.get_credentials()))
        self.assertEqual(Event.objects.count(), 0)

    def test_delete_event(self):
        event = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                     ends_on='2055-06-14T05:15:22.792659',
                                     name="Play piano",
                                     location=[7000, 22965.83])
        Membership.objects.create(user=self.user,
                                  event=event,
                                  is_organizer=True,
                                  rsvp='yes')

        detail_url = '/api/v1/event/{0}/'.format(event.pk)
        self.assertEqual(Event.objects.count(), 2)
        assign_perm('view_event', self.user, event)
        self.assertHttpAccepted(
            self.api_client.delete(detail_url,
                                   format='json',
                                   authentication=self.get_credentials()))
        self.assertEqual(Event.objects.count(), 1)

    def test_friend_attendees_count(self):
        user1 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        user2 = FacebookCustomUser.objects.create_user(username='******',
                                                       password='******')
        self.neo.create_friendship(user1, self.user)
        self.neo.create_friendship(self.user, user2)
        event = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                     ends_on='2055-06-14T05:15:22.792659',
                                     name="Play piano",
                                     location=[7000, 22965.83])
        Membership.objects.create(user=self.user,
                                  event=event,
                                  is_organizer=True)
        Membership.objects.create(user=user1, event=event, rsvp='yes')
        Membership.objects.create(user=user2, event=event, rsvp='yes')
        detail_url = '/api/v1/event/{0}/'.format(event.pk)
        assign_perm('view_event', self.user, event)
        resp = self.api_client.get(detail_url,
                                   format='json',
                                   authentication=self.get_credentials())
        self.assertEqual(self.deserialize(resp)['friend_attendees_count'], 2)

    def test_post_event_photo(self):
        new_file = SimpleUploadedFile('new_file.txt', 'Hello world!')

        post_data = {
            'description': 'Test description',
            'ends_on': '2055-06-15T05:15:22.792659',
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'repeat': u'W',
            'starts_on': '2055-06-13T05:15:22.792659',
            'event_photo': new_file
        }

        resp = self.api_client.client.post(
            '/api/v1/event/',
            data=post_data,
            format='json',
            HTTP_AUTHORIZATION=self.get_credentials())

        self.assertNotEqual(self.deserialize(resp)['event_photo'], '')

    def test_get_private_event(self):
        event = Event.objects.create(name="Public Event",
                                     location=[7000, 22965.83],
                                     access_level='public',
                                     starts_on=now(),
                                     ends_on=now() + timedelta(days=10))
        Membership.objects.create(user=self.user, event=event)
        assign_perm('view_event', self.user, event)

        resp = self.api_client.get('/api/v1/event/{}/'.format(event.id),
                                   format='json',
                                   authentication=self.get_credentials())
        self.assertValidJSONResponse(resp)

        json = self.deserialize(resp)
        self.assertEqual(json['name'], 'Public Event')

    @skip
    def test_post_private_event_with_access_user_list(self):
        user = FacebookCustomUser.objects. \
            create_user(username='******', password='******',
                        first_name='Mary', last_name='Mal')

        user2 = FacebookCustomUser.objects. \
            create_user(username='******', password='******',
                        first_name='Mary Kay', last_name='Peterson')
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'access_level': 'private',
            'access_user_list': ','.join(map(str, [user.id, user2.id])),
            'repeat': u'W',
            'starts_on': str(now() + timedelta(days=1))
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        self.assertHttpCreated(resp)
        event = self.deserialize(resp)
        e = Event.objects.get(pk=int(event['id']))
        self.assertEqual(user.has_perm('view_event', e), True)
        self.assertEqual(user2.has_perm('view_event', e), True)

    def test_post_public_event(self):
        user = FacebookCustomUser.objects. \
            create_user(username='******', password='******',
                        first_name='Mary', last_name='Mal')
        UserLocation.objects.create(user=user,
                                    position=[-87.627696, 41.880745])
        post_data = {
            'description': 'Test description',
            'ends_on': str(now() + timedelta(days=2)),
            'location': u'7000,22965.83',
            'name': u'Play piano',
            'access_level': 'public',
            'access_user_list': str(user.id),
            'repeat': u'W',
            'starts_on': str(now() + timedelta(days=1))
        }
        resp = self.api_client.post('/api/v1/event/',
                                    format='json',
                                    data=post_data,
                                    authentication=self.get_credentials())
        self.assertHttpCreated(resp)
        event = self.deserialize(resp)

        resp = self.api_client.get(
            '/api/v1/event/{}/'.format(event['id']),
            format='json',
            authentication=self.get_credentials(user=user))
        self.assertEqual(
            self.deserialize(resp)['access_user_list'], str(user.id))
Example #28
0
class EventResource(MultiPartResource, ModelResource):
    members = fields.OneToManyField('events.api.resources.MembershipResource',
                                    attribute=lambda bundle:
                                    bundle.obj.membership_set.all(),
                                    full=True, null=True)
    attendees = fields.OneToManyField(
        'events.api.resources.MembershipResource',
        attribute=lambda bundle:
        # TODO: fix user bundle.request.user.id
        #
        bundle.obj.membership_set.filter(
            user__in=NeoFourJ().get_my_friends_ids(bundle.request.user.id) +
            [bundle.request.user.id], rsvp='yes'),
        full=True, null=True)
    event_photo = fields.FileField(attribute="event_photo", null=True,
                                   blank=True)

    class Meta:
        always_return_data = True
        queryset = Event.objects.all().order_by('-starts_on')
        resource_name = 'event'
        excludes = ['search_index']

        filtering = {
            'description': ALL
        }
        validation = EventValidation()
        authentication = JSONWebTokenAuthentication()
        authorization = GuardianAuthorization(
            view_permission_code='view_event',
            # create_permission_code='add_event',
        )

    def dehydrate(self, bundle):
        user_id = bundle.request.user.id
        friends = NeoFourJ().get_my_friends_ids(user_id)
        try:
            bundle.data['hosted_by'] = bundle.obj.membership_set. \
                filter(is_organizer=True, rsvp='yes')[0].user.get_full_name()
        except IndexError:
            bundle.data['hosted_by'] = ''

        # Total number of event attendees
        total_attendees = bundle.obj. \
            membership_set.filter(rsvp='yes').count()
        bundle.data['total_attendees'] = total_attendees

        # the number of people with RSVP = yes AND
        # are also a connection of the user who is viewing the event
        attendees = bundle.obj. \
            membership_set.filter(user__in=friends + [user_id], rsvp='yes')
        bundle.data['friend_attendees_count'] = attendees.count()

        # spots_remaining = max_attendees - total_attendees
        # TODO: max_attendees in ICE-938
        bundle.data['spots_remaining'] = int(
            bundle.obj.max_attendees) - total_attendees

        matched_users = MatchQuerySet.attendees(user_id)
        bundle.data['attendees_yes'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='yes')
        bundle.data['attendees_no'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='no')
        bundle.data['attendees_maybe'] = MatchEvent.get_attendees(
            user_id, bundle.obj, matched_users, rsvp='maybe')

        bundle.data['cumulative_match_score'] = MatchEvent.get_cum_score(
            user_id, bundle.obj, matched_users)

        try:
            bundle.data['distance'] = MatchQuerySet.user_event(
                    bundle.request.user.id,
                    bundle.obj.pk
            )[0].distance
        except IndexError:
            bundle.data['distance'] = [10000, 'mi']
        bundle.data['organizer'] = build_organizer(bundle.obj)
        return bundle

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/search%s$" %
                (self._meta.resource_name, trailing_slash()),
                self.wrap_view('get_search'), name="api_get_search"),
        ]

    def get_search(self, request, **kwargs):
        self.method_check(request, allowed=['get'])
        self.is_authenticated(request)
        self.throttle_check(request)

        # Do the query.
        query = request.GET.get('q', '')
        sqs = SearchQuerySet().models(Event).load_all(). \
            filter(SQ(name=query) | SQ(description=query))
        paginator = Paginator(sqs, 10)

        try:
            page = paginator.page(int(request.GET.get('page', 1)))
        except InvalidPage:
            raise Http404("Sorry, no results on that page.")

        objects = []

        for result in page.object_list:
            bundle = self.build_bundle(obj=result.object, request=request)
            bundle = self.full_dehydrate(bundle)
            objects.append(bundle)

        object_list = {
            'objects': objects,
        }

        self.log_throttled_access(request)
        return self.create_response(request, object_list)

    def obj_create(self, bundle, **kwargs):
        bundle = super(EventResource, self).obj_create(bundle, **kwargs)
        assign_perm('view_event', bundle.request.user, bundle.obj)
        Membership.objects.create(user=bundle.request.user, event=bundle.obj,
                                  is_organizer=True, rsvp='yes')

        if bundle.obj.access_level == 'public':
            users = FacebookCustomUserActive.objects.all(). \
                exclude(pk=bundle.request.user.id)
            assign_perm_task.delay('view_event', users, bundle.obj)
        elif bundle.obj.access_level == 'private':
            if bundle.obj.access_user_list:
                try:
                    user_ids = map(int, bundle.obj.access_user_list.split(','))
                    users = FacebookCustomUserActive.objects.\
                        filter(pk__in=user_ids)
                    assign_perm_task.delay('view_event', users, bundle.obj)
                except TypeError as e:
                    logger.error(e)
        elif bundle.obj.access_level == 'connections':
            user_ids = []
            if bundle.obj.access_user_list:
                try:
                    user_ids = map(int, bundle.obj.access_user_list.split(','))
                except TypeError as e:
                    logger.error(e)
            else:
                user_ids = NeoFourJ().get_my_friends_ids(bundle.request.user.id)

            users = FacebookCustomUserActive.objects.filter(pk__in=user_ids)
            assign_perm_task.delay('view_event', users, bundle.obj)

        return bundle

    def obj_update(self, bundle, skip_errors=False, **kwargs):
        new_access_level = bundle.data.get('access_level', '')
        current_access_level = bundle.obj.access_level
        event_photo = bundle.data.get('event_photo', '')
        if isinstance(event_photo, unicode) and event_photo.startswith('http'):
            bundle.data['event_photo'] = \
                event_photo.split('cloudfront.net/')[-1]
        bundle = super(EventResource, self).obj_update(bundle, **kwargs)
        if current_access_level != new_access_level:
            if new_access_level == 'public':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                assign_perm_task.delay('view_event', users, bundle.obj)

            elif new_access_level == 'private':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                remove_perm_task.delay('view_event', users, bundle.obj)

                if bundle.obj.access_user_list:
                    try:
                        user_ids = map(int,
                                       bundle.obj.access_user_list.split(','))
                        users_ = FacebookCustomUserActive.objects. \
                            filter(pk__in=user_ids)
                        assign_perm_task.delay('view_event', users_, bundle.obj)
                    except TypeError as e:
                        logger.error(e)

            elif new_access_level == 'connections':
                users = FacebookCustomUserActive.objects.all(). \
                    exclude(pk=bundle.request.user.id)
                remove_perm_task.delay('view_event', users, bundle.obj)

                user_ids = []
                if bundle.obj.access_user_list:
                    try:
                        user_ids = map(int,
                                       bundle.obj.access_user_list.split(','))
                    except TypeError as e:
                        logger.error(e)
                else:
                    user_ids = NeoFourJ().get_my_friends_ids(
                        bundle.request.user.id
                    )

                users_ = FacebookCustomUserActive.objects. \
                    filter(pk__in=user_ids)
                assign_perm_task.delay('view_event', users_, bundle.obj)
        return bundle

    def obj_delete(self, bundle, **kwargs):
        r = redis.StrictRedis(host='localhost', port=6379, db=0)
        event = Event.objects.get(pk=int(kwargs['pk']))
        members = event.membership_set.filter(rsvp__in=['yes', 'maybe'],
                                              is_organizer=False)
        organizer = event.membership_set.filter(is_organizer=True)[0]
        recipients = FacebookCustomUserActive.objects. \
            filter(id__in=members.values_list('user_id', flat=True))
        data = {u'event_name': unicode(event.name),
                u'event_start_date': unicode(event.starts_on),
                u'event_organizer_name': unicode(organizer.user.first_name)}

        for recipient in recipients:
            message_data = {u'sent_at': now().isoformat(),
                            u'sender': '/api/auth/user/{}/'.format(
                                organizer.user.id),
                            u'recipient': '/api/auth/user/{}/'.format(
                                recipient.id),
                            u'body': u"""
                                    The event {event_name} on {event_start_date} has been
                                    cancelled by {event_organizer_name},
                                    the event host. We apologize for any inconvenience.
                                    (This is an automated message.)"
                                    """.format(**data)}
            pm_write(bundle.request.user, recipient, '',
                     body=message_data['body'])
            r.publish('message.%s' % recipient.id, json.dumps(message_data))

        for member in members:
            r.publish('event_deleted.%s' % member.user.id, json.dumps(data))

        return super(EventResource, self).obj_delete(bundle, **kwargs)

    def save_m2m(self, bundle):
        for field_name, field_object in self.fields.items():
            if not getattr(field_object, 'is_m2m', False):
                continue

            if not field_object.attribute:
                continue

            for field in bundle.data[field_name]:
                kwargs = {'event': Event.objects.get(pk=bundle.obj.id),
                          'user': field.obj.user}
                try:
                    Membership.objects.get_or_create(**kwargs)
                except IntegrityError:
                    continue

    def update_in_place(self, request, original_bundle, new_data):
        ends_on = original_bundle.data['ends_on']
        if ends_on < now():
            raise BadRequest(
                'Users cannot edit events which have an end date that '
                'occurred in the past.'
            )
        return super(EventResource, self).update_in_place(
            request, original_bundle, new_data
        )
Example #29
0
class TestMatchEvents(BaseTestCase, JWTResourceTestCase):
    def setUp(self):
        super(TestMatchEvents, self).setUp()
        haystack.connections.reload('default')
        FacebookCustomUser.objects.all().delete()
        self.user = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=1234567,
                        first_name='Andrii', password='******', gender='m',
                        date_of_birth=date(1989, 5, 20))
        self.user1 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345671,
                        first_name='Sasa', gender='m', password='******',
                        date_of_birth=date(1979, 1, 9))
        user_location = UserLocation.objects.create(
            user=self.user, position=[-87.627696, 41.880745])
        user_location1 = UserLocation.objects.create(
            user=self.user1, position=[-87.627696, 41.880745])
        self.subject = Subject.objects.create(description='learning django')
        self.subject2 = Subject.objects.create(description='learn python')
        clear_index.Command().handle(interactive=False)
        rebuild_index.Command().handle(interactive=False)
        self.neo = NeoFourJ()
        self.neo.graph.delete_all()

    def get_credentials(self):
        pass

    def test_my_events(self):
        self.event = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="Play piano", location=[7000, 22965.83])
        self.event1 = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="python meetup", location=[7000, 22965.83])
        self.membership = Membership.objects. \
            create(user=self.user, event=self.event,
                   is_organizer=True, rsvp='yes')
        self.membership = Membership.objects. \
            create(user=self.user1, event=self.event1,
                   is_organizer=True, rsvp='yes')
        assign_perm('view_event', self.user, self.event)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id, feed='my')
        self.assertEqual(len(events), 1)
        self.assertEqual(events[0].name, 'Play piano')

    def test_all_events(self):
        self.event = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="Play piano", location=[7000, 22965.83])
        self.event1 = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="python meetup", location=[7000, 22965.83])
        self.membership = Membership.objects. \
            create(user=self.user, event=self.event,
                   is_organizer=True, rsvp='yes')
        self.membership = Membership.objects. \
            create(user=self.user1, event=self.event1,
                   is_organizer=True, rsvp='yes')
        assign_perm('view_event', self.user, self.event)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id, feed='all')
        self.assertEqual(len(events), 2)
        self.assertEqual(
            sorted(events, key=lambda x: x.name)[0].name, 'Play piano')

    def test_connections_events(self):
        self.event = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="Play piano", location=[7000, 22965.83])
        self.event1 = Event.objects. \
            create(starts_on='2055-06-13T05:15:22.792659',
                   ends_on='2055-06-14T05:15:22.792659',
                   name="python meetup", location=[7000, 22965.83])
        self.membership = Membership.objects. \
            create(user=self.user, event=self.event,
                   is_organizer=True, rsvp='yes')
        self.membership = Membership.objects. \
            create(user=self.user1, event=self.event1,
                   is_organizer=True, rsvp='yes')
        self.neo.create_friendship(self.user, self.user1)
        assign_perm('view_event', self.user, self.event)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id, feed='connections')
        self.assertEqual(len(events), 1)
        self.assertEqual(events[0].name, 'python meetup')

    def test_filter_by_distance_my_events(self):
        e = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                 ends_on='2055-06-14T05:15:22.792659',
                                 name="Play piano",
                                 location=[7000, 22965.83])

        e1 = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                  ends_on='2055-06-14T05:15:22.792659',
                                  name="python meetup",
                                  location=[700, 22965.83])

        Membership.objects.create(user=self.user,
                                  event=e,
                                  is_organizer=True,
                                  rsvp='yes')
        Membership.objects.create(user=self.user,
                                  event=e1,
                                  is_organizer=True,
                                  rsvp='yes')
        assign_perm('view_event', self.user, e)
        assign_perm('view_event', self.user, e1)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id, feed='my')
        self.assertEqual(len(events), 2)
        self.assertEqual(events[0].distance[0], 4904)

    def test_filter_by_keywords_my_events(self):
        e = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                 ends_on='2055-06-14T05:15:22.792659',
                                 name="Play piano",
                                 location=[7000, 22965.83])

        e1 = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                  ends_on='2055-06-14T05:15:22.792659',
                                  name="python meetup",
                                  location=[700, 22965.83])

        Membership.objects.create(user=self.user,
                                  event=e,
                                  is_organizer=True,
                                  rsvp='yes')
        Membership.objects.create(user=self.user,
                                  event=e1,
                                  is_organizer=True,
                                  rsvp='yes')
        assign_perm('view_event', self.user, e)
        assign_perm('view_event', self.user, e1)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='python',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id,
                                         feed='my',
                                         is_filter=True)
        self.assertEqual(len(events), 1)
        self.assertEqual(events[0].name, 'python meetup')

    def test_filter_by_recommended_event_score_my_events(self):
        e = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                 ends_on='2055-06-14T05:15:22.792659',
                                 description='PyCon is a conference for the '
                                 'Python community, organized by '
                                 'members of the Python community '
                                 'PyCon is for Python enthusiasts '
                                 'of all experience levels, from '
                                 'new users to core developers.',
                                 name="Python Con",
                                 location=[7000, 22965.83])

        e1 = Event.objects.create(starts_on='2055-06-13T05:15:22.792659',
                                  ends_on='2055-06-14T05:15:22.792659',
                                  name="python meetup",
                                  location=[700, 22965.83])

        Goal.objects.get_or_create(user=self.user, goal=self.subject)
        Goal.objects.get_or_create(user=self.user, goal=self.subject2)
        Membership.objects.create(user=self.user,
                                  event=e,
                                  is_organizer=True,
                                  rsvp='yes')
        Membership.objects.create(user=self.user,
                                  event=e1,
                                  is_organizer=True,
                                  rsvp='yes')
        assign_perm('view_event', self.user, e)
        assign_perm('view_event', self.user, e1)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='python',
                                   order_criteria='event_score',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        events = MatchQuerySet.all_event(self.user.id,
                                         feed='my',
                                         is_filter=True)
        self.assertEqual(len(events), 2)
        self.assertEqual(events[0].name, 'python meetup')
        self.assertEqual(events[0].recommended_event_score, 1)
        self.assertEqual(events[1].recommended_event_score, 4)
Example #30
0
class TestMatchQuerySet(BaseTestCase, JWTResourceTestCase):
    fixtures = ['initial_data.json']

    def setUp(self):
        super(TestMatchQuerySet, self).setUp()
        haystack.connections.reload('default')
        Goal.objects.all().delete()
        Offer.objects.all().delete()
        Subject.objects.all().delete()
        FacebookCustomUser.objects.all().delete()
        photo = SimpleUploadedFile(name='test_image.jpg', content='test')
        self.user = FacebookCustomUser.objects.\
            create_user(username='******', facebook_id=1234567,
                        first_name='Andrii', password='******', gender='m',
                        date_of_birth=date(1989, 5, 20), image=photo)
        self.user1 = FacebookCustomUser.objects.\
            create_user(username='******', facebook_id=12345671,
                        first_name='Sasa', gender='m', password='******',
                        date_of_birth=date(1979, 1, 9), image=photo)
        self.user2 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345672,
                        first_name='Ira', gender='f', password='******',
                        date_of_birth=date(1969, 1, 9), image=photo)
        self.user3 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345676,
                        first_name='Natali', gender='f', password='******',
                        date_of_birth=date(1959, 1, 9), image=photo)
        self.user4 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345675,
                        first_name='Tati', gender='f', password='******',
                        date_of_birth=date(1949, 1, 9), image=photo)
        self.user5 = FacebookCustomUser.objects. \
            create_user(username='******', facebook_id=12345674,
                        first_name='Ken', gender='m', password='******',
                        date_of_birth=date(1939, 1, 9), image=photo)

        user_location = UserLocation.objects.create(
            user=self.user, position=[-87.627696, 41.880745])
        user_location1 = UserLocation.objects.create(
            user=self.user1, position=[60.627675, 21.881925])
        user_location2 = UserLocation.objects.create(
            user=self.user2, position=[-87.6281729688, 41.881849562])
        user_location3 = UserLocation.objects.create(
            user=self.user5, position=[-87.62839, 41.88206])
        user_location4 = UserLocation.objects.create(
            user=self.user4, position=[-87.6269801114, 41.8814058757])
        user_location5 = UserLocation.objects.create(user=self.user3,
                                                     position=[38.53, 77.02])

        self.subject = Subject.objects.create(description='learning django')
        self.subject2 = Subject.objects.create(description='learn python')
        self.subject3 = Subject.objects.create(description='teach erlang')
        self.subject4 = Subject.objects.create(description='teach javascript')

        self.subject5 = Subject.objects.create(description='teach django')
        self.subject6 = Subject.objects.create(description='teach python')
        self.subject7 = Subject.objects.create(description='learn erlang')
        self.subject8 = Subject.objects.create(description='learn javascript')
        self.subject9 = Subject.objects.\
            create(description='django under the hood')
        self.subject10 = Subject.objects.\
            create(description='learn kiteboarding and foxes')
        self.subject11 = Subject.objects.\
            create(description='like a kiteboard and fox')
        self.subject12 = Subject.objects. \
            create(description='baby')
        self.subject13 = Subject.objects. \
            create(description='child')
        self.subject14 = Subject.objects. \
            create(description='hire a dog sitter')
        self.subject16 = Subject.objects. \
            create(description='play with dogs')
        self.subject15 = Subject.objects. \
            create(description='learn to code django python')

        self.i_subject = InterestSubject.objects.\
            create(description='teach django')
        self.i_subject1 = InterestSubject.objects. \
            create(description='learn django')
        self.i_subject2 = InterestSubject.objects. \
            create(description='teach python')
        self.i_subject3 = InterestSubject.objects. \
            create(description='learn python')
        self.i_subject4 = InterestSubject.objects. \
            create(description='kiteboarding')
        StopWords.objects.create(word='learn')
        StopWords.objects.create(word=u'and')
        StopWords.objects.create(word=u'teach')
        StopWords.objects.create(word=u'to')
        clear_index.Command().handle(interactive=False)
        rebuild_index.Command().handle(interactive=False)
        self.neo = NeoFourJ()
        self.neo.graph.delete_all()

    def tearDown(self):
        pass
        # haystack.connections['default'].get_backend().clear()

    def test_simple_match_goals(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine.\
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['goals'],
                         [u'teach <em>django</em>'])

    def test_simple_match_offers(self):
        Offer.objects.create(user=self.user, offer=self.subject2)
        Offer.objects.create(user=self.user1, offer=self.subject6)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['offers'],
                         [u'teach <em>python</em>'])

    def test_simple_match_interests(self):
        Interest.objects.create(user=self.user, interest=self.i_subject)
        Interest.objects.create(user=self.user1, interest=self.i_subject1)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['interests'],
                         [u'learn <em>django</em>'])

    def test_simple_match_likes(self):
        FacebookLike.objects.create(user_id=self.user.id,
                                    facebook_id=123456,
                                    name='learn python')
        fb_like = FacebookLike.objects.create(user_id=self.user1.id,
                                              facebook_id=123456,
                                              name='learn python')
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['_source']['likes_fb_ids'],
                         [unicode(fb_like.facebook_id)])

    def test_simple_match_two_goals_to_two_offers(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user, goal=self.subject2)
        Offer.objects.create(user=self.user1, offer=self.subject5)
        Offer.objects.create(user=self.user1, offer=self.subject6)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['offers'],
                         [u'teach <em>django</em>', u'teach <em>python</em>'])

    def test_match_goals_to_offers(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user, goal=self.subject2)
        Offer.objects.create(user=self.user1, offer=self.subject5)
        Offer.objects.create(user=self.user1, offer=self.subject3)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['_source']['offers'],
                         [u'teach django', u'teach erlang'])
        self.assertEqual(match_users[0]['highlight']['offers'],
                         [u'teach <em>django</em>'])

    def test_simple_match_query_set(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Offer.objects.create(user=self.user1, offer=self.subject5)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(users), 1)
        self.assertEqual(users[0].first_name, 'Sasa')

    def test_highlight_simple_match_goal_query_set(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(users[0].goals, [{u'teach django': 1}])

    def test_highlight_simple_match_offer_query_set(self):
        Offer.objects.create(user=self.user, offer=self.subject)
        Offer.objects.create(user=self.user1, offer=self.subject5)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(users[0].offers, [{u'teach django': 1}])

    def test_highlight_simple_match_interest_query_set(self):
        Interest.objects.create(user=self.user, interest=self.i_subject)
        Interest.objects.create(user=self.user1, interest=self.i_subject1)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(users[0].interests, [{u'learn django': 1}])

    def test_simple_match_score_goals(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user, goal=self.subject2)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject6)
        Goal.objects.create(user=self.user1, goal=self.subject7)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(users[0].score, 2)

    def test_simple_match_score_offers(self):
        Offer.objects.create(user=self.user, offer=self.subject)
        Offer.objects.create(user=self.user, offer=self.subject2)
        Offer.objects.create(user=self.user1, offer=self.subject5)
        Offer.objects.create(user=self.user1, offer=self.subject6)
        Offer.objects.create(user=self.user1, offer=self.subject7)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.all(self.user.id)
        self.assertEqual(users[0].score, 2)

    def test_simple_match_goals_with_stop_words(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject9)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['goals'],
                         [u'<em>django</em> under the hood'])

    def test_simple_match_goals_with_stop_words2(self):
        Goal.objects.create(user=self.user, goal=self.subject14)
        Goal.objects.create(user=self.user1, goal=self.subject16)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['goals'],
                         [u'play with <em>dogs</em>'])

    def test_simple_match_goals_with_root_forms_of_word(self):
        Goal.objects.create(user=self.user, goal=self.subject11)
        Goal.objects.create(user=self.user1, goal=self.subject10)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['goals'],
                         [u'learn <em>kiteboarding</em> and <em>foxes</em>'])

    def test_simple_match_between(self):
        Goal.objects.create(user=self.user, goal=self.subject11)
        Goal.objects.create(user=self.user1, goal=self.subject10)
        Goal.objects.create(user=self.user2, goal=self.subject10)
        Goal.objects.create(user=self.user3, goal=self.subject10)
        update_index.Command().handle(interactive=False)
        users = MatchQuerySet.between(self.user.id, self.user1.id)
        self.assertEqual(len(users), 1)
        self.assertEqual(users[0].score, 1)

    def test_simple_match_synonyms(self):
        Goal.objects.create(user=self.user, goal=self.subject12)
        Goal.objects.create(user=self.user1, goal=self.subject12)
        update_index.Command().handle(interactive=False)
        match_users = ElasticSearchMatchEngine. \
            elastic_objects.match(user_id=self.user.id)
        self.assertEqual(
            match_users[0]['_id'],
            u'members.facebookcustomuseractive.%s' % self.user1.id)
        self.assertEqual(match_users[0]['highlight']['goals'],
                         [u'<em>baby</em>'])

    def test_simple_top_interests(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject15)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].top_interests[0], {
            u'coding': 0,
            u'django': 1,
            u'python': 0
        })

    def test_top_interests(self):
        Goal.objects.create(user=self.user, goal=self.subject12)
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user, goal=self.subject2)
        Offer.objects.create(user=self.user, offer=self.subject3)
        Goal.objects.create(user=self.user1, goal=self.subject13)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject6)
        Offer.objects.create(user=self.user1, offer=self.subject7)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].top_interests, [{
            u'child': 0,
            u'django': 1,
            u'erlang': 1,
            u'python': 1
        }])

    def test_simple_top_interests_less_than_3(self):
        Goal.objects.create(user=self.user, goal=self.subject11)
        Goal.objects.create(user=self.user1, goal=self.subject10)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].top_interests[0], {
            u'kiteboarding': 1,
            u'foxes': 0
        })

    def test_simple_top_interests_less_than_1(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject10)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(match_users), 0)

    def test_filter_gender_male(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user, gender='m', distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')
        self.assertEqual(match_users[0].gender, 'm')

    def test_filter_gender_female(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user4, goal=self.subject5)
        FilterState.objects.create(user=self.user, gender='f', max_age=99)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Tati')
        self.assertEqual(match_users[0].gender, 'f')

    def test_filter_gender_all(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        Goal.objects.create(user=self.user4, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   gender='f,m',
                                   max_age=99,
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 3)

    def test_filter_age(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        Goal.objects.create(user=self.user4, goal=self.subject5)
        FilterState.objects.create(user=self.user, min_age=60, max_age=67)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Tati')
        self.assertEqual(match_users[0].age, 67)

    def test_filter_keywords(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject2)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='python',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')
        self.assertEqual(match_users[0].goals, [{
            u'learn python': 0,
            u'teach django': 1
        }])

    def test_filter_two_keywords(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject2)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='python,ruby',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')
        self.assertEqual(match_users[0].goals, [{
            u'learn python': 0,
            u'teach django': 1
        }])

    def test_filter_with_different_word_form_of_keywords(self):
        """
        Searching Crowd for "hiking" yields no results
        (but search for "hike" does) - ICE-1311
        """
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject)
        Goal.objects.create(user=self.user1,
                            goal=Subject.objects.create(description='hiking'))

        Goal.objects.create(user=self.user2, goal=self.subject)

        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='hike',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')
        self.assertEqual(match_users[0].goals, [{
            u'learning django': 1,
            u'hiking': 0
        }])

    def test_filter_with_different_word_form_of_keywords2(self):
        """
        Searching Crowd for "hiking" yields no results
        (but search for "hike" does) - ICE-1311
        """
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject)
        Goal.objects.create(user=self.user1,
                            goal=Subject.objects.create(description='hike'))

        Goal.objects.create(user=self.user2, goal=self.subject)

        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='hiking',
                                   distance=16516)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')
        self.assertEqual(match_users[0].goals, [{
            u'learning django': 1,
            u'hike': 0
        }])

    def test_filter_keywords_negative_case(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject2)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   keyword='ruby')
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 0)

    def test_filter_distance(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user1, goal=self.subject2)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   distance=1)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 0)

    def test_exclude_friends(self):
        Goal.objects.create(user=self.user, goal=self.subject)
        Goal.objects.create(user=self.user1, goal=self.subject5)
        Goal.objects.create(user=self.user3, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   distance=10000)
        self.neo.create_friendship(self.user, self.user3)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id)
        self.assertEqual(len(match_users), 1)
        self.assertEqual(match_users[0].first_name, 'Sasa')

    def test_order_mutual_friends(self):
        Goal.objects.get_or_create(user=self.user, goal=self.subject)
        Goal.objects.get_or_create(user=self.user1, goal=self.subject5)
        Goal.objects.get_or_create(user=self.user2, goal=self.subject5)
        Goal.objects.get_or_create(user=self.user3, goal=self.subject5)
        Goal.objects.get_or_create(user=self.user4, goal=self.subject5)
        Goal.objects.get_or_create(user=self.user5, goal=self.subject5)
        FilterState.objects.create(user=self.user,
                                   min_age=18,
                                   max_age=99,
                                   distance=16000,
                                   order_criteria='mutual_friends')
        self.neo.create_friendship(self.user, self.user1)
        self.neo.create_friendship(self.user, self.user3)
        self.neo.create_friendship(self.user5, self.user1)
        self.neo.create_friendship(self.user5, self.user3)
        self.neo.create_friendship(self.user4, self.user1)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)
        self.assertEqual(len(match_users), 3)
        resp = self.api_client.get('/api/v1/matchfeed/',
                                   authentication=self.get_credentials(),
                                   format='json')
        self.assertValidJSONResponse(resp)
        data = self.deserialize(resp)['objects']
        self.assertEqual(data[0]['friends_score'], 2)
        self.assertEqual(data[1]['friends_score'], 1)
        self.assertEqual(data[2]['friends_score'], 0)

    def test_simple_phrase(self):
        s = Subject.objects.create(description='foreign language')
        Goal.objects.get_or_create(user=self.user, goal=s)
        Goal.objects.get_or_create(user=self.user1, goal=s)
        update_index.Command().handle(interactive=False)
        match_users = MatchQuerySet.all(self.user.id, is_filter=True)