Source code for store.utils
from django.utils import timezone
from django.utils.dateparse import parse_datetime
from rest_framework import status
from rest_framework.response import Response
from .models import Vote
from base import mods
[docs]def classic_store(request):
"""
Processes and stores a classic type vote.
Args:
request: Django HttpRequest object containing vote data.
The request should contain:
- voting (int): The ID of the voting.
- voter (int): The ID of the voter.
- vote (dict): A dictionary containing the 'a' and 'b' keys representing the encrypted vote.
- voting_type (str): A string representing the type of voting ('yesno', 'classic', 'comment', 'preference').
Returns:
HTTP status code indicating the result of the operation.
Raises:
HTTP_401_UNAUTHORIZED: If the voting is not found, or has not started, or is closed.
HTTP_400_BAD_REQUEST: If the voting ID, voter ID, or vote data is missing or invalid.
"""
vid = request.data.get('voting')
voting = mods.get('voting', params={'id': vid})
if not voting or not isinstance(voting, list):
return status.HTTP_401_UNAUTHORIZED
start_date = voting[0].get('start_date', None)
end_date = voting[0].get('end_date', None)
not_started = not start_date or timezone.now() < parse_datetime(start_date)
is_closed = end_date and parse_datetime(end_date) < timezone.now()
if not_started or is_closed:
return status.HTTP_401_UNAUTHORIZED
uid = request.data.get('voter')
vote = request.data.get('vote')
if not vid or not uid or not vote:
return status.HTTP_400_BAD_REQUEST
# validating voter
if request.auth:
token = request.auth.key
else:
token = "NO-AUTH-VOTE"
voter = mods.post(
'authentication',
entry_point='/getuser/',
json={
'token': token})
voter_id = voter.get('id', None)
if not voter_id or voter_id != uid:
return status.HTTP_401_UNAUTHORIZED
# the user is in the census
perms = mods.get(
'census/{}'.format(vid),
params={
'voter_id': uid},
response=True)
if perms.status_code == 401:
return status.HTTP_401_UNAUTHORIZED
a = vote.get("a")
b = vote.get("b")
defs = {"a": a, "b": b}
v, _ = Vote.objects.get_or_create(voting_id=vid, voter_id=uid,
defaults=defs)
v.a = a
v.b = b
v.save()
return status.HTTP_200_OK
[docs]def choices_store(request):
"""
Processes and stores votes for a voting of type 'choices'.
Args:
request: Django HttpRequest object containing votes data.
The request should contain:
- voting (int): The ID of the voting.
- voter (int): The ID of the voter.
- votes (list): A list of dictionaries, each containing the 'a' and 'b' keys representing individual encrypted votes.
- voting_type (str): A string representing the type of voting ('choices').
Returns:
HTTP status code indicating the result of the operation.
Raises:
HTTP_401_UNAUTHORIZED: If the voting is not found, or has not started, or is closed.
HTTP_400_BAD_REQUEST: If the voting ID, voter ID, or votes data is missing or invalid.
"""
vid = request.data.get('voting')
voting = mods.get('voting', params={'id': vid})
if not voting or not isinstance(voting, list):
return status.HTTP_401_UNAUTHORIZED
start_date = voting[0].get('start_date', None)
end_date = voting[0].get('end_date', None)
not_started = not start_date or timezone.now() < parse_datetime(start_date)
is_closed = end_date and parse_datetime(end_date) < timezone.now()
if not_started or is_closed:
return status.HTTP_401_UNAUTHORIZED
uid = request.data.get('voter')
votes = request.data.get('votes')
if not vid or not uid or not votes:
return status.HTTP_400_BAD_REQUEST
# validating voter
if request.auth:
token = request.auth.key
else:
token = "NO-AUTH-VOTE"
voter = mods.post(
'authentication',
entry_point='/getuser/',
json={
'token': token})
voter_id = voter.get('id', None)
if not voter_id or voter_id != uid:
return status.HTTP_401_UNAUTHORIZED
# the user is in the census
perms = mods.get(
'census/{}'.format(vid),
params={
'voter_id': uid},
response=True)
if perms.status_code == 401:
return status.HTTP_401_UNAUTHORIZED
vote = Vote.objects.filter(voter_id=uid, voting_id=vid).first()
if vote is not None:
Vote.objects.filter(voter_id=uid, voting_id=vid).delete()
for v in votes:
a = v.get("a")
b = v.get("b")
defs = {"a": a, "b": b}
voteDB, _ = Vote.objects.get_or_create(
voting_id=vid, voter_id=uid, a=a, b=b, defaults=defs)
voteDB.a = a
voteDB.b = b
voteDB.save()
return status.HTTP_200_OK