def _update_vote_count(request, votecount, direction):
    '''
    Evaluates a request's Vote and corresponding VoteCount object and,
    after a bit of clever logic, either ignores the request or registers
    a new Vote.

    This is NOT a view!  But should be used within a view ...

    Returns True if the request was considered a Vote; returns False if not.
    '''
    user = request.user
    ip_address = get_ip(request)

    net_change = 0

    # TODO: Rate-limit users based on IP to avoid spamming
    #votes_per_ip_limit = getattr(settings, 'VOTECOUNT_VOTES_PER_IP_LIMIT', 0)
    # check limit on votes from a unique ip address (VOTECOUNT_VOTES_PER_IP_LIMIT)
    #if votes_per_ip_limit:
    #    if qs.filter(ip_address__exact=ip_address).count() > votes_per_ip_limit:
    #        return net_change, False

    # Check if the user already voted
    try:
        prev_vote = Vote.objects.get(user=user, votecount=votecount)

        # SLOW: Instead of deleting the old and creating a new vote, we really
        # should just alter the old vote's direction and then change the
        # VoteCounts total accordingly. The VoteCount change should be done
        # in the overridden save() method

        # Since the user already voted, remove it. Then check if the new vote
        # is in a different direction, and if so, create that one
        prev_direction = prev_vote.direction
        prev_vote.delete()
        net_change -= prev_direction

        if prev_direction != direction:
            # TODO: Is there a better way to refresh this? Like in save()/delete() methods?
            # Reload VoteCount from DB since the previous delete() just changed its up/downvote totals
            votecount = VoteCount.objects.get(id=votecount.id)

            vote = Vote(votecount=votecount,
                        direction=direction,
                        ip_address=get_ip(request))
            vote.user = user
            vote.save()
            net_change += direction
    except Vote.DoesNotExist:
        vote = Vote(votecount=votecount,
                    direction=direction,
                    ip_address=get_ip(request))
        vote.user = user
        vote.save()
        net_change += direction

    return net_change, True
Exemple #2
0
def _insert_or_update_vote(cart, category, team):
    try:
        vote = Vote.objects.get(cart=cart, category=category)
        if team is None:
            vote.delete()
        else:
            vote.team = team
            vote.save()
    except:
        if team is not None:
            vote = Vote(cart=cart, category=category, team=team)
            vote.save()
Exemple #3
0
    def get_similar_items_from_model(self,
                                     item,
                                     user_list,
                                     model,
                                     min_value=MIN_SIMILARITY_VALUE):
        user_item_matrix = self.create_matrix_from_model(user_list, model)
        item_user_matrix = self.rotate_matrix(user_item_matrix)
        #	assert False, (user_item_matrix, item_user_matrix)
        sim_list = []
        item_list = model.objects.all()
        for other in item_list:
            if item == other: continue
            #	    assert False, item_user_matrix[item.id]
            #            sim=utils.distance_matrix_p1_p2(item_user_matrix[item.id],item_user_matrix[other.id]) #returns a 0..1 value
            sim = utils.distance_matrix_p1_p2(
                item_user_matrix.get(item.id, {1: Vote()}),
                item_user_matrix.get(other.id, {1: Vote()}))
            """
            sim=utils.distance_matrix_p1_p2(item_user_matrix.get(item.id,
			{1:Vote(	object=item,
				object_id=item.id,
				user=user_list[0],
				vote=0,
				content_type=ContentType.objects.get_for_model(item)
			)}),
		item_user_matrix.get(other.id, 
			{1:Vote(	object=item,
				object_id=item.id,
				user=user_list[0],
				vote=0,
				content_type=ContentType.objects.get_for_model(item)
			)}
		)) #returns a 0..1 value
	    """
            if sim > min_value:
                sim_list.append((sim, other))

        assert False, sim_list
        sim_list.sort(reverse=True)
        return sim_list
Exemple #4
0
    def test_vote_model(self):
        vote = Vote()
        vote.object_id = self.article._get_pk_val()
        vote.content_type = ContentType.objects.get_for_model(self.article)
        #vote.content_object = ContentType.objects.get_for_model(self.article)

        vote.voter = self.user1
        vote.vote = UPVOTE

        vote.save()

        vote_obj = Vote.objects.all()[0]
        self.assertEqual(vote_obj._get_pk_val(), vote._get_pk_val(),
                         "Primary Keys do not match")
        self.assertEqual(vote.vote, vote_obj.vote, "Vote value does not match")
Exemple #5
0
 def create(self, validated_data):
     print 'In create'        
     vote = Vote()
     vote.voter = validated_data.get('voter')
     vote.vote = validated_data.get('vote')
     vote.content_type = validated_data.get('content_type')
     vote.object_id = validated_data.get('object_id')
     
     #Get row from contentType which has content_type
     content_object = ContentType.objects.get_for_id(vote.content_type.id)
     
     vote.content_object = content_object.model_class().objects.get(id=vote.object_id)
                     
     """
     Record a user's vote on a given object. Only allows a given user
     to vote once, though that vote may be changed.
     
     A zero vote indicates that any existing vote should be removed.
     """
     if vote.vote not in (+1, 0, -1):
         raise ValueError('Invalid vote (must be +1/0/-1)')
     
     # First, try to fetch the instance of this row from DB
     # If that does not exist, then it is the first time we're creating it
     # If it does, then just update the previous one
     try:
         vote_obj = Vote.objects.get(voter=vote.voter, content_type=vote.content_type, object_id=vote.object_id)
         if vote == 0 and not ZERO_VOTES_ALLOWED:
             vote_obj.delete()
         else:
             vote_obj.vote = vote
             vote_obj.save()
             
     except ObjectDoesNotExist:
         #This is the first time we're creating it
         try:
             if not ZERO_VOTES_ALLOWED and vote == 0:
                 # This shouldn't be happening actually
                 return
             vote_obj = Vote.objects.create(voter=vote.voter, content_type=vote.content_type, object_id=vote.object_id, vote=vote.vote)                        
         except:
             print '{file}: something went wrong in creating a vote object at {line}'.format(file=str('__FILE__'), line=str('__LINE__'))
             raise ObjectDoesNotExist    
     
     return vote_obj
Exemple #6
0
def index(request):
	context={}
	if request.method=='POST':
		form = voteForm(request.POST)
		if form.is_valid():
			candidates=Candidate.objects.filter(region=Voter.objects.get(id=request.session['id']).region).values_list('id')
			for candidate in candidates:
				if(candidate[0]==form.cleaned_data['candidate']):
					voted=Vote(voter=request.session['id'],candidate=form.cleaned_data['candidate'])
					candidate=Candidate.objects.get(id=form.cleaned_data['candidate'])
					candidate.votes=int(candidate.votes)+1
					candidate.save()
					voted.save()
					return HttpResponse('Success')
			context['error']="Enter valid id"
			return render(request,'voting/index.html',context)
	voterid=example_search.pro()
	context['showform']=1
	if voterid <0:
            voterid=100
            context['showform']=0
	context['voter']=Voter.objects.get(finger=voterid)
	
	print('*************************************')
	if ((datetime.now(timezone.utc)-context['voter'].dob).total_seconds()/(365*86400)<18):
            context['error']="Underage bitch"
            context['showform']=0
	print(context['voter'].finger)
	check=Vote.objects.filter(voter=context['voter'].id)
	print(len(check))
	if(len(check)>0):
           context['error']="Already Voted"
           context['showform']=0
	request.session['id']=context['voter'].id
	candidates=Candidate.objects.filter(region=context['voter'].region).values_list('id','name')
	context['candidates']=candidates
	form = voteForm()
	context['form']=form
	return render(request,'voting/index.html',context)
Exemple #7
0
def poll_detail(request, pk):
    """Jedno konkrétní hlasování"""
    ## Tahle funkce je složitější, protože zpracovává nejen dotazy na
    ## aktuální stav (GET), ale i požadavky na změnu stavu (POST) – u nás
    ## přidání nového záznamu.

    ## Nejdřív z databáze načteme hlasování zadané v adrese.
    ## Pokud neexistuje, vrátíme chybu 404 (stránka neexistuje).
    poll = get_object_or_404(Poll, pk=pk)
    ## Nastavíme proměnnou, do které dáme popis chyby, kdyby něco šlo špatně.
    error = ''
    ## A teď: Pokud chtěl uživatel změnit stav (POST), musíme mu zkusit
    ## vyhovět.
    if request.method == 'POST':
        ## S požadavkem POST by měly přijít informace z formuláře, které nám
        ## Django zpřístupní ve slovníku "request.POST".
        ## Očekáváme něco jako:
        ## {'title': 'Janča', 'opt-1': True, 'opt-3': True}
        ## t.j. 'title' obsahuje jméno, a 'opt-X', pokud ve slovníku je,
        ## znamená že uživatel hlasuje pro danou možnost.
        ## Vezměme si ze slovníku ono jméno.
        title = request.POST.get('title')
        ## Pak si naplníme seznam hlasů.
        option_values = []
        ## Pro každou možnost v tomto hlasování ...
        for option in poll.options.all():
            ## ... zjistíme, jestli je v POST datech příslušný záznam,
            if 'opt-{}'.format(option.pk) in request.POST:
                value = True
            else:
                value = False
            ## A seznam plníme dvojicemi (N-ticemi): (možnost, hodnota).
            ## ("append" bere jen jeden argument: append(a, b) by nefungovalo,
            ## závorky navíc znamenají, že metodě posíláme jednu dvojici.)
            option_values.append((option, value))

        ## Jméno musí být vyplněno ...
        if title:
            ## ... a jestli je, zapíšeme do databáze.
            ## ("with transaction.atomic" říká, že pokud se některý z příkazů
            ## v tomhle bloku nepovede, databáze zůstane netknutá.
            ## Je dobré to aspoň pro zápisy do databáze pooužívat.)
            with transaction.atomic():
                ## Vytvoříme nový záznam, a vložíme do databáze
                record = Record(poll=poll, title=title)
                record.save()
                ## A pro všechny dvojice (možnost, hodnota), které
                ## jsme si před chvílí připravili, vytvoříme a uložíme
                ## odpovídající hlas.
                for option, value in option_values:
                    vote = Vote(option=option, record=record, value=value)
                    vote.save()
            ## A potom řekneme prohlížeči, aby stránku načetl znova,
            ## tentokrát metodou GET.
            ## (To je proto, že kdyby uživatel stránku načtenou pomocí POST
            ## obnovil (F5), formulář by se odeslal znovu.)
            return redirect('poll_detail', pk=pk)
        else:
            ## Nebyla-li data správná, nastavíme chybovou hlášku.
            error = 'Musíš zadat jméno.'

            ## Formulář teď uživateli ukážeme znova, s chybovou hláškou,
            ## ale o údaje které vyplnil nepřijde – máme je v "option_values"
            ## a použijeme je při vytvéření stránky.
    else:
        ## Poslal-li uživatel požadavek GET, nastavíme si "option_values"
        ## na dvojice jako výše, jen budou všechny hlasy zatím prázdné.
        option_values = []
        for option in poll.options.all():
            option_values.append((option, False))

    ## Teď můžeme tvořit výslednou stránku. Napřed si pěkně připravíme
    ## informace pro šablonu...
    data = {
        'poll': poll,       ## Objekt "Hlasování" se všemi informacemi
        'error': error,     ## Případná chybová hláška

        ## Dvojice (možnost, hodnota) pro hlasovací formulář
        'option_values': option_values,
    }
    ## Informace předáme do šablony, a necháme Django vytvořit stránku.
    return render(request, 'voting/poll_detail.html', data)