586 lines
23 KiB
HTML
586 lines
23 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
|
|
|
<title>Device {{ device_real.dhid }} - Usody</title>
|
|
<meta content="" name="description">
|
|
<meta content="" name="keywords">
|
|
|
|
<!-- Favicons -->
|
|
<link href="{{ url_for('static', filename='img/favicon.png') }}" rel="icon">
|
|
<link href="{{ url_for('static', filename='img/apple-touch-icon.png') }}" rel="apple-touch-icon">
|
|
|
|
<!-- Google Fonts -->
|
|
<link href="https://fonts.gstatic.com" rel="preconnect">
|
|
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Nunito:300,300i,400,400i,600,600i,700,700i|Poppins:300,300i,400,400i,500,500i,600,600i,700,700i" rel="stylesheet">
|
|
|
|
<!-- JS Files -->
|
|
<script src="{{ url_for('static', filename='js/jquery-3.6.0.min.js') }}"></script>
|
|
<script src="{{ url_for('static', filename='vendor/bootstrap/js/bootstrap.bundle.min.js') }}"></script>
|
|
|
|
<!-- Vendor CSS Files -->
|
|
<link href="{{ url_for('static', filename='vendor/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
|
|
<link href="{{ url_for('static', filename='vendor/bootstrap-icons/bootstrap-icons.css') }}" rel="stylesheet">
|
|
|
|
|
|
<!-- Template Main CSS File -->
|
|
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
|
|
<link href="{{ url_for('static', filename='css/devicehub.css') }}" rel="stylesheet">
|
|
|
|
<!-- =======================================================
|
|
* Template Name: NiceAdmin - v2.2.0
|
|
* Template URL: https://bootstrapmade.com/nice-admin-bootstrap-admin-html-template/
|
|
* Author: BootstrapMade.com
|
|
* License: https://bootstrapmade.com/license/
|
|
======================================================== -->
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<main>
|
|
|
|
<section class="container mt-3">
|
|
<div class="row">
|
|
|
|
<div class="col">
|
|
<nav class="header-nav ms-auto">
|
|
<ul class="d-flex align-items-right">
|
|
<li class="nav-item">
|
|
{% if not rols and user.is_anonymous %}
|
|
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#validateModal">Validate</button>
|
|
{% else %}
|
|
<button class="btn btn-primary" id="buttonRol" data-bs-toggle="modal" data-bs-target="#rolsModal">Select your role</button>
|
|
<a class="btn btn-primary" href="{{ url_for('core.logout') }}?next={{ path }}">Logout</a>
|
|
{% endif %}
|
|
</li>
|
|
</ul>
|
|
{% if rol %}
|
|
<br />Current Role: {{ rol }}
|
|
{% endif %}
|
|
</nav>
|
|
<div class="col-xl-12">
|
|
|
|
<div class="card">
|
|
<div class="card-body">
|
|
<h3 class="nav-link mt-5" style="color: #993365">{{ device_real.type }} - {{ device_real.verbose_name }}</h3>
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<h5 class="card-title">Details</h5>
|
|
{% if manuals.details %}
|
|
<div class="row">
|
|
<div class="col">
|
|
{% if manuals.details.logo %}
|
|
<img style="max-width: 50px; margin-right: 15px;" src="{{ manuals.details.logo }}" />
|
|
{% endif %}
|
|
</div>
|
|
<div class="col">
|
|
{% if manuals.details.image %}
|
|
<img style="width: 100px;" src="{{ manuals.details.image }}" />
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
<div class="row">
|
|
<div class="col">
|
|
Type
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.type or '- not detected -' }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Manufacturer
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.manufacturer or '- not detected -' }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Model
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.model or '- not detected -' }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Part Number
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.part_number or '- not detected -' }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Serial Number
|
|
</div>
|
|
<div class="col">
|
|
{{ device_abstract.serial_number and device_abstract.serial_number.upper() or '- not detected -' }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Usody Identifier (DHID)
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.dhid }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Inventory Identifier (PHID)
|
|
</div>
|
|
<div class="col">
|
|
{{ device_real.phid() }}
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Device Identifier (CHID):
|
|
</div>
|
|
<div class="col">
|
|
<a href="{{ url_for('did.did', id_dpp=device_abstract.chid) }}">{{ device_abstract.chid|truncate(20, True, '...') }}</a>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Manufacturer DPP:
|
|
</div>
|
|
<div class="col">
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
Last Digital Passport (Last Dpp):
|
|
</div>
|
|
<div class="col">
|
|
{% if last_dpp %}
|
|
<a href="{{ url_for('did.did', id_dpp=last_dpp.key) }}">{{ last_dpp.key|truncate(20, True, '...') }}</a>
|
|
{% else %}
|
|
- not detected -
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mt-3">
|
|
<div class="col-6">
|
|
<h5 class="card-title">Status</h5>
|
|
<div class="row">
|
|
<div class="col">
|
|
<div class="label"><b>Physical</b></div>
|
|
<div>{{ device_real.physical_status and device.physical_status.type or '- not status -' }}</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
<div class="label"><b>Lifecycle</b></div>
|
|
<div>{{ device_real.status and device_real.status.type or '- not status -' }}</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col">
|
|
<div class="label"><b>Allocation</b></div>
|
|
<div>
|
|
{% if device_real.allocated %}
|
|
Allocated
|
|
{% else %}
|
|
Not allocated
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-6">
|
|
{% if manuals.icecat %}
|
|
<h5 class="card-title">Icecat data sheet</h5>
|
|
<div class="row">
|
|
<div class="col-12 list-group-item d-flex align-items-center">
|
|
{% if manuals.details.logo %}
|
|
<img style="max-width: 50px; margin-right: 15px;" src="{{ manuals.details.logo }}" />
|
|
{% endif %}
|
|
{% if manuals.details.image %}
|
|
<img style="max-width: 100px; margin-right: 15px;" src="{{ manuals.details.image }}" />
|
|
{% endif %}
|
|
{% if manuals.details.pdf %}
|
|
<a href="{{ manuals.details.pdf }}" target="_blank">{{ manuals.details.title }}</a><br />
|
|
{% else %}
|
|
{{ manuals.details.title }}<br />
|
|
{% endif %}
|
|
</div>
|
|
<div class="col-12 accordion-item">
|
|
<h5 class="card-title accordion-header">
|
|
<button class="accordion-button collapsed" data-bs-target="#manuals-icecat" type="button"
|
|
data-bs-toggle="collapse" aria-expanded="false">
|
|
More examples
|
|
</button>
|
|
</h5>
|
|
<div id="manuals-icecat" class="row accordion-collapse collapse">
|
|
<div class="accordion-body">
|
|
{% for m in manuals.icecat %}
|
|
<div class="list-group-item d-flex align-items-center">
|
|
{% if m.logo %}
|
|
<img style="max-width: 50px; margin-right: 15px;" src="{{ m.logo }}" />
|
|
{% endif %}
|
|
{% if m.pdf %}
|
|
<a href="{{ m.pdf }}" target="_blank">{{ m.title }}</a><br />
|
|
{% else %}
|
|
{{ m.title }}<br />
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="row mt-3">
|
|
<div class="col-6">
|
|
<h5 class="card-title">Components</h5>
|
|
<div class="row">
|
|
{% if components %}
|
|
<div class="list-group col">
|
|
{% for component in components|sort(attribute='type') %}
|
|
<div class="list-group-item">
|
|
<div class="d-flex w-100 justify-content-between">
|
|
<h5 class="mb-1">{{ component.type }}</h5>
|
|
<small class="text-muted">{{ component.created.strftime('%H:%M %d-%m-%Y') }}</small>
|
|
</div>
|
|
<p class="mb-1">
|
|
Manufacturer: {{ component.manufacturer or '- not detected -' }}<br />
|
|
Model: {{ component.model or '- not detected -' }}<br />
|
|
Serial: {{ component.serial_number and component.serial_number.upper() or '- not detected -' }}
|
|
</p>
|
|
<small class="text-muted">
|
|
{% if component.type in ['RamModule', 'HardDrive', 'SolidStateDrive'] %}
|
|
{{ component.size }}MB
|
|
{% endif %}
|
|
</small>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<div class="list-group col">
|
|
<div class="list-group-item">
|
|
- not detected -
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="col-6">
|
|
<h5 class="card-title">Repair history</h5>
|
|
<div class="row">
|
|
<div class="list-group col">
|
|
{% for action in placeholder.actions %}
|
|
<div class="list-group-item d-flex justify-content-between align-items-center">
|
|
{{ action.type }} {{ action.severity }}
|
|
<small class="text-muted">{{ action.created.strftime('%H:%M %d-%m-%Y') }}</small>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% if manuals.laer %}
|
|
<div class="row mt-3">
|
|
<div class="col-12">
|
|
<h5 class="card-title">Recycled Content</h5>
|
|
|
|
<div class="row mb-3">
|
|
<div class="col-sm-2">
|
|
Metal
|
|
</div>
|
|
<div class="col-sm-10">
|
|
<div class="progress">
|
|
|
|
<div class="progress-bar"
|
|
role="progressbar"
|
|
style="width: {{ manuals.laer.0.metal }}%"
|
|
aria-valuenow="{{ manuals.laer.0.metal }}"
|
|
aria-valuemin="0"
|
|
aria-valuemax="100">{{ manuals.laer.0.metal }}%
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-sm-2">
|
|
Plastic post Consumer
|
|
</div>
|
|
<div class="col-sm-10">
|
|
<div class="progress">
|
|
<div class="progress-bar"
|
|
role="progressbar"
|
|
style="width: {{ manuals.laer.0.plastic_post_consumer }}%"
|
|
aria-valuenow="{{ manuals.laer.0.plastic_post_consumer }}"
|
|
aria-valuemin="0"
|
|
aria-valuemax="100">{{ manuals.laer.0.plastic_post_consumer }}%
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mb-3">
|
|
<div class="col-sm-2">
|
|
Plastic post Industry
|
|
</div>
|
|
<div class="col-sm-10">
|
|
<div class="progress">
|
|
<div class="progress-bar"
|
|
role="progressbar"
|
|
style="width: {{ manuals.laer.0.plastic_post_industry }}%"
|
|
aria-valuenow="{{ manuals.laer.0.plastic_post_industry }}"
|
|
aria-valuemin="0"
|
|
aria-valuemax="100">{{ manuals.laer.0.plastic_post_industry }}%
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar %}
|
|
<div class="row mt-3">
|
|
<div class="col-12">
|
|
<h5 class="card-title">Energy spent</h5>
|
|
|
|
{% if manuals.energystar.long_idle_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Consumption when inactivity power function is activated (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.long_idle_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.short_idle_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Consumption when inactivity power function is not activated (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.short_idle_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.sleep_mode_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
sleep_mode_watts
|
|
Consumption when computer goes into sleep mode (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.sleep_mode_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.off_mode_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Consumption when the computer is off (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.off_mode_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.tec_allowance_kwh %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Power allocation for normal operation (kwh)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.tec_allowance_kwh }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.tec_of_model_kwh %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Consumption of the model configuration (kwh)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.tec_of_model_kwh }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.tec_requirement_kwh %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Energy allowance provided (kwh)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.tec_requirement_kwh }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.work_off_mode_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
The lowest power mode which cannot be switched off (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.work_off_mode_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if manuals.energystar.work_weighted_power_of_model_watts %}
|
|
<div class="row mb-3">
|
|
<div class="col-sm-10">
|
|
Weighted energy consumption from all its states (watts)
|
|
</div>
|
|
<div class="col-sm-2">
|
|
{{ manuals.energystar.work_weighted_power_of_model_watts }}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
|
|
{% if manuals.ifixit %}
|
|
<div class="row">
|
|
<div class="col-12 accordion-item">
|
|
<h5 class="card-title accordion-header">
|
|
<button class="accordion-button collapsed" data-bs-target="#manuals-repair" type="button"
|
|
data-bs-toggle="collapse" aria-expanded="false">
|
|
Repair manuals
|
|
</button>
|
|
</h5>
|
|
<div id="manuals-repair" class="row accordion-collapse collapse">
|
|
<div class="list-group col">
|
|
{% for m in manuals.ifixit %}
|
|
<div class="list-group-item d-flex align-items-center">
|
|
{% if m.image %}
|
|
<img style="max-width: 100px; margin-right: 15px;" src="{{ m.image }}" />
|
|
{% endif %}
|
|
{% if m.url %}
|
|
<a href="{{ m.url }}" target="_blank">{{ m.title }}</a><br />
|
|
{% else %}
|
|
{{ m.title }}<br />
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
</main>
|
|
<!-- ======= Footer ======= -->
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col">
|
|
<footer class="footer">
|
|
<div class="copyright">
|
|
© Copyright <strong><span>Usody</span></strong>. All Rights Reserved
|
|
</div>
|
|
<div class="credits">
|
|
<a href="https://help.usody.com/en/" target="_blank">Help</a> |
|
|
<a href="https://www.usody.com/legal/privacy-policy" target="_blank">Privacy</a> |
|
|
<a href="https://www.usody.com/legal/terms" target="_blank">Terms</a>
|
|
</div>
|
|
<div class="credits">
|
|
DeviceHub
|
|
</div>
|
|
</footer><!-- End Footer -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if user.is_anonymous and not rols %}
|
|
<div class="modal fade" id="validateModal" tabindex="-1" style="display: none;" aria-hidden="true">
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content">
|
|
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Validate as <span id="title-action"></span></h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
<a class="btn btn-primary" type="button"
|
|
href="{{ url_for('core.login') }}?next={{ path }}">
|
|
User of system
|
|
</a>
|
|
{% if oidc %}
|
|
<br />
|
|
<a class="btn btn-primary mt-3" type="button" href="{{ url_for('oidc.login_other_inventory') }}?next={{ path }}">
|
|
User of other inventory
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<div class="modal-footer"></div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="modal fade" id="rolsModal" tabindex="-1" style="display: none;" aria-hidden="true">
|
|
<div class="modal-dialog modal-dialog-centered">
|
|
<div class="modal-content">
|
|
|
|
<form action="{{ path }}" method="get">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Select your Role <span id="title-action"></span></h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
|
|
<div class="modal-body">
|
|
<select name="rol">
|
|
{% for k, v in rols %}
|
|
<option value="{{ k }}" {% if v==rol %}selected=selected{% endif %}>{{ v }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
|
<input type="submit" class="btn btn-primary" value="Send" />
|
|
</div>
|
|
</form>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</body>
|
|
|
|
<!-- Custom Code -->
|
|
{% if not user.is_anonymous and not rol %}
|
|
<script>
|
|
$(document).ready(() => {
|
|
$("#buttonRol").click();
|
|
});
|
|
</script>
|
|
{% endif %}
|
|
|
|
</html>
|