(request, id)
return HttpResponse(data, mimetype="application/json")
vote_type:
        acceptAnswer : 0,
        questionUpVote : 1,
        questionDownVote : 2,
        favorite : 4,
        answerUpVote: 5,
        answerDownVote:6,
        offensiveQuestion : 7,
        offensiveAnswer:8,
        removeQuestion: 9,
        removeAnswer:10
        questionSubscribeUpdates:11

    accept answer code:
        response_data['allowed'] = -1, Accept his own answer   0, no allowed - Anonymous    1, Allowed - by default
        response_data['success'] =  0, failed                                               1, Success - by default
        response_data['status']  =  0, By default                                           1, Answer has been accepted already(Cancel)

    vote code:
        allowed = -3, Don't have enough votes left
                  -2, Don't have enough reputation score
                  -1, Vote his own post
                   0, no allowed - Anonymous
                   1, Allowed - by default
        status  =  0, By default
                   1, Cancel
                   2, Vote is too old to be canceled

    offensive code:
        allowed = -3, Don't have enough flags left
                  -2, Don't have enough reputation score to do this
                   0, not allowed
                   1, allowed
        status  =  0, by default
                   1, can't do it again
vote_type:
        acceptAnswer : 0,
        questionUpVote : 1,
        questionDownVote : 2,
        favorite : 4,
        answerUpVote: 5,
        answerDownVote:6,
        offensiveQuestion : 7,
        offensiveAnswer:8,
        removeQuestion: 9,
        removeAnswer:10
        questionSubscribeUpdates:11
vote_type : acceptAnswer : 0 questionUpVote : 1 questionDownVote : 2 favorite : 4 answerUpVote : 5 answerDownVote : 6 offensiveQuestion : 7 offensiveAnswer : 8 removeQuestion : 9 removeAnswer : 10 questionSubscribeUpdates : 11
def vote(request, id):
    """
    vote_type:
        acceptAnswer : 0,
        questionUpVote : 1,
        questionDownVote : 2,
        favorite : 4,
        answerUpVote: 5,
        answerDownVote:6,
        offensiveQuestion : 7,
        offensiveAnswer:8,
        removeQuestion: 9,
        removeAnswer:10
        questionSubscribeUpdates:11

    accept answer code:
        response_data['allowed'] = -1, Accept his own answer   0, no allowed - Anonymous    1, Allowed - by default
        response_data['success'] =  0, failed                                               1, Success - by default
        response_data['status']  =  0, By default                                           1, Answer has been accepted already(Cancel)

    vote code:
        allowed = -3, Don't have enough votes left
                  -2, Don't have enough reputation score
                  -1, Vote his own post
                   0, no allowed - Anonymous
                   1, Allowed - by default
        status  =  0, By default
                   1, Cancel
                   2, Vote is too old to be canceled

    offensive code:
        allowed = -3, Don't have enough flags left
                  -2, Don't have enough reputation score to do this
                   0, not allowed
                   1, allowed
        status  =  0, by default
                   1, can't do it again
    """
    response_data = {
        "allowed": 1,
        "success": 1,
        "status": 0,
        "count": 0,
        "message": ''
    }

    def can_vote(vote_score, user):
        if vote_score == 1:
            return can_vote_up(request.user)
        else:
            return can_vote_down(request.user)

    try:
        if not request.user.is_authenticated():
            response_data['allowed'] = 0
            response_data['success'] = 0

        elif request.is_ajax():
            question = get_object_or_404(Question, id=id)
            vote_type = request.POST.get('type')

            #accept answer
            if vote_type == '0':
                answer_id = request.POST.get('postId')
                answer = get_object_or_404(Answer, id=answer_id)
                # make sure question author is current user
                if question.author == request.user:
                    # answer user who is also question author is not allow to accept answer
                    if answer.author == question.author:
                        response_data['success'] = 0
                        response_data['allowed'] = -1
                    # check if answer has been accepted already
                    elif answer.accepted:
                        onAnswerAcceptCanceled(answer, request.user)
                        response_data['status'] = 1
                    else:
                        # set other answers in this question not accepted first
                        for answer_of_question in Answer.objects.get_answers_from_question(question, request.user):
                            if answer_of_question != answer and answer_of_question.accepted:
                                onAnswerAcceptCanceled(answer_of_question, request.user)

                        #make sure retrieve data again after above author changes, they may have related data
                        answer = get_object_or_404(Answer, id=answer_id)
                        onAnswerAccept(answer, request.user)
                else:
                    response_data['allowed'] = 0
                    response_data['success'] = 0
            # favorite
            elif vote_type == '4':
                has_favorited = False
                fav_questions = FavoriteQuestion.objects.filter(question=question)
                # if the same question has been favorited before, then delete it
                if fav_questions is not None:
                    for item in fav_questions:
                        if item.user == request.user:
                            item.delete()
                            response_data['status'] = 1
                            response_data['count']  = len(fav_questions) - 1
                            if response_data['count'] < 0:
                                response_data['count'] = 0
                            has_favorited = True
                # if above deletion has not been executed, just insert a new favorite question
                if not has_favorited:
                    new_item = FavoriteQuestion(question=question, user=request.user)
                    new_item.save()
                    response_data['count']  = FavoriteQuestion.objects.filter(question=question).count()
                Question.objects.update_favorite_count(question)

            elif vote_type in ['1', '2', '5', '6']:
                post_id = id
                post = question
                vote_score = 1
                if vote_type in ['5', '6']:
                    answer_id = request.POST.get('postId')
                    answer = get_object_or_404(Answer, id=answer_id)
                    post_id = answer_id
                    post = answer
                if vote_type in ['2', '6']:
                    vote_score = -1

                if post.author == request.user:
                    response_data['allowed'] = -1
                elif not can_vote(vote_score, request.user):
                    response_data['allowed'] = -2
                elif post.votes.filter(user=request.user).count() > 0:
                    vote = post.votes.filter(user=request.user)[0]
                    # unvote should be less than certain time
                    if (datetime.datetime.now().day - vote.voted_at.day) >= VOTE_RULES['scope_deny_unvote_days']:
                        response_data['status'] = 2
                    else:
                        voted = vote.vote
                        if voted > 0:
                            # cancel upvote
                            onUpVotedCanceled(vote, post, request.user)

                        else:
                            # cancel downvote
                            onDownVotedCanceled(vote, post, request.user)

                        response_data['status'] = 1
                        response_data['count'] = post.score
                elif Vote.objects.get_votes_count_today_from_user(request.user) >= VOTE_RULES['scope_votes_per_user_per_day']:
                    response_data['allowed'] = -3
                else:
                    vote = Vote(user=request.user, content_object=post, vote=vote_score, voted_at=datetime.datetime.now())
                    if vote_score > 0:
                        # upvote
                        onUpVoted(vote, post, request.user)
                    else:
                        # downvote
                        onDownVoted(vote, post, request.user)

                    votes_left = VOTE_RULES['scope_votes_per_user_per_day'] - Vote.objects.get_votes_count_today_from_user(request.user)
                    if votes_left <= VOTE_RULES['scope_warn_votes_left']:
                        response_data['message'] = u'%s votes left' % votes_left
                    response_data['count'] = post.score
            elif vote_type in ['7', '8']:
                post = question
                post_id = id
                if vote_type == '8':
                    post_id = request.POST.get('postId')
                    post = get_object_or_404(Answer, id=post_id)

                if FlaggedItem.objects.get_flagged_items_count_today(request.user) >= VOTE_RULES['scope_flags_per_user_per_day']:
                    response_data['allowed'] = -3
                elif not can_flag_offensive(request.user):
                    response_data['allowed'] = -2
                elif post.flagged_items.filter(user=request.user).count() > 0:
                    response_data['status'] = 1
                else:
                    item = FlaggedItem(user=request.user, content_object=post, flagged_at=datetime.datetime.now())
                    onFlaggedItem(item, post, request.user)
                    response_data['count'] = post.offensive_flag_count
                    # send signal when question or answer be marked offensive
                    mark_offensive.send(sender=post.__class__, instance=post, mark_by=request.user)
            elif vote_type in ['9', '10']:
                post = question
                post_id = id
                if vote_type == '10':
                    post_id = request.POST.get('postId')
                    post = get_object_or_404(Answer, id=post_id)

                if not can_delete_post(request.user, post):
                    response_data['allowed'] = -2
                elif post.deleted:
                    onDeleteCanceled(post, request.user)
                    response_data['status'] = 1
                else:
                    onDeleted(post, request.user)
                    delete_post_or_answer.send(sender=post.__class__, instance=post, delete_by=request.user)
            elif vote_type == '11':#subscribe q updates
                user = request.user
                if user.is_authenticated():
                    try:
                        EmailFeed.objects.get(feed_id=question.id, subscriber_id=user.id, feed_content_type=question_type)
                    except EmailFeed.DoesNotExist:
                        feed = EmailFeed(subscriber=user, content=question)
                        feed.save()
                        if settings.EMAIL_VALIDATION == 'on' and user.email_isvalid == False:
                            response_data['message'] = _('subscription saved, %(email)s needs validation') % {'email':user.email}
                    #response_data['status'] = 1
                    #responst_data['allowed'] = 1
                else:
                    pass
                    #response_data['status'] = 0
                    #response_data['allowed'] = 0
            elif vote_type == '12':#unsubscribe q updates
                user = request.user
                if user.is_authenticated():
                    try:
                        feed = EmailFeed.objects.get(feed_id=question.id, subscriber_id=user.id)
                        feed.delete()
                    except EmailFeed.DoesNotExist:
                        pass
                    
        else:
            response_data['success'] = 0
            response_data['message'] = u'Request mode is not supported. Please try again.'

        data = simplejson.dumps(response_data)

    except Exception, e:
        response_data['message'] = str(e)
        data = simplejson.dumps(response_data)
    return HttpResponse(data, mimetype="application/json")
def vote ( request , id ) : response_data = { "allowed" : 1 , "success" : 1 , "status" : 0 , "count" : 0 , "message" : '' } def can_vote ( vote_score , user ) : if vote_score == 1 : return can_vote_up ( request . user ) else : return can_vote_down ( request . user ) try : if not request . user . is_authenticated ( ) : response_data [ 'allowed' ] = 0 response_data [ 'success' ] = 0 elif request . is_ajax ( ) : question = get_object_or_404 ( Question , id = id ) vote_type = request . POST . get ( 'type' ) #accept answer if vote_type == '0' : answer_id = request . POST . get ( 'postId' ) answer = get_object_or_404 ( Answer , id = answer_id ) # make sure question author is current user if question . author == request . user : # answer user who is also question author is not allow to accept answer if answer . author == question . author : response_data [ 'success' ] = 0 response_data [ 'allowed' ] = - 1 # check if answer has been accepted already elif answer . accepted : onAnswerAcceptCanceled ( answer , request . user ) response_data [ 'status' ] = 1 else : # set other answers in this question not accepted first for answer_of_question in Answer . objects . get_answers_from_question ( question , request . user ) : if answer_of_question != answer and answer_of_question . accepted : onAnswerAcceptCanceled ( answer_of_question , request . user ) #make sure retrieve data again after above author changes, they may have related data answer = get_object_or_404 ( Answer , id = answer_id ) onAnswerAccept ( answer , request . user ) else : response_data [ 'allowed' ] = 0 response_data [ 'success' ] = 0 # favorite elif vote_type == '4' : has_favorited = False fav_questions = FavoriteQuestion . objects . filter ( question = question ) # if the same question has been favorited before, then delete it if fav_questions is not None : for item in fav_questions : if item . user == request . user : item . delete ( ) response_data [ 'status' ] = 1 response_data [ 'count' ] = len ( fav_questions ) - 1 if response_data [ 'count' ] < 0 : response_data [ 'count' ] = 0 has_favorited = True # if above deletion has not been executed, just insert a new favorite question if not has_favorited : new_item = FavoriteQuestion ( question = question , user = request . user ) new_item . save ( ) response_data [ 'count' ] = FavoriteQuestion . objects . filter ( question = question ) . count ( ) Question . objects . update_favorite_count ( question ) elif vote_type in [ '1' , '2' , '5' , '6' ] : post_id = id post = question vote_score = 1 if vote_type in [ '5' , '6' ] : answer_id = request . POST . get ( 'postId' ) answer = get_object_or_404 ( Answer , id = answer_id ) post_id = answer_id post = answer if vote_type in [ '2' , '6' ] : vote_score = - 1 if post . author == request . user : response_data [ 'allowed' ] = - 1 elif not can_vote ( vote_score , request . user ) : response_data [ 'allowed' ] = - 2 elif post . votes . filter ( user = request . user ) . count ( ) > 0 : vote = post . votes . filter ( user = request . user ) [ 0 ] # unvote should be less than certain time if ( datetime . datetime . now ( ) . day - vote . voted_at . day ) >= VOTE_RULES [ 'scope_deny_unvote_days' ] : response_data [ 'status' ] = 2 else : voted = vote . vote if voted > 0 : # cancel upvote onUpVotedCanceled ( vote , post , request . user ) else : # cancel downvote onDownVotedCanceled ( vote , post , request . user ) response_data [ 'status' ] = 1 response_data [ 'count' ] = post . score elif Vote . objects . get_votes_count_today_from_user ( request . user ) >= VOTE_RULES [ 'scope_votes_per_user_per_day' ] : response_data [ 'allowed' ] = - 3 else : vote = Vote ( user = request . user , content_object = post , vote = vote_score , voted_at = datetime . datetime . now ( ) ) if vote_score > 0 : # upvote onUpVoted ( vote , post , request . user ) else : # downvote onDownVoted ( vote , post , request . user ) votes_left = VOTE_RULES [ 'scope_votes_per_user_per_day' ] - Vote . objects . get_votes_count_today_from_user ( request . user ) if votes_left <= VOTE_RULES [ 'scope_warn_votes_left' ] : response_data [ 'message' ] = u'%s votes left' % votes_left response_data [ 'count' ] = post . score elif vote_type in [ '7' , '8' ] : post = question post_id = id if vote_type == '8' : post_id = request . POST . get ( 'postId' ) post = get_object_or_404 ( Answer , id = post_id ) if FlaggedItem . objects . get_flagged_items_count_today ( request . user ) >= VOTE_RULES [ 'scope_flags_per_user_per_day' ] : response_data [ 'allowed' ] = - 3 elif not can_flag_offensive ( request . user ) : response_data [ 'allowed' ] = - 2 elif post . flagged_items . filter ( user = request . user ) . count ( ) > 0 : response_data [ 'status' ] = 1 else : item = FlaggedItem ( user = request . user , content_object = post , flagged_at = datetime . datetime . now ( ) ) onFlaggedItem ( item , post , request . user ) response_data [ 'count' ] = post . offensive_flag_count # send signal when question or answer be marked offensive mark_offensive . send ( sender = post . __class__ , instance = post , mark_by = request . user ) elif vote_type in [ '9' , '10' ] : post = question post_id = id if vote_type == '10' : post_id = request . POST . get ( 'postId' ) post = get_object_or_404 ( Answer , id = post_id ) if not can_delete_post ( request . user , post ) : response_data [ 'allowed' ] = - 2 elif post . deleted : onDeleteCanceled ( post , request . user ) response_data [ 'status' ] = 1 else : onDeleted ( post , request . user ) delete_post_or_answer . send ( sender = post . __class__ , instance = post , delete_by = request . user ) elif vote_type == '11' : #subscribe q updates user = request . user if user . is_authenticated ( ) : try : EmailFeed . objects . get ( feed_id = question . id , subscriber_id = user . id , feed_content_type = question_type ) except EmailFeed . DoesNotExist : feed = EmailFeed ( subscriber = user , content = question ) feed . save ( ) if settings . EMAIL_VALIDATION == 'on' and user . email_isvalid == False : response_data [ 'message' ] = _ ( 'subscription saved, %(email)s needs validation' ) % { 'email' : user . email } #response_data['status'] = 1 #responst_data['allowed'] = 1 else : pass #response_data['status'] = 0 #response_data['allowed'] = 0 elif vote_type == '12' : #unsubscribe q updates user = request . user if user . is_authenticated ( ) : try : feed = EmailFeed . objects . get ( feed_id = question . id , subscriber_id = user . id ) feed . delete ( ) except EmailFeed . DoesNotExist : pass else : response_data [ 'success' ] = 0 response_data [ 'message' ] = u'Request mode is not supported. Please try again.' data = simplejson . dumps ( response_data ) except Exception , e : response_data [ 'message' ] = str ( e ) data = simplejson . dumps ( response_data ) return HttpResponse ( data , mimetype = "application/json" )