From df6b09d0518cf101b0ee07d57218fdfc15d4f315 Mon Sep 17 00:00:00 2001 From: Cayo Puigdefabregas Date: Wed, 31 May 2023 16:30:49 +0200 Subject: [PATCH] new did endpoint --- ereuse_devicehub/config.py | 2 - ereuse_devicehub/did/views.py | 147 ++++++++++++++++++ .../device/templates/devices/layout.html | 2 +- 3 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 ereuse_devicehub/did/views.py diff --git a/ereuse_devicehub/config.py b/ereuse_devicehub/config.py index b8dd9a82..841e746e 100644 --- a/ereuse_devicehub/config.py +++ b/ereuse_devicehub/config.py @@ -13,7 +13,6 @@ from ereuse_devicehub.resources import ( user, ) from ereuse_devicehub.resources.device import definitions -from ereuse_devicehub.resources.did import did from ereuse_devicehub.resources.documents import documents from ereuse_devicehub.resources.enums import PriceSoftware from ereuse_devicehub.resources.licences import licences @@ -37,7 +36,6 @@ class DevicehubConfig(Config): import_resource(lot), import_resource(deliverynote), import_resource(documents), - import_resource(did), import_resource(tradedocument), import_resource(inventory), import_resource(versions), diff --git a/ereuse_devicehub/did/views.py b/ereuse_devicehub/did/views.py new file mode 100644 index 00000000..2b683004 --- /dev/null +++ b/ereuse_devicehub/did/views.py @@ -0,0 +1,147 @@ +import json + +import flask +from ereuseapi.methods import API +from flask import Blueprint +from flask import current_app as app +from flask import g, redirect, render_template, request, session +from flask.json import jsonify +from flask.views import View + +from ereuse_devicehub import __version__ +from ereuse_devicehub.resources.device.models import Device +from ereuse_devicehub.resources.did.models import Dpp + +did = Blueprint('did', __name__, url_prefix='/did') + + +class DidView(View): + methods = ['GET', 'POST'] + template_name = 'did/layout.html' + + def dispatch_request(self, id_dpp): + self.get_ids(id_dpp) + + # import pdb; pdb.set_trace() + self.context = { + 'version': __version__, + 'oidc': 'oidc' in app.blueprints.keys(), + 'user': g.user, + 'path': request.path, + } + self.get_rols() + self.get_rol() + self.get_device() + + if 'json' in request.headers['Accept']: + return jsonify(self.get_result()) + + return render_template(self.template_name, **self.context) + + def get_ids(self, id_dpp): + self.id_dpp = None + self.chid = id_dpp + + if len(id_dpp.split(":")) == 2: + self.id_dpp = id_dpp + self.chid = id_dpp.split(':')[0] + + def get_rols(self): + rols = session.get('rols') + if not g.user.is_authenticated and not rols: + return [] + + if rols: + return [(k, k) for k in rols] + + if 'trublo' not in app.blueprints.keys(): + return [] + + if not session.get('token_dlt'): + return [] + + token_dlt = session.get('token_dlt') + api_dlt = app.config.get('API_DLT') + if not token_dlt or not api_dlt: + return [] + + api = API(api_dlt, token_dlt, "ethereum") + + result = api.check_user_roles() + if result.get('Status') != 200: + return [] + + if 'Success' not in result.get('Data', {}).get('status'): + return [] + + rols = result.get('Data', {}).get('data', {}) + self.context['rols'] = [(k, k) for k, v in rols.items() if v] + + def get_rol(self): + rols = self.context.get('rols', []) + rol = len(rols) == 1 and rols[0][0] or None + if 'rol' in request.args and not rol: + rol = dict(rols).get(request.args.get('rol')) + self.context['rol'] = rol + + def get_device(self): + if self.id_dpp: + self.dpp = Dpp.query.filter_by(key=self.id_dpp).one() + device = Device.query.filter_by(chid=self.chid, active=True).first() + if not device: + return flask.abort(404) + abstract = None + if device.placeholder: + abstract = device.placeholder.binding + + placeholder = device.binding or device.placeholder + device_abstract = placeholder and placeholder.binding or device + device_real = placeholder and placeholder.device or device + self.device = device_abstract + + self.context.update( + { + 'placeholder': placeholder, + 'device': self.device, + 'device_abstract': device_abstract, + 'device_real': device_real, + 'abstract': abstract, + } + ) + + def get_last_dpp(self, dpp): + dpps = [ + act.dpp[0] for act in dpp.device.actions if act.t == 'Snapshot' and act.dpp + ] + last_dpp = '' + for d in dpps: + if d.key == dpp.key: + return last_dpp + last_dpp = d.key + + return last_dpp + + def get_result(self): + data = { + 'hardware': {}, + 'dpp': self.id_dpp, + } + result = {'data': data} + + if self.dpp: + data['hardware'] = json.loads(self.dpp.snapshot.json_hw) + last_dpp = self.get_last_dpp(self.id_dpp) + url_last = '' + if last_dpp: + url_last = 'http://did.ereuse.org/{did}'.format(did=last_dpp) + data['url_last'] = url_last + return result + + dpps = [] + for d in self.device.dpps: + rr = {'dpp': d.key, 'hardware': json.loads(d.snapshot.json_hw)} + dpps.append(rr) + return {'data': dpps} + + +did.add_url_rule('/', view_func=DidView.as_view('did')) diff --git a/ereuse_devicehub/resources/device/templates/devices/layout.html b/ereuse_devicehub/resources/device/templates/devices/layout.html index ed89a16a..07a567f6 100644 --- a/ereuse_devicehub/resources/device/templates/devices/layout.html +++ b/ereuse_devicehub/resources/device/templates/devices/layout.html @@ -241,7 +241,7 @@