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

Commit

Permalink
\CPA-309 Refactor Buyers/Suppliers API
Browse files Browse the repository at this point in the history
- [x] Buyer API
- [x] Supplier API
- [x] Top-Supplier API
- [x] Top-Buyer API
- [x] Buyer-trend
- [x] Supplier trend
- [x] Added condition of buyer/suypplier address and made it lower & striped it while saving
- [x] Added exception in buyer/supplier serializer
- [x] Refactoring done in buyer/supplier api
- [x] used iexact forCase-insensitive exact match while creating buyer and supplier
  • Loading branch information
Suyoj Man Tamrakar committed May 14, 2021
1 parent cc7c366 commit fbd37c2
Show file tree
Hide file tree
Showing 7 changed files with 216 additions and 217 deletions.
232 changes: 100 additions & 132 deletions country/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ class Meta:
class SupplierSerializer(serializers.ModelSerializer, SerializerExtensionsMixin):
amount_local = serializers.SerializerMethodField()
amount_usd = serializers.SerializerMethodField()
# red_flag_tender_count = serializers.SerializerMethodField()
# red_flag_tender_percentage = serializers.SerializerMethodField()
red_flag_tender_count = serializers.SerializerMethodField()
red_flag_tender_percentage = serializers.SerializerMethodField()
country_code = serializers.SerializerMethodField()
country_name = serializers.SerializerMethodField()
product_category_count = serializers.SerializerMethodField()
Expand All @@ -116,7 +116,7 @@ class Meta:
fields = (
"amount_local",
"amount_usd",
# "red_flag_tender_count",
"red_flag_tender_count",
"supplier_id",
"supplier_code",
"supplier_name",
Expand All @@ -126,86 +126,74 @@ class Meta:
"product_category_count",
"buyer_count",
"tender_count",
# "red_flag_tender_percentage",
"red_flag_tender_percentage",
)

def get_amount_usd(self, obj):
try:
if obj.amount_usd:
return obj.amount_usd
else:
return None
except Exception:
return obj.tenders.all().aggregate(sum_usd=Sum("goods_services__contract_value_usd"))["sum_usd"]
amount_usd = obj.summary["amount_usd"]
except TypeError:
amount_usd = 0
return amount_usd

def get_amount_local(self, obj):
try:
if obj.amount_local:
return obj.amount_local
else:
return None
except Exception:
return obj.tenders.all().aggregate(sum_local=Sum("goods_services__contract_value_local"))["sum_local"]

# def get_red_flag_tender_count(self, obj):
# return obj.red_flag_count
#
# def get_red_flag_tender_percentage(self, obj):
# red_flags = obj.red_flag_count
# total = obj.tender_count
# try:
# return red_flags / total
# except Exception:
# return 0
amount_local = obj.summary["amount_local"]
except TypeError:
amount_local = 0
return amount_local

def get_red_flag_tender_count(self, obj):
try:
red_flag_tender_count = obj.summary["red_flag_tender_count"]
except TypeError:
red_flag_tender_count = 0
return red_flag_tender_count

def get_red_flag_tender_percentage(self, obj):
try:
red_flag_tender_percentage = obj.summary["red_flag_tender_percentage"]
except TypeError:
red_flag_tender_percentage = 0
return red_flag_tender_percentage

def get_country_code(self, obj):
tender_obj = obj.tenders.first()
if tender_obj:
return tender_obj.country.country_code_alpha_2
try:
country_code = obj.summary["country_code"]
except TypeError:
country_code = ""
return country_code

def get_country_name(self, obj):
try:
if obj.country_name:
return obj.country_name
else:
return None
except Exception:
tender_obj = obj.tenders.first()
if tender_obj:
return tender_obj.country.name
country_name = obj.summary["country_name"]
except TypeError:
country_name = ""
return country_name

def get_buyer_count(self, obj):
supplier_related_tenders = obj.tenders.all()
if supplier_related_tenders:
return supplier_related_tenders.exclude(buyer_id__isnull=True).distinct("buyer_id").count()
try:
buyer_count = obj.summary["buyer_count"]
except TypeError:
buyer_count = 0
return buyer_count

def get_supplier_id(self, obj):
return obj.id

def get_tender_count(self, obj):
try:
if obj.tender_count:
return obj.tender_count
else:
return None
except Exception:
supplier_related_tenders = obj.tenders.all()
if supplier_related_tenders:
return supplier_related_tenders.count()
tender_count = obj.summary["tender_count"]
except TypeError:
tender_count = 0
return tender_count

def get_product_category_count(self, obj):
try:
if obj.product_category_count:
return obj.product_category_count
else:
return None
except Exception:
supplier_related_tenders = obj.tenders.all()
if supplier_related_tenders:
product_category_count = supplier_related_tenders.distinct(
"goods_services__goods_services_category"
).count()
return product_category_count
product_count = obj.summary["product_count"]
except TypeError:
product_count = 0
return product_count

def get_supplier_code(self, obj):
return obj.supplier_id
Expand All @@ -214,8 +202,8 @@ def get_supplier_code(self, obj):
class BuyerSerializer(serializers.ModelSerializer, SerializerExtensionsMixin):
amount_local = serializers.SerializerMethodField()
amount_usd = serializers.SerializerMethodField()
# red_flag_tender_count = serializers.SerializerMethodField()
# red_flag_tender_percentage = serializers.SerializerMethodField()
red_flag_tender_count = serializers.SerializerMethodField()
red_flag_tender_percentage = serializers.SerializerMethodField()
country_code = serializers.SerializerMethodField()
country_name = serializers.SerializerMethodField()
product_category_count = serializers.SerializerMethodField()
Expand All @@ -229,7 +217,7 @@ class Meta:
fields = (
"amount_local",
"amount_usd",
# "red_flag_tender_count",
"red_flag_tender_count",
"buyer_id",
"buyer_code",
"buyer_name",
Expand All @@ -239,94 +227,74 @@ class Meta:
"product_category_count",
"supplier_count",
"tender_count",
# "red_flag_tender_percentage",
"red_flag_tender_percentage",
)

def get_amount_usd(self, obj):
try:
if obj.amount_usd:
return obj.amount_usd
else:
return None
except Exception:
return (
obj.tenders.select_related("goods_services")
.all()
.aggregate(sum_usd=Sum("goods_services__contract_value_usd"))["sum_usd"]
)
amount_usd = obj.summary["amount_usd"]
except TypeError:
amount_usd = 0
return amount_usd

def get_amount_local(self, obj):
try:
if obj.amount_local:
return obj.amount_local
else:
return None
except Exception:
return (
obj.tenders.select_related("goods_services")
.all()
.aggregate(sum_local=Sum("goods_services__contract_value_local"))["sum_local"]
)

# def get_red_flag_tender_count(self, obj):
# return obj.red_flag_count
#
# def get_red_flag_tender_percentage(self, obj):
# red_flags = obj.red_flag_count
# total = obj.tender_count
# try:
# return red_flags / total
# except Exception:
# return 0
amount_local = obj.summary["amount_local"]
except TypeError:
amount_local = 0
return amount_local

def get_red_flag_tender_count(self, obj):
try:
red_flag_tender_count = obj.summary["red_flag_tender_count"]
except TypeError:
red_flag_tender_count = 0
return red_flag_tender_count

def get_red_flag_tender_percentage(self, obj):
try:
red_flag_tender_percentage = obj.summary["red_flag_tender_percentage"]
except TypeError:
red_flag_tender_percentage = 0
return red_flag_tender_percentage

def get_country_code(self, obj):
tender_obj = obj.tenders.first()
if tender_obj:
return tender_obj.country.country_code_alpha_2
try:
country_code = obj.summary["country_code"]
except TypeError:
country_code = ""
return country_code

def get_country_name(self, obj):
try:
if obj.country_name:
return obj.country_name
else:
return None
except Exception:
tender_obj = obj.tenders.first()
if tender_obj:
return tender_obj.country.name
country_name = obj.summary["country_name"]
except TypeError:
country_name = ""
return country_name

def get_product_category_count(self, obj):
def get_supplier_count(self, obj):
try:
if obj.product_category_count:
return obj.product_category_count
else:
return None
except Exception:
buyer_related_tenders = obj.tenders.all()
if buyer_related_tenders:
product_category_count = buyer_related_tenders.distinct(
"goods_services__goods_services_category"
).count()
return product_category_count
supplier_count = obj.summary["supplier_count"]
except TypeError:
supplier_count = 0
return supplier_count

def get_supplier_count(self, obj):
buyer_related_tenders = obj.tenders.all()
if buyer_related_tenders:
return buyer_related_tenders.exclude(supplier_id__isnull=True).distinct("supplier_id").count()
def get_buyer_id(self, obj):
return obj.id

def get_tender_count(self, obj):
try:
if obj.tender_count:
return obj.tender_count
else:
return None
except Exception:
buyer_related_tenders = obj.tenders.all()
if buyer_related_tenders:
return buyer_related_tenders.count()
tender_count = obj.summary["tender_count"]
except TypeError:
tender_count = 0
return tender_count

def get_buyer_id(self, obj):
return obj.id
def get_product_category_count(self, obj):
try:
product_count = obj.summary["product_count"]
except TypeError:
product_count = 0
return product_count

def get_buyer_code(self, obj):
return obj.buyer_id
Expand Down
16 changes: 12 additions & 4 deletions country/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,10 +256,15 @@ def import_tender_from_batch_id(batch_id, country, currency):
country_obj = Country.objects.filter(name=country).first()

# Get or Create Supplier
if supplier_id or supplier_name:
if supplier_id or supplier_name or supplier_address:
supplier_id = str(supplier_id).strip() if supplier_id else " "
supplier_name = str(supplier_name).strip() if supplier_name else " "
supplier_obj = Supplier.objects.filter(supplier_id=supplier_id, supplier_name=supplier_name).first()
supplier_address = str(supplier_address).strip() if supplier_address else " "
supplier_obj = Supplier.objects.filter(
supplier_id__iexact=supplier_id,
supplier_name__iexact=supplier_name,
supplier_address__iexact=supplier_address,
).first()
if not supplier_obj:
supplier_obj = Supplier(
supplier_id=supplier_id,
Expand All @@ -272,10 +277,13 @@ def import_tender_from_batch_id(batch_id, country, currency):
supplier_obj = None

# Get or Create Buyer
if buyer_id or buyer_name:
if buyer_id or buyer_name or buyer_address:
buyer_id = str(buyer_id).strip() if buyer_id else " "
buyer_name = str(buyer_name).strip() if buyer_name else " "
buyer_obj = Buyer.objects.filter(buyer_id=buyer_id, buyer_name=buyer_name).first()
buyer_address = str(buyer_address).strip() if buyer_address else " "
buyer_obj = Buyer.objects.filter(
buyer_id__iexact=buyer_id, buyer_name__iexact=buyer_name, buyer_address__iexact=buyer_address
).first()
if not buyer_obj:
buyer_obj = Buyer(
buyer_id=buyer_id,
Expand Down
Loading

0 comments on commit fbd37c2

Please sign in to comment.