Skip to content

Commit 505d0e7

Browse files
Chris KimChris Kim
authored andcommitted
updates to tests and fixes. UI improvements and added more features such as party types for the required parties
1 parent 91f7a19 commit 505d0e7

45 files changed

Lines changed: 3722 additions & 1578 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎cookies.txt‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Netscape HTTP Cookie File
2+
# https://curl.se/docs/http-cookies.html
3+
# This file was generated by libcurl! Edit at your own risk.
4+
5+
#HttpOnly_127.0.0.1 FALSE / FALSE 1756916000 sessionid r3aljvmtjz19cqs1y5b6eq890rmzisfp

‎cookies_8001.txt‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Netscape HTTP Cookie File
2+
# https://curl.se/docs/http-cookies.html
3+
# This file was generated by libcurl! Edit at your own risk.
4+
5+
#HttpOnly_127.0.0.1 FALSE / FALSE 1756916514 sessionid mon47nwve77zcc1230qht008vjzb0ail

‎efile_app/db.sqlite3‎

0 Bytes
Binary file not shown.
-613 Bytes
Binary file not shown.
48 Bytes
Binary file not shown.
973 Bytes
Binary file not shown.

‎efile_app/efile/api/auth_views.py‎

Lines changed: 117 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ def get_tyler_token(request, state=None):
4444

4545
auth_tokens = request.session.get('auth_tokens', {})
4646
print(f"Auth tokens in session: {auth_tokens}")
47-
tyler_token = auth_tokens.get(f'TYLER-TOKEN-{state.upper()}')
47+
48+
# Try different Tyler token key formats
49+
tyler_token = (auth_tokens.get(f'TYLER-TOKEN-{state.upper()}') or
50+
auth_tokens.get(f'tyler_token_{state}') or
51+
auth_tokens.get(f'tyler-token-{state}'))
4852

4953
if tyler_token:
5054
return tyler_token
@@ -127,25 +131,40 @@ def user_profile(request):
127131
external_data = api_response.json()
128132
print(f"External data retrieved: {external_data}")
129133

134+
# Extract address information from external API response
135+
address_info = external_data.get('address', {})
136+
address_line1 = address_info.get('addressLine1', '')
137+
address_line2 = address_info.get('addressLine2', '')
138+
city = address_info.get('city', '')
139+
state = address_info.get('state', 'IL')
140+
zip_code = address_info.get('zipCode', '60601')
141+
phone_number = external_data.get('phoneNumber', '')
142+
130143
# Build user profile data combining local and external data
131144
user_data = {
132145
'external_firm_data': external_data,
133146
# Local user data (if authenticated)
134147
'id': request.user.id if request.user.is_authenticated else None,
135148
'username': request.user.username if request.user.is_authenticated else 'guest',
136-
'email': request.user.email if request.user.is_authenticated else None,
149+
'email': request.user.email if request.user.is_authenticated else request.session.get('user_email'),
137150
'first_name': request.user.first_name if request.user.is_authenticated else 'Demo',
138151
'last_name': request.user.last_name if request.user.is_authenticated else 'User',
139152
'date_joined': request.user.date_joined.isoformat() if request.user.is_authenticated else None,
140153
'last_login': request.user.last_login.isoformat() if (request.user.is_authenticated and request.user.last_login) else None,
154+
# Address information from external API
155+
'address': address_line1,
156+
'address_line2': address_line2,
157+
'city': city,
158+
'state': state,
159+
'zip': zip_code,
160+
'phone': phone_number,
141161
# Default location information
142162
'preferred_county': 'cook',
143-
'zip_code': '60601', # Downtown Chicago zip for demo
144-
'state': 'IL',
163+
'zip_code': zip_code, # Use actual zip from API
145164
'location': {
146165
'county': 'Cook County',
147166
'state': 'Illinois',
148-
'zip_code': '60601',
167+
'zip_code': zip_code,
149168
'available_counties': ['cook', 'dupage', 'kane', 'lake', 'mchenry', 'will']
150169
}
151170
}
@@ -158,12 +177,18 @@ def user_profile(request):
158177
'note': 'Suffolk eFile API requires authentication. Using demo data.',
159178
'id': request.user.id if request.user.is_authenticated else None,
160179
'username': request.user.username if request.user.is_authenticated else 'demo_user',
161-
'email': request.user.email if request.user.is_authenticated else 'demo@example.com',
180+
'email': request.user.email if request.user.is_authenticated else request.session.get('user_email', 'demo@example.com'),
162181
'first_name': request.user.first_name if request.user.is_authenticated else 'John',
163182
'last_name': request.user.last_name if request.user.is_authenticated else 'Doe',
183+
# Default address information for demo
184+
'address': '123 Main St',
185+
'address_line2': '',
186+
'city': 'Chicago',
187+
'state': 'IL',
188+
'zip': '60601',
189+
'phone': '(312) 555-1234',
164190
'preferred_county': 'cook',
165191
'zip_code': '60601', # Downtown Chicago zip for demo
166-
'state': 'IL',
167192
'location': {
168193
'county': 'Cook County',
169194
'state': 'Illinois',
@@ -194,12 +219,18 @@ def user_profile(request):
194219
'response_text': api_response.text[:200] if api_response.text else 'No response body',
195220
'id': request.user.id if request.user.is_authenticated else None,
196221
'username': request.user.username if request.user.is_authenticated else 'guest',
197-
'email': request.user.email if request.user.is_authenticated else None,
222+
'email': request.user.email if request.user.is_authenticated else request.session.get('user_email'),
198223
'first_name': request.user.first_name if request.user.is_authenticated else 'Demo',
199224
'last_name': request.user.last_name if request.user.is_authenticated else 'User',
225+
# Default address information
226+
'address': '123 Main St',
227+
'address_line2': '',
228+
'city': 'Chicago',
229+
'state': 'IL',
230+
'zip': '60601',
231+
'phone': '(312) 555-1234',
200232
'preferred_county': 'cook',
201233
'zip_code': '60601', # Downtown Chicago zip for demo
202-
'state': 'IL',
203234
'location': {
204235
'county': 'Cook County',
205236
'state': 'Illinois',
@@ -217,12 +248,18 @@ def user_profile(request):
217248
'external_api_error': f"Could not connect to Suffolk API: {str(e)}",
218249
'id': request.user.id if request.user.is_authenticated else None,
219250
'username': request.user.username if request.user.is_authenticated else 'guest',
220-
'email': request.user.email if request.user.is_authenticated else None,
251+
'email': request.user.email if request.user.is_authenticated else request.session.get('user_email'),
221252
'first_name': request.user.first_name if request.user.is_authenticated else 'Demo',
222253
'last_name': request.user.last_name if request.user.is_authenticated else 'User',
254+
# Default address information
255+
'address': '123 Main St',
256+
'address_line2': '',
257+
'city': 'Chicago',
258+
'state': 'IL',
259+
'zip': '60601',
260+
'phone': '(312) 555-1234',
223261
'preferred_county': 'cook',
224262
'zip_code': '60601', # Downtown Chicago zip for demo
225-
'state': 'IL',
226263
'location': {
227264
'county': 'Cook County',
228265
'state': 'Illinois',
@@ -322,10 +359,79 @@ def external_profile(request):
322359
except Exception as e:
323360
return AuthAPIViews.error_response(f"Error: {str(e)}")
324361

362+
@staticmethod
363+
@require_http_methods(["GET"])
364+
def tyler_token(request):
365+
"""Get Tyler token and API key for external form submissions"""
366+
try:
367+
# Get state and Tyler token dynamically
368+
state = AuthAPIViews.get_state_from_request(request)
369+
tyler_token = AuthAPIViews.get_tyler_token(request, state)
370+
api_key = getattr(settings, "SUFFOLK_EFILE_API_KEY", None)
371+
372+
return AuthAPIViews.success_response({
373+
'tyler_token': tyler_token,
374+
'api_key': api_key,
375+
'state': state
376+
})
377+
except Exception as e:
378+
return AuthAPIViews.error_response(f"Error: {str(e)}")
379+
380+
@staticmethod
381+
@require_http_methods(["GET"])
382+
def payment_accounts(request):
383+
"""Get payment accounts from Suffolk eFile API with proper authentication"""
384+
try:
385+
# Get state and Tyler token dynamically
386+
state = AuthAPIViews.get_state_from_request(request)
387+
tyler_token = AuthAPIViews.get_tyler_token(request, state)
388+
api_key = getattr(settings, "SUFFOLK_EFILE_API_KEY", None)
389+
390+
headers = {
391+
'Content-Type': 'application/json',
392+
'User-Agent': f'{state.title()}-eFile-Client/1.0',
393+
'X-API-Key': api_key if api_key else '',
394+
}
395+
396+
# Add Tyler token if available
397+
if tyler_token:
398+
headers[f'tyler-token-{state}'] = tyler_token
399+
else:
400+
# Log that no token was found for debugging
401+
print(f"Warning: No Tyler token found for state '{state}' in Suffolk eFile payment accounts request")
402+
403+
api_response = requests.get(
404+
f'https://efile-test.suffolklitlab.org/jurisdictions/{state}/payments/payment-accounts/',
405+
headers=headers,
406+
timeout=10
407+
)
408+
409+
if api_response.status_code == 200:
410+
payment_accounts = api_response.json()
411+
return AuthAPIViews.success_response(payment_accounts)
412+
elif api_response.status_code == 401:
413+
# Return empty list for unauthorized - frontend will show "add new payment method"
414+
return AuthAPIViews.success_response([])
415+
else:
416+
# Return error with status info
417+
return AuthAPIViews.error_response(
418+
f"Payment accounts API returned status {api_response.status_code}: {api_response.text[:200]}",
419+
api_response.status_code
420+
)
421+
422+
except requests.exceptions.Timeout:
423+
return AuthAPIViews.error_response("Payment accounts API request timed out", 408)
424+
except requests.exceptions.RequestException as e:
425+
return AuthAPIViews.error_response(f"Could not connect to payment accounts API: {str(e)}", 503)
426+
except Exception as e:
427+
return AuthAPIViews.error_response(f"Error: {str(e)}")
428+
325429

326430
# Individual view functions for URL mapping
327431
user_login = AuthAPIViews.user_login
328432
user_logout = AuthAPIViews.user_logout
329433
user_profile = AuthAPIViews.user_profile
330434
external_auth = AuthAPIViews.external_auth
331435
external_profile = AuthAPIViews.external_profile
436+
payment_accounts = AuthAPIViews.payment_accounts
437+
tyler_token = AuthAPIViews.tyler_token

‎efile_app/efile/api/case_type_config.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf import settings
66
import os
77

8-
@cache_page(60 * 15) # Cache for 15 minutes
8+
# @cache_page(60 * 15) # Cache for 15 minutes - temporarily disabled for development
99
def get_case_type_config(request):
1010
"""
1111
Serves the case type configuration from YAML file as JSON

‎efile_app/efile/api/dropdown_views.py‎

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,73 @@ def get_optional_services(request):
527527

528528
except Exception as e:
529529
return DropdownAPIViews.error_response(f"Error: {str(e)}")
530+
531+
@staticmethod
532+
@require_http_methods(["GET"])
533+
def get_party_types(request):
534+
"""Get available party types from Suffolk LIT Lab API based on case type"""
535+
try:
536+
auth_tokens = get_auth_tokens(request)
537+
538+
# Get required parameters
539+
court_code = request.GET.get('court')
540+
case_type_code = request.GET.get('case_type')
541+
jurisdiction = request.GET.get('jurisdiction', 'illinois')
542+
543+
if not court_code or not case_type_code:
544+
return DropdownAPIViews.error_response("Missing required court or case_type parameters")
545+
546+
# Make API call to external party types endpoint
547+
api_url = f"https://efile-test.suffolklitlab.org/jurisdictions/{jurisdiction}/codes/courts/{court_code}/case_types/{case_type_code}/party_types"
548+
549+
# Make the API request with auth tokens if available
550+
headers = {}
551+
if auth_tokens and 'token' in auth_tokens:
552+
headers['Authorization'] = f"Bearer {auth_tokens['token']}"
553+
554+
response = requests.get(api_url, headers=headers, timeout=10)
555+
556+
if response.status_code == 200:
557+
# Parse the API response - expecting list of party type objects
558+
api_data = response.json()
559+
560+
# Transform API data to our dropdown format
561+
party_types = []
562+
if isinstance(api_data, list):
563+
for party_type in api_data:
564+
if (isinstance(party_type, dict) and
565+
'code' in party_type and
566+
'name' in party_type):
567+
# Include all party types for now (no filtering)
568+
569+
party_types.append({
570+
'value': party_type['code'],
571+
'text': party_type['name'],
572+
'code': party_type['code'],
573+
'name': party_type['name'],
574+
'isRequired': party_type.get('isrequired', False),
575+
'isAvailableForNewParties': party_type.get('isAvailableForNewParties', True)
576+
})
577+
578+
# Sort alphabetically by name
579+
party_types.sort(key=lambda x: x['name'])
580+
581+
return DropdownAPIViews.success_response({
582+
'party_types': party_types,
583+
'count': len(party_types),
584+
'source': 'suffolk_api',
585+
'court': court_code,
586+
'case_type': case_type_code
587+
})
588+
else:
589+
# Log the error but don't expose sensitive details
590+
error_msg = f"External API returned status {response.status_code}"
591+
return DropdownAPIViews.error_response(error_msg)
592+
593+
except requests.RequestException as e:
594+
return DropdownAPIViews.error_response(f"Network error: Failed to fetch party types")
595+
except Exception as e:
596+
return DropdownAPIViews.error_response(f"Unexpected error: {str(e)}")
530597

531598

532599
# Individual view functions for URL mapping
@@ -536,3 +603,4 @@ def get_optional_services(request):
536603
get_courts = DropdownAPIViews.get_courts
537604
get_document_types = DropdownAPIViews.get_document_types
538605
get_optional_services = DropdownAPIViews.get_optional_services
606+
get_party_types = DropdownAPIViews.get_party_types

‎efile_app/efile/api/urls.py‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@
88
get_filing_types,
99
get_courts,
1010
get_document_types,
11-
get_optional_services
11+
get_optional_services,
12+
get_party_types
1213
)
1314
from .auth_views import (
1415
user_login,
1516
user_logout,
1617
user_profile,
1718
external_auth,
18-
external_profile
19+
external_profile,
20+
payment_accounts,
21+
tyler_token
1922
)
2023
from .filing_views import (
2124
get_filings,
@@ -39,6 +42,7 @@
3942
path('dropdowns/courts/', get_courts, name='courts'),
4043
path('dropdowns/document-types/', get_document_types, name='document_types'),
4144
path('dropdowns/optional-services/', get_optional_services, name='optional_services'),
45+
path('dropdowns/party-types/', get_party_types, name='party_types'),
4246

4347
# Form configuration endpoints
4448
path('form-config/', get_form_config, name='form_config'),
@@ -50,6 +54,10 @@
5054
path('auth/profile/', user_profile, name='profile'),
5155
path('auth/external/', external_auth, name='external_auth'),
5256
path('auth/external-profile/', external_profile, name='external_profile'),
57+
path('auth/tyler-token/', tyler_token, name='tyler_token'),
58+
59+
# Payment API endpoints
60+
path('payment-accounts/', payment_accounts, name='payment_accounts'),
5361

5462
# Filing API endpoints
5563
path('filings/', get_filings, name='filings_list'),

0 commit comments

Comments
 (0)