Skip to content

Instantly share code, notes, and snippets.

@Ingco
Last active March 25, 2020 11:09
Show Gist options
  • Save Ingco/bf52d615df94eab671b6236a1c993fda to your computer and use it in GitHub Desktop.
Save Ingco/bf52d615df94eab671b6236a1c993fda to your computer and use it in GitHub Desktop.
when__critical_status = When(
Q(orderstep_order__deadline__isnull=False)
& Q(orderstep_order__deadline__gte=timezone.now())
& Q(orderstep_order__deadline__lte=timezone.now() + timedelta(hours=4)),
then=Val("critical")
)
when__need_attention_status = When(
Q(orderstep_order__deadline__isnull=False)
& Q(orderstep_order__deadline__gte=timezone.now() + timedelta(hours=4))
& Q(orderstep_order__deadline__lte=timezone.now() + timedelta(hours=48)),
then=Val("need_attention"),
)
when__done_status = When(order_final=True, then=Val("done"))
queryset = (
queryset
.prefetch_related(
Prefetch(
"orderstep_order",
queryset=(
OrderStep.objects_clear.annotate(
step_status=Subquery(
StepStatusChangelog.objects.select_related("status")
.order_by("-created_at")
.filter(step_id=OuterRef("pk"))
.values("status__is_final")[:1]
)
)
),
to_attr="steps_with_status"
)
)
.annotate(
# order_status=Subquery(
# StepStatusChangelog.objects.select_related("status")
# .order_by("-created_at")
# .filter(step__order_id=OuterRef("pk"))
# .values("status__is_final")[:1]
# ),
order_final=Case(
When(steps_with_status__step_status=False, then=False),
default=True,
output_field=BooleanField()
),
)
.annotate(
status=Case(
when__done_status,
when__critical_status,
when__need_attention_status,
default=Val("in_future"),
output_field=CharField(),
)
)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment