diff --git a/ereuse_devicehub/dummy/dummy.py b/ereuse_devicehub/dummy/dummy.py index 1b59aa05..b984e9c5 100644 --- a/ereuse_devicehub/dummy/dummy.py +++ b/ereuse_devicehub/dummy/dummy.py @@ -6,6 +6,7 @@ from typing import Set import click import click_spinner import yaml +from ereuse_utils.test import ANY from ereuse_devicehub.client import UserClient from ereuse_devicehub.db import db @@ -139,6 +140,11 @@ class Dummy: res=m.Event) # todo Receive + user.get(res=Device, item=sample_pc) # Test + anonymous = self.app.test_client() + html, _ = anonymous.get(res=Device, item=sample_pc, accept=ANY) + assert 'intel core2 duo cpu' in html + # For netbook: to preapre -> torepair -> to dispose -> disposed print('⭐ Done.') diff --git a/ereuse_devicehub/resources/event/models.py b/ereuse_devicehub/resources/event/models.py index 8610978a..81edf3fc 100644 --- a/ereuse_devicehub/resources/event/models.py +++ b/ereuse_devicehub/resources/event/models.py @@ -745,11 +745,29 @@ class TestDataStorage(Test): offline_uncorrectable = Column(SmallInteger) remaining_lifetime_percentage = Column(SmallInteger) - def __str__(self) -> str: - return '{}. Lifetime of {:.1f} years'.format(inflection.humanize(self.status), - self.lifetime.days / 365) + def __init__(self, **kwargs) -> None: + super().__init__(**kwargs) + # As of https://www.backblaze.com/blog/hard-drive-smart-stats/ and + # https://www.backblaze.com/blog-smart-stats-2014-8.html + # We can guess some future disk failures by analyzing some + # SMART data + if (self.reallocated_sector_count or 0) > 10: + self.incidence = True + self.description = 'Warning: Chance of disk failure within a year.' + if (self.current_pending_sector_count or 0) > 40 \ + and (self.reported_uncorrectable_errors or 0) > 10: + self.incidence = True + self.description = 'Warning: Chance of disk failure within a year.' + if not self.assessment: + self.incidence = True + self.description = 'Warning: Drive failure expected soon.' - # todo remove lifetime / passed_lifetime as I think they are the same + def __str__(self) -> str: + t = inflection.humanize(self.status) + if self.lifetime: + t += ' with a lifetime of {:.1f} years.'.format(self.lifetime.days / 365) + t += self.description + return t class StressTest(Test): diff --git a/requirements.txt b/requirements.txt index 69ac4f1b..e4a3a70c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ click==6.7 click-spinner==0.1.8 colorama==0.3.9 colour==0.1.5 -ereuse-utils==0.4.0b9 +ereuse-utils==0.4.0b10 Flask==1.0.2 Flask-Cors==3.0.6 Flask-SQLAlchemy==2.3.2 @@ -25,7 +25,7 @@ requests==2.19.1 requests-mock==1.5.2 SQLAlchemy==1.2.11 SQLAlchemy-Utils==0.33.3 -teal==0.2.0a26 +teal==0.2.0a28 webargs==4.0.0 Werkzeug==0.14.1 sqlalchemy-citext==1.3.post0 diff --git a/setup.py b/setup.py index fd4aa80b..59a58c1a 100644 --- a/setup.py +++ b/setup.py @@ -34,10 +34,10 @@ setup( long_description=long_description, long_description_content_type='text/markdown', install_requires=[ - 'teal>=0.2.0a26', # teal always first + 'teal>=0.2.0a28', # teal always first 'click', 'click-spinner', - 'ereuse-utils[Naming]>=0.4b9', + 'ereuse-utils[Naming]>=0.4b10', 'hashids', 'marshmallow_enum', 'psycopg2-binary',