From 32e696c57cc3a86d72c0b88404099121851b3230 Mon Sep 17 00:00:00 2001 From: Xavier Bustamante Talavera Date: Wed, 13 Feb 2019 18:59:14 +0100 Subject: [PATCH] Fix rate related issues --- ereuse_devicehub/db.py | 1 + ereuse_devicehub/resources/event/models.py | 45 +++-- ereuse_devicehub/resources/event/rate/main.py | 7 +- ...sktop-9644w8n-lenovo-0169622.snapshot.yaml | 121 +++++++++++++ ...k-hewlett-packard-cnd52270fw.snapshot.yaml | 170 ++++++++++++++++++ tests/test_snapshot.py | 11 ++ 6 files changed, 337 insertions(+), 18 deletions(-) create mode 100644 tests/files/desktop-9644w8n-lenovo-0169622.snapshot.yaml create mode 100644 tests/files/laptop-hp_255_g3_notebook-hewlett-packard-cnd52270fw.snapshot.yaml diff --git a/ereuse_devicehub/db.py b/ereuse_devicehub/db.py index 5fc091cb..b82e714f 100644 --- a/ereuse_devicehub/db.py +++ b/ereuse_devicehub/db.py @@ -36,6 +36,7 @@ class SQLAlchemy(SchemaSQLAlchemy): # manually import them all the time UUID = postgresql.UUID CIText = citext.CIText + PSQL_INT_MAX = 2147483648 def drop_all(self, bind='__all__', app=None, common_schema=True): """A faster nuke-like option to drop everything.""" diff --git a/ereuse_devicehub/resources/event/models.py b/ereuse_devicehub/resources/event/models.py index cad8f8ee..946a97b8 100644 --- a/ereuse_devicehub/resources/event/models.py +++ b/ereuse_devicehub/resources/event/models.py @@ -593,7 +593,12 @@ class Rate(JoinedWithOneDeviceMixin, EventWithOneDevice): plus the ``WorkbenchRate`` from 1. """ rating = Column(Float(decimal_return_scale=2), check_range('rating', *RATE_POSITIVE)) - rating.comment = """The rating for the content.""" + rating.comment = """The rating for the content. + + This value is automatically set by rating algorithms. In case that + no algorithm is defined per the device and type of rate, this + value is None. + """ software = Column(DBEnum(RatingSoftware)) software.comment = """The algorithm used to produce this rating.""" version = Column(StrictVersionType) @@ -604,8 +609,7 @@ class Rate(JoinedWithOneDeviceMixin, EventWithOneDevice): @property def rating_range(self) -> RatingRange: - if self.rating: - return RatingRange.from_score(self.rating) + return RatingRange.from_score(self.rating) if self.rating else None @declared_attr def __mapper_args__(cls): @@ -782,13 +786,12 @@ class AggregateRate(Rate): @classmethod def from_workbench_rate(cls, rate: WorkbenchRate): - aggregate = cls() - aggregate.rating = rate.rating - aggregate.software = rate.software - aggregate.appearance = rate.appearance - aggregate.functionality = rate.functionality - aggregate.device = rate.device - aggregate.workbench = rate + aggregate = cls(rating=rate.rating, + software=rate.software, + appearance=rate.appearance, + functionality=rate.functionality, + device=rate.device, + workbench=rate) return aggregate @@ -836,7 +839,7 @@ class Price(JoinedWithOneDeviceMixin, EventWithOneDevice): @classmethod def to_price(cls, value: Union[Decimal, float], rounding=ROUND) -> Decimal: """Returns a Decimal value with the correct scale for Price.price.""" - if isinstance(value, float): + if isinstance(value, (float, int)): value = Decimal(value) # equation from marshmallow.fields.Decimal return value.quantize(Decimal((0, (1,), -cls.SCALE)), rounding=rounding) @@ -920,8 +923,8 @@ class EreusePrice(Price): self.warranty2 = EreusePrice.Type(rate[self.WARRANTY2][role], price) def __init__(self, rating: AggregateRate, **kwargs) -> None: - if rating.rating_range == RatingRange.VERY_LOW: - raise ValueError('Cannot compute price for Range.VERY_LOW') + if not rating.rating_range or rating.rating_range == RatingRange.VERY_LOW: + raise InvalidRangeForPrice() # We pass ROUND_UP strategy so price is always greater than what refurbisher... amounts price = self.to_price(rating.rating * self.MULTIPLIER[rating.device.__class__], ROUND_UP) super().__init__(rating=rating, @@ -993,7 +996,7 @@ class TestDataStorage(Test): assessment = Column(Boolean) reallocated_sector_count = Column(SmallInteger) power_cycle_count = Column(SmallInteger) - reported_uncorrectable_errors = Column(SmallInteger) + _reported_uncorrectable_errors = Column('reported_uncorrectable_errors', Integer) command_timeout = Column(Integer) current_pending_sector_count = Column(SmallInteger) offline_uncorrectable = Column(SmallInteger) @@ -1021,6 +1024,16 @@ class TestDataStorage(Test): t += self.description return t + @property + def reported_uncorrectable_errors(self): + return self._reported_uncorrectable_errors + + @reported_uncorrectable_errors.setter + def reported_uncorrectable_errors(self, value): + # There is no value for a stratospherically big number + self._reported_uncorrectable_errors = min(value, db.PSQL_INT_MAX) + + class StressTest(Test): """The act of stressing (putting to the maximum capacity) @@ -1401,3 +1414,7 @@ def update_parent(target: Union[EraseBasic, Test, Install], device: Device, _, _ target.parent = None if isinstance(device, Component): target.parent = device.parent + + +class InvalidRangeForPrice(ValueError): + pass diff --git a/ereuse_devicehub/resources/event/rate/main.py b/ereuse_devicehub/resources/event/rate/main.py index 69213ba7..d8879bd9 100644 --- a/ereuse_devicehub/resources/event/rate/main.py +++ b/ereuse_devicehub/resources/event/rate/main.py @@ -4,8 +4,8 @@ from typing import Set, Union from ereuse_devicehub.resources.device.models import Device from ereuse_devicehub.resources.enums import RatingSoftware -from ereuse_devicehub.resources.event.models import AggregateRate, EreusePrice, Rate, \ - WorkbenchRate +from ereuse_devicehub.resources.event.models import AggregateRate, EreusePrice, \ + InvalidRangeForPrice, Rate, WorkbenchRate from ereuse_devicehub.resources.event.rate.workbench import v1_0 RATE_TYPES = { @@ -72,7 +72,6 @@ def main(rating_model: WorkbenchRate, if soft == software and vers == version: aggregation = AggregateRate.from_workbench_rate(rating) events.add(aggregation) - with suppress(ValueError): - # We will have exception if range == VERY_LOW + with suppress(InvalidRangeForPrice): # We will have exception if range == VERY_LOW events.add(EreusePrice(aggregation)) return events diff --git a/tests/files/desktop-9644w8n-lenovo-0169622.snapshot.yaml b/tests/files/desktop-9644w8n-lenovo-0169622.snapshot.yaml new file mode 100644 index 00000000..f5cf71f7 --- /dev/null +++ b/tests/files/desktop-9644w8n-lenovo-0169622.snapshot.yaml @@ -0,0 +1,121 @@ +{ + "closed": true, + "components": [ + { + "events": [], + "manufacturer": "Intel Corporation", + "model": "NM10/ICH7 Family High Definition Audio Controller", + "serialNumber": null, + "type": "SoundCard" + }, + { + "events": [], + "manufacturer": "Broadcom Inc. and subsidiaries", + "model": "NetLink BCM5786 Gigabit Ethernet PCI Express", + "serialNumber": "00:1a:6b:5e:7f:10", + "speed": 1000, + "type": "NetworkAdapter", + "wireless": false + }, + { + "events": [], + "format": "DIMM", + "interface": "DDR", + "manufacturer": null, + "model": null, + "serialNumber": null, + "size": 1024, + "speed": 133.0, + "type": "RamModule" + }, + { + "events": [], + "format": "DIMM", + "interface": "DDR", + "manufacturer": null, + "model": null, + "serialNumber": null, + "size": 1024, + "speed": 133.0, + "type": "RamModule" + }, + { + "address": 64, + "events": [ + { + "elapsed": 33, + "rate": 32.9274, + "type": "BenchmarkProcessorSysbench" + }, + { + "elapsed": 0, + "rate": 8771.5, + "type": "BenchmarkProcessor" + } + ], + "manufacturer": "Intel Corp.", + "model": "Intel Core2 Duo CPU E4500 @ 2.20GHz", + "serialNumber": null, + "speed": 1.1, + "threads": 2, + "type": "Processor" + }, + { + "events": [], + "manufacturer": "Intel Corporation", + "memory": 256.0, + "model": "82946GZ/GL Integrated Graphics Controller", + "serialNumber": null, + "type": "GraphicCard" + }, + { + "events": [], + "firewire": 0, + "manufacturer": "LENOVO", + "model": "LENOVO", + "pcmcia": 0, + "serial": 1, + "serialNumber": null, + "slots": 0, + "type": "Motherboard", + "usb": 5 + } + ], + "device": { + "chassis": "Microtower", + "events": [ + { + "appearanceRange": "D", + "biosRange": "E", + "functionalityRange": "D", + "type": "WorkbenchRate" + }, + { + "elapsed": 300, + "severity": "Info", + "type": "StressTest" + }, + { + "elapsed": 2, + "rate": 1.4968, + "type": "BenchmarkRamSysbench" + } + ], + "manufacturer": "LENOVO", + "model": "9644W8N", + "serialNumber": "0169622", + "type": "Desktop" + }, + "elapsed": 338, + "endTime": "2019-02-13T11:57:31.378330+00:00", + "expectedEvents": [ + "Benchmark", + "TestDataStorage", + "StressTest", + "Install" + ], + "software": "Workbench", + "type": "Snapshot", + "uuid": "d7904bd3-7d0f-4918-86b1-e21bfab738f9", + "version": "11.0b5" +} diff --git a/tests/files/laptop-hp_255_g3_notebook-hewlett-packard-cnd52270fw.snapshot.yaml b/tests/files/laptop-hp_255_g3_notebook-hewlett-packard-cnd52270fw.snapshot.yaml new file mode 100644 index 00000000..4824615a --- /dev/null +++ b/tests/files/laptop-hp_255_g3_notebook-hewlett-packard-cnd52270fw.snapshot.yaml @@ -0,0 +1,170 @@ +{ + "closed": true, + "components": [ + { + "events": [], + "manufacturer": "Qualcomm Atheros", + "model": "QCA9565 / AR9565 Wireless Network Adapter", + "serialNumber": "ac:e0:10:c2:e3:ac", + "type": "NetworkAdapter", + "wireless": true + }, + { + "events": [], + "manufacturer": "Realtek Semiconductor Co., Ltd.", + "model": "RTL810xE PCI Express Fast Ethernet controller", + "serialNumber": "30:8d:99:25:6c:d9", + "speed": 100, + "type": "NetworkAdapter", + "wireless": false + }, + { + "events": [], + "manufacturer": "Advanced Micro Devices, Inc. AMD/ATI", + "model": "Kabini HDMI/DP Audio", + "serialNumber": null, + "type": "SoundCard" + }, + { + "events": [], + "manufacturer": "Chicony Electronics Co.,Ltd.", + "model": "HP Webcam", + "serialNumber": "0x0001", + "type": "SoundCard" + }, + { + "events": [], + "manufacturer": "Advanced Micro Devices, Inc. AMD", + "model": "FCH Azalia Controller", + "serialNumber": null, + "type": "SoundCard" + }, + { + "events": [], + "format": "SODIMM", + "interface": "DDR3", + "manufacturer": "Hynix", + "model": "HMT451S6AFR8A-PB", + "serialNumber": "11743764", + "size": 4096, + "speed": 667.0, + "type": "RamModule" + }, + { + "address": 64, + "cores": 2, + "events": [ + { + "elapsed": 0, + "rate": 3992.32, + "type": "BenchmarkProcessor" + }, + { + "elapsed": 65, + "rate": 65.3007, + "type": "BenchmarkProcessorSysbench" + } + ], + "manufacturer": "Advanced Micro Devices AMD", + "model": "AMD E1-2100 APU with Radeon HD Graphics", + "serialNumber": null, + "speed": 0.9, + "threads": 2, + "type": "Processor" + }, + { + "events": [ + { + "elapsed": 12, + "readSpeed": 90.0, + "type": "BenchmarkDataStorage", + "writeSpeed": 30.7 + }, + { + "assessment": true, + "commandTimeout": 1341, + "currentPendingSectorCount": 0, + "elapsed": 113, + "length": "Short", + "lifetime": 1782, + "offlineUncorrectable": 0, + "powerCycleCount": 806, + "reallocatedSectorCount": 224, + "reportedUncorrectableErrors": 9961472, + "severity": "Info", + "status": "Completed without error", + "type": "TestDataStorage" + }, + { + "address": 32, + "elapsed": 690, + "name": "LinuxMint-19-x86-es-2018-12.fsa", + "severity": "Info", + "type": "Install" + } + ], + "interface": "ATA", + "manufacturer": null, + "model": "HGST HTS545050A7", + "serialNumber": "TE85134N34LNSN", + "size": 476940, + "type": "HardDrive" + }, + { + "events": [], + "manufacturer": "Advanced Micro Devices, Inc. AMD/ATI", + "memory": 256.0, + "model": "Kabini Radeon HD 8210", + "serialNumber": null, + "type": "GraphicCard" + }, + { + "events": [], + "firewire": 0, + "manufacturer": "Hewlett-Packard", + "model": "21F7", + "pcmcia": 0, + "serial": 1, + "serialNumber": "PEHERF41U8P9TV", + "slots": 0, + "type": "Motherboard", + "usb": 5 + } + ], + "device": { + "chassis": "Netbook", + "events": [ + { + "appearanceRange": "A", + "functionalityRange": "A", + "type": "WorkbenchRate" + }, + { + "elapsed": 300, + "severity": "Info", + "type": "StressTest" + }, + { + "elapsed": 6, + "rate": 5.8783, + "type": "BenchmarkRamSysbench" + } + ], + "manufacturer": "Hewlett-Packard", + "model": "HP 255 G3 Notebook", + "serialNumber": "CND52270FW", + "type": "Laptop" + }, + "elapsed": 1194, + "endTime": "2019-02-13T10:13:50.535387+00:00", + "expectedEvents": [ + "Benchmark", + "TestDataStorage", + "StressTest", + "Install" + ], + "software": "Workbench", + "type": "Snapshot", + "uuid": "ca564895-567e-4ac2-9a0d-2d1402528687", + "version": "11.0b5" +} diff --git a/tests/test_snapshot.py b/tests/test_snapshot.py index 2b7ac98d..ce7b5f37 100644 --- a/tests/test_snapshot.py +++ b/tests/test_snapshot.py @@ -453,3 +453,14 @@ def test_snapshot_keyboard(user: UserClient): snapshot = snapshot_and_check(user, s, event_types=('ManualRate',)) keyboard = snapshot['device'] assert keyboard['layout'] == 'ES' + + +def test_pc_rating_rate_none(user: UserClient): + """Tests a Snapshot with EraseSectors.""" + s = file('desktop-9644w8n-lenovo-0169622.snapshot') + snapshot, _ = user.post(res=Snapshot, data=s) + + +def test_pc_2(user: UserClient): + s = file('laptop-hp_255_g3_notebook-hewlett-packard-cnd52270fw.snapshot') + snapshot, _ = user.post(res=Snapshot, data=s)