From 87c3310b0d459583b8e01604a70be2c637403d85 Mon Sep 17 00:00:00 2001 From: Michael Olund Date: Tue, 27 Oct 2020 11:33:17 -0700 Subject: [PATCH] Re-arranged efilng code --- edivorce/apps/core/tests/test_efiling_hub.py | 16 +- edivorce/apps/core/tests/test_filing.py | 2 +- .../{cso_filing.py => efiling_documents.py} | 105 ----------- .../efiling_packaging.py} | 167 +--------------- .../apps/core/utils/efiling_submission.py | 178 ++++++++++++++++++ edivorce/apps/core/views/efiling.py | 111 ++++++++++- edivorce/apps/core/views/main.py | 2 +- edivorce/apps/poc/urls.py | 2 +- edivorce/apps/poc/views.py | 7 +- 9 files changed, 304 insertions(+), 286 deletions(-) rename edivorce/apps/core/utils/{cso_filing.py => efiling_documents.py} (59%) rename edivorce/apps/core/{efilinghub.py => utils/efiling_packaging.py} (61%) create mode 100644 edivorce/apps/core/utils/efiling_submission.py diff --git a/edivorce/apps/core/tests/test_efiling_hub.py b/edivorce/apps/core/tests/test_efiling_hub.py index 6bf11565..445557e3 100644 --- a/edivorce/apps/core/tests/test_efiling_hub.py +++ b/edivorce/apps/core/tests/test_efiling_hub.py @@ -7,7 +7,8 @@ from django.test import TransactionTestCase from django.test.client import RequestFactory from django.core.files.uploadedfile import SimpleUploadedFile -from edivorce.apps.core.efilinghub import EFilingHub, PACKAGE_PARTY_FORMAT, PACKAGE_DOCUMENT_FORMAT +from edivorce.apps.core.utils.efiling_submission import EFilingSubmission +from edivorce.apps.core.utils.efiling_packaging import EFilingPackaging, PACKAGE_PARTY_FORMAT, PACKAGE_DOCUMENT_FORMAT SAMPLE_TOKEN_RESPONSE = { "access_token": "klkadlfjadsfkj", @@ -36,7 +37,7 @@ GENERATE_URL_RESPONSE_ERROR = { } -class EFilingHubTests(TransactionTestCase): +class EFilingSubmissionTests(TransactionTestCase): def setUp(self): # Every test needs access to the request factory. @@ -47,7 +48,8 @@ class EFilingHubTests(TransactionTestCase): middleware.process_request(self.request) self.request.session.save() - self.hub = EFilingHub(initial_filing=True) + self.hub = EFilingSubmission(initial_filing=True) + self.packaging = EFilingPackaging(initial_filing=True) def _mock_response(self, status=200, text="Text", json_data=None, raise_for_status=None): mock_resp = mock.Mock() @@ -192,7 +194,7 @@ class EFilingHubTests(TransactionTestCase): parties.append(party) location = '6011' - package = self.hub._format_package(self.request, files, documents, parties, location) + package = self.packaging.format_package(self.request, files, documents, parties, location) self.assertTrue(package) self.assertEqual(package['filingPackage']['documents'][0]['name'], 'form_0.pdf') @@ -205,7 +207,7 @@ class EFilingHubTests(TransactionTestCase): with self.assertRaises(PermissionDenied): redirect, msg = self.hub.upload(self.request, None) - @mock.patch('edivorce.apps.core.efilinghub.EFilingHub._get_api') + @mock.patch('edivorce.apps.core.utils.efiling_submission.EFilingSubmission._get_api') def test_upload_success(self, mock_get_api): self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' with self.settings(DEPLOYMENT_TYPE='prod'): @@ -219,7 +221,7 @@ class EFilingHubTests(TransactionTestCase): self.assertEqual(redirect, GENERATE_URL_RESPONSE['efilingUrl']) self.assertEqual(msg, 'success') - @mock.patch('edivorce.apps.core.efilinghub.EFilingHub._get_api') + @mock.patch('edivorce.apps.core.utils.efiling_submission.EFilingSubmission._get_api') def test_upload_failed_initial_upload(self, mock_get_api): self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' with self.settings(DEPLOYMENT_TYPE='prod'): @@ -231,7 +233,7 @@ class EFilingHubTests(TransactionTestCase): self.assertFalse(redirect) - @mock.patch('edivorce.apps.core.efilinghub.EFilingHub._get_api') + @mock.patch('edivorce.apps.core.utils.efiling_submission.EFilingSubmission._get_api') def test_upload_failed_generate_url(self, mock_get_api): self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' with self.settings(DEPLOYMENT_TYPE='prod'): diff --git a/edivorce/apps/core/tests/test_filing.py b/edivorce/apps/core/tests/test_filing.py index 20bee95a..89c8f7e8 100644 --- a/edivorce/apps/core/tests/test_filing.py +++ b/edivorce/apps/core/tests/test_filing.py @@ -1,7 +1,7 @@ from django.test import TestCase from edivorce.apps.core.models import BceidUser, Document, UserResponse -from edivorce.apps.core.utils.cso_filing import forms_to_file +from edivorce.apps.core.utils.efiling_documents import forms_to_file from edivorce.apps.core.utils.user_response import get_data_for_user diff --git a/edivorce/apps/core/utils/cso_filing.py b/edivorce/apps/core/utils/efiling_documents.py similarity index 59% rename from edivorce/apps/core/utils/cso_filing.py rename to edivorce/apps/core/utils/efiling_documents.py index dcd94f12..42ae996e 100644 --- a/edivorce/apps/core/utils/cso_filing.py +++ b/edivorce/apps/core/utils/efiling_documents.py @@ -1,111 +1,6 @@ -import base64 -import random - -from django.conf import settings - -from edivorce.apps.core.efilinghub import EFilingHub -from edivorce.apps.core.models import Document, UserResponse from edivorce.apps.core.utils.derived import get_derived_data -def file_documents(request, responses, initial=False): - user = request.user - errors = [] - if not initial: - user_has_submitted_initial = _get_response(user, 'initial_filing_submitted') == 'True' - if not user_has_submitted_initial: - errors.append("You must file the initial filing first before submitting the final filing.") - court_file_number = _get_response(user, 'court_file_number') - if not court_file_number: - errors.append("You must input your Court File Number") - - uploaded, generated = forms_to_file(responses, initial) - for form in uploaded: - docs = Document.objects.filter( - bceid_user=user, doc_type=form['doc_type'], party_code=form.get('party_code', 0)) - if docs.count() == 0: - errors.append(f"Missing documents for {Document.form_types[form['doc_type']]}") - - if errors: - return errors, None - - if not settings.EFILING_HUB_ENABLED: - return after_file_documents(request, initial) - - hub = EFilingHub(initial_filing=initial) - post_files, documents = hub.get_files(request, responses, uploaded, generated) - location = hub.get_location(responses) - parties = hub.get_parties(responses) - - redirect_url, msg = hub.upload(request, post_files, documents, parties, location) - - if msg != 'success': - errors.append(msg) - return errors, None - - if redirect_url: - return None, redirect_url - - return None, None - - -def after_file_documents(request, initial=False): - user = request.user - - # Save dummy data for now. Eventually replace with data from CSO - prefix = 'initial' if initial else 'final' - _save_response(user, f'{prefix}_filing_submitted', 'True') - - if not initial: - _save_response(user, f'final_filing_status', 'Submitted') - - if settings.EFILING_HUB_ENABLED: - package_number = '' - base64_message = request.GET.get('packageRef', '') - base64_bytes = base64_message.encode('ascii') - message_bytes = base64.b64decode(base64_bytes) - message = message_bytes.decode('ascii') - - parts = message.split('=') - if len(parts) == 2: - package_number = parts[1] - - if not settings.EFILING_HUB_ENABLED: - package_number_parts = [] - for _ in range(3): - num = '' - for _ in range(3): - num += str(random.randint(0, 9)) - package_number_parts.append(num) - package_number = '-'.join(package_number_parts) - - _save_response(user, f'{prefix}_filing_package_number', package_number) - - if settings.DEPLOYMENT_TYPE == 'localdev': - base_url = 'https://dev.justice.gov.bc.ca' - else: - base_url = settings.PROXY_BASE_URL - - receipt_link = base_url + '/cso/filing/status/viewDocument.do?actionType=viewReceipt&packageNo=' + package_number - _save_response(user, f'{prefix}_filing_receipt_link', receipt_link) - - package_link = base_url + '/cso/accounts/bceidNotification.do?packageNo=' + package_number - _save_response(user, f'{prefix}_filing_package_link', package_link) - return None, None - - -def _save_response(user, question, value): - response, _ = UserResponse.objects.get_or_create(bceid_user=user, question_id=question) - response.value = value - response.save() - - -def _get_response(user, question): - response = UserResponse.objects.filter(bceid_user=user, question_id=question).first() - if response: - return response.value - - def forms_to_file(responses_dict, initial=False): generated = [] uploaded = [] diff --git a/edivorce/apps/core/efilinghub.py b/edivorce/apps/core/utils/efiling_packaging.py similarity index 61% rename from edivorce/apps/core/efilinghub.py rename to edivorce/apps/core/utils/efiling_packaging.py index 4571c61e..7bd80911 100644 --- a/edivorce/apps/core/efilinghub.py +++ b/edivorce/apps/core/utils/efiling_packaging.py @@ -3,11 +3,8 @@ import hashlib import json import logging import re -import requests -import uuid from django.conf import settings -from django.core.exceptions import PermissionDenied from django.urls import reverse from edivorce.apps.core.models import Document @@ -103,127 +100,12 @@ NJF_JSON_FORMAT = { } -class EFilingHub: +class EFilingPackaging: def __init__(self, initial_filing): - self.client_id = settings.EFILING_HUB_CLIENT_ID - self.client_secret = settings.EFILING_HUB_CLIENT_SECRET - self.token_base_url = settings.EFILING_HUB_TOKEN_BASE_URL - self.token_realm = settings.EFILING_HUB_REALM - self.api_base_url = settings.EFILING_HUB_API_BASE_URL - - self.submission_id = None self.initial_filing = initial_filing - def _get_token(self, request): - payload = f'client_id={self.client_id}&grant_type=client_credentials&client_secret={self.client_secret}' - headers = {'Content-Type': 'application/x-www-form-urlencoded'} - - url = f'{self.token_base_url}/auth/realms/{self.token_realm}/protocol/openid-connect/token' - - response = requests.post(url, headers=headers, data=payload) - logging.debug(f'EFH - Get Token {response.status_code}') - if response.status_code == 200: - response = json.loads(response.text) - - # save in session .. lets just assume that current user is authenticated - if 'access_token' in response: - request.session['access_token'] = response['access_token'] - if 'refresh_token' in response: - request.session['refresh_token'] = response['refresh_token'] - - return True - return False - - def _refresh_token(self, request): - refresh_token = request.session.get('refresh_token', None) - if not refresh_token: - return False - - payload = f'client_id={self.client_id}&grant_type=refresh_token&client_secret={self.client_secret}&refresh_token={refresh_token}' - headers = {'Content-Type': 'application/x-www-form-urlencoded'} - - url = f'{self.token_base_url}/auth/realms/{self.token_realm}/protocol/openid-connect/token' - - response = requests.post(url, headers=headers, data=payload) - logging.debug(f'EFH - Get Refresh Token {response.status_code}') - - response = json.loads(response.text) - - # save in session .. lets just assume that current user is authenticated - if 'access_token' in response: - request.session['access_token'] = response['access_token'] - if 'refresh_token' in response: - request.session['refresh_token'] = response['refresh_token'] - - return True - return False - - def _get_api(self, request, url, transaction_id, bce_id, headers, data=None, files=None): - # make sure we have a session - access_token = request.session.get('access_token', None) - if not access_token: - if not self._get_token(request): - raise Exception('EFH - Unable to get API Token') - - access_token = request.session.get('access_token', None) - headers.update({ - 'X-Transaction-Id': transaction_id, - 'X-User-Id': bce_id, - 'Authorization': f'Bearer {access_token}' - }) - - if not data: - data = {} - - response = requests.post(url, headers=headers, data=data, files=files) - logging.debug(f'EFH - Get API {response.status_code} {response.text}') - - if response.status_code == 401: - # not authorized .. try refreshing token - if self._refresh_token(request): - access_token = request.session.get('access_token', None) - headers.update({ - 'X-Transaction-Id': transaction_id, - 'X-User-Id': bce_id, - 'Authorization': f'Bearer {access_token}' - }) - - response = requests.post(url, headers=headers, data=data, files=files) - logging.debug(f'EFH - Get API Retry {response.status_code} {response.text}') - - return response - - def _get_transaction(self, request): - """ - Get the current transaction id stored in session, otherwise generate one. - :param request: - :return: - """ - guid = request.session.get('transaction_id', None) - if not guid: - guid = str(uuid.uuid4()) - request.session['transaction_id'] = guid - return guid - - def _get_bceid(self, request): - - def _get_raw_bceid(request): - is_localdev = settings.DEPLOYMENT_TYPE in ['localdev', 'minishift'] - if is_localdev: - # to integrate with the Test eFiling Hub, we need a valid BCEID which is - # unavailable for a local eDivorce environment. Use an env specified mapping - # to figure out what we should pass through to eFiling Hub. This BCEID username - # needs to match with what you will be logging in with to the Test BCEID environment. - return settings.EFILING_BCEID - return request.session.get('bcgov_userguid', None) - - guid = _get_raw_bceid(request) - if guid: - return str(uuid.UUID(guid)) - return guid - - def _format_package(self, request, files, documents, parties, location): + def format_package(self, request, files, documents, parties, location): package = PACKAGE_FORMAT.copy() package['filingPackage']['court']['location'] = location package['filingPackage']['documents'] = documents @@ -426,48 +308,3 @@ class EFilingHub: def get_location(self, responses): location_name = responses.get('court_registry_for_filing', '') return list_of_registries.get(location_name, '0000') - - def upload(self, request, files, documents=None, parties=None, location=None): - """ - Does an initial upload of documents and gets the generated eFiling Hub url. - :param parties: - :param request: - :param files: Files need to be a list of tuples in the form ('files': (filename, filecontent)) - :return: The url for redirect and any error messages - """ - # Find the transaction id .. this will be a unique guid generated by eDivorce thats passed to Efiling Hub. We - # will tie it to the session. - - transaction_id = self._get_transaction(request) - bce_id = self._get_bceid(request) - - # if bce_id is None .. we basically have an anonymous user so raise an error - if bce_id is None: - raise PermissionDenied() - - # package_data, files = self._get_data(request, responses, uploaded, generated) - - url = f'{self.api_base_url}/submission/documents' - response = self._get_api(request, url, transaction_id, bce_id, headers={}, files=files) - if response.status_code == 200: - response = json.loads(response.text) - - if "submissionId" in response and response['submissionId'] != "": - # get the redirect url - headers = { - 'Content-Type': 'application/json' - } - package_data = self._format_package(request, files, documents, parties, location) - url = f"{self.api_base_url}/submission/{response['submissionId']}/generateUrl" - data = json.dumps(package_data) - response = self._get_api(request, url, transaction_id, bce_id, headers, data) - - if response.status_code == 200: - response = json.loads(response.text) - return response['efilingUrl'], 'success' - - response = json.loads(response.text) - - return None, f"{response['error']} - {response['message']}" - - return None, f'{response.status_code} - {response.text}' diff --git a/edivorce/apps/core/utils/efiling_submission.py b/edivorce/apps/core/utils/efiling_submission.py new file mode 100644 index 00000000..141898ec --- /dev/null +++ b/edivorce/apps/core/utils/efiling_submission.py @@ -0,0 +1,178 @@ +import json +import logging +import requests +import uuid + +from django.conf import settings +from django.core.exceptions import PermissionDenied + +from .efiling_packaging import EFilingPackaging + +logger = logging.getLogger(__name__) + + +class EFilingSubmission: + + def __init__(self, initial_filing): + self.client_id = settings.EFILING_HUB_CLIENT_ID + self.client_secret = settings.EFILING_HUB_CLIENT_SECRET + self.token_base_url = settings.EFILING_HUB_TOKEN_BASE_URL + self.token_realm = settings.EFILING_HUB_REALM + self.api_base_url = settings.EFILING_HUB_API_BASE_URL + + self.submission_id = None + self.initial_filing = initial_filing + self.packaging = EFilingPackaging(initial_filing) + + def _get_token(self, request): + payload = f'client_id={self.client_id}&grant_type=client_credentials&client_secret={self.client_secret}' + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + + url = f'{self.token_base_url}/auth/realms/{self.token_realm}/protocol/openid-connect/token' + + response = requests.post(url, headers=headers, data=payload) + logging.debug(f'EFH - Get Token {response.status_code}') + if response.status_code == 200: + response = json.loads(response.text) + + # save in session .. lets just assume that current user is authenticated + if 'access_token' in response: + request.session['access_token'] = response['access_token'] + if 'refresh_token' in response: + request.session['refresh_token'] = response['refresh_token'] + + return True + return False + + def _refresh_token(self, request): + refresh_token = request.session.get('refresh_token', None) + if not refresh_token: + return False + + payload = f'client_id={self.client_id}&grant_type=refresh_token&client_secret={self.client_secret}&refresh_token={refresh_token}' + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + + url = f'{self.token_base_url}/auth/realms/{self.token_realm}/protocol/openid-connect/token' + + response = requests.post(url, headers=headers, data=payload) + logging.debug(f'EFH - Get Refresh Token {response.status_code}') + + response = json.loads(response.text) + + # save in session .. lets just assume that current user is authenticated + if 'access_token' in response: + request.session['access_token'] = response['access_token'] + if 'refresh_token' in response: + request.session['refresh_token'] = response['refresh_token'] + + return True + return False + + def _get_api(self, request, url, transaction_id, bce_id, headers, data=None, files=None): + # make sure we have a session + access_token = request.session.get('access_token', None) + if not access_token: + if not self._get_token(request): + raise Exception('EFH - Unable to get API Token') + + access_token = request.session.get('access_token', None) + headers.update({ + 'X-Transaction-Id': transaction_id, + 'X-User-Id': bce_id, + 'Authorization': f'Bearer {access_token}' + }) + + if not data: + data = {} + + response = requests.post(url, headers=headers, data=data, files=files) + logging.debug(f'EFH - Get API {response.status_code} {response.text}') + + if response.status_code == 401: + # not authorized .. try refreshing token + if self._refresh_token(request): + access_token = request.session.get('access_token', None) + headers.update({ + 'X-Transaction-Id': transaction_id, + 'X-User-Id': bce_id, + 'Authorization': f'Bearer {access_token}' + }) + + response = requests.post(url, headers=headers, data=data, files=files) + logging.debug(f'EFH - Get API Retry {response.status_code} {response.text}') + + return response + + def _get_transaction(self, request): + """ + Get the current transaction id stored in session, otherwise generate one. + :param request: + :return: + """ + guid = request.session.get('transaction_id', None) + if not guid: + guid = str(uuid.uuid4()) + request.session['transaction_id'] = guid + return guid + + def _get_bceid(self, request): + + def _get_raw_bceid(request): + is_localdev = settings.DEPLOYMENT_TYPE in ['localdev', 'minishift'] + if is_localdev: + # to integrate with the Test eFiling Hub, we need a valid BCEID which is + # unavailable for a local eDivorce environment. Use an env specified mapping + # to figure out what we should pass through to eFiling Hub. This BCEID username + # needs to match with what you will be logging in with to the Test BCEID environment. + return settings.EFILING_BCEID + return request.session.get('bcgov_userguid', None) + + guid = _get_raw_bceid(request) + if guid: + return str(uuid.UUID(guid)) + return guid + + def upload(self, request, files, documents=None, parties=None, location=None): + """ + Does an initial upload of documents and gets the generated eFiling Hub url. + :param parties: + :param request: + :param files: Files need to be a list of tuples in the form ('files': (filename, filecontent)) + :return: The url for redirect and any error messages + """ + # Find the transaction id .. this will be a unique guid generated by eDivorce thats passed to Efiling Hub. We + # will tie it to the session. + + transaction_id = self._get_transaction(request) + bce_id = self._get_bceid(request) + + # if bce_id is None .. we basically have an anonymous user so raise an error + if bce_id is None: + raise PermissionDenied() + + # package_data, files = self._get_data(request, responses, uploaded, generated) + + url = f'{self.api_base_url}/submission/documents' + response = self._get_api(request, url, transaction_id, bce_id, headers={}, files=files) + if response.status_code == 200: + response = json.loads(response.text) + + if "submissionId" in response and response['submissionId'] != "": + # get the redirect url + headers = { + 'Content-Type': 'application/json' + } + package_data = self.packaging.format_package(request, files, documents, parties, location) + url = f"{self.api_base_url}/submission/{response['submissionId']}/generateUrl" + data = json.dumps(package_data) + response = self._get_api(request, url, transaction_id, bce_id, headers, data) + + if response.status_code == 200: + response = json.loads(response.text) + return response['efilingUrl'], 'success' + + response = json.loads(response.text) + + return None, f"{response['error']} - {response['message']}" + + return None, f'{response.status_code} - {response.text}' diff --git a/edivorce/apps/core/views/efiling.py b/edivorce/apps/core/views/efiling.py index 29fa8178..1b81cb60 100644 --- a/edivorce/apps/core/views/efiling.py +++ b/edivorce/apps/core/views/efiling.py @@ -1,10 +1,17 @@ +import base64 +import random + +from django.conf import settings from django.contrib import messages from django.shortcuts import redirect from django.urls import reverse from django.contrib.auth.decorators import login_required from ..decorators import prequal_completed -from ..utils.cso_filing import file_documents, after_file_documents +from ..models import Document, UserResponse +from ..utils.efiling_documents import forms_to_file +from ..utils.efiling_packaging import EFilingPackaging +from ..utils.efiling_submission import EFilingSubmission from ..utils.user_response import get_data_for_user @@ -21,9 +28,11 @@ def submit_final_files(request): def _submit_files(request, initial=False): + """ App flow logic """ responses_dict = get_data_for_user(request.user) - errors, hub_redirect_url = file_documents(request, responses_dict, initial=initial) + errors, hub_redirect_url = _validate_and_submit_documents( + request, responses_dict, initial=initial) if hub_redirect_url: return redirect(hub_redirect_url) @@ -47,6 +56,55 @@ def _submit_files(request, initial=False): return redirect(reverse('dashboard_nav', kwargs={'nav_step': next_page}), context=responses_dict) +def _validate_and_submit_documents(request, responses, initial=False): + """ Validation and submission logic """ + user = request.user + errors = [] + if not initial: + user_has_submitted_initial = responses.get('initial_filing_submitted') == 'True' + if not user_has_submitted_initial: + errors.append( + "You must file the initial filing first before submitting the final filing.") + court_file_number = responses.get('court_file_number') + if not court_file_number: + errors.append("You must input your Court File Number") + + uploaded, generated = forms_to_file(responses, initial) + for form in uploaded: + docs = Document.objects.filter( + bceid_user=user, doc_type=form['doc_type'], party_code=form.get('party_code', 0)) + if docs.count() == 0: + errors.append(f"Missing documents for {Document.form_types[form['doc_type']]}") + + if errors: + return errors, None + + if not settings.EFILING_HUB_ENABLED: + return _after_submit_files(request, initial) + + msg, redirect_url = _package_and_submit(request, uploaded, generated, responses, initial) + + if msg != 'success': + errors.append(msg) + return errors, None + + if redirect_url: + return None, redirect_url + + return None, None + + +def _package_and_submit(request, uploaded, generated, responses, initial): + """ Build the efiling package and submit it to the efiling hub """ + hub = EFilingSubmission(initial_filing=initial) + packaging = EFilingPackaging(initial_filing=initial) + post_files, documents = packaging.get_files(request, responses, uploaded, generated) + location = packaging.get_location(responses) + parties = packaging.get_parties(responses) + redirect_url, msg = hub.upload(request, post_files, documents, parties, location) + return msg, redirect_url + + @login_required @prequal_completed def after_submit_initial_files(request): @@ -66,8 +124,55 @@ def _after_submit_files(request, initial=False): else: next_page = 'next_steps' - after_file_documents(request, initial=initial) + user = request.user + + prefix = 'initial' if initial else 'final' + _save_response(user, f'{prefix}_filing_submitted', 'True') + + if not initial: + _save_response(user, f'final_filing_status', 'Submitted') + + package_number = _get_package_number(request) + + _save_response(user, f'{prefix}_filing_package_number', package_number) + + if settings.DEPLOYMENT_TYPE == 'localdev': + base_url = 'https://dev.justice.gov.bc.ca' + else: + base_url = settings.PROXY_BASE_URL + + receipt_link = base_url + '/cso/filing/status/viewDocument.do?actionType=viewReceipt&packageNo=' + package_number + _save_response(user, f'{prefix}_filing_receipt_link', receipt_link) + + package_link = base_url + '/cso/accounts/bceidNotification.do?packageNo=' + package_number + _save_response(user, f'{prefix}_filing_package_link', package_link) responses_dict['active_page'] = next_page return redirect(reverse('dashboard_nav', kwargs={'nav_step': next_page}), context=responses_dict) + + +def _get_package_number(request): + if settings.EFILING_HUB_ENABLED: + base64_message = request.GET.get('packageRef', '') + base64_bytes = base64_message.encode('ascii') + message_bytes = base64.b64decode(base64_bytes) + message = message_bytes.decode('ascii') + parts = message.split('=') + if len(parts) == 2: + return parts[1] + else: + # Generate a random string in format 000-000-000 + package_number_parts = [] + for _ in range(3): + num = '' + for _ in range(3): + num += str(random.randint(0, 9)) + package_number_parts.append(num) + return '-'.join(package_number_parts) + + +def _save_response(user, question, value): + response, _ = UserResponse.objects.get_or_create(bceid_user=user, question_id=question) + response.value = value + response.save() diff --git a/edivorce/apps/core/views/main.py b/edivorce/apps/core/views/main.py index 13c1e3f5..90ddf137 100644 --- a/edivorce/apps/core/views/main.py +++ b/edivorce/apps/core/views/main.py @@ -6,7 +6,7 @@ from django.contrib.auth.decorators import login_required from edivorce.apps.core.utils.derived import get_derived_data from ..decorators import intercept, prequal_completed -from ..utils.cso_filing import forms_to_file +from ..utils.efiling_documents import forms_to_file from ..utils.question_step_mapping import list_of_registries from ..utils.step_completeness import get_error_dict, get_missed_question_keys, get_step_completeness, is_complete, get_formatted_incomplete_list from ..utils.template_step_order import template_step_order diff --git a/edivorce/apps/poc/urls.py b/edivorce/apps/poc/urls.py index ae508eac..d5bd7980 100644 --- a/edivorce/apps/poc/urls.py +++ b/edivorce/apps/poc/urls.py @@ -5,7 +5,7 @@ from edivorce.apps.poc import views urlpatterns = [ url(r'scan', login_required(views.UploadScan.as_view()), name="poc-scan"), - url(r'hub', login_required(views.EfilingHubUpload.as_view()), name="poc-hub"), + url(r'hub', login_required(views.EFilingSubmissionUpload.as_view()), name="poc-hub"), url(r'storage/doc/(?P\d+)', login_required(views.view_document_file), name="poc-storage-download"), url(r'storage/delete/(?P\d+)', login_required(views.UploadStorageDelete.as_view()), name="poc-storage-delete"), url(r'storage', login_required(views.UploadStorage.as_view()), name="poc-storage"), diff --git a/edivorce/apps/poc/views.py b/edivorce/apps/poc/views.py index f6f09fae..e2858bbe 100644 --- a/edivorce/apps/poc/views.py +++ b/edivorce/apps/poc/views.py @@ -8,7 +8,8 @@ from django import forms from django.http import HttpResponse from django.conf import settings -from edivorce.apps.core.efilinghub import EFilingHub, PACKAGE_PARTY_FORMAT +from edivorce.apps.core.utils.efiling_submission import EFilingSubmission +from edivorce.apps.core.utils.efiling_packaging import PACKAGE_PARTY_FORMAT from edivorce.apps.core.validators import file_scan_validation from edivorce.apps.core.models import Document @@ -74,7 +75,7 @@ def view_document_file(request, document_id): return response -class EfilingHubUpload(FormView): +class EFilingSubmissionUpload(FormView): form_class = MultipleUploadForm template_name = 'hub.html' success_url = '/poc/hub' @@ -99,7 +100,7 @@ class EfilingHubUpload(FormView): party['lastName'] = 'Test' parties.append(party) - hub = EFilingHub(initial_filing=True) + hub = EFilingSubmission(initial_filing=True) redirect, msg = hub.upload(request, post_files, parties=parties) if redirect: self.success_url = redirect