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 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)
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 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()
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']
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
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()
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
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()
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)
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()
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, [])
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)
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
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))
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()
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 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)
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 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
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']
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()
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))
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 )
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)
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)