Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
voucher.py 5.07 KiB
import logging

from django.http import JsonResponse

from web.api_views.serialization_utils import get_filters_for_data_table_request, add_column, \
    serialize_date
from web.models import Voucher

logger = logging.getLogger(__name__)


def get_vouchers_order(vouchers_to_be_ordered, order_column, order_direction):
    result = vouchers_to_be_ordered
    if order_direction == "asc":
        order_direction = ""
    else:
        order_direction = "-"
    if order_column == "first_name":
        result = vouchers_to_be_ordered.order_by(order_direction + 'study_subject__subject__first_name')
    elif order_column == "last_name":
        result = vouchers_to_be_ordered.order_by(order_direction + 'study_subject__subject__last_name')
    elif order_column == "number":
        result = vouchers_to_be_ordered.order_by(order_direction + 'number')
    elif order_column == "expiry_date":
        result = vouchers_to_be_ordered.order_by(order_direction + 'expiry_date')
    elif order_column == "issue_date":
        result = vouchers_to_be_ordered.order_by(order_direction + 'issue_date')
    elif order_column == "id":
        result = vouchers_to_be_ordered.order_by(order_direction + 'id')
    elif order_column == "type":
        result = vouchers_to_be_ordered.order_by(order_direction + 'voucher_type__code')
    elif order_column == "status":
        result = vouchers_to_be_ordered.order_by(order_direction + 'status')
    else:
        logger.warn("Unknown sort column: " + str(order_column))
    return result


def get_vouchers_filtered(vouchers_to_be_filtered, filters):
    result = vouchers_to_be_filtered
    for row in filters:
        column = row[0]
        value = row[1]
        if column == "first_name":
            result = result.filter(study_subject__subject__first_name__icontains=value)
        elif column == "last_name":
            result = result.filter(study_subject__subject__last_name__icontains=value)
        elif column == "number":
            result = result.filter(number__icontains=value)
        elif column == "type":
            result = result.filter(voucher_type=value)
        elif column == "status":
            result = result.filter(status=value)
        elif column == "voucher_partner":
            result = result.filter(usage_partner=value)
        elif column == "feedback":
            result = result.filter(feedback__icontains=value)
        elif column == "":
            pass
        else:
            message = "UNKNOWN filter: "
            if column is None:
                message += "[None]"
            else:
                message += str(column)
            logger.warn(message)
    return result


# noinspection PyUnusedLocal
def get_voucher_columns(request):
    result = []
    add_column(result, "First name", "first_name", None, "string_filter")
    add_column(result, "Last name", "last_name", None, "string_filter")
    add_column(result, "Number", "number", None, "string_filter")
    add_column(result, "Type", "type", None, "voucher_type_filter")
    add_column(result, "Status", "status", None, "voucher_status_filter")
    add_column(result, "Voucher partner", "voucher_partner", None, "voucher_partner_filter")
    add_column(result, "Issue date", "issue_date", None, None)
    add_column(result, "Expiry date", "expiry_date", None, None)
    add_column(result, "Edit", "edit", None, None, sortable=False)

    return JsonResponse({"columns": result})


def get_vouchers(request):
    # id of the query from dataTable: https://datatables.net/manual/server-side
    draw = int(request.GET.get("draw", "-1"))

    start = int(request.GET.get("start", "0"))
    length = int(request.GET.get("length", "10"))
    order = int(request.GET.get("order[0][column]", "0"))
    order_dir = request.GET.get("order[0][dir]", "asc")
    order_column = request.GET.get("columns[" + str(order) + "][data]", "last_name")

    filters = get_filters_for_data_table_request(request)

    all_vouchers = Voucher.objects.all()

    count = all_vouchers.count()

    ordered_vouchers = get_vouchers_order(all_vouchers, order_column, order_dir)
    filtered_vouchers = get_vouchers_filtered(ordered_vouchers, filters)
    sliced_vouchers = filtered_vouchers[start:(start + length)]

    result_vouchers = sliced_vouchers

    count_filtered = filtered_vouchers.count()

    data = []
    for voucher in result_vouchers:
        data.append(serialize_voucher(voucher))

    return JsonResponse({
        "draw": draw,
        "recordsTotal": count,
        "recordsFiltered": count_filtered,
        "data": data,
    })


def serialize_voucher(voucher):
    issue_date = serialize_date(voucher.issue_date)
    expiry_date = serialize_date(voucher.expiry_date)
    result = {
        "first_name": voucher.study_subject.subject.first_name,
        "last_name": voucher.study_subject.subject.last_name,
        "issue_date": issue_date,
        "type": voucher.voucher_type.code,
        "status": str(voucher.status),
        "voucher_partner": str(voucher.usage_partner),
        "feedback": voucher.feedback,
        "expiry_date": expiry_date,
        "number": voucher.number,
        "id": voucher.id,
    }
    return result