mangroveorg/datawinners

View on GitHub
datawinners/dataextraction/views.py

Summary

Maintainability
A
1 hr
Test Coverage
import json
from django.http import HttpResponse
from django_digest.decorators import httpdigest
from mangrove.datastore.user_permission import has_permission
from mangrove.errors.MangroveException import FormModelDoesNotExistsException
from mangrove.form_model.form_model import get_form_model_by_code
from datawinners.dataextraction.helper import encapsulate_data_for_form, convert_to_json_file_download_response
from datawinners.dataextraction.helper import generate_filename, check_date_format
from datawinners.main.database import get_database_manager
from datawinners.submission.models import DatawinnerLog
from datawinners.utils import get_organization
from django.db.models import Q
import operator
from datetime import datetime
from django.utils.translation import gettext as _


@httpdigest
def get_for_form(request, form_code, start_date=None, end_date=None):
    if request.method == 'GET':
        user = request.user
        dbm = get_database_manager(user)
        try:
            questionnaire_id = get_form_model_by_code(dbm, form_code).id
        except FormModelDoesNotExistsException:
            return HttpResponse(content=json.dumps(dict(submissions=[],
                                                        success=False,
                                                        message=_(
                                                            "Questionnaire code [%s] does not existed.") % form_code
                                                        )))

        if user.is_ngo_admin() or user.is_extended_user() or \
                (user.is_project_manager() and has_permission(dbm, user.id, questionnaire_id)):
            data_for_form = encapsulate_data_for_form(dbm, form_code, start_date, end_date)
            return convert_to_json_file_download_response(data_for_form,
                                                          generate_filename(form_code, start_date, end_date))

        return HttpResponse(content="Error: You don't have access to this information", status=403)
    return HttpResponse("Error. Only support GET method.")


@httpdigest
def get_failed_submissions(request):
    organization = get_organization(request)
    start_date = request.GET.get('start_date') if check_date_format(request.GET.get('start_date')) else None
    end_date = request.GET.get('end_date') if check_date_format(request.GET.get('end_date')) else None
    to_number = request.GET.get('to_number')

    criteria = [Q(organization=organization)]

    if start_date is not None:
        criteria.append(Q(created_at__gte=datetime.strptime(start_date, '%d-%m-%Y')))

    if end_date is not None:
        criteria.append(Q(created_at__lte=datetime.strptime(end_date + " 23:59:59", '%d-%m-%Y %H:%M:%S')))

    if to_number is not None:
        criteria.append(Q(to_number=to_number))

    failed_submissions = list(DatawinnerLog.objects.filter(reduce(operator.and_, criteria))
                              .extra(select={'submission_date': 'created_at'})
                              .values('from_number', 'to_number', 'message', 'error', 'submission_date')
                              .order_by('created_at')
                              )
    if len(failed_submissions):
        failed_submissions_dict = {"message": "You can access the data in submissions field.",
                                   "submissions": failed_submissions, "success": True}
    else:
        failed_submissions_dict = {"message": "No failed submissions available", "submissions": [], "success": False}

    return convert_to_json_file_download_response(failed_submissions_dict, "failed_submissions")