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
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Below are the steps to start all services. For other methods, please consult the
1. Set-up environement variables


`VITE_DA_SIMU`, `VITE_SNCF_SIMU` & `VITE_POWERGRID_SIMU` are the simulators endpoints.
`VITE_POWERGRID_SIMU` is the simulator's endpoint.
Put for each UC the corresponding IP address.

Examples:
Expand Down Expand Up @@ -101,6 +101,11 @@ cd config/dev/cab-standalone
- After adding the frontend URL, save the changes to update the client settings.

4. Load resources
**WARINING:** You need to restart the frontend after updating the URL on keycloak do it before loading the resources.
```sh
docker restart frontend
```

```sh
cd resources
./loadTestConf.sh
Expand Down
8 changes: 4 additions & 4 deletions backend/cab_common/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ def mock_introspect(token):
"jti": "91ee1b13-35c7-4509-a306-033a74abb9d4",
"iss": "http://192.168.208.57:3200/auth/realms/dev",
"aud": "account",
"sub": "sncf_user",
"sub": "railway_user",
"typ": "Bearer",
"azp": "opfab-client",
"session_state": "420008f7-52de-4174-a7fa-36afcc5ec78e",
"preferred_username": "sncf_user",
"preferred_username": "railway_user",
"email_verified": False,
"acr": "1",
"realm_access": {"roles": ["offline_access", "uma_authorization"]},
Expand All @@ -47,9 +47,9 @@ def mock_introspect(token):
},
"scope": "email profile",
"sid": "420008f7-52de-4174-a7fa-36afcc5ec78e",
"entitiesId": "SNCF",
"entitiesId": "Railway",
"client_id": "opfab-client",
"username": "sncf_user",
"username": "railway_user",
"active": True,
}
return valid_introspect
Expand Down
2 changes: 1 addition & 1 deletion backend/cab_common/tests/test_get_use_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def test_get_use_cases_valid_token(app, mock_keycloak_introspect, valid_token):
use_cases = get_use_cases()

# Assert the expected result
assert use_cases == ["SNCF"]
assert use_cases == ["Railway"]


def test_get_use_cases_invalid_token(app, mock_keycloak_introspect):
Expand Down
2 changes: 1 addition & 1 deletion backend/context-service/api/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class MetadataSchema(Schema):

class ContextIn(Schema):
use_case = String(
required=True, validate=OneOf(["PowerGrid", "SNCF", "DA", "ORANGE"])
required=True, validate=OneOf(["PowerGrid", "Railway", "ATM"])
)
date = DateTime(format="iso")
data = Dict()
Expand Down
8 changes: 8 additions & 0 deletions backend/context-service/resources/ATM/context_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# backend/context-service/resources/ATM/context_manager.py

from api.context_manager.base_context_manager import BaseContextManager

class ATMContextManager(BaseContextManager):
def __init__(self):
super().__init__()
self.use_case = "ATM"
8 changes: 8 additions & 0 deletions backend/context-service/resources/ATM/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# backend/context-service/resources/ATM/schemas.py

from api.schemas import MetadataSchema
from apiflask.fields import Dict, String

class MetadataSchemaATM(MetadataSchema):
topology = String(allow_none=False)
observation = Dict(allow_none=False)
8 changes: 8 additions & 0 deletions backend/context-service/resources/Railway/context_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# backend/context-service/resources/Railway/context_manager.py

from api.context_manager.base_context_manager import BaseContextManager

class RailwayContextManager(BaseContextManager):
def __init__(self):
super().__init__()
self.use_case = "Railway"
10 changes: 10 additions & 0 deletions backend/context-service/resources/Railway/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# backend/context-service/resources/Railway/schemas.py

from api.schemas import MetadataSchema
from apiflask.fields import Dict, String, List, Integer

class MetadataSchemaRailway(MetadataSchema):
trains = List(Dict(), required=False)
list_of_target = Dict(required=False)
direction_agents = List(Integer(), required=False)
position_agents = Dict(required=False)
4 changes: 2 additions & 2 deletions backend/context-service/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def publisher_test_auth_mocker(client, mocker):
"scope": "email profile",
"sid": "c8f122de-77aa-46e5-8e0f-37516e0f2933",
"groups": "Dispatcher;ReadOnly;Supervisor",
"entitiesId": "SNCF;ORANGE;DA;PowerGrid",
"entitiesId": "Railway;ATM;PowerGrid",
"client_id": "opfab-client",
"username": "publisher_test",
"active": True,
Expand Down Expand Up @@ -137,7 +137,7 @@ def create_contexts(client, publisher_test_auth_mocker):
}
]
},
"use_case": "SNCF",
"use_case": "Railway",
}

client.post("/api/v1/contexts", headers=headers, json=context_data)
Expand Down
19 changes: 19 additions & 0 deletions backend/event-service/resources/ATM/event_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# backend/event-service/resources/ATM/event_manager.py

from api.event_manager.base_event_manager import BaseEventManager

class ATMEventManager(BaseEventManager):
def __init__(self):
super().__init__()
self.use_case = "ATM"
self.use_case_process = "cabProcess"

# Optional: Customize Event Uniqueness
def get_unique_fields(self, data):
"""
Override to specify unique fields for event uniqueness.

This method specifies the fields on which InteractiveAI will ensure event uniqueness.
"""
input_line = data["data"].get("line")
return {"line": input_line}
17 changes: 17 additions & 0 deletions backend/event-service/resources/ATM/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# backend/event-service/resources/ATM/schemas.py

from apiflask.fields import Float, String, Dict
from apiflask.validators import OneOf
from api.schemas import MetadataSchema

class MetadataSchemaATM(MetadataSchema):
event_type = String(
required=True,
validate=OneOf(["KPI", "anticipation", "agent", "consignation"]),
)
creation_date = String()
zone = String(validate=OneOf(["Est", "Ouest", "Centre"]))
line = String(required=True)
flux = Float()
kpis = Dict(required=True)
event_context = String()
15 changes: 15 additions & 0 deletions backend/event-service/resources/Railway/event_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# backend/event-service/resources/Railway/event_manager.py

from api.event_manager.base_event_manager import BaseEventManager

class RailwayEventManager(BaseEventManager):
def __init__(self):
super().__init__()
self.use_case = "Railway"
self.use_case_process = "cabProcess"

# Optional: Customize Event Uniqueness
def get_unique_fields(self, data):
id_train = data["data"].get("id_train")
event_type = data["data"].get("event_type")
return {"id_train": id_train, "event_type": event_type}
21 changes: 21 additions & 0 deletions backend/event-service/resources/Railway/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# backend/event-service/resources/Railway/schemas.py

from apiflask.fields import Float, String, Dict, List, Integer
from apiflask.validators import OneOf
from api.schemas import MetadataSchema

class MetadataSchemaRailway(MetadataSchema):
agent_id = String(allow_none=True, required=True)
event_type = String(required=True)
agent_position = List(
Integer(allow_none=True), allow_none=True, default=None
)
delay = Integer(required=True)
id_train = String(allow_none=True, required=True)
malfunction_stop_position = List(Integer(allow_none=True), allow_none=True)
num_rame = String(allow_none=True, default=None)
tmp_rame = String(allow_none=True, default=None)
travel_plan = List(Dict(), allow_none=True)
longitude = Float(allow_none=True, default=None)
latitude = Float(allow_none=True, default=None)
simulation_name = String(allow_none=True, default=None)
2 changes: 1 addition & 1 deletion backend/event-service/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def create_events(client, create_usecases, PowerGrid_auth_mocker):
)
event2 = EventModel(
id_event="456",
use_case="DA",
use_case="ATM",
title="Test Event 2",
description="This is another test event",
start_date=datetime.now(),
Expand Down
6 changes: 3 additions & 3 deletions backend/event-service/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from settings import logger

POWERGRID_BEARER_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJSbXFOVTNLN0x4ck5SRmtIVTJxcTZZcTEya1RDaXNtRkw5U2NwbkNPeDBjIn0.eyJleHAiOjE2ODQzMzMyNjEsImlhdCI6MTY4MzcyODQ2MSwianRpIjoiNzE2YjAyZDQtMjliYS00MWJkLTg1YjItODAwNGNlYzFhMDMzIiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjExLjk1OjMyMDAvcmVhbG1zL2RldiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJydGVfdXNlciIsInR5cCI6IkJlYXJlciIsImF6cCI6Im9wZmFiLWNsaWVudCIsInNlc3Npb25fc3RhdGUiOiI4OTc2YjEyNS0zOWE4LTRiZGYtYjUyMy03ZTBkY2JjZGQzYjQiLCJhY3IiOiIxIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJzaWQiOiI4OTc2YjEyNS0zOWE4LTRiZGYtYjUyMy03ZTBkY2JjZGQzYjQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImdyb3VwcyI6IkRpc3BhdGNoZXI7UmVhZE9ubHk7U3VwZXJ2aXNvciIsInByZWZlcnJlZF91c2VybmFtZSI6InJ0ZV91c2VyIiwiZ2l2ZW5fbmFtZSI6IiIsImVudGl0aWVzSWQiOiJSVEUiLCJmYW1pbHlfbmFtZSI6IiJ9.j-_kiNnn5jQtUBMZ-oaeWVVfZLM1dWLFjRYKfL9pkpklG-CAVl1CuUQE969YkaPZLD4TtXaiNy02LhkIWmSwQuks2lH5_dtUlCBlpIouD1liDxg1g_oXn_m3vKwzDQ03KeeVC03BCMJR8gDTED80U-vjXT33-BngpjMP2rFMZRiZIJO_BB4GnIf55dnazWj8jbp0MVZYS9fuNeuLLrRgMevGDn5s-AlznmWLce1K6P882StmhI0unRXVOTRae8xRvDkk0BJ545K9FtLoZtgOeyEw7JrvElkPMqWKOy3R5hmpJENZSV1zCMBdXusVi7GTyn4denCqA7yYerWi_yaITg"
DA_BEARER_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJSbXFOVTNLN0x4ck5SRmtIVTJxcTZZcTEya1RDaXNtRkw5U2NwbkNPeDBjIn0.eyJleHAiOjE2ODQ0MDEyMTksImlhdCI6MTY4Mzc5NjQxOSwianRpIjoiYTI4NzM0ZjYtZjVjOC00MTMwLThmYjctNTczZDc1YzM5ZDhjIiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjExLjk1OjMyMDAvcmVhbG1zL2RldiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJkYV91c2VyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib3BmYWItY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImJkM2I4NjEwLTFkMDUtNGJkZC05MTZiLTYxZGNmZTZkNWU3MiIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImJkM2I4NjEwLTFkMDUtNGJkZC05MTZiLTYxZGNmZTZkNWU3MiIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZ3JvdXBzIjoiUlRFO0FETUlOO1JlYWRPbmx5IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGFfdXNlciIsImVudGl0aWVzSWQiOiJEQSJ9.RKl9ndaXW_EdMW81YRBxuwQhcRaZwvlfSG1H0ms1ElySp-XGnunvdNuj6VLwB56_wjdijPUnqOrKAsYMxa9lGipUzeAIdbPFojO1Et1IxGQSyqxJTX9ngpSQi3btJM3eP1bQ3bHSLNKIdSpZrCdhhxP8-s6vHa__7RcIMxSBvYjX-tT97qQBubqqHdSouAJP1RZYn1_G8T6Pzs1hK2RXseMRYvBUAtXD24-Lk9IaRB9GUO5P9MCb_VldqUEPAWM5rVkjxrojAUB0OM1NGcge1jiQotHyeqBPnB5oHD_2LdygbsuO5i1t4Z5y4Q2JxyMzrR4nyh3lrSjhUf60cfFpEA"
SNCF_BEARER_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJSbXFOVTNLN0x4ck5SRmtIVTJxcTZZcTEya1RDaXNtRkw5U2NwbkNPeDBjIn0.eyJleHAiOjE2ODQ0MDE2OTAsImlhdCI6MTY4Mzc5Njg5MCwianRpIjoiN2MzZTQ2YzUtYTliOC00ZTRmLWFmYjAtZjBlODU5Y2U3YzA1IiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjExLjk1OjMyMDAvcmVhbG1zL2RldiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJzbmNmX3VzZXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvcGZhYi1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiM2MwNzRmNTMtODMxNy00NTE5LTk1MGMtOWZlOTE1ZjVjY2QwIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIiwic2lkIjoiM2MwNzRmNTMtODMxNy00NTE5LTk1MGMtOWZlOTE1ZjVjY2QwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzbmNmX3VzZXIiLCJlbnRpdGllc0lkIjoiU05DRiJ9.LZzZGg8Gu73_8HKzAPZJdR1E_e_NPyt-Q_d0lV7YzL2zjO0_q5-F08QG8nZYBoIAK_2C10Ho7qABHNTBeIR0Oe9NQnvyRn85YGLlx1k495e9p2-ZGNAh-JBbZ20ohEoghEbRAmR304gr_fKqVBM5QoxZrYdApMRbMfGuR_vGlUaQwnuG_p5uHu0wU_3SFItOtg1cSEWgviKnEt5gNuQ3D8zWAN1YtYivpqraYwQRdbENjXtxJCWsIgK-nclAWilan3vEGHGLBhZ8FCYw0U670YnlXOoe2wnFXEwt20maJzidPXA7XhEjbmUo9J-yEgEnjWspvcQhNwgsisx8P2Jyqw"
ATM_BEARER_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJSbXFOVTNLN0x4ck5SRmtIVTJxcTZZcTEya1RDaXNtRkw5U2NwbkNPeDBjIn0.eyJleHAiOjE2ODQ0MDEyMTksImlhdCI6MTY4Mzc5NjQxOSwianRpIjoiYTI4NzM0ZjYtZjVjOC00MTMwLThmYjctNTczZDc1YzM5ZDhjIiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjExLjk1OjMyMDAvcmVhbG1zL2RldiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJkYV91c2VyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoib3BmYWItY2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImJkM2I4NjEwLTFkMDUtNGJkZC05MTZiLTYxZGNmZTZkNWU3MiIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7ImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoiZW1haWwgcHJvZmlsZSIsInNpZCI6ImJkM2I4NjEwLTFkMDUtNGJkZC05MTZiLTYxZGNmZTZkNWU3MiIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZ3JvdXBzIjoiUlRFO0FETUlOO1JlYWRPbmx5IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGFfdXNlciIsImVudGl0aWVzSWQiOiJEQSJ9.RKl9ndaXW_EdMW81YRBxuwQhcRaZwvlfSG1H0ms1ElySp-XGnunvdNuj6VLwB56_wjdijPUnqOrKAsYMxa9lGipUzeAIdbPFojO1Et1IxGQSyqxJTX9ngpSQi3btJM3eP1bQ3bHSLNKIdSpZrCdhhxP8-s6vHa__7RcIMxSBvYjX-tT97qQBubqqHdSouAJP1RZYn1_G8T6Pzs1hK2RXseMRYvBUAtXD24-Lk9IaRB9GUO5P9MCb_VldqUEPAWM5rVkjxrojAUB0OM1NGcge1jiQotHyeqBPnB5oHD_2LdygbsuO5i1t4Z5y4Q2JxyMzrR4nyh3lrSjhUf60cfFpEA"
RAILWAY_BEARER_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJSbXFOVTNLN0x4ck5SRmtIVTJxcTZZcTEya1RDaXNtRkw5U2NwbkNPeDBjIn0.eyJleHAiOjE2ODQ0MDE2OTAsImlhdCI6MTY4Mzc5Njg5MCwianRpIjoiN2MzZTQ2YzUtYTliOC00ZTRmLWFmYjAtZjBlODU5Y2U3YzA1IiwiaXNzIjoiaHR0cDovLzE5Mi4xNjguMjExLjk1OjMyMDAvcmVhbG1zL2RldiIsImF1ZCI6ImFjY291bnQiLCJzdWIiOiJzbmNmX3VzZXIiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJvcGZhYi1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiM2MwNzRmNTMtODMxNy00NTE5LTk1MGMtOWZlOTE1ZjVjY2QwIiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIiwic2lkIjoiM2MwNzRmNTMtODMxNy00NTE5LTk1MGMtOWZlOTE1ZjVjY2QwIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzbmNmX3VzZXIiLCJlbnRpdGllc0lkIjoiU05DRiJ9.LZzZGg8Gu73_8HKzAPZJdR1E_e_NPyt-Q_d0lV7YzL2zjO0_q5-F08QG8nZYBoIAK_2C10Ho7qABHNTBeIR0Oe9NQnvyRn85YGLlx1k495e9p2-ZGNAh-JBbZ20ohEoghEbRAmR304gr_fKqVBM5QoxZrYdApMRbMfGuR_vGlUaQwnuG_p5uHu0wU_3SFItOtg1cSEWgviKnEt5gNuQ3D8zWAN1YtYivpqraYwQRdbENjXtxJCWsIgK-nclAWilan3vEGHGLBhZ8FCYw0U670YnlXOoe2wnFXEwt20maJzidPXA7XhEjbmUo9J-yEgEnjWspvcQhNwgsisx8P2Jyqw"


def test_get_all_PowerGrid_events(
Expand Down Expand Up @@ -82,7 +82,7 @@ def test_update_PowerGrid_event_if_exist(
"use_case": "PowerGrid",
"is_active": False,
}
headers = {"Authorization": f"Bearer {SNCF_BEARER_TOKEN}"}
headers = {"Authorization": f"Bearer {RAILWAY_BEARER_TOKEN}"}

# Create intial event
response = client.post("/api/v1/events", headers=headers, json=event_data)
Expand Down
6 changes: 3 additions & 3 deletions backend/recommendation-service/report.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ app = <APIFlask 'recommendation-service'>
)
E RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.

../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_sncf_get_recommendation" time="0.015"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_railway_get_recommendation" time="0.015"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
def app():
&gt; app = create_app("test")

Expand Down Expand Up @@ -186,7 +186,7 @@ app = &lt;APIFlask 'recommendation-service'&gt;
)
E RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.

../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_da_get_recommendation_1" time="0.016"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_atm_get_recommendation_1" time="0.016"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
def app():
&gt; app = create_app("test")

Expand Down Expand Up @@ -280,7 +280,7 @@ app = &lt;APIFlask 'recommendation-service'&gt;
)
E RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.

../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_da_get_recommendation_2" time="0.014"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
../../cab_venv_312/lib/python3.12/site-packages/flask_sqlalchemy/extension.py:310: RuntimeError</error></testcase><testcase classname="tests.test_views" name="test_atm_get_recommendation_2" time="0.014"><error message="failed on setup with &quot;RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.&quot;">@pytest.fixture(scope="function")
def app():
&gt; app = create_app("test")

Expand Down
25 changes: 25 additions & 0 deletions backend/recommendation-service/resources/ATM/manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# backend/recommendation-service/resources/RTE/manager.py

from api.manager.base_manager import BaseRecommendationManager

class ATMManager(BaseRecommendationManager):
def __init__(self):
super().__init__()

def get_recommendation(self, request_data):
"""
Override to provide recommendations specific to the RTE use case.

This method generates and returns recommendations tailored for RTE.
"""
action_dict = {}

output_json = {
"title": "recommendation",
"description": "description",
"use_case": "ATM",
"agent_type": "agent_type",
"actions": [action_dict],
}

return [output_json]
25 changes: 25 additions & 0 deletions backend/recommendation-service/resources/Railway/manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# backend/recommendation-service/resources/RTE/manager.py

from api.manager.base_manager import BaseRecommendationManager

class RailwayManager(BaseRecommendationManager):
def __init__(self):
super().__init__()

def get_recommendation(self, request_data):
"""
Override to provide recommendations specific to the RTE use case.

This method generates and returns recommendations tailored for RTE.
"""
action_dict = {}

output_json = {
"title": "recommendation",
"description": "description",
"use_case": "Railway",
"agent_type": "agent_type",
"actions": [action_dict],
}

return [output_json]
2 changes: 1 addition & 1 deletion backend/recommendation-service/start_service.bash
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ export FLASK_ENV="development"
export AUTH_DISABLED="True"
# Create a default use case to replace user detection from JWT
# This option is used only with AUTH_DISABLED="True"
export DEFAULT_USE_CASE="DA"
export DEFAULT_USE_CASE="ATM"
# Start python app on default port (5000)
python -m flask run --host=0.0.0.0 --reload
Loading
Loading