Browse Source

Re-arranged efilng code

pull/172/head
Michael Olund 5 years ago
parent
commit
87c3310b0d
9 changed files with 304 additions and 286 deletions
  1. +9
    -7
      edivorce/apps/core/tests/test_efiling_hub.py
  2. +1
    -1
      edivorce/apps/core/tests/test_filing.py
  3. +0
    -105
      edivorce/apps/core/utils/efiling_documents.py
  4. +2
    -165
      edivorce/apps/core/utils/efiling_packaging.py
  5. +178
    -0
      edivorce/apps/core/utils/efiling_submission.py
  6. +108
    -3
      edivorce/apps/core/views/efiling.py
  7. +1
    -1
      edivorce/apps/core/views/main.py
  8. +1
    -1
      edivorce/apps/poc/urls.py
  9. +4
    -3
      edivorce/apps/poc/views.py

+ 9
- 7
edivorce/apps/core/tests/test_efiling_hub.py View File

@ -7,7 +7,8 @@ from django.test import TransactionTestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.core.files.uploadedfile import SimpleUploadedFile 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 = { SAMPLE_TOKEN_RESPONSE = {
"access_token": "klkadlfjadsfkj", "access_token": "klkadlfjadsfkj",
@ -36,7 +37,7 @@ GENERATE_URL_RESPONSE_ERROR = {
} }
class EFilingHubTests(TransactionTestCase):
class EFilingSubmissionTests(TransactionTestCase):
def setUp(self): def setUp(self):
# Every test needs access to the request factory. # Every test needs access to the request factory.
@ -47,7 +48,8 @@ class EFilingHubTests(TransactionTestCase):
middleware.process_request(self.request) middleware.process_request(self.request)
self.request.session.save() 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): def _mock_response(self, status=200, text="Text", json_data=None, raise_for_status=None):
mock_resp = mock.Mock() mock_resp = mock.Mock()
@ -192,7 +194,7 @@ class EFilingHubTests(TransactionTestCase):
parties.append(party) parties.append(party)
location = '6011' 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.assertTrue(package)
self.assertEqual(package['filingPackage']['documents'][0]['name'], 'form_0.pdf') self.assertEqual(package['filingPackage']['documents'][0]['name'], 'form_0.pdf')
@ -205,7 +207,7 @@ class EFilingHubTests(TransactionTestCase):
with self.assertRaises(PermissionDenied): with self.assertRaises(PermissionDenied):
redirect, msg = self.hub.upload(self.request, None) 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): def test_upload_success(self, mock_get_api):
self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9'
with self.settings(DEPLOYMENT_TYPE='prod'): with self.settings(DEPLOYMENT_TYPE='prod'):
@ -219,7 +221,7 @@ class EFilingHubTests(TransactionTestCase):
self.assertEqual(redirect, GENERATE_URL_RESPONSE['efilingUrl']) self.assertEqual(redirect, GENERATE_URL_RESPONSE['efilingUrl'])
self.assertEqual(msg, 'success') 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): def test_upload_failed_initial_upload(self, mock_get_api):
self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9'
with self.settings(DEPLOYMENT_TYPE='prod'): with self.settings(DEPLOYMENT_TYPE='prod'):
@ -231,7 +233,7 @@ class EFilingHubTests(TransactionTestCase):
self.assertFalse(redirect) 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): def test_upload_failed_generate_url(self, mock_get_api):
self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9' self.request.session['bcgov_userguid'] = '70fc9ce1-0cd6-4170-b842-bbabb88452a9'
with self.settings(DEPLOYMENT_TYPE='prod'): with self.settings(DEPLOYMENT_TYPE='prod'):


+ 1
- 1
edivorce/apps/core/tests/test_filing.py View File

@ -1,7 +1,7 @@
from django.test import TestCase from django.test import TestCase
from edivorce.apps.core.models import BceidUser, Document, UserResponse 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 from edivorce.apps.core.utils.user_response import get_data_for_user


edivorce/apps/core/utils/cso_filing.py → edivorce/apps/core/utils/efiling_documents.py View File

@ -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 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): def forms_to_file(responses_dict, initial=False):
generated = [] generated = []
uploaded = [] uploaded = []

edivorce/apps/core/efilinghub.py → edivorce/apps/core/utils/efiling_packaging.py View File

@ -3,11 +3,8 @@ import hashlib
import json import json
import logging import logging
import re import re
import requests
import uuid
from django.conf import settings from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.urls import reverse from django.urls import reverse
from edivorce.apps.core.models import Document from edivorce.apps.core.models import Document
@ -103,127 +100,12 @@ NJF_JSON_FORMAT = {
} }
class EFilingHub:
class EFilingPackaging:
def __init__(self, initial_filing): 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.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 = PACKAGE_FORMAT.copy()
package['filingPackage']['court']['location'] = location package['filingPackage']['court']['location'] = location
package['filingPackage']['documents'] = documents package['filingPackage']['documents'] = documents
@ -426,48 +308,3 @@ class EFilingHub:
def get_location(self, responses): def get_location(self, responses):
location_name = responses.get('court_registry_for_filing', '') location_name = responses.get('court_registry_for_filing', '')
return list_of_registries.get(location_name, '0000') 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}'

+ 178
- 0
edivorce/apps/core/utils/efiling_submission.py View File

@ -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}'

+ 108
- 3
edivorce/apps/core/views/efiling.py View File

@ -1,10 +1,17 @@
import base64
import random
from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from ..decorators import prequal_completed 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 from ..utils.user_response import get_data_for_user
@ -21,9 +28,11 @@ def submit_final_files(request):
def _submit_files(request, initial=False): def _submit_files(request, initial=False):
""" App flow logic """
responses_dict = get_data_for_user(request.user) 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: if hub_redirect_url:
return redirect(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) 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 @login_required
@prequal_completed @prequal_completed
def after_submit_initial_files(request): def after_submit_initial_files(request):
@ -66,8 +124,55 @@ def _after_submit_files(request, initial=False):
else: else:
next_page = 'next_steps' 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 responses_dict['active_page'] = next_page
return redirect(reverse('dashboard_nav', kwargs={'nav_step': next_page}), context=responses_dict) 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()

+ 1
- 1
edivorce/apps/core/views/main.py View File

@ -6,7 +6,7 @@ from django.contrib.auth.decorators import login_required
from edivorce.apps.core.utils.derived import get_derived_data from edivorce.apps.core.utils.derived import get_derived_data
from ..decorators import intercept, prequal_completed 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.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.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 from ..utils.template_step_order import template_step_order


+ 1
- 1
edivorce/apps/poc/urls.py View File

@ -5,7 +5,7 @@ from edivorce.apps.poc import views
urlpatterns = [ urlpatterns = [
url(r'scan', login_required(views.UploadScan.as_view()), name="poc-scan"), 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<document_id>\d+)', login_required(views.view_document_file), name="poc-storage-download"), url(r'storage/doc/(?P<document_id>\d+)', login_required(views.view_document_file), name="poc-storage-download"),
url(r'storage/delete/(?P<pk>\d+)', login_required(views.UploadStorageDelete.as_view()), name="poc-storage-delete"), url(r'storage/delete/(?P<pk>\d+)', login_required(views.UploadStorageDelete.as_view()), name="poc-storage-delete"),
url(r'storage', login_required(views.UploadStorage.as_view()), name="poc-storage"), url(r'storage', login_required(views.UploadStorage.as_view()), name="poc-storage"),

+ 4
- 3
edivorce/apps/poc/views.py View File

@ -8,7 +8,8 @@ from django import forms
from django.http import HttpResponse from django.http import HttpResponse
from django.conf import settings 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.validators import file_scan_validation
from edivorce.apps.core.models import Document from edivorce.apps.core.models import Document
@ -74,7 +75,7 @@ def view_document_file(request, document_id):
return response return response
class EfilingHubUpload(FormView):
class EFilingSubmissionUpload(FormView):
form_class = MultipleUploadForm form_class = MultipleUploadForm
template_name = 'hub.html' template_name = 'hub.html'
success_url = '/poc/hub' success_url = '/poc/hub'
@ -99,7 +100,7 @@ class EfilingHubUpload(FormView):
party['lastName'] = 'Test' party['lastName'] = 'Test'
parties.append(party) parties.append(party)
hub = EFilingHub(initial_filing=True)
hub = EFilingSubmission(initial_filing=True)
redirect, msg = hub.upload(request, post_files, parties=parties) redirect, msg = hub.upload(request, post_files, parties=parties)
if redirect: if redirect:
self.success_url = redirect self.success_url = redirect


Loading…
Cancel
Save