fixing test_basic

This commit is contained in:
Cayo Puigdefabregas 2021-07-28 15:59:11 +02:00
parent 1e32b74b8f
commit bb3145f3d8
5 changed files with 88 additions and 4 deletions

View File

@ -13,6 +13,7 @@ from ereuse_devicehub.resources.action.models import ToErased
from ereuse_devicehub.resources.documents.models import Document from ereuse_devicehub.resources.documents.models import Document
from ereuse_devicehub.resources.device.models import DataStorage from ereuse_devicehub.resources.device.models import DataStorage
from ereuse_devicehub.resources.documents.schemas import Document as sh_document from ereuse_devicehub.resources.documents.schemas import Document as sh_document
from ereuse_devicehub.resources.hash_reports import ReportHash
class ErasedView(): class ErasedView():
@ -39,6 +40,9 @@ class ErasedView():
doc_data['type'] = 'ToErased' doc_data['type'] = 'ToErased'
self.document = Document(**doc_data) self.document = Document(**doc_data)
db.session.add(self.document) db.session.add(self.document)
db_hash = ReportHash(hash3=self.document.file_hash)
db.session.add(db_hash)
def insert_action(self, data): def insert_action(self, data):
[data.pop(x, None) for x in ['url', 'documentId', 'filename', 'hash']] [data.pop(x, None) for x in ['url', 'documentId', 'filename', 'hash']]

View File

@ -696,6 +696,25 @@ class Computer(Device):
if privacy if privacy
) )
@property
def external_document_erasure(self):
"""Returns the external ``DataStorage`` proof of erasure.
"""
from ereuse_devicehub.resources.action.models import ToErased
urls = set()
try:
ev = self.last_action_of(ToErased)
urls.add(ev.document.url.to_text())
except LookupError:
pass
for comp in self.components:
if isinstance(comp, DataStorage):
doc = comp.external_document_erasure
if doc:
urls.add(doc)
return urls
def add_mac_to_hid(self, components_snap=None): def add_mac_to_hid(self, components_snap=None):
"""Returns the Naming.hid with the first mac of network adapter, """Returns the Naming.hid with the first mac of network adapter,
following an alphabetical order. following an alphabetical order.
@ -879,6 +898,17 @@ class DataStorage(JoinedComponentTableMixin, Component):
v += ' {} GB'.format(self.size // 1000 if self.size else '?') v += ' {} GB'.format(self.size // 1000 if self.size else '?')
return v return v
@property
def external_document_erasure(self):
"""Returns the external ``DataStorage`` proof of erasure.
"""
from ereuse_devicehub.resources.action.models import ToErased
try:
ev = self.last_action_of(ToErased)
return ev.document.url.to_text()
except LookupError:
return None
class HardDrive(DataStorage): class HardDrive(DataStorage):
pass pass

View File

@ -90,6 +90,7 @@ class DocumentView(DeviceView):
res = flask.make_response(template) res = flask.make_response(template)
return res return res
@staticmethod @staticmethod
def erasure(query: db.Query): def erasure(query: db.Query):
def erasures(): def erasures():
@ -114,6 +115,34 @@ class DocumentView(DeviceView):
} }
return flask.render_template('documents/erasure.html', **params) return flask.render_template('documents/erasure.html', **params)
class ExternalErasureDocumentView(DeviceView):
@cache(datetime.timedelta(minutes=1))
def find(self, args: dict):
query = (x for x in self.query(args) if x.owner_id == g.user.id)
return self.generate_post_csv(query)
def generate_post_csv(self, query):
"""Get device query and put information in csv format."""
data = StringIO()
cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
cw.writerow(['Urls'])
for device in query:
if isinstance(device, devs.Computer):
urls = device.external_document_erasure
if urls:
cw.writerow(urls)
elif isinstance(device, devs.DataStorage):
url = device.external_document_erasure
if url:
cw.writerow(set(url))
bfile = data.getvalue().encode('utf-8')
output = make_response(bfile)
insert_hash(bfile)
output.headers['Content-Disposition'] = 'attachment; filename=export_urls_external_proof.csv'
output.headers['Content-type'] = 'text/csv'
return output
class DevicesDocumentView(DeviceView): class DevicesDocumentView(DeviceView):
@cache(datetime.timedelta(minutes=1)) @cache(datetime.timedelta(minutes=1))
@ -291,7 +320,6 @@ class InternalStatsView(DeviceView):
evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate'))) evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate')))
return self.generate_post_csv(query) return self.generate_post_csv(query)
def generate_post_csv(self, query): def generate_post_csv(self, query):
d = {} d = {}
for ac in query: for ac in query:
@ -417,6 +445,12 @@ class DocumentDef(Resource):
self.add_url_rule('/internalstats/', defaults=d, view_func=internalstats_view, self.add_url_rule('/internalstats/', defaults=d, view_func=internalstats_view,
methods=get) methods=get)
externalErasureDocument_view = ExternalErasureDocumentView.as_view(
'ExternalErasureDocumentView', definition=self, auth=app.auth)
externalErasureDocument_view = app.auth.requires_auth(externalErasureDocument_view)
self.add_url_rule('/externalErasureDocuments/', defaults=d,
view_func=externalErasureDocument_view, methods=get)
actions_view = ActionsDocumentView.as_view('ActionsDocumentView', actions_view = ActionsDocumentView.as_view('ActionsDocumentView',
definition=self, definition=self,
auth=app.auth) auth=app.auth)

View File

@ -6,6 +6,7 @@ import copy
import pytest import pytest
from datetime import datetime, timedelta from datetime import datetime, timedelta
from io import BytesIO
from dateutil.tz import tzutc from dateutil.tz import tzutc
from decimal import Decimal from decimal import Decimal
from typing import Tuple, Type from typing import Tuple, Type
@ -2412,10 +2413,13 @@ def test_trade_case14(user: UserClient, user2: UserClient):
@pytest.mark.mvp @pytest.mark.mvp
@pytest.mark.usefixtures(conftest.app_context.__name__) @pytest.mark.usefixtures(conftest.app_context.__name__)
def test_action_web_erase(user: UserClient): def test_action_web_erase(user: UserClient, client: Client):
# import pdb; pdb.set_trace() import hashlib
from ereuse_devicehub.resources.documents import documents
bfile = BytesIO(b'abc')
hash3 = hashlib.sha3_256(bfile.read()).hexdigest()
snap, _ = user.post(file('acer.happy.battery.snapshot'), res=models.Snapshot) snap, _ = user.post(file('acer.happy.battery.snapshot'), res=models.Snapshot)
request = {'type': 'ToErased', 'devices': [snap['device']['id']], 'name': 'borrado universal', 'severity': 'Info', 'description': 'nada que describir', 'url': 'http://www.google.com/', 'documentId': '33', 'endTime': '2021-07-07T22:00:00.000Z', 'filename': 'Certificado de borrado1.pdf', 'hash': 'fedbcbd057d25df9915ca9758b7537794148b896b66b3bbc972fe966dcced34b'} request = {'type': 'ToErased', 'devices': [snap['device']['id']], 'name': 'borrado universal', 'severity': 'Info', 'description': 'nada que describir', 'url': 'http://www.google.com/', 'documentId': '33', 'endTime': '2021-07-07T22:00:00.000Z', 'filename': 'Certificado de borrado1.pdf', 'hash': hash3}
user.post(res=models.Action, data=request) user.post(res=models.Action, data=request)
action = models.ToErased.query.one() action = models.ToErased.query.one()
@ -2423,3 +2427,14 @@ def test_action_web_erase(user: UserClient):
assert action in dev.actions assert action in dev.actions
assert action.document.file_hash == request['hash'] assert action.document.file_hash == request['hash']
bfile = BytesIO(b'abc')
response, _ = client.post(res=documents.DocumentDef.t,
item='stamps/',
content_type='multipart/form-data',
accept='text/html',
data={'docUpload': [(bfile, 'example.csv')]},
status=200)
assert "alert alert-info" in response
assert "100% coincidence." in response
assert not "alert alert-danger" in response

View File

@ -40,6 +40,7 @@ def test_api_docs(client: Client):
'/documents/erasures/', '/documents/erasures/',
'/documents/devices/', '/documents/devices/',
'/documents/stamps/', '/documents/stamps/',
'/documents/externalErasureDocuments/',
'/documents/wbconf/{wbtype}', '/documents/wbconf/{wbtype}',
'/documents/internalstats/', '/documents/internalstats/',
'/documents/stock/', '/documents/stock/',