@swagger_auto_schema(responses=response_dict(OutputSerializer()))
def get(self, request, report_id):
# 1) Ensure report exists
report = get_object_or_404(CliReport, id=report_id)
# 2) Prefetch user approval ranges onto request.user as `approval_ranges`
prefetch_related_objects(
[request.user],
Prefetch(
"cli_approval_ranges",
queryset=CliApprovalMatrix.objects.order_by("count_range_min", "count_range_max"),
to_attr="approval_ranges",
),
)
ranges = getattr(request.user, "approval_ranges", []) or []
customer_count = report.customers_count
authorized = False
if customer_count is not None and ranges:
for ar in ranges:
if ar.count_range_min <= customer_count and customer_count <= ar.count_range_max:
authorized = True
break
can_approve = bool(authorized)
can_publish = bool(authorized)
data = self.OutputSerializer(
{"can_publish": can_publish, "can_approve": can_approve}
).data
return Response(data, status=status.HTTP_200_OK)
QHN3YWdnZXJfYXV0b19zY2hlbWEocmVzcG9uc2VzPXJlc3BvbnNlX2RpY3QoT3V0cHV0U2VyaWFsaXplcigpKSkKICAgIGRlZiBnZXQoc2VsZiwgcmVxdWVzdCwgcmVwb3J0X2lkKToKICAgICAgICAjIDEpIEVuc3VyZSByZXBvcnQgZXhpc3RzCiAgICAgICAgcmVwb3J0ID0gZ2V0X29iamVjdF9vcl80MDQoQ2xpUmVwb3J0LCBpZD1yZXBvcnRfaWQpCgogICAgICAgICMgMikgUHJlZmV0Y2ggdXNlciBhcHByb3ZhbCByYW5nZXMgb250byByZXF1ZXN0LnVzZXIgYXMgYGFwcHJvdmFsX3Jhbmdlc2AKICAgICAgICBwcmVmZXRjaF9yZWxhdGVkX29iamVjdHMoCiAgICAgICAgICAgIFtyZXF1ZXN0LnVzZXJdLAogICAgICAgICAgICBQcmVmZXRjaCgKICAgICAgICAgICAgICAgICJjbGlfYXBwcm92YWxfcmFuZ2VzIiwKICAgICAgICAgICAgICAgIHF1ZXJ5c2V0PUNsaUFwcHJvdmFsTWF0cml4Lm9iamVjdHMub3JkZXJfYnkoImNvdW50X3JhbmdlX21pbiIsICJjb3VudF9yYW5nZV9tYXgiKSwKICAgICAgICAgICAgICAgIHRvX2F0dHI9ImFwcHJvdmFsX3JhbmdlcyIsCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICByYW5nZXMgPSBnZXRhdHRyKHJlcXVlc3QudXNlciwgImFwcHJvdmFsX3JhbmdlcyIsIFtdKSBvciBbXQogICAgICAgIGN1c3RvbWVyX2NvdW50ID0gcmVwb3J0LmN1c3RvbWVyc19jb3VudAoKICAgICAgICBhdXRob3JpemVkID0gRmFsc2UKICAgICAgICBpZiBjdXN0b21lcl9jb3VudCBpcyBub3QgTm9uZSBhbmQgcmFuZ2VzOgogICAgICAgICAgICBmb3IgYXIgaW4gcmFuZ2VzOgogICAgICAgICAgICAgICAgaWYgYXIuY291bnRfcmFuZ2VfbWluIDw9IGN1c3RvbWVyX2NvdW50IGFuZCBjdXN0b21lcl9jb3VudCA8PSBhci5jb3VudF9yYW5nZV9tYXg6CiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBjYW5fYXBwcm92ZSA9IGJvb2woYXV0aG9yaXplZCkKICAgICAgICBjYW5fcHVibGlzaCA9IGJvb2woYXV0aG9yaXplZCkKCgogICAgICAgIGRhdGEgPSBzZWxmLk91dHB1dFNlcmlhbGl6ZXIoCiAgICAgICAgICAgIHsiY2FuX3B1Ymxpc2giOiBjYW5fcHVibGlzaCwgImNhbl9hcHByb3ZlIjogY2FuX2FwcHJvdmV9CiAgICAgICAgKS5kYXRhCiAgICAgICAgcmV0dXJuIFJlc3BvbnNlKGRhdGEsIHN0YXR1cz1zdGF0dXMuSFRUUF8yMDBfT0spCg==