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
24 changes: 13 additions & 11 deletions framework/python/src/api/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
23 changes: 23 additions & 0 deletions framework/python/src/common/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_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)

def add_report(self, report):
self.reports.append(report)
Expand Down Expand Up @@ -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
Expand All @@ -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)
5 changes: 2 additions & 3 deletions framework/python/src/common/risk_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions modules/ui/src/app/model/device.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ export interface Device {
technology?: string;
test_pack?: TestingType;
additional_info?: Question[];
created_at?: string;
modified_at?: string;
}

export enum DeviceStatus {
Expand Down
12 changes: 11 additions & 1 deletion modules/ui/src/app/services/test-run.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,17 @@ export class TestRunService {
}

fetchDevices(): Observable<Device[]> {
return this.http.get<Device[]>(`${API_URL}/devices`);
return this.http
.get<Required<Device>[]>(`${API_URL}/devices`)
.pipe(
map(items =>
items.sort(
(a, b) =>
new Date(b.modified_at).getTime() -
new Date(a.modified_at).getTime()
)
)
);
}

getSystemConfig(): Observable<SystemConfig> {
Expand Down