From da9b2ea9c2ef37eb191ba0a9e78e62ce942dc912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20S=C3=A1nchez=20Parra?= Date: Fri, 3 Sep 2021 14:51:15 +0200 Subject: [PATCH] Add image details action This action is used to visualize the specific details of an image, as its ID, name, size, etc. --- ogcp/forms/action_forms.py | 11 +++++++++- ogcp/templates/actions/image_details.html | 13 ++++++++++++ ogcp/templates/images.html | 2 ++ ogcp/views.py | 26 ++++++++++++++++++++++- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 ogcp/templates/actions/image_details.html diff --git a/ogcp/forms/action_forms.py b/ogcp/forms/action_forms.py index 1722d8b..d881065 100644 --- a/ogcp/forms/action_forms.py +++ b/ogcp/forms/action_forms.py @@ -7,7 +7,7 @@ from wtforms import ( Form, SubmitField, HiddenField, SelectField, BooleanField, IntegerField, - StringField, RadioField, FormField, FieldList + StringField, RadioField, FormField, FieldList, DecimalField ) from wtforms.validators import InputRequired from flask_wtf import FlaskForm @@ -143,3 +143,12 @@ class DeleteRoomForm(FlaskForm): room = SelectField(label=_('Room'), validators=[InputRequired()]) submit = SubmitField(label=_('Submit')) + +class ImageDetailsForm(FlaskForm): + id = StringField(label=_('Id')) + name = StringField(label=_('Name')) + size = DecimalField(label=_('Size (GiB)')) + datasize = DecimalField(label=_('Datasize (GiB)')) + modified = StringField(label=_('Modified')) + permissions = StringField(label=_('Permissions')) + software_id = StringField(label=_('Software id')) diff --git a/ogcp/templates/actions/image_details.html b/ogcp/templates/actions/image_details.html new file mode 100644 index 0000000..a4feb55 --- /dev/null +++ b/ogcp/templates/actions/image_details.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} +{% import "bootstrap/wtf.html" as wtf %} + +{% block content %} + +

{{_('Image details')}}

+ +{{ wtf.quick_form(form, + method='post', + button_map={'create': 'primary'}, + extra_classes="mx-5") }} + +{% endblock %} diff --git a/ogcp/templates/images.html b/ogcp/templates/images.html index e698af9..3faa029 100644 --- a/ogcp/templates/images.html +++ b/ogcp/templates/images.html @@ -25,5 +25,7 @@ {% endblock %} {% block commands %} + {% endblock %} diff --git a/ogcp/views.py b/ogcp/views.py index 3e80120..11e3693 100644 --- a/ogcp/views.py +++ b/ogcp/views.py @@ -9,7 +9,7 @@ from flask import ( g, render_template, url_for, flash, redirect, request, jsonify, make_response ) from ogcp.forms.action_forms import ( - WOLForm, SetupForm, ClientDetailsForm, HardwareForm, + WOLForm, SetupForm, ClientDetailsForm, ImageDetailsForm, HardwareForm, SessionForm, ImageRestoreForm, ImageCreateForm, SoftwareForm, BootModeForm, RoomForm, DeleteRoomForm, CenterForm, DeleteCenterForm ) @@ -774,3 +774,27 @@ def images(): r = g.server.get('/images') images = r.json()['images'] return render_template('images.html', images=images) + +@app.route('/action/image/info', methods=['GET']) +@login_required +def action_image_info(): + form = ImageDetailsForm() + ids = parse_elements(request.args.to_dict()) + if not validate_elements(ids, max_len=1): + return redirect(url_for('images')) + + id = ids.pop() + r = g.server.get('/images') + images = r.json()['images'] + image = next(img for img in images if img['id'] == int(id)) + + form.id.data = image['id'] + form.name.data = image['name'] + # Bytes to Gibibytes + form.size.data = image['size'] / 1024 ** 3 + form.datasize.data = image['datasize'] / 1024 ** 3 + form.modified.data = image['modified'] + form.permissions.data = image['permissions'] + form.software_id.data = image['software_id'] + + return render_template('actions/image_details.html', form=form)