2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-16 20:15:44 +00:00

Add "target_date" for Build model

- Add "overdue" status to Build serializer
This commit is contained in:
Oliver Walters
2020-12-15 23:24:37 +11:00
parent a7d825158c
commit 802dd5174c
6 changed files with 108 additions and 28 deletions

View File

@ -5,12 +5,21 @@ JSON serializers for Build API
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime
from django.db.models import Q
from django.db.models import Case, When, Value
from django.db.models import BooleanField
from rest_framework import serializers
from InvenTree.serializers import InvenTreeModelSerializer
from InvenTree.status_codes import BuildStatus
from stock.serializers import StockItemSerializerBrief
from part.serializers import PartBriefSerializer
from .models import Build, BuildItem
from part.serializers import PartBriefSerializer
class BuildSerializer(InvenTreeModelSerializer):
@ -23,6 +32,38 @@ class BuildSerializer(InvenTreeModelSerializer):
quantity = serializers.FloatField()
overdue = serializers.BooleanField()
@staticmethod
def annotate_queryset(queryset):
"""
Add custom annotations to the BuildSerializer queryset,
performing database queries as efficiently as possible.
The following annoted fields are added:
- overdue: True if the build is outstanding *and* the completion date has past
"""
# Annotate a boolean 'overdue' flag
# Construct a filter for finding overdue builds
today = datetime.datetime.now().date()
overdue = Q(status__in=BuildStatus.ACTIVE_CODES) & ~Q(target_date=None) & Q(target_date__lte=today)
queryset = queryset.annotate(
overdue=Case(
When(
overdue, then=Value(True, output_field=BooleanField()),
),
default=Value(False, output_field=BooleanField())
)
)
return queryset
def __init__(self, *args, **kwargs):
part_detail = kwargs.pop('part_detail', False)
@ -42,11 +83,13 @@ class BuildSerializer(InvenTreeModelSerializer):
'completion_date',
'part',
'part_detail',
'overdue',
'reference',
'sales_order',
'quantity',
'status',
'status_text',
'target_date',
'notes',
'link',
]