Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Legacy win migration function. #5395

Merged
merged 1 commit into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions datahub/export_win/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,13 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin):
)
search_fields = (
'=id',
'computed_adviser_name',
# legacy field
'adviser_name',
'=company__pk',
'lead_officer_adviser_name',
# legacy field
'lead_officer_name',
'company__name',
'country__name',
'contact_name',
Expand Down Expand Up @@ -239,7 +243,9 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin):

def get_adviser(self, obj):
"""Return adviser as user with email."""
return f'{obj.adviser} <{obj.adviser.email}>'
return f'{obj.adviser} <{obj.adviser.email}>' if obj.adviser else \
f'{obj.adviser_name} <{obj.adviser_email_address}>'

get_adviser.short_description = 'User'

def get_company(self, obj):
Expand Down Expand Up @@ -283,7 +289,7 @@ def has_delete_permission(self, request, obj=None):
def get_search_results(self, request, queryset, search_term):
if search_term:
queryset = queryset.annotate(
adviser_name=Concat(
computed_adviser_name=Concat(
'adviser__first_name', Value(' '), 'adviser__last_name',
),
lead_officer_adviser_name=Concat(
Expand Down Expand Up @@ -356,7 +362,7 @@ def has_change_permission(self, request, obj=None):
class WinAdviserAdmin(BaseModelAdminMixin):
"""Admin for Win Adviser."""

list_display = ('win', 'get_adviser_name', 'team_type', 'hq_team', 'location')
list_display = ('win', 'get_computed_adviser_name', 'team_type', 'hq_team', 'location')
search_fields = ('win__id',)

fieldsets = (
Expand All @@ -383,9 +389,9 @@ def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset.filter(win__is_deleted=False)

def get_adviser_name(self, obj):
"""Return adviser name."""
return obj.adviser.name
def get_computed_adviser_name(self, obj):
"""Return computed adviser name."""
return obj.adviser.name if obj.adviser else obj.name

def delete_view(self, request, object_id, extra_context=None):
"""
Expand All @@ -399,6 +405,6 @@ def delete_view(self, request, object_id, extra_context=None):
def has_change_permission(self, request, obj=None):
return False

get_adviser_name.short_description = 'Name'
get_computed_adviser_name.short_description = 'Name'

WinAdviser._meta.verbose_name_plural = 'Advisors'
75 changes: 75 additions & 0 deletions datahub/export_win/export_wins_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from logging import getLogger

from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from requests.exceptions import HTTPError, Timeout

from datahub.company.export_wins_api import (
ExportWinsAPIConnectionError,
ExportWinsAPIHTTPError,
ExportWinsAPITimeoutError,
)
from datahub.core.api_client import APIClient, HawkAuth
from datahub.core.exceptions import APIBadGatewayException


logger = getLogger(__name__)


def _fetch_page(api_client, source_url):
"""
Requests a page from given relative source_url.
"""
page = api_client.request('GET', source_url).json()
return page['results'], page['next']


def get_legacy_export_wins_dataset(start_url):
if not all(
[
settings.EXPORT_WINS_SERVICE_BASE_URL,
settings.EXPORT_WINS_HAWK_ID,
settings.EXPORT_WINS_HAWK_KEY,
],
):
raise ImproperlyConfigured('The all EXPORT_WINS_SERVICE* setting must be set')

api_client = APIClient(
api_url=settings.EXPORT_WINS_SERVICE_BASE_URL,
auth=HawkAuth(settings.EXPORT_WINS_HAWK_ID, settings.EXPORT_WINS_HAWK_KEY),
raise_for_status=True,
default_timeout=settings.DEFAULT_SERVICE_TIMEOUT,
)

source_url = start_url
items = 0
try:
while True:
results, next_url = _fetch_page(api_client, source_url)

yield results

items += len(results)

if not next_url or 'source=E' in next_url:
break

source_url = next_url.replace(
settings.EXPORT_WINS_SERVICE_BASE_URL,
'',
)

except APIBadGatewayException as exc:
error_message = 'Export Wins API service unavailable'
raise ExportWinsAPIConnectionError(error_message) from exc
except Timeout as exc:
error_message = 'Encountered a timeout interacting with Export Wins API'
raise ExportWinsAPITimeoutError(error_message) from exc
except HTTPError as exc:
error_message = (
'The Export Wins API returned an error status: '
f'{exc.response.status_code}',
)
raise ExportWinsAPIHTTPError(error_message) from exc

logger.info(f'Legacy Export wins dataset {start_url} processed ({items} records).')
Loading