Skip to content
This repository has been archived by the owner on Dec 13, 2022. It is now read-only.

Commit

Permalink
Merge pull request #319 from open-contracting/CPA-318
Browse files Browse the repository at this point in the history
CPA-318 Contracts table api refactoring
  • Loading branch information
KushalRaj committed May 20, 2021
2 parents 3a4eb66 + c0bc020 commit 27517e6
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 118 deletions.
64 changes: 14 additions & 50 deletions country/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ def get_red_flag_tender_count(self, obj):

def get_red_flag_tender_percentage(self, obj):
try:
red_flag_tender_percentage = obj.summary["red_flag_tender_percentage"]
red_flag_tender_percentage = round(obj.summary["red_flag_tender_percentage"], 2)
except TypeError:
red_flag_tender_percentage = 0
return red_flag_tender_percentage
Expand Down Expand Up @@ -253,7 +253,7 @@ def get_red_flag_tender_count(self, obj):

def get_red_flag_tender_percentage(self, obj):
try:
red_flag_tender_percentage = obj.summary["red_flag_tender_percentage"]
red_flag_tender_percentage = round(obj.summary["red_flag_tender_percentage"], 2)
except TypeError:
red_flag_tender_percentage = 0
return red_flag_tender_percentage
Expand Down Expand Up @@ -310,8 +310,6 @@ class TenderSerializer(serializers.ModelSerializer, SerializerExtensionsMixin):
country_name = serializers.CharField(source="country.name", read_only=True)
country_alpha_code = serializers.CharField(source="country.country_code_alpha_2", read_only=True)
contract_currency_local = serializers.CharField(source="country.currency", read_only=True)
contract_value_usd = serializers.SerializerMethodField()
contract_value_local = serializers.SerializerMethodField()
supplier_name = serializers.SerializerMethodField()
buyer_name = serializers.SerializerMethodField()
supplier_id = serializers.SerializerMethodField()
Expand All @@ -322,10 +320,6 @@ class TenderSerializer(serializers.ModelSerializer, SerializerExtensionsMixin):
buyer_code = serializers.SerializerMethodField()
product_category = serializers.SerializerMethodField()
bidders_no = serializers.SerializerMethodField()
tender_local = serializers.SerializerMethodField()
tender_usd = serializers.SerializerMethodField()
award_local = serializers.SerializerMethodField()
award_usd = serializers.SerializerMethodField()
equity_category = serializers.SerializerMethodField()
# red_flag_count = serializers.SerializerMethodField()
red_flag = RedFlagSerializer(many=True, read_only=True)
Expand Down Expand Up @@ -360,10 +354,10 @@ class Meta:
"data_source",
"product_category",
"bidders_no",
"tender_local",
"tender_usd",
"award_local",
"award_usd",
"tender_value_local",
"tender_value_usd",
"award_value_local",
"award_value_usd",
"equity_category",
# 'red_flag_count',
"red_flag",
Expand All @@ -374,47 +368,16 @@ class Meta:
"contract_currency_local",
)

def get_contract_value_usd(self, obj):
return obj.goods_services.aggregate(total=Sum("contract_value_usd"))["total"]

def get_contract_value_local(self, obj):
return obj.goods_services.aggregate(total=Sum("contract_value_local"))["total"]

def get_product_category(self, obj):
tender = (
Tender.objects.filter(id=obj.id)
.values("goods_services__goods_services_category__category_name")
.distinct()
)
return tender[0]["goods_services__goods_services_category__category_name"]

def get_bidders_no(self, obj):
try:
return obj.no_of_bidders
except Exception:
return 0

def get_tender_local(self, obj):
try:
return obj.goods_services.aggregate(tender_value_local=Sum("tender_value_local"))["tender_value_local"]
except Exception:
return 0

def get_tender_usd(self, obj):
try:
return obj.goods_services.aggregate(tender_value_usd=Sum("tender_value_usd"))["tender_value_usd"]
categories = obj.goods_services.values("goods_services_category__category_name").distinct()
return categories[0]["goods_services_category__category_name"]
except Exception:
return 0

def get_award_local(self, obj):
try:
return obj.goods_services.aggregate(award_value_local=Sum("award_value_local"))["award_value_local"]
except Exception:
return 0
return ""

def get_award_usd(self, obj):
def get_bidders_no(self, obj):
try:
return obj.goods_services.aggregate(award_value_usd=Sum("award_value_usd"))["award_value_usd"]
return obj.no_of_bidders
except Exception:
return 0

Expand Down Expand Up @@ -458,7 +421,7 @@ def get_buyer_code(self, obj):
return obj.buyer.buyer_id

def get_goods_services(self, obj):
a = obj.goods_services.all().values(
a = obj.goods_services.values(
"goods_services_category__category_name",
"contract_desc",
"contract_value_usd",
Expand All @@ -467,7 +430,8 @@ def get_goods_services(self, obj):
"contract_value_local",
"classification_code",
)
return list(a)
if obj.goods_services:
return list(a)


class OverallStatSummarySerializer(serializers.ModelSerializer, SerializerExtensionsMixin):
Expand Down
17 changes: 15 additions & 2 deletions country/views/buyer_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class BuyerView(viewsets.ModelViewSet):
"country__name",
"amount_usd",
"amount_local",
"buyer_code",
"red_flag_tender_percentage",
]
ordering = ["-id"]
extensions_auto_optimize = True
Expand All @@ -32,13 +34,18 @@ def retrieve(self, request, *args, **kwargs):
return Response(self.get_serializer(instance).data)

def get_queryset(self):
# country, buyer name, value range, red flag range
country = self.request.GET.get("country", None)
buyer_name = self.request.GET.get("buyer_name", None)
buyer_code = self.request.GET.get("buyer_code", None)
product_id = self.request.GET.get("product", None)
contract_value_usd = self.request.GET.get("contract_value_usd", None)
value_comparison = self.request.GET.get("value_comparison", None)
filter_args = {}
filter_args = {
"country__isnull": False,
"summary__tender_count__isnull": False,
"summary__amount_local__isnull": False,
"summary__amount_usd__isnull": False,
}
annotate_args = {}

if country:
Expand All @@ -47,6 +54,9 @@ def get_queryset(self):
if buyer_name:
filter_args["buyer_name__contains"] = buyer_name

if buyer_code:
filter_args["buyer_id__contains"] = buyer_code

if product_id:
filter_args["tenders__goods_services__goods_services_category"] = product_id

Expand All @@ -64,5 +74,8 @@ def get_queryset(self):
product_category_count=KeyTransform("product_count", "summary__product_count"),
amount_usd=KeyTransform("amount_usd", "summary__amount_usd"),
amount_local=KeyTransform("amount_local", "summary__amount_local"),
red_flag_tender_percentage=KeyTransform(
"red_flag_tender_percentage", "summary__red_flag_tender_percentage"
),
**annotate_args
).filter(**filter_args)
16 changes: 15 additions & 1 deletion country/views/supplier_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ class SupplierView(viewsets.ModelViewSet):
"country__name",
"amount_usd",
"amount_local",
"supplier_code",
"red_flag_tender_percentage",
]
ordering = ["-id"]
extensions_auto_optimize = True
Expand All @@ -33,10 +35,16 @@ def retrieve(self, request, *args, **kwargs):
def get_queryset(self):
country_code = self.request.GET.get("country", None)
supplier_name = self.request.GET.get("supplier_name", None)
supplier_code = self.request.GET.get("supplier_code", None)
product_id = self.request.GET.get("product", None)
contract_value_usd = self.request.GET.get("contract_value_usd", None)
value_comparison = self.request.GET.get("value_comparison", None)
filter_args = {}
filter_args = {
"country__isnull": False,
"summary__tender_count__isnull": False,
"summary__amount_local__isnull": False,
"summary__amount_usd__isnull": False,
}
annotate_args = {}

if country_code:
Expand All @@ -45,6 +53,9 @@ def get_queryset(self):
if supplier_name:
filter_args["supplier_name__icontains"] = supplier_name

if supplier_code:
filter_args["supplier_id__contains"] = supplier_code

if product_id:
filter_args["tenders__goods_services__goods_services_category"] = product_id

Expand All @@ -62,5 +73,8 @@ def get_queryset(self):
product_category_count=KeyTransform("product_count", "summary__product_count"),
amount_usd=KeyTransform("amount_usd", "summary__amount_usd"),
amount_local=KeyTransform("amount_local", "summary__amount_local"),
red_flag_tender_percentage=KeyTransform(
"red_flag_tender_percentage", "summary__red_flag_tender_percentage"
),
**annotate_args
).filter(**filter_args)
4 changes: 2 additions & 2 deletions country/views/tender_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ def get_queryset(self):
filter_args["contract_date__range"] = [date_from, date_to]
if contract_value_usd and value_comparison:
if value_comparison == "gt":
annotate_args["sum"] = Sum("goods_services__contract_value_usd")
annotate_args["sum"] = Sum("contract_value_usd")
filter_args["sum__gte"] = contract_value_usd
elif value_comparison == "lt":
annotate_args["sum"] = Sum("goods_services__contract_value_usd")
annotate_args["sum"] = Sum("contract_value_usd")
filter_args["sum__lte"] = contract_value_usd
if status == "others":
exclude_args["status__in"] = ["active", "canceled", "completed"]
Expand Down
51 changes: 26 additions & 25 deletions visualization/views/top_buyers.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
from django.db.models import Count, F
from django.contrib.postgres.fields.jsonb import KeyTransform
from django.http import JsonResponse
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from rest_framework.views import APIView

from country.models import Tender
from country.models import Buyer
from visualization.helpers.general import page_expire_period
from visualization.views.lib.general import add_filter_args


def top_buyer(order_by, **filter_args):
result = (
Tender.objects.filter(**filter_args)
.values("buyer__id", "buyer__buyer_name", "country__currency")
Buyer.objects.filter(**filter_args)
.values("id", "buyer_name", "country__currency")
.annotate(
count=Count("id"),
usd=F("contract_value_usd"),
local=F("contract_value_local"),
tender_count=KeyTransform("tender_count", "summary__tender_count"),
amount_usd=KeyTransform("amount_usd", "summary__amount_usd"),
amount_local=KeyTransform("amount_local", "summary__amount_local"),
)
.order_by(f"-{order_by}")[:10]
)
Expand All @@ -28,42 +27,44 @@ class TopBuyers(APIView):
@method_decorator(cache_page(page_expire_period()))
def get(self, request):
country_code = self.request.GET.get("country", None)
supplier = self.request.GET.get("supplier")
supplier_id = self.request.GET.get("supplier")
filter_args = {
"buyer__isnull": False,
"contract_value_usd__isnull": False,
"country__isnull": False,
"summary__tender_count__isnull": False,
"summary__amount_local__isnull": False,
"summary__amount_usd__isnull": False,
}

if country_code:
filter_args["country__country_code_alpha_2"] = country_code

if supplier:
filter_args = add_filter_args("supplier", supplier, filter_args)
if supplier_id:
filter_args["tenders__supplier_id"] = supplier_id

for_value = top_buyer(order_by="usd", **filter_args)
for_number = top_buyer(order_by="count", **filter_args)
for_value = top_buyer(order_by="amount_usd", **filter_args)
for_number = top_buyer(order_by="tender_count", **filter_args)
by_number = []
by_value = []

for value in for_value:
a = {
"amount_local": value["local"] if value["usd"] else 0,
"amount_usd": value["usd"] or 0,
"amount_local": value["amount_local"] if value["amount_local"] else 0,
"amount_usd": value["amount_usd"] or 0,
"local_currency_code": value["country__currency"],
"buyer_id": value["buyer__id"],
"buyer_name": value["buyer__buyer_name"],
"tender_count": value["count"],
"buyer_id": value["id"],
"buyer_name": value["buyer_name"],
"tender_count": value["tender_count"] if value["tender_count"] else 0,
}
by_value.append(a)

for value in for_number:
a = {
"amount_local": value["local"] if value["usd"] else 0,
"amount_usd": value["usd"] or 0,
"amount_local": value["amount_local"] if value["amount_local"] else 0,
"amount_usd": value["amount_usd"] or 0,
"local_currency_code": value["country__currency"],
"buyer_id": value["buyer__id"],
"buyer_name": value["buyer__buyer_name"],
"tender_count": value["count"],
"buyer_id": value["id"],
"buyer_name": value["buyer_name"],
"tender_count": value["tender_count"] if value["tender_count"] else 0,
}
by_number.append(a)

Expand Down
Loading

0 comments on commit 27517e6

Please sign in to comment.