From 3d0527edf169c579dfb0b3327596dd2c397656b6 Mon Sep 17 00:00:00 2001 From: Cayo Puigdefabregas Date: Wed, 20 Nov 2024 18:06:52 +0100 Subject: [PATCH] view dpp page --- device/models.py | 9 ++ device/views.py | 9 +- did/templates/device_web.html | 171 ---------------------------------- did/views.py | 140 ++++++++++++++++++++++++++-- 4 files changed, 149 insertions(+), 180 deletions(-) delete mode 100644 did/templates/device_web.html diff --git a/device/models.py b/device/models.py index 0ba7cac..56d20dc 100644 --- a/device/models.py +++ b/device/models.py @@ -95,6 +95,15 @@ class Device: if self.last_evidence: return + if self.uuid: + import pdb; pdb.set_trace() + self.last_evidence = Evidence(self.uuid) + return + + annotations = self.get_annotations() + if not annotations.count(): + return + if self.uuid: self.last_evidence = Evidence(self.uuid) return diff --git a/device/views.py b/device/views.py index 3335048..68dcd43 100644 --- a/device/views.py +++ b/device/views.py @@ -1,5 +1,4 @@ -import json -import logging +from django.http import JsonResponse from django.http import JsonResponse from django.conf import settings @@ -20,6 +19,7 @@ from dashboard.mixins import DashboardView, Http403 from evidence.models import UserProperty, SystemProperty from lot.models import LotTag from dpp.models import Proof +from dpp.api_dlt import PROOF_TYPE from device.models import Device from device.forms import DeviceFormSet from device.environmental_impact.calculator import get_device_environmental_impact @@ -91,7 +91,10 @@ class DetailsView(DashboardView, TemplateView): context = super().get_context_data(**kwargs) self.object.initial() lot_tags = LotTag.objects.filter(owner=self.request.user.institution) - dpps = Proof.objects.filter(uuid__in=self.object.uuids) + dpps = Proof.objects.filter( + uuid__in=self.object.uuids, + type=PROOF_TYPE["IssueDPP"] + ) context.update({ 'object': self.object, 'snapshot': last_evidence, diff --git a/did/templates/device_web.html b/did/templates/device_web.html deleted file mode 100644 index 8c607d3..0000000 --- a/did/templates/device_web.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - {{ object.type }} - - - - - -
-

{{ object.manufacturer }} {{ object.type }} {{ object.model }}

- -
-
-

Details

-
-
Phid
-
-
{{ object.id }}
-
-
-
-
Type
-
{{ object.type }}
-
- - {% if object.is_websnapshot %} - {% for snapshot_key, snapshot_value in object.last_user_evidence %} -
-
{{ snapshot_key }}
-
{{ snapshot_value|default:'' }}
-
- {% endfor %} - {% else %} -
-
Manufacturer
-
{{ object.manufacturer|default:'' }}
-
-
-
Model
-
{{ object.model|default:'' }}
-
- {% if user.is_authenticated %} -
-
Serial Number
-
{{ object.serial_number|default:'' }}
-
- {% endif %} - {% endif %} -
- -
-

Identifiers

- {% for chid in object.hids %} -
-
{{ chid|default:'' }}
-
- {% endfor %} -
-
-

Components

-
- {% for component in object.components %} -
-
-
-
{{ component.type }}
-

- {% for component_key, component_value in component.items %} - {% if component_key not in 'actions,type' %} - {% if component_key != 'serialNumber' or user.is_authenticated %} - {{ component_key }}: {{ component_value }}
- {% endif %} - {% endif %} - {% endfor %} -

-
-
-
- {% endfor %} -
-
- - - - - diff --git a/did/views.py b/did/views.py index 1caa081..e8ad5cd 100644 --- a/did/views.py +++ b/did/views.py @@ -1,14 +1,26 @@ +import json +import logging + from django.http import JsonResponse, Http404 from django.views.generic.base import TemplateView from device.models import Device +from dpp.models import Proof + + +logger = logging.getLogger('django') class PublicDeviceWebView(TemplateView): - template_name = "device_web.html" + template_name = "device_did.html" def get(self, request, *args, **kwargs): self.pk = kwargs['pk'] - self.object = Device(id=self.pk) + chid = self.pk.split(":")[0] + proof = Proof.objects.filter(signature=self.pk).first() + if proof: + self.object = Device(id=chid, uuid=proof.uuid) + else: + self.object = Device(id=chid) if not self.object.last_evidence: raise Http404 @@ -18,12 +30,24 @@ class PublicDeviceWebView(TemplateView): return super().get(request, *args, **kwargs) def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) + self.context = super().get_context_data(**kwargs) self.object.initial() - context.update({ - 'object': self.object + roles = [("Operator", "Operator")] + role = "Operator" + if self.request.user.is_anonymous: + roles = [] + role = None + self.context.update({ + 'object': self.object, + 'role': role, + 'roles': roles, + 'path': self.request.path, + 'last_dpp': "", + 'before_dpp': "", }) - return context + if not self.request.user.is_anonymous: + self.get_manuals() + return self.context @property def public_fields(self): @@ -58,3 +82,107 @@ class PublicDeviceWebView(TemplateView): device_data = self.get_device_data() return JsonResponse(device_data) + def get_manuals(self): + manuals = { + 'ifixit': [], + 'icecat': [], + 'details': {}, + 'laer': [], + 'energystar': {}, + } + try: + params = { + "manufacturer": self.object.manufacturer, + "model": self.object.model, + } + self.params = json.dumps(params) + manuals['ifixit'] = self.request_manuals('ifixit') + manuals['icecat'] = self.request_manuals('icecat') + manuals['laer'] = self.request_manuals('laer') + manuals['energystar'] = self.request_manuals('energystar') or {} + if manuals['icecat']: + manuals['details'] = manuals['icecat'][0] + except Exception as err: + logger.error("Error: {}".format(err)) + + self.context['manuals'] = manuals + self.parse_energystar() + + def parse_energystar(self): + if not self.context.get('manuals', {}).get('energystar'): + return + + # Defined in: + # https://dev.socrata.com/foundry/data.energystar.gov/j7nq-iepp + + energy_types = [ + 'functional_adder_allowances_kwh', + 'tec_allowance_kwh', + 'long_idle_watts', + 'short_idle_watts', + 'off_mode_watts', + 'sleep_mode_watts', + 'tec_of_model_kwh', + 'tec_requirement_kwh', + 'work_off_mode_watts', + 'work_weighted_power_of_model_watts', + ] + energy = {} + for field in energy_types: + energy[field] = [] + + for e in self.context['manuals']['energystar']: + for field in energy_types: + for k, v in e.items(): + if not v: + continue + if field in k: + energy[field].append(v) + + for k, v in energy.items(): + if not v: + energy[k] = 0 + continue + tt = sum([float(i) for i in v]) + energy[k] = round(tt / len(v), 2) + + self.context['manuals']['energystar'] = energy + + def request_manuals(self, prefix): + #TODO reimplement manuals service + response = { + "laer": [{"metal": 40, "plastic_post_consumer": 27, "plastic_post_industry": 34}], + "energystar": [{ + 'functional_adder_allowances_kwh': 180, + "long_idle_watts": 240, + "short_idle_watts": 120, + "sleep_mode_watts": 30, + "off_mode_watts": 3, + "tec_allowance_kwh": 180, + "tec_of_model_kwh": 150, + "tec_requirement_kwh": 220, + "work_off_mode_watts": 70, + "work_weighted_power_of_model_watts": 240 + }], + "ifixit": [ + { + "image": "https://guide-images.cdn.ifixit.com/igi/156EpI4YdQeVfVPa.medium", + "url": "https://es.ifixit.com/Gu%C3%ADa/HP+ProBook+450+G4+Back+Panel+Replacement/171196?lang=en", + "title": "HP ProBook 450 G4 Back Panel Replacement" + }, + { + "image": "https://guide-images.cdn.ifixit.com/igi/usTIqCKpuxVWC3Ix.140x105", + "url": "https://es.ifixit.com/Gu%C3%ADa/HP+ProBook+450+G4+Display+Assembly+Replacement/171101?lang=en", + "title": "Display Assembly Replacement" + } + ], + "icecat": [ + { + "logo": "https://images.icecat.biz/img/brand/thumb/1_cf8603f6de7b4c4d8ac4f5f0ef439a05.jpg", + "image": "https://guide-images.cdn.ifixit.com/igi/Q2nYjTIQfG6GaI5B.standard", + "pdf": "https://icecat.biz/rest/product-pdf?productId=32951710&lang=en", + "title": "HP ProBook 450 G3" + } + ] + } + return response.get(prefix, {})