From b0092f0b18f7f5f182a6770841e2e8aa9c059234 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Mon, 16 Jun 2025 15:06:09 +0200 Subject: [PATCH 1/4] added time to risk profile creation date --- framework/python/src/common/risk_profile.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/python/src/common/risk_profile.py b/framework/python/src/common/risk_profile.py index f2e684710..a316a44f2 100644 --- a/framework/python/src/common/risk_profile.py +++ b/framework/python/src/common/risk_profile.py @@ -95,8 +95,7 @@ def __init__(self, profile_json=None, profile_format=None): # but still validate the profile def load(self, profile_json, profile_format): self.name = profile_json['name'] - self.created = datetime.strptime( - profile_json['created'], '%Y-%m-%d') + self.created = datetime.fromisoformat(profile_json['created']) self.version = profile_json['version'] self.questions = profile_json['questions'] self.status = None @@ -329,7 +328,7 @@ def to_json(self, pretty=False): json_dict = { 'name': self.name, 'version': self.version, - 'created': self.created.strftime('%Y-%m-%d'), + 'created': self.created.isoformat(), 'status': self.status, 'risk': self.risk, 'questions': self.questions From 4bca569c15e567e467219c10d751d7430e777498 Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Tue, 17 Jun 2025 18:31:19 +0200 Subject: [PATCH 2/4] device created_at, modified_at field --- framework/python/src/common/device.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/framework/python/src/common/device.py b/framework/python/src/common/device.py index d90720d90..d2f7519a3 100644 --- a/framework/python/src/common/device.py +++ b/framework/python/src/common/device.py @@ -38,6 +38,11 @@ class Device(): device_folder: str = None reports: List[TestReport] = field(default_factory=list) max_device_reports: int = None + created_at: datetime = field(default=datetime.now()) + modified_at: datetime = field(default=datetime.now()) + + # Store the original values to detect changes + _initial_values: dict = field(init=False, repr=False, default_factory=dict) def add_report(self, report): self.reports.append(report) @@ -66,6 +71,8 @@ def to_dict(self): device_json['technology'] = self.technology device_json['test_pack'] = self.test_pack device_json['additional_info'] = self.additional_info + device_json['created_at'] = self.created_at.isoformat() + device_json['modified_at'] = self.modified_at.isoformat() if self.firmware is not None: device_json['firmware'] = self.firmware @@ -85,4 +92,20 @@ def to_config_json(self): device_json['test_pack'] = self.test_pack device_json['test_modules'] = self.test_modules device_json['additional_info'] = self.additional_info + device_json['created_at'] = self.created_at.isoformat() + device_json['modified_at'] = self.modified_at.isoformat() + return device_json + + def __post_init__(self): + # Store initial values after creation + for f in self.__dataclass_fields__: + if f not in ['created_at', 'modified_at', '_initial_values']: + self._initial_values[f] = getattr(self, f) + + def __setattr__(self, name: str, value: any) -> None: + if (name not in ['created_at', 'modified_at', '_initial_values'] and + hasattr(self, name) and getattr(self, name) != value): + # Update the last_updated timestamp + super().__setattr__('modified_at', datetime.now()) + super().__setattr__(name, value) From a15a234e859097746fd7c05b767779cb564170e4 Mon Sep 17 00:00:00 2001 From: Sofia Kurilova Date: Wed, 18 Jun 2025 11:21:56 +0000 Subject: [PATCH 3/4] FE: Refactor RA date format - add time (#1331) * Adds device sorting * Fix tests --- modules/ui/src/app/model/device.ts | 2 ++ modules/ui/src/app/services/test-run.service.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/ui/src/app/model/device.ts b/modules/ui/src/app/model/device.ts index 62100f170..919603479 100644 --- a/modules/ui/src/app/model/device.ts +++ b/modules/ui/src/app/model/device.ts @@ -26,6 +26,8 @@ export interface Device { technology?: string; test_pack?: TestingType; additional_info?: Question[]; + created_at?: string; + modified_at?: string; } export enum DeviceStatus { diff --git a/modules/ui/src/app/services/test-run.service.ts b/modules/ui/src/app/services/test-run.service.ts index a80bc37ab..ba5733cc0 100644 --- a/modules/ui/src/app/services/test-run.service.ts +++ b/modules/ui/src/app/services/test-run.service.ts @@ -64,7 +64,17 @@ export class TestRunService { } fetchDevices(): Observable { - return this.http.get(`${API_URL}/devices`); + return this.http + .get[]>(`${API_URL}/devices`) + .pipe( + map(items => + items.sort( + (a, b) => + new Date(b.modified_at).getTime() - + new Date(a.modified_at).getTime() + ) + ) + ); } getSystemConfig(): Observable { From 841baaa8581ac007796067207548908e8ebaa7fe Mon Sep 17 00:00:00 2001 From: Aliaksandr Nikitsin Date: Fri, 20 Jun 2025 12:58:55 +0200 Subject: [PATCH 4/4] change device creation approach --- framework/python/src/api/api.py | 24 +++++++++++++----------- framework/python/src/common/device.py | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/framework/python/src/api/api.py b/framework/python/src/api/api.py index f1a32c1e6..5c52f9a5f 100644 --- a/framework/python/src/api/api.py +++ b/framework/python/src/api/api.py @@ -599,17 +599,19 @@ async def save_device(self, request: Request, response: Response): if device is None: # Create new device - device = Device() - device.mac_addr = device_json.get(DEVICE_MAC_ADDR_KEY).lower() - device.manufacturer = device_json.get(DEVICE_MANUFACTURER_KEY) - device.model = device_json.get(DEVICE_MODEL_KEY) - device.test_pack = device_json.get(DEVICE_TEST_PACK_KEY) - device.type = device_json.get(DEVICE_TYPE_KEY) - device.technology = device_json.get(DEVICE_TECH_KEY) - device.additional_info = device_json.get(DEVICE_ADDITIONAL_INFO_KEY) - - device.device_folder = device.manufacturer + " " + device.model - device.test_modules = device_json.get(DEVICE_TEST_MODULES_KEY) + device_manufacturer = device_json.get(DEVICE_MANUFACTURER_KEY) + device_model = device_json.get(DEVICE_MODEL_KEY) + additional_info=device_json.get(DEVICE_ADDITIONAL_INFO_KEY) + device = Device(mac_addr=device_json.get(DEVICE_MAC_ADDR_KEY).lower(), + manufacturer=device_manufacturer, + model=device_model, + test_pack=device_json.get(DEVICE_TEST_PACK_KEY), + type=device_json.get(DEVICE_TYPE_KEY), + technology=device_json.get(DEVICE_TECH_KEY), + additional_info=additional_info, + device_folder=f"{device_manufacturer} {device_model}", + test_modules=device_json.get(DEVICE_TEST_MODULES_KEY) + ) self._testrun.create_device(device) response.status_code = status.HTTP_201_CREATED diff --git a/framework/python/src/common/device.py b/framework/python/src/common/device.py index d2f7519a3..0b2ea3162 100644 --- a/framework/python/src/common/device.py +++ b/framework/python/src/common/device.py @@ -38,8 +38,8 @@ class Device(): device_folder: str = None reports: List[TestReport] = field(default_factory=list) max_device_reports: int = None - created_at: datetime = field(default=datetime.now()) - modified_at: datetime = field(default=datetime.now()) + created_at: datetime = field(default_factory=datetime.now) + modified_at: datetime = field(default_factory=datetime.now) # Store the original values to detect changes _initial_values: dict = field(init=False, repr=False, default_factory=dict)