diff --git a/country/admin.py b/country/admin.py index e8dff7a..0285373 100644 --- a/country/admin.py +++ b/country/admin.py @@ -93,8 +93,8 @@ def import_status(self): return format_html("""Import """) else: return format_html( - f"""Import """ ) diff --git a/country/management/commands/fill_contract_values.py b/country/management/commands/fill_contract_values.py new file mode 100644 index 0000000..8855f4c --- /dev/null +++ b/country/management/commands/fill_contract_values.py @@ -0,0 +1,12 @@ +from django.core.management.base import BaseCommand + +from country.models import Tender +from country.tasks import fill_contract_values + + +class Command(BaseCommand): + def handle(self, *args, **kwargs): + tenders = Tender.objects.all() + print("Created task: fill_contract_values") + for tender in tenders: + fill_contract_values.apply_async(args=(tender.id,), queue="covid19") diff --git a/country/management/commands/fix_contract_fields.py b/country/management/commands/fix_contract_fields.py deleted file mode 100644 index 3367b4b..0000000 --- a/country/management/commands/fix_contract_fields.py +++ /dev/null @@ -1,43 +0,0 @@ -from django.core.management.base import BaseCommand - -from country.models import TempDataImportTable, Tender - - -class Command(BaseCommand): - help = "Fix contract_status and contract_procedure fields" - - def handle(self, *args, **kwargs): - print("Converting") - tenders = Tender.objects.filter(link_to_contract="not_identified") - - for tender in tenders: - print(tender.contract_id) - temp_datas = TempDataImportTable.objects.filter(contract_id=tender.contract_id) - if temp_datas: - temp_value = temp_datas[0].procurement_process - contract_status = temp_datas[0].contract_status - link_to_contract = temp_datas[0].link_to_contract - if tender.link_to_contract == "not_identified": - tender.link_to_contract = link_to_contract - if contract_status == "not_identified": - contract_status_code = temp_datas[0].contract_status_code - if contract_status_code in ["Cancelled", "Terminated", "terminated"]: - tender.status = "cancelled" - elif contract_status_code in ["Active", "active"]: - tender.status = "active" - else: - tender.status = "not_identified" - if temp_value in ["Direct", "direct"]: - temp_value = "direct" - elif temp_value in ["Limited", "limited"]: - temp_value = "limited" - elif temp_value in ["Selective", "selective"]: - temp_value = "selective" - elif temp_value in ["Open", "open"]: - temp_value = "open" - else: - temp_value = "not_identified" - tender.procurement_procedure = temp_value - tender.save() - print("Tender value changed for id :" + str(tender.id)) - print("Done") diff --git a/country/red_flag.py b/country/red_flag.py index 62d119c..f636308 100644 --- a/country/red_flag.py +++ b/country/red_flag.py @@ -35,7 +35,10 @@ def flag8(self, contract_id): ) contract_value = tender_instance["contract_value"] tender_value = tender_instance["tender_value"] - percentage_increase = ((contract_value - tender_value) / tender_value) * 100 + try: + percentage_increase = ((contract_value - tender_value) / tender_value) * 100 + except Exception: + percentage_increase = 0 if ( percentage_increase > 20 ): # the difference between the expected purchase price and the final (contract) value exceeds 20 percent; diff --git a/country/tasks.py b/country/tasks.py index 263010f..1639558 100644 --- a/country/tasks.py +++ b/country/tasks.py @@ -128,6 +128,7 @@ def fix_contract_name_value(tender_id, country): tender_list = tender_id for tender in tender_list: tender_instance = Tender.objects.get(id=tender) + tender_instance.red_flag.clear() # Clearing red-flag goods_services = list( tender_instance.goods_services.all().values( "contract_title", @@ -181,6 +182,10 @@ def fix_contract_name_value(tender_id, country): print(category) instance = EquityCategory.objects.get(category_name=category) tender_instance.equity_category.add(instance) + print("Hereeeee") + process_redflag7.apply_async(args=(tender_instance.id,), queue="covid19") + process_redflag6.apply_async(args=(tender_instance.id,), queue="covid19") + process_redflag.apply_async(args=(tender_instance.id,), queue="covid19") @app.task(name="import_tender_from_batch_id") @@ -477,35 +482,44 @@ def clear_redflag(id): @app.task(name="process_red_flag7") -def process_redflag7(id, tender): - flag7_obj = RedFlag.objects.get(function_name="flag7") - concentration = Tender.objects.filter( - buyer__buyer_name=tender["buyer__buyer_name"], supplier__supplier_name=tender["supplier__supplier_name"] +def process_redflag7(id): + print("redflag77") + tenders = Tender.objects.filter(id=id).values( + "id", "buyer__buyer_name", "supplier__supplier_name", "supplier__supplier_address" ) - # supplier who has signed X(10) percent or more of their contracts with the same buyer - # (wins tenders from the same buyer) - if len(concentration) > 10: - for i in concentration: - obj = Tender.objects.get(id=i.id) - obj.red_flag.add(flag7_obj) + flag7_obj = RedFlag.objects.get(function_name="flag7") + for tender in tenders: + concentration = Tender.objects.filter( + buyer__buyer_name=tender["buyer__buyer_name"], supplier__supplier_name=tender["supplier__supplier_name"] + ) + # supplier who has signed X(10) percent or more of their contracts with the same buyer + # (wins tenders from the same buyer) + if len(concentration) > 10: + for i in concentration: + obj = Tender.objects.get(id=i.id) + obj.red_flag.add(flag7_obj) @app.task(name="process_red_flag6") -def process_redflag6(id, tender): +def process_redflag6(id): flag6_obj = RedFlag.objects.get(function_name="flag6") - a = ( - Tender.objects.values("buyer__buyer_name") - .filter( - supplier__supplier_name=tender["supplier__supplier_name"], - supplier__supplier_address=tender["supplier__supplier_address"], - ) - .distinct("buyer__buyer_name") + tenders = Tender.objects.filter(id=id).values( + "id", "buyer__buyer_name", "supplier__supplier_name", "supplier__supplier_address" ) - if len(a) > 2: - if a[0]["buyer__buyer_name"] == a[1]["buyer__buyer_name"]: - for obj in a: - objs = Tender.objects.get(id=obj.id) - objs.red_flag.add(flag6_obj) + for tender in tenders: + a = ( + Tender.objects.values("buyer__buyer_name") + .filter( + supplier__supplier_name=tender["supplier__supplier_name"], + supplier__supplier_address=tender["supplier__supplier_address"], + ) + .distinct("buyer__buyer_name") + ) + if len(a) > 2: + if a[0]["buyer__buyer_name"] == a[1]["buyer__buyer_name"]: + for obj in a: + objs = Tender.objects.get(id=obj.id) + objs.red_flag.add(flag6_obj) @app.task(name="store_in_temp_table") @@ -959,3 +973,47 @@ def delete_dataset(data_import_id): print("Done for temp data " + str(temp_data_id)) import_batch.delete() return "Done" + + +@app.task(name="fill_contract_values") +def fill_contract_values(tender_id): + tender_instance = Tender.objects.get(id=tender_id) + goods_services = list( + tender_instance.goods_services.all().values( + "contract_title", + "contract_value_usd", + "award_value_usd", + "tender_value_usd", + "contract_value_local", + "award_value_local", + "tender_value_local", + ) + ) + contract_title = [i.get("contract_title") for i in goods_services if i.get("contract_title") is not None] + contract_title.append(tender_instance.contract_title) + contract_names = ", ".join(set(contract_title)) + contract_value_usd = sum( + [i.get("contract_value_usd") for i in goods_services if i.get("contract_value_usd") is not None] + ) + award_value_usd = sum([i.get("award_value_usd") for i in goods_services if i.get("award_value_usd") is not None]) + tender_value_usd = sum( + [i.get("tender_value_usd") for i in goods_services if i.get("tender_value_usd") is not None] + ) + contract_value_local = sum( + [i.get("contract_value_local") for i in goods_services if i.get("contract_value_local") is not None] + ) + award_value_local = sum( + [i.get("award_value_local") for i in goods_services if i.get("award_value_local") is not None] + ) + tender_value_local = sum( + [i.get("tender_value_local") for i in goods_services if i.get("tender_value_local") is not None] + ) + tender_instance.contract_title = contract_names + tender_instance.contract_value_usd = contract_value_usd + tender_instance.contract_value_local = contract_value_local + tender_instance.tender_value_local = tender_value_local + tender_instance.tender_value_usd = tender_value_usd + tender_instance.award_value_local = award_value_local + tender_instance.award_value_usd = award_value_usd + tender_instance.save() + print("Done for tender id : " + str(tender_id))