Source code for postproc.views
from rest_framework.views import APIView
from rest_framework.response import Response
[docs]class PostProcView(APIView):
"""
API view for post-processing voting results.
This view provides three types of post-processing:
1. Identity: Keep the votes as is.
2. Text: Post-processing for text-based voting.
3. Weight: Post-processing considering weights for votes.
:ivar int VOTES_WEIGHT: The default weight for votes.
:cvar VOTES_WEIGHT: int
:method identity: Post-process voting results with identity transformation.
:method text: Post-process text-based voting results.
:method weight: Post-process voting results considering weights.
:method post: Handle POST requests for post-processing voting results.
"""
[docs] def identity(self, options):
"""
Post-process voting results with identity transformation.
:param options: List of voting options.
:type options: list
:return: Response containing the post-processed results.
:rtype: Response
"""
out = []
for opt in options:
out.append({
**opt,
'postproc': opt['votes'],
})
out.sort(key=lambda x: -x['postproc'])
return Response(out)
[docs] def text(self, text_votes):
"""
Post-process text-based voting results.
:param text_votes: List of text-based voting results.
:type text_votes: list
:return: Response containing the post-processed results.
:rtype: Response
"""
out = []
for vote in text_votes:
out.append({
**vote,
'postproc': vote['vote'],
})
return Response(out)
[docs] def weight(self, options):
"""
Post-process voting results considering weights.
:param options: List of voting options with weights.
:type options: list
:return: Response containing the post-processed results.
:rtype: Response
"""
out = []
for opt in options:
out.append({
**opt,
'postproc': opt['votes_wights'],
})
out.sort(key=lambda x: -x['postproc'])
return Response(out)
[docs] def post(self, request):
"""
Handle POST requests for post-processing voting results.
The expected request data includes:
- 'type': IDENTITY | TEXT | WEIGHT
- 'options': List of voting options.
- 'text_votes': List of text-based voting results.
:param request: The incoming HTTP request containing post-processing data.
:type request: Request
:return: Response containing the post-processed results.
:rtype: Response
"""
t = request.data.get('type', 'IDENTITY')
opts = request.data.get('options', [])
text_votes = request.data.get('text_votes', [])
if t == 'IDENTITY':
return self.identity(opts)
if t == 'TEXT':
return self.text(text_votes)
if t == 'WEIGHT':
return self.weight(opts)
return Response({})