Skip to content
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
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ A minimal Django app for form submission and review. The Django project lives un
- __2) Initialize the database__
```bash
cd efile_app
uv run python manage.py migrate
uv run python manage.py migrate --run-syncdb
```

- __3) Run the development server__
Expand All @@ -47,15 +47,15 @@ A minimal Django app for form submission and review. The Django project lives un
```bash
source .venv/bin/activate
cd efile_app
python manage.py migrate
python manage.py migrate --run-syncdb
python manage.py runserver
```

- Windows (PowerShell):
```powershell
.venv\Scripts\Activate.ps1
cd efile_app
python manage.py migrate
python manage.py migrate --run-syncdb
python manage.py runserver
```

Expand Down
1 change: 0 additions & 1 deletion efile_app/efile/admin.py

This file was deleted.

69 changes: 17 additions & 52 deletions efile_app/efile/api/auth_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@

import requests
from django.conf import settings
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth import authenticate, login
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from requests.exceptions import RequestException, Timeout

from efile.api.suffolk_api_views import get_tyler_token
from efile.utils.jurisdiction_stuff import get_jurisdiction_from_request

from .base import APIResponseMixin

logger = logging.getLogger(__name__)
Expand All @@ -20,38 +23,6 @@
class AuthAPIViews(APIResponseMixin):
"""API views for authentication"""

@staticmethod
def get_jurisdiction_from_request(request):
"""Extract jurisdiction from request URL or parameters"""
# Try to get jurisdiction from query parameters first
jurisdiction = request.GET.get("jurisdiction")
if jurisdiction:
return jurisdiction.lower()
return None

@staticmethod
def get_tyler_token(request, jurisdiction=None):
"""Helper method to retrieve Tyler token from various sources"""
if jurisdiction is None:
jurisdiction = AuthAPIViews.get_jurisdiction_from_request(request)

if request.user.is_authenticated and hasattr(request.user, "tyler_token") and request.user.tyler_token:
return request.user.tyler_token

# Fallback to session
# TODO(brycew): should this ever happen?
auth_tokens = request.session.get("auth_tokens", {})
logger.debug(f"Auth tokens in session: {auth_tokens}")

# Try different Tyler token key formats
tyler_token = (
auth_tokens.get(f"TYLER-TOKEN-{jurisdiction.upper()}")
or auth_tokens.get(f"tyler_token_{jurisdiction}")
or auth_tokens.get(f"tyler-token-{jurisdiction}")
)

return tyler_token

@staticmethod
@require_http_methods(["POST"])
@csrf_exempt
Expand All @@ -71,7 +42,6 @@ def user_login(request):

if user is not None:
login(request, user)
request.session["user_email"] = user.email
return AuthAPIViews.success_response(
{"user_id": user.id, "username": user.username, "email": user.email, "is_authenticated": True},
"Login successful",
Expand All @@ -89,12 +59,10 @@ def user_login(request):
@csrf_exempt
def user_logout(request):
"""Handle user logout"""
from efile.authentication import SuffolkEFileBackend

try:
logout(request)
session_keys_to_keep = ["csrftoken"]
session_data = {k: v for k, v in request.session.items() if k in session_keys_to_keep}
request.session.clear()
request.session.update(session_data)
SuffolkEFileBackend.logout(request)
return AuthAPIViews.success_response({}, "Logout successful")
except Exception as e:
return AuthAPIViews.error_response(f"Error: {str(e)}")
Expand All @@ -106,8 +74,8 @@ def user_profile(request):
try:
# TODO(brycew): get some of this from the existing logged in user
# Get jurisdiction and Tyler token dynamically
jurisdiction = AuthAPIViews.get_jurisdiction_from_request(request)
tyler_token = AuthAPIViews.get_tyler_token(request, jurisdiction)
jurisdiction = get_jurisdiction_from_request(request)
tyler_token = get_tyler_token(request, jurisdiction)
api_key = getattr(settings, "SUFFOLK_EFILE_API_KEY", None)

headers = {
Expand All @@ -116,18 +84,15 @@ def user_profile(request):
"X-API-Key": api_key if api_key else "",
}

auth_tokens = request.session.get("auth_tokens", {})
logger.debug(f"Auth tokens in session: {auth_tokens}")

# Add Tyler token if available
if tyler_token:
headers[f"tyler-token-{jurisdiction}"] = tyler_token
else:
# Log that no token was found for debugging
logger.info("No Tyler token found for state '%s' in Suffolk eFile API request", jurisdiction)

if auth_tokens.get(f"TYLER-ID-{jurisdiction.upper()}"):
headers[f"TYLER-ID-{jurisdiction.upper()}"] = auth_tokens.get(f"TYLER-ID-{jurisdiction.upper()}")
if request.user.tyler_user_id:
headers[f"TYLER-ID-{jurisdiction.upper()}"] = request.user.tyler_user_id

url = f"{settings.EFSP_URL}/jurisdictions/{jurisdiction}/firmattorneyservice/firm"
logger.debug("GET %s header keys=%s", url, list(headers.keys()))
Expand Down Expand Up @@ -198,8 +163,8 @@ def user_profile(request):
return AuthAPIViews.error_response("Unable to retrieve profile", 500)
except Timeout:
return AuthAPIViews.error_response("External API request timed out", 408)
except Exception as e:
logger.warn("Request exception: %s", str(e))
except Exception:
logger.exception("Request exception")
return AuthAPIViews.error_response("Request Exception", 500)

@staticmethod
Expand Down Expand Up @@ -238,8 +203,8 @@ def tyler_token(request):
"""Get Tyler token and API key for external form submissions"""
try:
# Get jurisdiction and Tyler token dynamically
jurisdiction = AuthAPIViews.get_jurisdiction_from_request(request)
tyler_token = AuthAPIViews.get_tyler_token(request, jurisdiction)
jurisdiction = get_jurisdiction_from_request(request)
tyler_token = get_tyler_token(request, jurisdiction)
api_key = getattr(settings, "SUFFOLK_EFILE_API_KEY", None)

return AuthAPIViews.success_response(
Expand All @@ -254,8 +219,8 @@ def payment_accounts(request):
"""Get payment accounts from Suffolk eFile API with proper authentication"""
try:
# Get jurisdiction and Tyler token dynamically
jurisdiction = AuthAPIViews.get_jurisdiction_from_request(request)
tyler_token = AuthAPIViews.get_tyler_token(request, jurisdiction)
jurisdiction = get_jurisdiction_from_request(request)
tyler_token = get_tyler_token(request, jurisdiction)
api_key = getattr(settings, "SUFFOLK_EFILE_API_KEY", None)

headers = {
Expand Down
18 changes: 0 additions & 18 deletions efile_app/efile/api/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,3 @@ def success_response(data, message=None):
def error_response(error_message, status_code=400):
"""Return an error API response"""
return JsonResponse({"success": False, "error": error_message}, status=status_code)


def get_auth_tokens(request):
"""Helper function to get auth tokens from session"""
return request.session.get("auth_tokens", None)


def validate_request(request, required_params=None):
"""Validate API request and return any missing parameters"""
if required_params is None:
required_params = []

missing_params = []
for param in required_params:
if param not in request.GET and param not in request.POST:
missing_params.append(param)

return missing_params
30 changes: 1 addition & 29 deletions efile_app/efile/api/dropdown_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.views.decorators.http import require_http_methods

from ..utils.zip_to_county_il import get_county_by_zip
from .base import APIResponseMixin, get_auth_tokens
from .base import APIResponseMixin

logger = logging.getLogger(__name__)

Expand All @@ -24,8 +24,6 @@ class DropdownAPIViews(APIResponseMixin):
def get_case_categories(request):
"""Get available case categories from Suffolk LIT Lab API"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters
court_code = request.GET.get("court")
jurisdiction = request.GET.get("jurisdiction", "illinois")
Expand All @@ -38,8 +36,6 @@ def get_case_categories(request):

# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

logger.debug("GET %s header keys=%s", api_url, list(headers.keys()))
response = requests.get(api_url, headers=headers, timeout=10)
Expand Down Expand Up @@ -78,8 +74,6 @@ def get_case_categories(request):
def get_case_types(request):
"""Get case types based on selected category from Suffolk LIT Lab API"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters
court_code = request.GET.get("court")
category_id = request.GET.get("parent") # category_id from case category dropdown
Expand All @@ -97,8 +91,6 @@ def get_case_types(request):

# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

logger.debug("GET %s header keys=%s", api_url, list(headers.keys()))
response = requests.get(api_url, headers=headers, timeout=10)
Expand Down Expand Up @@ -131,8 +123,6 @@ def get_case_types(request):
def get_filing_types(request):
"""Get filing types based on selected case type from Suffolk LIT Lab API"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters - support both parameter names for flexibility
court_code = request.GET.get("court")
case_type_id = request.GET.get("case_type") or request.GET.get("parent") # Support both flows
Expand Down Expand Up @@ -165,8 +155,6 @@ def get_filing_types(request):

# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

logger.debug("GET %s header keys=%s", api_url, list(headers.keys()))
response = requests.get(api_url, headers=headers, timeout=10)
Expand Down Expand Up @@ -203,8 +191,6 @@ def get_filing_types(request):
def get_courts(request):
"""Get available courts based on user location/preferences"""
try:
auth_tokens = get_auth_tokens(request)

jurisdiction = request.GET.get("jurisdiction", "")
user_zip = request.GET.get("user_zip")
user_county = request.GET.get("user_county")
Expand All @@ -215,8 +201,6 @@ def get_courts(request):
try:
# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

logger.debug("GET %s header keys=%s", api_url, list(headers.keys()))
logger.debug("GET %s header keys=%s", api_url, list(headers.keys()))
Expand Down Expand Up @@ -463,8 +447,6 @@ def _prioritize_courts_by_location(courts, user_zip=None, user_county=None):
def get_document_types(request):
"""Get document types based on selected filing type from Suffolk LIT Lab API"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters
court_code = request.GET.get("court")
filing_type_id = request.GET.get("parent") # filing type ID from filing type dropdown
Expand All @@ -485,8 +467,6 @@ def get_document_types(request):

# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

response = requests.get(api_url, headers=headers, timeout=10)

Expand Down Expand Up @@ -520,8 +500,6 @@ def get_document_types(request):
def get_optional_services(request):
"""Get optional services for a filing type from Suffolk LIT Lab API"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters
court_code = request.GET.get("court")
filing_type_id = request.GET.get("filing_type_id")
Expand All @@ -543,8 +521,6 @@ def get_optional_services(request):
try:
# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

response = requests.get(api_url, headers=headers, timeout=10)

Expand Down Expand Up @@ -596,8 +572,6 @@ def get_optional_services(request):
def get_party_types(request):
"""Get available party types from Suffolk LIT Lab API based on case type"""
try:
auth_tokens = get_auth_tokens(request)

# Get required parameters
court_code = request.GET.get("court")
case_type_code = request.GET.get("case_type")
Expand All @@ -612,8 +586,6 @@ def get_party_types(request):

# Make the API request with auth tokens if available
headers = {}
if auth_tokens and "token" in auth_tokens:
headers["Authorization"] = f"Bearer {auth_tokens['token']}"

response = requests.get(api_url, headers=headers, timeout=10)

Expand Down
Loading