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

Commit

Permalink
CPA-282
Browse files Browse the repository at this point in the history
* [x] Visualization views test with model create
* [x] modified red flag import using only country code
* [x] Fixes test case in management command
* [x] Refactored red flag command
  • Loading branch information
bikramtuladhar committed Apr 30, 2021
1 parent 0811099 commit c6389e3
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 109 deletions.
37 changes: 37 additions & 0 deletions country/management/commands/evaluate_contract_red_flag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from django.core.management.base import BaseCommand

from country.models import Country, Tender
from country.tasks import clear_redflag, process_redflag, process_redflag6, process_redflag7


class Command(BaseCommand):
help = "Red flag compute for specific country"

def add_arguments(self, parser):
parser.add_argument("country", nargs="+", type=str)

def handle(self, *args, **options):
country = options["country"][0]
if country:
country = str(country).upper()
else:
self.stderr.write("Country code is missing.")
return

country = Country.objects.get(country_code_alpha_2=country)

self.stdout.write(f"Processing Red flag for {country.name}")

tender_instance = Tender.objects.filter(
country_id=country.id, supplier__isnull=False, buyer__isnull=False
).values("id", "buyer__buyer_name", "supplier__supplier_name", "supplier__supplier_address")

for tender in tender_instance:
tender_id = tender["id"]
self.stdout.write("Created task for id :" + str(tender_id))
clear_redflag.apply_async(args=(tender_id,), queue="covid19")
process_redflag6.apply_async(args=(tender_id,), queue="covid19")
process_redflag7.apply_async(args=(tender_id,), queue="covid19")
process_redflag.apply_async(args=(tender_id,), queue="covid19")

self.stdout.write("Done")
30 changes: 0 additions & 30 deletions country/management/commands/import_red_flag.py

This file was deleted.

1 change: 1 addition & 0 deletions country/tests/commands/test_fetch_covid_active_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def assertCommand(self, *args, expected_out="", expected_err="", **kwargs):
self.assertEqual(out.getvalue(), dedent(expected_out))

def test_command(self):
Country.objects.all().delete()
Country.objects.create(name="Global", country_code="GLO", country_code_alpha_2="gl", currency="USD")
Country.objects.create(name="Kenya", country_code="KEN", country_code_alpha_2="KE", currency="KES")

Expand Down
119 changes: 65 additions & 54 deletions visualization/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,69 @@
from django.core.management import call_command
from django.test import TestCase
from django.urls import reverse
from rest_framework import status


def setUpModule():
call_command("loaddata", "country")


class VisualizationViewTest(TestCase):
def setUp(self):
self.total_contract_list_url = "total_contracts"
self.total_contracts_url = "total_contracts"
self.total_spending_url = "total_spending"
self.average_bids_url = "average_bids"
self.world_map_race_url = "world_map_race"
self.top_suppliers_url = "top_suppliers"
self.top_buyers_url = "top_buyers"
self.direct_open_url = "direct_open"
self.buyer_detail_url = "buyer_detail"
self.buyer_summary_url = "buyer_summary"
self.buyer_trend_url = "buyer_trend"
self.contract_red_flags_url = "contract_red_flags"
self.contract_status_url = "contract_status"
self.quantity_correlation_url = "quantity_correlation"
self.monopolization_url = "monopolization"
self.country_suppliers_url = "country_suppliers"
self.country_map_url = "country_map"
self.world_map_url = "world_map"
self.country_map_api_url = "country_map_api"
self.global_suppliers_url = "global_suppliers"
self.product_distribution_url = "product_distribution"
self.equity_indicators_url = "equity_indicators"
self.product_timeline_url = "product_timeline"
self.product_timeline_race_url = "product_timeline_race"
self.supplier_detail_url = "supplier_detail"
self.buyer_detail_url = "buyer_detail"
self.country_map_url = "country_map"
self.country_partners_url = "country_partners"
self.country_suppliers_url = "country_suppliers"
self.data_providers_url = "data_providers"
self.buyer_summary_url = "buyer_summary"
self.supplier_summary_url = "supplier_summary"
self.filter_parameters_url = "filter_parameters"
self.product_summary_url = "product_summary"
self.direct_open_contract_trend_url = "direct_open_contract_trend"
self.direct_open_url = "direct_open"
self.equity_indicators_url = "equity_indicators"
self.equity_summary_url = "equity_summary"
self.products_url = "products"
self.filters_parameters_suppliers_url = "filters_parameters_suppliers"
self.filter_parameters_url = "filter_parameters"
self.filters_parameters_buyers_url = "filters_parameters_buyers"
self.filters_parameters_static_url = "filters_parameters_static"
self.filters_parameters_suppliers_url = "filters_parameters_suppliers"
self.global_suppliers_url = "global_suppliers"
self.monopolization_url = "monopolization"
self.product_distribution_url = "product_distribution"
self.product_flow_view_url = "product_flow_view"
self.product_spending_comparison_url = "product_spending_comparison"
self.buyer_trend_url = "buyer_trend"
self.supplier_trend_url = "supplier_trend"
self.direct_open_contract_trend_url = "direct_open_contract_trend"
self.contract_red_flags_url = "contract_red_flags"
self.product_summary_url = "product_summary"
self.product_timeline_race_url = "product_timeline_race"
self.product_timeline_url = "product_timeline"
self.products_url = "products"
self.quantity_correlation_url = "quantity_correlation"
self.red_flag_summary_url = "red_flag_summary"
self.product_flow_view_url = "product_flow_view"
self.supplier_detail_url = "supplier_detail"
self.supplier_flow_view_url = "supplier_flow_view"
self.supplier_summary_url = "supplier_summary"
self.supplier_trend_url = "supplier_trend"
self.top_buyers_url = "top_buyers"
self.top_suppliers_url = "top_suppliers"
self.total_contract_list_url = "total_contracts"
self.total_contracts_url = "total_contracts"
self.total_spending_url = "total_spending"
self.world_map_race_url = "world_map_race"
self.world_map_url = "world_map"

def test_total_contracts_GET(self):
response = self.client.get(reverse(self.total_contracts_url))
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_total_spending_GET(self):
url = "%s?country=GB&buyer=1&supplier=1" % reverse(self.total_spending_url)
url = "%s?country=KE&buyer=1&supplier=1" % reverse(self.total_spending_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_average_bids_GET(self):
response = self.client.get(reverse(self.average_bids_url))
url = "%s?country=KE&buyer=1" % reverse(self.average_bids_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_world_map_race_GET(self):
Expand All @@ -73,31 +79,32 @@ def test_top_buyers_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_direct_open_GET(self):
response = self.client.get(reverse(self.direct_open_url))
url = "%s?country=KE&buyer=1&supplier=1" % reverse(self.direct_open_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_contract_status_GET(self):
url = "%s?country=GB&buyer=1" % reverse(self.contract_status_url)
url = "%s?country=KE&buyer=1" % reverse(self.contract_status_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_quantity_correlation_GET(self):
url = "%s?country=GB" % reverse(self.quantity_correlation_url)
url = "%s?country=KE" % reverse(self.quantity_correlation_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_monopolization_GET(self):
url = "%s?country=GB&buyer=1" % reverse(self.monopolization_url)
url = "%s?country=KE&buyer=1" % reverse(self.monopolization_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_country_suppliers_GET(self):
url = "%s?country=GB" % reverse(self.country_suppliers_url)
url = "%s?country=KE" % reverse(self.country_suppliers_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_country_map_GET(self):
url = "%s?country=GB" % reverse(self.country_map_url)
url = "%s?country=KE" % reverse(self.country_map_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

Expand All @@ -107,7 +114,7 @@ def test_world_map_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_country_map_api_GET(self):
url = "%s?country=GB" % reverse(self.country_map_api_url)
url = "%s?country=KE" % reverse(self.country_map_api_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

Expand All @@ -116,17 +123,17 @@ def test_global_suppliers_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_product_distribution_GET(self):
url = "%s?country=GB&buyer=1" % reverse(self.product_distribution_url)
url = "%s?country=KE&buyer=1" % reverse(self.product_distribution_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_equity_indicators_GET(self):
url = "%s?country=GB&buyer=1" % reverse(self.equity_indicators_url)
url = "%s?country=KE&buyer=1" % reverse(self.equity_indicators_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_product_timeline_GET(self):
url = "%s?country=GB&buyer=1&supplier=1" % reverse(self.product_timeline_url)
url = "%s?country=KE&buyer=1&supplier=1" % reverse(self.product_timeline_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

Expand All @@ -139,26 +146,26 @@ def test_supplier_detail_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_buyer_detail_GET(self):
response = self.client.get(reverse(self.buyer_detail_url, args=["1"]))
self.assertEquals(response.status_code, status.HTTP_200_OK)
response = self.client.get(reverse(self.buyer_detail_url, args=[1]))
self.assertEquals(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)

def test_country_partners_GET(self):
url = "%s?country=GB" % reverse(self.country_partners_url)
url = "%s?country=KE" % reverse(self.country_partners_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_data_providers_GET(self):
url = "%s?country=GB" % reverse(self.data_providers_url)
url = "%s?country=KE" % reverse(self.data_providers_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_buyer_summary_GET(self):
url = "%s?country=GB" % reverse(self.buyer_summary_url)
url = "%s?country=KE" % reverse(self.buyer_summary_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_supplier_summary_GET(self):
url = "%s?country=GB" % reverse(self.supplier_summary_url)
url = "%s?country=KE" % reverse(self.supplier_summary_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

Expand All @@ -167,25 +174,28 @@ def test_filter_parameters_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_product_summary_GET(self):
response = self.client.get(reverse(self.product_summary_url))
url = "%s?country=KE" % reverse(self.product_summary_url)
response = self.client.get(url)
print(response.json())
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_equity_summary_GET(self):
url = "%s?country=GB" % reverse(self.equity_summary_url)
url = "%s?country=KE" % reverse(self.equity_summary_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_products_GET(self):
response = self.client.get(reverse(self.products_url))
url = "%s?country=KE&buyer=1" % reverse(self.products_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_filters_parameters_suppliers_GET(self):
url = "%s?country=GB&buyer=1" % reverse(self.filters_parameters_suppliers_url)
url = "%s?country=KE&buyer=1" % reverse(self.filters_parameters_suppliers_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_filters_parameters_buyers_GET(self):
url = "%s?country=GB&supplier=1" % reverse(self.filters_parameters_buyers_url)
url = "%s?country=KE&supplier=1" % reverse(self.filters_parameters_buyers_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

Expand All @@ -211,7 +221,8 @@ def test_direct_open_contract_trend_GET(self):
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_contract_red_flags_GET(self):
response = self.client.get(reverse(self.contract_red_flags_url))
url = "%s?country=KE&buyer=1&supplier=1&product=1" % reverse(self.contract_red_flags_url)
response = self.client.get(url)
self.assertEquals(response.status_code, status.HTTP_200_OK)

def test_red_flag_summary_GET(self):
Expand Down
42 changes: 22 additions & 20 deletions visualization/views/buyer_profile_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,40 @@
from django.http import JsonResponse
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from rest_framework import status
from rest_framework.views import APIView

from country.models import Buyer, Tender
from country.models import Buyer
from visualization.helpers.general import page_expire_period


class BuyerProfileView(APIView):
@method_decorator(cache_page(page_expire_period()))
def get(self, request, *args, **kwargs):
pk = self.kwargs["pk"]
data = {}
try:
instance = Buyer.objects.get(id=pk)
tenders = instance.tenders
buyer_detail = (
Tender.objects.filter(buyer_id=pk)
.values("country__name", "country__country_code_alpha_2")
tenders.values("country__name", "country__country_code_alpha_2")
.annotate(
total_usd=Sum("goods_services__contract_value_usd"),
total_local=Sum("goods_services__contract_value_local"),
total_usd=Sum("contract_value_usd"),
total_local=Sum("contract_value_local"),
)
.first()
)
tender_count = Tender.objects.filter(buyer_id=pk).count()
data["name"] = instance.buyer_name
data["id"] = pk
data["code"] = instance.buyer_id
data["address"] = instance.buyer_address
data["amount_usd"] = buyer_detail[0]["total_usd"]
data["amount_local"] = buyer_detail[0]["total_local"]
data["tender_count"] = tender_count
data["country_code"] = buyer_detail[0]["country__country_code_alpha_2"]
data["country_name"] = buyer_detail[0]["country__name"]
return JsonResponse(data, safe=False)
except Exception:
data["error"] = "Enter valid ID"
return JsonResponse(data, safe=False)
data = {
"name": instance.buyer_name,
"id": pk,
"code": instance.buyer_id,
"address": instance.buyer_address,
"amount_usd": buyer_detail.get("total_usd", 0),
"amount_local": buyer_detail.get("total_local", 0),
"tender_count": tenders.distinct().count(),
"country_code": buyer_detail.get("country__country_code_alpha_2", ""),
"country_name": buyer_detail.get("country__name", ""),
}
return JsonResponse(data, safe=False, status=status.HTTP_200_OK)
except Exception as E:
error = {"error": str(E)}
return JsonResponse(error, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
4 changes: 1 addition & 3 deletions visualization/views/buyer_summary_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,7 @@ def get(self, request):
.aggregate(total=Count("buyer"))
)
for details in buyer_details:
data = {}
data["buyer_count"] = details["count"]
data["month"] = details["month"]
data = {"buyer_count": details["count"], "month": details["month"]}
trend.append(data)
try:
dates_in_details = [i["month"] for i in buyer_details]
Expand Down
Loading

0 comments on commit c6389e3

Please sign in to comment.