Skip to content

Commit 29c8763

Browse files
Merge pull request #68 from AustralianBioCommons/remove-bpa-register-orgs
AAI-352: Remove orgs from bpa registration page
2 parents 8ea88f6 + 919de3c commit 29c8763

6 files changed

Lines changed: 9 additions & 178 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,6 @@ cython_debug/
174174
.pypirc
175175

176176
.vscode/
177+
178+
# Local database file
179+
database.db

config.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from functools import lru_cache
2-
from typing import Dict, Optional
2+
from typing import Optional
33

44
from pydantic_settings import BaseSettings, SettingsConfigDict
55

@@ -19,26 +19,6 @@ class Settings(BaseSettings):
1919
# Note we process this separately in app startup as it needs
2020
# to be available before the app starts
2121
cors_allowed_origins: str
22-
organizations: Dict[str, str] = {
23-
"bpa-bioinformatics-workshop": "2024 Fungi Bioinformatics Workshop",
24-
"cipps": "ARC for Innovations in Peptide and Protein Science (CIPPS)",
25-
"ausarg": "Australian Amphibian and Reptile Genomics",
26-
"aus-avian": "Australian Avian Genomics",
27-
"aus-fish": "Australian Fish Genomics",
28-
"grasslands": "Australian Grasslands Initiative",
29-
"fungi": "Fungi Functional 'Omics",
30-
"forest-resilience": "Genomics for Forest Resilience",
31-
"bpa-great-barrier-reef": "Great Barrier Reef",
32-
"bpa-ipm": "Integrated Pest Management 'Omics",
33-
"bpa-omg": "Oz Mammals Genomics Initiative",
34-
"plant-pathogen": "Plant Pathogen 'Omics",
35-
"ppa": "Plant Protein Atlas",
36-
"australian-microbiome": "The Australian Microbiome Initiative",
37-
"threatened-species": "Threatened Species Initiative",
38-
"bpa-wheat-cultivars": "Wheat Cultivars",
39-
"bpa-wheat-pathogens-genomes": "Wheat Pathogens Genomes",
40-
"bpa-wheat-pathogens-transcript": "Wheat Pathogens Transcript",
41-
}
4222

4323
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
4424

routers/bpa_register.py

Lines changed: 3 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import logging
22
from datetime import datetime, timezone
33

4-
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
4+
from fastapi import APIRouter, Depends, HTTPException
55
from httpx import HTTPStatusError
66
from sqlmodel import Session
77
from starlette.responses import JSONResponse
88

9-
from auth.ses import EmailService
109
from auth0.client import Auth0Client, get_auth0_client
1110
from config import Settings, get_settings
1211
from db.models import BiocommonsUser, PlatformEnum
@@ -15,7 +14,7 @@
1514
from schemas.biocommons import Auth0UserData, BiocommonsRegisterData
1615
from schemas.bpa import BPARegistrationRequest
1716
from schemas.responses import RegistrationErrorResponse, RegistrationResponse
18-
from schemas.service import Resource, Service
17+
from schemas.service import Service
1918

2019
logger = logging.getLogger(__name__)
2120

@@ -27,57 +26,14 @@
2726
)
2827

2928

30-
def send_approval_email(registration: BPARegistrationRequest, bpa_resources: list[Resource]):
31-
email_service = EmailService()
32-
approver_email = "aai-dev@biocommons.org.au"
33-
subject = "New BPA User Access Request"
34-
35-
org_list_html = "".join(
36-
f"<li>{res.name} (ID: {res.id})</li>" for res in bpa_resources
37-
)
38-
39-
body_html = f"""
40-
<p>A new user has requested access to one or more organizations in the BPA service.</p>
41-
<p><strong>User:</strong> {registration.fullname} ({registration.email})</p>
42-
<p><strong>Requested access to:</strong></p>
43-
<ul>{org_list_html}</ul>
44-
<p>Please <a href='https://aaiportal.test.biocommons.org.au/requests'>log into the AAI Admin Portal</a> to review and approve access.</p>
45-
"""
46-
47-
email_service.send(approver_email, subject, body_html)
48-
49-
50-
def _get_bpa_resources(registration: BPARegistrationRequest, settings: Settings, update_time: datetime) -> list[Resource]:
51-
bpa_resources = []
52-
for org_id, is_selected in registration.organizations.items():
53-
if not is_selected:
54-
continue
55-
if org_id not in settings.organizations:
56-
raise HTTPException(
57-
status_code=400, detail=f"Invalid organization ID: {org_id}"
58-
)
59-
resource = Resource(
60-
id=org_id,
61-
name=settings.organizations[org_id],
62-
status="pending",
63-
last_updated=update_time,
64-
initial_request_time=update_time,
65-
updated_by="system",
66-
).model_dump(mode="json")
67-
bpa_resources.append(resource)
68-
return bpa_resources
69-
70-
7129
def _get_bpa_service_request(registration: BPARegistrationRequest, settings: Settings, update_time: datetime) -> Service:
72-
bpa_resources = _get_bpa_resources(registration, settings, update_time)
7330
return Service(
7431
name="Bioplatforms Australia Data Portal",
7532
id="bpa",
7633
initial_request_time=update_time,
7734
status="pending",
7835
last_updated=update_time,
7936
updated_by="system",
80-
resources=bpa_resources,
8137
)
8238

8339

@@ -90,12 +46,11 @@ def _get_bpa_service_request(registration: BPARegistrationRequest, settings: Set
9046
)
9147
async def register_bpa_user(
9248
registration: BPARegistrationRequest,
93-
background_tasks: BackgroundTasks,
9449
settings: Settings = Depends(get_settings),
9550
db_session: Session = Depends(get_db_session),
9651
auth0_client: Auth0Client = Depends(get_auth0_client)
9752
):
98-
"""Register a new BPA user with selected organization resources."""
53+
"""Register a new BPA user."""
9954
now = datetime.now(timezone.utc)
10055
bpa_service = _get_bpa_service_request(registration=registration, settings=settings, update_time=now)
10156

@@ -111,9 +66,6 @@ async def register_bpa_user(
11166
logger.info("Adding user to DB")
11267
_create_bpa_user_record(auth0_user_data, db_session)
11368

114-
if bpa_service.resources and settings.send_email:
115-
background_tasks.add_task(send_approval_email, registration, bpa_resources=bpa_service.resources)
116-
11769
return {"message": "User registered successfully", "user": auth0_user_data.model_dump(mode="json")}
11870

11971
# Return HTTP status errors as RegistrationErrorResponse

schemas/bpa.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from typing import Dict
2-
31
from pydantic import BaseModel, EmailStr
42

53
from schemas.biocommons import BiocommonsPassword, BiocommonsUsername
@@ -11,4 +9,3 @@ class BPARegistrationRequest(BaseModel):
119
email: EmailStr
1210
reason: str
1311
password: BiocommonsPassword
14-
organizations: Dict[str, bool]

tests/datagen.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,6 @@ def confirmPassword(cls, password: str) -> str:
109109
class BPARegistrationDataFactory(ModelFactory[BPARegistrationRequest]):
110110
"""Factory for generating BPA registration test data."""
111111

112-
@classmethod
113-
def get_default_organizations(cls) -> dict:
114-
"""Default organization selection."""
115-
return {
116-
"bpa-bioinformatics-workshop": True,
117-
"cipps": False,
118-
"ausarg": True,
119-
}
120-
121112
password = BiocommonsProviders.biocommons_password
122113
username = BiocommonsProviders.biocommons_username
123114

tests/test_bpa_register.py

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def valid_registration_data():
2828
email="test@example.com",
2929
reason="Need access to BPA resources",
3030
password="SecurePass123!",
31-
organizations=BPARegistrationDataFactory.get_default_organizations(),
3231
).model_dump()
3332

3433

@@ -50,22 +49,17 @@ def test_to_biocommons_register_data(valid_registration_data):
5049

5150

5251
def test_successful_registration(
53-
test_client_with_email, mocker, valid_registration_data,
54-
mock_auth0_client, test_db_session
52+
test_client, valid_registration_data, mock_auth0_client, test_db_session
5553
):
5654
"""Test successful user registration with BPA service"""
57-
test_client = test_client_with_email
5855
user_id = random_auth0_id()
5956
mock_auth0_client.create_user.return_value = Auth0UserDataFactory.build(user_id=user_id)
60-
mock_email_cls = mocker.patch("routers.bpa_register.EmailService", autospec=True)
61-
mock_email_cls.return_value.send.return_value = None
6257

6358
response = test_client.post("/bpa/register", json=valid_registration_data)
6459

6560
assert response.status_code == 200
6661
assert response.json()["message"] == "User registered successfully"
6762

68-
mock_email_cls.return_value.send.assert_called_once()
6963
# Check user is created in the database
7064
db_user = test_db_session.get(BiocommonsUser, user_id)
7165
assert db_user is not None
@@ -95,12 +89,7 @@ def test_successful_registration(
9589
assert bpa_service.status == "pending"
9690
assert bpa_service.last_updated is not None
9791
assert bpa_service.updated_by == "system"
98-
assert len(bpa_service.resources) == 2
99-
100-
for resource in bpa_service.resources:
101-
assert resource.last_updated is not None
102-
assert resource.initial_request_time is not None
103-
assert resource.updated_by == "system"
92+
assert len(bpa_service.resources) == 0
10493

10594
assert (
10695
called_data.user_metadata.bpa.registration_reason
@@ -165,25 +154,11 @@ def test_registration_auth0_error(
165154
assert response.json()["message"] == "Auth0 error: Something went wrong"
166155

167156

168-
def test_registration_with_invalid_organization(
169-
test_client, valid_registration_data
170-
):
171-
"""Test registration with invalid organization ID"""
172-
data = valid_registration_data.copy()
173-
data["organizations"] = {"invalid-org-id": True}
174-
175-
response = test_client.post("/bpa/register", json=data)
176-
177-
assert response.status_code == 400
178-
assert "Invalid organization ID" in response.json()["detail"]
179-
180-
181157
def test_registration_request_validation(test_client):
182158
"""Test request validation"""
183159
invalid_data = {
184160
"username": "testuser",
185161
"email": "invalid-email",
186-
"organizations": {},
187162
}
188163

189164
response = test_client.post("/bpa/register", json=invalid_data)
@@ -194,45 +169,6 @@ def test_registration_request_validation(test_client):
194169
assert any(error["field"] == "email" for error in error_data["field_errors"])
195170

196171

197-
def test_no_selected_organizations(
198-
test_client, test_db_session, mock_auth0_client, valid_registration_data
199-
):
200-
"""Test registration with no organizations selected"""
201-
data = valid_registration_data.copy()
202-
data["organizations"] = {
203-
"bpa-bioinformatics-workshop": False,
204-
"cipps": False,
205-
"ausarg": False,
206-
}
207-
user_data = Auth0UserDataFactory.build()
208-
mock_auth0_client.create_user.return_value = user_data
209-
210-
response = test_client.post("/bpa/register", json=data)
211-
212-
assert response.status_code == 200
213-
# Check user data sent to Auth0
214-
called_data = mock_auth0_client.create_user.call_args[0][0]
215-
bpa_service = called_data.app_metadata.services[0]
216-
assert len(bpa_service.resources) == 0
217-
218-
219-
def test_empty_organizations_dict(
220-
test_client, test_db_session, mock_auth0_client, valid_registration_data
221-
):
222-
"""Test registration with empty organizations dictionary"""
223-
data = valid_registration_data.copy()
224-
data["organizations"] = {}
225-
user_data = Auth0UserDataFactory.build()
226-
mock_auth0_client.create_user.return_value = user_data
227-
228-
response = test_client.post("/bpa/register", json=data)
229-
230-
assert response.status_code == 200
231-
called_data = mock_auth0_client.create_user.call_args[0][0]
232-
bpa_service = called_data.app_metadata.services[0]
233-
assert len(bpa_service.resources) == 0
234-
235-
236172
def test_registration_email_format(test_client, valid_registration_data):
237173
"""Test email format validation"""
238174
data = valid_registration_data.copy()
@@ -244,31 +180,3 @@ def test_registration_email_format(test_client, valid_registration_data):
244180
details = response.json()
245181
errors = details["field_errors"]
246182
assert "email" in [error["field"] for error in errors]
247-
248-
249-
def test_all_organizations_selected(
250-
test_client_with_email,
251-
test_db_session,
252-
mock_settings,
253-
mocker,
254-
mock_auth0_client,
255-
valid_registration_data,
256-
):
257-
"""Test registration with all organizations selected"""
258-
data = valid_registration_data.copy()
259-
data["organizations"] = {k: True for k in mock_settings.organizations.keys()}
260-
261-
user_data = Auth0UserDataFactory.build()
262-
mock_auth0_client.create_user.return_value = user_data
263-
264-
email_service_cls = mocker.patch("routers.bpa_register.EmailService", autospec=True)
265-
email_service_cls.return_value.send.return_value = True
266-
267-
response = test_client_with_email.post("/bpa/register", json=data)
268-
269-
assert response.status_code == 200
270-
called_data = mock_auth0_client.create_user.call_args[0][0]
271-
bpa_service = called_data.app_metadata.services[0]
272-
assert len(bpa_service.resources) == len(mock_settings.organizations)
273-
274-
email_service_cls.return_value.send.assert_called_once()

0 commit comments

Comments
 (0)