예제 #1
0
 def get(self, request, format=None):
     """
     Return profile of user
     """
     user = request.user
     statusCode = status.HTTP_200_OK
     name = user.first_name + ' ' + user.last_name
     avatar = bw_get_thumbnail( user.profile.get_avatar(), '21x21').url
     return Response({'username': user.username, 'name': name, 'avatar': avatar}, statusCode)
예제 #2
0
    def get(self, request, slug, format=None):
        """
        Get a Problem with given slug
        """
        try:
            problem = get_object_or_none( Poll, article__slug=slug )
            if not problem:
                return Response( { "error": True, "message": "No such Poll" } )
            my_response = get_object_or_none( PollResponse, user_id=request.user.id, poll_id=problem.id )        
            user = problem.article.author
            name = user.first_name + ' ' + user.last_name
            avatar = bw_get_thumbnail( user.profile.get_avatar(), '21x21').url
            content = render_to_string('bw_restapi/problem_description.html', { 'problem': problem })
            answerMap = problem.get_ordered_answers()
            answers = []
            num_abstentions = problem.pollresponse_set.filter(answer__isnull=True).count()
            my_answer = None
            if my_response:
                my_answer = {
                    'public': my_response.public
                }
                if my_response.answer:
                    my_answer['answer'] = my_response.answer.answer_text
                else:
                    my_answer['answer'] = "Abstain"            
            for answer in answerMap:
                if answer.answer_count > 0:
                    if answer.answer_text.lower() == my_answer['answer'].lower():
                        my_answer['count'] = answer.answer_count;
                    answers.append( { 'text': answer.answer_text, 'count':answer.answer_count } )
            item = {
                'my_answer': my_answer,
                'num_answers': problem.article.num_poll_responses,
                'abstentions': num_abstentions,
                'num_abstentions': num_abstentions,
                'answers': answers,
                'slug': problem.article.slug,
                'description': content,
                'type': problem.poll_type,
                'lin_str': problem.hand.lin_str(),
                'author': name,
                'avatar': avatar,
                'scoring': problem.scoring,
                'vulnerability': problem.vul,
                'auction': problem.auction,
                'dealer': problem.dealer
            }
            item["error"] = False

            return Response( item )
        except Exception as e:
            return Response( { "error": True, "message": e.message } )          
예제 #3
0
 def post(self, request, format=None):
     """
     Get Recent Published Problems
     """
     try:
         start = int(request.POST.get( "start", 0))
         end = int(request.POST.get( "end", 0))
         end = end+1
         recent_polls = Poll.objects.filter(article__author_id=request.user.id).exclude(article__unpublished=True).exclude(poll_type='Basic').order_by('-created')[start:end]
         answers = []
         for poll in recent_polls:
             num_abstentions = poll.pollresponse_set.filter(answer__isnull=True).count()
             num_answers = poll.article.num_poll_responses
             user = poll.article.author
             name = user.first_name + ' ' + user.last_name
             avatar = bw_get_thumbnail( user.profile.get_avatar(), '21x21').url
             answerMap = poll.get_ordered_answers()
             all_answers = []
             for item in answerMap:
                 if item.answer_count > 0:
                     itemPercent = int( 100.0 * float( item.answer_count ) / (num_answers - num_abstentions)  + 0.5 )
                     all_answers.append( { 'text': item.answer_text, 'count':item.answer_count, 'percent': itemPercent } )
             my_response = get_object_or_none( PollResponse, user_id=request.user.id, poll_id=poll.id )        
             my_answer = None
             if my_response:
                 my_answer = {
                     'public': my_response.public
                 }
                 if my_response.answer:
                     my_answer['count'] = my_response.answer.answer_count
                     my_answer['answer'] = my_response.answer.answer_text
                 else:
                     my_answer['count'] = num_abstentions
                     my_answer['answer'] = "Abstain"                            
             item = {
                 'type': poll.poll_type,
                 'slug': poll.article.slug,
                 'lin_str': poll.hand.lin_str(),
                 'num_answers': num_answers,
                 'num_abstentions': num_abstentions,
                 'avatar': avatar,
                 'author': name,
                 'answers': all_answers,
                 'my_answer': my_answer                    
             }
             answers.append(item)
                 
         return Response( { "error": False, "recent_answers": answers } )
     except Exception as e:
         return Response( { "error": True, "message": e.message } )         
예제 #4
0
    def post(self, request):
	serializer = self.serializer_class(data=request.data)
	serializer.is_valid(raise_exception=True)
	user = serializer.validated_data['user']
	msg = serializer.validated_data['msg']
	error = serializer.validated_data['error']
	tokenKey = ''
	name = ''
	avatar = ''
	if not error:
	    token, created = Token.objects.get_or_create(user=user)
	    tokenKey = token.key
	    name = user.first_name + ' ' + user.last_name
	    avatar = bw_get_thumbnail( user.profile.get_avatar(), '21x21').url
	return Response( {'error': error, 'token': tokenKey, 'message': msg, 'name': name, 'avatar': avatar} )
예제 #5
0
    def post(self, request, format=None):
        """
        Return next voting problem of user
        """
        try:
            exclude_slug = request.POST.get( 'exclude', None );
            
            all_problems = Poll.objects.exclude( poll_type='Basic' )
            all_problems = all_problems.exclude( article__unpublished=True )
            all_problems = all_problems.exclude( article__deleted=True )
            all_problems = all_problems.filter( article__author__profile__verification_status=Profile.VERIFICATION_STATUS_VERIFIED )
            
            if request.user.is_authenticated():
                my_answers = [a for a in PollResponse.objects.filter(user_id=request.user.id).exclude( poll__poll_type='Basic' ).values_list('poll_id',flat=True)]
                my_ignores = [i for i in Ignore.objects.filter( user_id=request.user.id, articles=True ).values_list( 'ignored_user', flat=True )]
                available_problems = all_problems.exclude( id__in=my_answers )
                available_problems = available_problems.exclude( article__author_id__in=my_ignores )
            else:
                available_problems = all_problems
                    
            if exclude_slug:
                available_problems = available_problems.exclude( article__slug=exclude_slug )
                            
            site_settings = SitewideSettings.objects.get_singleton(request)
                    
            sample_strategy_names = [
                "Sampling from all problems",
                "Written by %d most popular people" % site_settings.num_popular_people,
                "Written by people I'm following"
            ]
            pdf = [site_settings.frontpage_problem_everyone_weight, site_settings.frontpage_problem_popular_weight]
            if request.user.is_authenticated():
                pdf.append(site_settings.frontpage_problem_following_weight)
                    
            cdf = compute_cdf( pdf )
            sample_strategy = sample_cdf( cdf )
            initial_sample_strategy_name = sample_strategy_names[sample_strategy]

            while True:
                strategy_problems = get_strategy_problems( request.user, available_problems, site_settings.num_popular_people, sample_strategy )
                if strategy_problems.exists() or sample_strategy == 0:
                    break;
                sample_strategy -= 1
                    
            sample_strategy_name = sample_strategy_names[sample_strategy]
            sample_likelihood = 0
            if sample_strategy == 0:
                sample_likelihood = cdf[0]
            elif sample_strategy > 0:
                sample_likelihood = cdf[sample_strategy] - cdf[sample_strategy-1]
                    
            num_problems = strategy_problems.count()
            if num_problems > 0:
                import random, math
                uniform = random.random()
                exponential = - math.log(uniform) / 15 # fudge factor from experiments
                idx = min( int( exponential * num_problems ), num_problems-1 )
                problem = strategy_problems.order_by('-article__publish_date')[idx]
                user = problem.article.author
                name = user.first_name + ' ' + user.last_name
                avatar = bw_get_thumbnail( user.profile.get_avatar(), '21x21').url
                content = render_to_string('bw_restapi/problem_description.html', { 'problem': problem })
                return Response({"error": False, 'alldone': False, 'slug': problem.article.slug, 'description': content, 'type': problem.poll_type, 'lin_str': problem.hand.lin_str(), 'author': name, 'avatar': avatar, 'scoring': problem.scoring, 'vulnerability': problem.vul, 'auction': problem.auction, 'dealer': problem.dealer})
            else:
                return Response({"error": False, 'alldone': True})
        except Exception as e:
            return Response( { "error": True, "message": e.message } )