save a new device and validations

This commit is contained in:
Cayo Puigdefabregas 2022-01-20 13:13:20 +01:00
parent 6e0f627aca
commit f497cc03e5
2 changed files with 202 additions and 25 deletions

View File

@ -1,10 +1,8 @@
import json import json
import teal
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import StringField, validators, MultipleFileField from wtforms import StringField, validators, MultipleFileField, FloatField, IntegerField
from flask import g, request, app from flask import g, request
from sqlalchemy.util import OrderedSet from sqlalchemy.util import OrderedSet
from psycopg2.errors import UniqueViolation
from json.decoder import JSONDecodeError from json.decoder import JSONDecodeError
from ereuse_devicehub.db import db from ereuse_devicehub.db import db
@ -142,11 +140,7 @@ class UploadSnapshotForm(FlaskForm):
path_snapshot = save_json(snapshot_json, self.tmp_snapshots, g.user.email) path_snapshot = save_json(snapshot_json, self.tmp_snapshots, g.user.email)
snapshot_json.pop('debug', None) snapshot_json.pop('debug', None)
snapshot_json = schema.load(snapshot_json) snapshot_json = schema.load(snapshot_json)
try: response = self.build(snapshot_json)
response = self.build(snapshot_json)
except teal.db.DBError as error:
self.result[filename] = 'Error: {0}'.format(error.code)
break
if hasattr(response, 'type'): if hasattr(response, 'type'):
self.result[filename] = 'Ok' self.result[filename] = 'Ok'
@ -225,15 +219,15 @@ class NewDeviceForm(FlaskForm):
appearance = StringField(u'Appearance') appearance = StringField(u'Appearance')
functionality = StringField(u'Functionality') functionality = StringField(u'Functionality')
brand = StringField(u'Brand') brand = StringField(u'Brand')
generation = StringField(u'Generation') generation = IntegerField(u'Generation')
version = StringField(u'Version') version = StringField(u'Version')
weight = StringField(u'Weight') weight = FloatField(u'Weight', [validators.DataRequired()])
width = StringField(u'Width') width = FloatField(u'Width', [validators.DataRequired()])
height = StringField(u'Height') height = FloatField(u'Height', [validators.DataRequired()])
depth = StringField(u'Depth') depth = FloatField(u'Depth', [validators.DataRequired()])
variant = StringField(u'Variant') variant = StringField(u'Variant')
sku = StringField(u'SKU') sku = StringField(u'SKU')
image = StringField(u'Image') image = StringField(u'Image', [validators.Optional(), validators.URL()])
imei = StringField(u'IMEI') imei = StringField(u'IMEI')
meid = StringField(u'MEID') meid = StringField(u'MEID')
resolution = StringField(u'Resolution width') resolution = StringField(u'Resolution width')
@ -248,14 +242,53 @@ class NewDeviceForm(FlaskForm):
"Mouse": Mouse, "Mouse": Mouse,
"Keyboard": Keyboard, "Keyboard": Keyboard,
"SAI": SAI, "SAI": SAI,
"MemoryCardReader": MemoryCardReader, "MemoryCardReader": MemoryCardReader}
}
if not self.generation.data:
self.generation.data = 0
if not self.weight.data:
self.weight.data = 0.1
if not self.height.data:
self.height.data = 0.1
if not self.width.data:
self.width.data = 0.1
if not self.depth.data:
self.depth.data = 0.1
if self.type.data: if self.type.data:
self.instance = self.devices[self.type.data]() self.instance = self.devices[self.type.data]()
self.populate_obj(self.instance) self.populate_obj(self.instance)
def validate(self, extra_validators=None):
is_valid = super().validate(extra_validators)
if not is_valid:
return False
if self.generation.data < 0:
return False
if self.weight.data < 0.1:
return False
if self.height.data < 0.1:
return False
if self.width.data < 0.1:
return False
if self.depth.data < 0.1:
return False
return True
def save(self): def save(self):
db.session.add(self.instance) db.session.add(self.instance)
import pdb; pdb.set_trace()
db.session.commit() db.session.commit()
return self.instance return self.instance
@ -265,6 +298,3 @@ class NewActionForm(FlaskForm):
date = StringField(u'Date') date = StringField(u'Date')
severity = StringField(u'Severity') severity = StringField(u'Severity')
description = StringField(u'Description') description = StringField(u'Description')
def save(self):
pass

View File

@ -53,30 +53,65 @@
</optgroup> </optgroup>
</select> </select>
<small class="text-muted form-text">Type of devices</small> <small class="text-muted form-text">Type of devices</small>
{% if form.type.errors %}
<p class="text-danger">
{% for error in form.type.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="form-group mb-2"> <div class="form-group mb-2">
<label for="label" class="form-label">Label</label> <label for="label" class="form-label">Label</label>
{{ form.label(class_="form-control") }} {{ form.label(class_="form-control") }}
<small class="text-muted form-text">Label that you want link to this device</small> <small class="text-muted form-text">Label that you want link to this device</small>
{% if form.label.errors %}
<p class="text-danger">
{% for error in form.label.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="serialNumber" class="form-label">{{ form.serial_number.label }} *</label> <label for="serialNumber" class="form-label">{{ form.serial_number.label }} *</label>
{{ form.serial_number(class_="form-control") }} {{ form.serial_number(class_="form-control") }}
<small class="text-muted form-text">Serial number of this device</small> <small class="text-muted form-text">Serial number of this device</small>
{% if form.serial_number.errors %}
<p class="text-danger">
{% for error in form.serial_number.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.model.label }} *</label> <label for="model" class="form-label">{{ form.model.label }} *</label>
{{ form.model(class_="form-control") }} {{ form.model(class_="form-control") }}
<small class="text-muted form-text">Name of model</small> <small class="text-muted form-text">Name of model</small>
{% if form.model.errors %}
<p class="text-danger">
{% for error in form.model.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.manufacturer.label }} *</label> <label for="model" class="form-label">{{ form.manufacturer.label }} *</label>
{{ form.manufacturer(class_="form-control") }} {{ form.manufacturer(class_="form-control") }}
<small class="text-muted form-text">Name of manufacturer</small> <small class="text-muted form-text">Name of manufacturer</small>
{% if form.manufacturer.errors %}
<p class="text-danger">
{% for error in form.manufacturer.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
@ -106,6 +141,13 @@
<label class="form-check-label">E. It is unacceptable (substantial visual damage that may affect use)</label> <label class="form-check-label">E. It is unacceptable (substantial visual damage that may affect use)</label>
</div> </div>
<small class="text-muted form-text">Rate the imperfections that affect the device aesthetically, but not its use.</small> <small class="text-muted form-text">Rate the imperfections that affect the device aesthetically, but not its use.</small>
{% if form.appearance.errors %}
<p class="text-danger">
{% for error in form.appearance.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
@ -127,90 +169,195 @@
<label class="form-check-label">D. Multiple buttons do not work properly; the screen has severe damage that may affect use</label> <label class="form-check-label">D. Multiple buttons do not work properly; the screen has severe damage that may affect use</label>
</div> </div>
<small class="text-muted form-text">It qualifies the defects of a device that affect its use.</small> <small class="text-muted form-text">It qualifies the defects of a device that affect its use.</small>
{% if form.functionality.errors %}
<p class="text-danger">
{% for error in form.functionality.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.brand.label }}</label> <label for="model" class="form-label">{{ form.brand.label }}</label>
{{ form.brand(class_="form-control") }} {{ form.brand(class_="form-control") }}
<small class="text-muted form-text">A naming for consumers. This field can represent several models, so it can be ambiguous, and it is not used to identify the product.</small> <small class="text-muted form-text">A naming for consumers. This field can represent several models, so it can be ambiguous, and it is not used to identify the product.</small>
{% if form.brand.errors %}
<p class="text-danger">
{% for error in form.brand.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.generation.label }}</label> <label for="model" class="form-label">{{ form.generation.label }} *</label>
{{ form.generation(class_="form-control") }} {{ form.generation(class_="form-control") }}
<small class="text-muted form-text">The generation of the device.</small> <small class="text-muted form-text">The generation of the device.</small>
{% if form.generation.errors %}
<p class="text-danger">
{% for error in form.generation.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.version.label }}</label> <label for="model" class="form-label">{{ form.version.label }}</label>
{{ form.version(class_="form-control") }} {{ form.version(class_="form-control") }}
<small class="text-muted form-text">The version code o fthis device, like 'v1' or 'A001'.</small> <small class="text-muted form-text">The version code o fthis device, like 'v1' or 'A001'.</small>
{% if form.version.errors %}
<p class="text-danger">
{% for error in form.version.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.weight.label }}</label> <label for="model" class="form-label">{{ form.weight.label }} *</label>
{{ form.weight(class_="form-control") }} {{ form.weight(class_="form-control") }}
<small class="text-muted form-text">The weight of the device in Kg.</small> <small class="text-muted form-text">The weight of the device in Kg.</small>
{% if form.weight.errors %}
<p class="text-danger">
{% for error in form.weight.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.width.label }}</label> <label for="model" class="form-label">{{ form.width.label }} *</label>
{{ form.width(class_="form-control") }} {{ form.width(class_="form-control") }}
<small class="text-muted form-text">The width of the device in meters.</small> <small class="text-muted form-text">The width of the device in meters.</small>
{% if form.width.errors %}
<p class="text-danger">
{% for error in form.width.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.height.label }}</label> <label for="model" class="form-label">{{ form.height.label }} *</label>
{{ form.height(class_="form-control") }} {{ form.height(class_="form-control") }}
<small class="text-muted form-text">The height of the device in meters.</small> <small class="text-muted form-text">The height of the device in meters.</small>
{% if form.height.errors %}
<p class="text-danger">
{% for error in form.height.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.depth.label }}</label> <label for="model" class="form-label">{{ form.depth.label }} *</label>
{{ form.depth(class_="form-control") }} {{ form.depth(class_="form-control") }}
<small class="text-muted form-text">The depth of the device in meters.</small> <small class="text-muted form-text">The depth of the device in meters.</small>
{% if form.depth.errors %}
<p class="text-danger">
{% for error in form.depth.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.variant.label }}</label> <label for="model" class="form-label">{{ form.variant.label }}</label>
{{ form.variant(class_="form-control") }} {{ form.variant(class_="form-control") }}
<small class="text-muted form-text">A variant or sub-model of the device.</small> <small class="text-muted form-text">A variant or sub-model of the device.</small>
{% if form.variant.errors %}
<p class="text-danger">
{% for error in form.variant.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="model" class="form-label">{{ form.sku.label }}</label> <label for="model" class="form-label">{{ form.sku.label }}</label>
{{ form.sku(class_="form-control") }} {{ form.sku(class_="form-control") }}
<small class="text-muted form-text">The Stock Keeping Unit (SKU), i.e. a merchant-specific identifier for a product or service.</small> <small class="text-muted form-text">The Stock Keeping Unit (SKU), i.e. a merchant-specific identifier for a product or service.</small>
{% if form.sku.errors %}
<p class="text-danger">
{% for error in form.sku.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div class="from-group has-validation mb-2"> <div class="from-group has-validation mb-2">
<label for="image" class="form-label">{{ form.image.label }}</label> <label for="image" class="form-label">{{ form.image.label }}</label>
{{ form.image(class_="form-control") }} {{ form.image(class_="form-control") }}
<small class="text-muted form-text">An URL containing an image of the device.</small> <small class="text-muted form-text">An URL containing an image of the device.</small>
{% if form.image.errors %}
<p class="text-danger">
{% for error in form.image.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div id="imei" class="from-group has-validation mb-2"> <div id="imei" class="from-group has-validation mb-2">
<label for="imei" class="form-label">{{ form.imei.label }}</label> <label for="imei" class="form-label">{{ form.imei.label }}</label>
{{ form.imei(class_="form-control") }} {{ form.imei(class_="form-control") }}
<small class="text-muted form-text">A number from 14 to 16 digits.</small> <small class="text-muted form-text">A number from 14 to 16 digits.</small>
{% if form.imei.errors %}
<p class="text-danger">
{% for error in form.imei.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div id="meid" class="from-group has-validation mb-2"> <div id="meid" class="from-group has-validation mb-2">
<label for="meid" class="form-label">{{ form.meid.label }}</label> <label for="meid" class="form-label">{{ form.meid.label }}</label>
{{ form.meid(class_="form-control") }} {{ form.meid(class_="form-control") }}
<small class="text-muted form-text">14 hexadecimal digits.</small> <small class="text-muted form-text">14 hexadecimal digits.</small>
{% if form.meid.errors %}
<p class="text-danger">
{% for error in form.meid.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div id="resolution" class="from-group has-validation mb-2"> <div id="resolution" class="from-group has-validation mb-2">
<label for="resolution" class="form-label">{{ form.resolution.label }}</label> <label for="resolution" class="form-label">{{ form.resolution.label }}</label>
{{ form.resolution(class_="form-control") }} {{ form.resolution(class_="form-control") }}
<small class="text-muted form-text">The resolution width of the screen.</small> <small class="text-muted form-text">The resolution width of the screen.</small>
{% if form.resolution.errors %}
<p class="text-danger">
{% for error in form.resolution.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
<div id="screen" class="from-group has-validation mb-2"> <div id="screen" class="from-group has-validation mb-2">
<label for="screen" class="form-label">{{ form.screen.label }}</label> <label for="screen" class="form-label">{{ form.screen.label }}</label>
{{ form.screen(class_="form-control") }} {{ form.screen(class_="form-control") }}
<small class="text-muted form-text">The size of the screen.</small> <small class="text-muted form-text">The size of the screen.</small>
{% if form.screen.errors %}
<p class="text-danger">
{% for error in form.screen.errors %}
{{ error }}<br/>
{% endfor %}
</p>
{% endif %}
</div> </div>
</div> </div>