parameters: (request, id)
return_statement: return HttpResponse(data, mimetype="application/json")
docstring: 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
docstring_summary: vote_type:
          acceptAnswer : 0,
          questionUpVote : 1,
          questionDownVote : 2,
          favorite : 4,
          answerUpVote: 5,
          answerDownVote:6,
          offensiveQuestion : 7,
          offensiveAnswer:8,
          removeQuestion: 9,
          removeAnswer:10
          questionSubscribeUpdates:11
docstring_tokens: vote_type : acceptAnswer : 0 questionUpVote : 1 questionDownVote : 2 favorite : 4 answerUpVote : 5 answerDownVote : 6 offensiveQuestion : 7 offensiveAnswer : 8 removeQuestion : 9 removeAnswer : 10 questionSubscribeUpdates : 11
function: 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")
function_tokens: 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" )