From 971848cb1b44aa0911a062bff374ed6f8028bbce Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Thu, 1 Dec 2016 01:29:28 -0200 Subject: [PATCH] database lookups --- kfet/views.py | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index f95fb2c6..e8080774 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -18,7 +18,7 @@ from django.contrib.auth.models import User, Permission, Group from django.http import HttpResponse, JsonResponse, Http404 from django.forms import modelformset_factory, formset_factory from django.db import IntegrityError, transaction -from django.db.models import F, Sum, Prefetch, Count, Func +from django.db.models import Q, F, Sum, Prefetch, Count, Func from django.db.models.functions import Coalesce from django.utils import timezone from django.utils.crypto import get_random_string @@ -26,7 +26,7 @@ from gestioncof.models import CofProfile, Clipper from kfet.decorators import teamkfet_required from kfet.models import (Account, Checkout, Article, Settings, AccountNegative, CheckoutStatement, GenericTeamToken, Supplier, SupplierArticle, Inventory, - InventoryArticle, Order, OrderArticle) + InventoryArticle, Order, OrderArticle, TransferGroup, Transfer) from kfet.forms import * from collections import defaultdict from kfet import consumers @@ -1268,35 +1268,63 @@ def history_json(request): # Récupération des paramètres from_date = request.POST.get('from', None) to_date = request.POST.get('to', None) - limit = request.POST.get('limit', None); checkouts = request.POST.getlist('checkouts[]', None) accounts = request.POST.getlist('accounts[]', None) # Construction de la requête (sur les opérations) pour le prefetch - queryset_prefetch = Operation.objects.select_related( + ope_queryset_prefetch = Operation.objects.select_related( 'canceled_by__trigramme', 'addcost_for__trigramme', 'article__name') + ope_prefetch = Prefetch('opes', + queryset = ope_queryset_prefetch) + + transfer_queryset_prefetch = Transfer.objects.select_related( + 'from_acc__trigramme', 'to_acc__trigramme', + 'canceled_by__trigramme') + + if accounts: + transfer_queryset_prefetch = transfer_queryset_prefetch.filter( + Q(from_acc__trigramme__in=accounts) | + Q(to_acc__trigramme__in=accounts)) + + if not request.user.has_perm('kfet.is_team'): + acc = request.user.profile.account_kfet + transfer_queryset_prefetch = transfer_queryset_prefetch.filter( + Q(from_acc=acc) | Q(to_acc=acc)) + + transfer_prefetch = Prefetch('transfers', + queryset=transfer_queryset_prefetch, + to_attr='filtered_transfers') + # Construction de la requête principale opegroups = (OperationGroup.objects - .prefetch_related(Prefetch('opes', queryset = queryset_prefetch)) + .prefetch_related(ope_prefetch) .select_related('on_acc__trigramme', 'valid_by__trigramme') .order_by('at') ) + + transfergroups = ( + TransferGroup.objects + .prefetch_related(transfer_prefetch) + .select_related('valid_by__trigramme') + .order_by('at')) + # Application des filtres if from_date: opegroups = opegroups.filter(at__gte=from_date) + transfergroups = transfergroups.filter(at__gte=from_date) if to_date: opegroups = opegroups.filter(at__lt=to_date) + transfergroups = transfergroups.filter(at__lt=to_date) if checkouts: opegroups = opegroups.filter(checkout_id__in=checkouts) + transfergroups = TransferGroup.objects.none() if accounts: opegroups = opegroups.filter(on_acc_id__in=accounts) # Un non-membre de l'équipe n'a que accès à son historique if not request.user.has_perm('kfet.is_team'): opegroups = opegroups.filter(on_acc=request.user.profile.account_kfet) - if limit: - opegroups = opegroups[:limit] # Construction de la réponse