add manual edit placeholder
This commit is contained in:
parent
71518ca2a5
commit
bc8944a498
|
@ -334,7 +334,12 @@ class NewDeviceForm(FlaskForm):
|
||||||
screen = FloatField('Screen size', [validators.Optional()])
|
screen = FloatField('Screen size', [validators.Optional()])
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
self._obj = kwargs.pop('_obj', None)
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
if self._obj:
|
||||||
|
self.type.data = self._obj.type
|
||||||
|
if not request.form:
|
||||||
|
self.reset_from_obj()
|
||||||
self.devices = {
|
self.devices = {
|
||||||
"Laptop": Laptop,
|
"Laptop": Laptop,
|
||||||
"Desktop": Desktop,
|
"Desktop": Desktop,
|
||||||
|
@ -364,6 +369,45 @@ class NewDeviceForm(FlaskForm):
|
||||||
if not self.depth.data:
|
if not self.depth.data:
|
||||||
self.depth.data = 0.1
|
self.depth.data = 0.1
|
||||||
|
|
||||||
|
def reset_from_obj(self):
|
||||||
|
if not self._obj:
|
||||||
|
return
|
||||||
|
disabled = {'disabled': "disabled"}
|
||||||
|
appearance = self._obj.appearance()
|
||||||
|
functionality = self._obj.functionality()
|
||||||
|
if appearance:
|
||||||
|
appearance = appearance.name
|
||||||
|
if functionality:
|
||||||
|
functionality = functionality.name
|
||||||
|
self.type.render_kw = disabled
|
||||||
|
self.type.data = self._obj.type
|
||||||
|
self.amount.render_kw = disabled
|
||||||
|
self.id_device_supplier.data = self._obj.placeholder.id_device_supplier
|
||||||
|
self.phid.data = self._obj.placeholder.phid
|
||||||
|
self.pallet.data = self._obj.placeholder.pallet
|
||||||
|
self.info.data = self._obj.placeholder.info
|
||||||
|
self.serial_number.data = self._obj.serial_number
|
||||||
|
self.model.data = self._obj.model
|
||||||
|
self.manufacturer.data = self._obj.manufacturer
|
||||||
|
self.appearance.data = appearance
|
||||||
|
self.functionality.data = functionality
|
||||||
|
self.brand.data = self._obj.brand
|
||||||
|
self.generation.data = self._obj.generation
|
||||||
|
self.version.data = self._obj.version
|
||||||
|
self.weight.data = self._obj.weight
|
||||||
|
self.width.data = self._obj.width
|
||||||
|
self.height.data = self._obj.height
|
||||||
|
self.depth.data = self._obj.depth
|
||||||
|
self.variant.data = self._obj.variant
|
||||||
|
self.sku.data = self._obj.sku
|
||||||
|
self.image.data = self._obj.image
|
||||||
|
if self._obj.type in ['Smartphone', 'Tablet', 'Cellphone']:
|
||||||
|
self.imei.data = self._obj.imei
|
||||||
|
self.meid.data = self._obj.meid
|
||||||
|
if self._obj.type == 'ComputerMonitor':
|
||||||
|
self.resolution.data = self._obj.resolution_width
|
||||||
|
self.screen.data = self._obj.size
|
||||||
|
|
||||||
def validate(self, extra_validators=None): # noqa: C901
|
def validate(self, extra_validators=None): # noqa: C901
|
||||||
error = ["Not a correct value"]
|
error = ["Not a correct value"]
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
@ -403,7 +447,20 @@ class NewDeviceForm(FlaskForm):
|
||||||
self.meid.errors = error
|
self.meid.errors = error
|
||||||
is_valid = False
|
is_valid = False
|
||||||
|
|
||||||
if self.phid.data and self.amount.data == 1:
|
if self.phid.data and self.amount.data == 1 and not self._obj:
|
||||||
|
dev = Placeholder.query.filter(
|
||||||
|
Placeholder.phid == self.phid.data, Device.owner == g.user
|
||||||
|
).first()
|
||||||
|
if dev:
|
||||||
|
msg = "Sorry, exist one snapshot device with this HID"
|
||||||
|
self.phid.errors = [msg]
|
||||||
|
is_valid = False
|
||||||
|
|
||||||
|
if (
|
||||||
|
self.phid.data
|
||||||
|
and self._obj
|
||||||
|
and self.phid.data != self._obj.placeholder.phid
|
||||||
|
):
|
||||||
dev = Placeholder.query.filter(
|
dev = Placeholder.query.filter(
|
||||||
Placeholder.phid == self.phid.data, Device.owner == g.user
|
Placeholder.phid == self.phid.data, Device.owner == g.user
|
||||||
).first()
|
).first()
|
||||||
|
@ -427,9 +484,12 @@ class NewDeviceForm(FlaskForm):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def save(self, commit=True):
|
def save(self, commit=True):
|
||||||
for n in range(self.amount.data):
|
if self._obj:
|
||||||
self.reset_ids()
|
self.edit_device()
|
||||||
self.create_device()
|
else:
|
||||||
|
for n in range(self.amount.data):
|
||||||
|
self.reset_ids()
|
||||||
|
self.create_device()
|
||||||
|
|
||||||
if commit:
|
if commit:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -466,7 +526,6 @@ class NewDeviceForm(FlaskForm):
|
||||||
'functionalityRange': self.functionality.data,
|
'functionalityRange': self.functionality.data,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
snapshot_json = schema.load(json_snapshot)
|
snapshot_json = schema.load(json_snapshot)
|
||||||
device = snapshot_json['device']
|
device = snapshot_json['device']
|
||||||
|
|
||||||
|
@ -501,6 +560,42 @@ class NewDeviceForm(FlaskForm):
|
||||||
)
|
)
|
||||||
return self.placeholder
|
return self.placeholder
|
||||||
|
|
||||||
|
def edit_device(self):
|
||||||
|
self._obj.placeholder.phid = self.phid.data or self._obj.placeholder.phid
|
||||||
|
self._obj.placeholder.id_device_supplier = self.id_device_supplier.data or None
|
||||||
|
self._obj.placeholder.info = self.info.data or None
|
||||||
|
self._obj.placeholder.pallet = self.pallet.data or None
|
||||||
|
self._obj.model = self.model.data
|
||||||
|
self._obj.manufacturer = self.manufacturer.data
|
||||||
|
self._obj.serial_number = self.serial_number.data
|
||||||
|
self._obj.brand = self.brand.data
|
||||||
|
self._obj.version = self.version.data
|
||||||
|
self._obj.generation = self.generation.data
|
||||||
|
self._obj.sku = self.sku.data
|
||||||
|
self._obj.weight = self.weight.data
|
||||||
|
self._obj.width = self.width.data
|
||||||
|
self._obj.height = self.height.data
|
||||||
|
self._obj.depth = self.depth.data
|
||||||
|
self._obj.variant = self.variant.data
|
||||||
|
self._obj.image = self.image.data
|
||||||
|
|
||||||
|
if self._obj.type == 'ComputerMonitor':
|
||||||
|
self._obj.resolution_width = self.resolution.data
|
||||||
|
self._obj.size = self.screen.data
|
||||||
|
|
||||||
|
if self._obj.type in ['Smartphone', 'Tablet', 'Cellphone']:
|
||||||
|
self._obj.imei = self.imei.data
|
||||||
|
self._obj.meid = self.meid.data
|
||||||
|
|
||||||
|
if self.appearance.data and self.appearance.data != self._obj.appearance().name:
|
||||||
|
self._obj.set_appearance(self.appearance.data)
|
||||||
|
|
||||||
|
if (
|
||||||
|
self.functionality.data
|
||||||
|
and self.functionality.data != self._obj.functionality().name
|
||||||
|
):
|
||||||
|
self._obj.set_functionality(self.functionality.data)
|
||||||
|
|
||||||
|
|
||||||
class TagDeviceForm(FlaskForm):
|
class TagDeviceForm(FlaskForm):
|
||||||
tag = SelectField('Tag', choices=[])
|
tag = SelectField('Tag', choices=[])
|
||||||
|
@ -1342,18 +1437,42 @@ class UploadPlaceholderForm(FlaskForm):
|
||||||
'Select a Placeholder File', [validators.DataRequired()]
|
'Select a Placeholder File', [validators.DataRequired()]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_data_file(self):
|
||||||
|
files = request.files.getlist(self.placeholder_file.name)
|
||||||
|
|
||||||
|
if not files:
|
||||||
|
return False
|
||||||
|
|
||||||
|
_file = files[0]
|
||||||
|
if _file.content_type == 'text/csv':
|
||||||
|
delimiter = ';'
|
||||||
|
data = pd.read_csv(_file).to_dict()
|
||||||
|
head = list(data.keys())[0].split(delimiter)
|
||||||
|
values = [
|
||||||
|
{k: v.split(delimiter)} for x in data.values() for k, v in x.items()
|
||||||
|
]
|
||||||
|
data = {}
|
||||||
|
for i in range(len(head)):
|
||||||
|
data[head[i]] = {}
|
||||||
|
for x in values:
|
||||||
|
for k, v in x.items():
|
||||||
|
data[head[i]][k] = v[i]
|
||||||
|
else:
|
||||||
|
data = pd.read_excel(_file).to_dict()
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
def validate(self, extra_validators=None):
|
def validate(self, extra_validators=None):
|
||||||
is_valid = super().validate(extra_validators)
|
is_valid = super().validate(extra_validators)
|
||||||
|
|
||||||
if not is_valid:
|
if not is_valid:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
files = request.files.getlist(self.placeholder_file.name)
|
if not request.files.getlist(self.placeholder_file.name):
|
||||||
|
|
||||||
if not files:
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
data = pd.read_excel(files[0]).to_dict()
|
data = self.get_data_file()
|
||||||
|
|
||||||
header = [
|
header = [
|
||||||
'Phid',
|
'Phid',
|
||||||
'Model',
|
'Model',
|
||||||
|
@ -1428,3 +1547,31 @@ class UploadPlaceholderForm(FlaskForm):
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
return self.placeholders
|
return self.placeholders
|
||||||
|
|
||||||
|
|
||||||
|
class EditPlaceholderForm(FlaskForm):
|
||||||
|
manufacturer = StringField('Manufacturer', [validators.Optional()])
|
||||||
|
model = StringField('Model', [validators.Optional()])
|
||||||
|
serial_number = StringField('Serial Number', [validators.Optional()])
|
||||||
|
id_device_supplier = StringField('Id Supplier', [validators.Optional()])
|
||||||
|
phid = StringField('Phid', [validators.DataRequired()])
|
||||||
|
pallet = StringField('Pallet', [validators.Optional()])
|
||||||
|
info = StringField('Info', [validators.Optional()])
|
||||||
|
|
||||||
|
def validate(self, extra_validators=None):
|
||||||
|
is_valid = super().validate(extra_validators)
|
||||||
|
|
||||||
|
if not is_valid:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def save(self, commit=True):
|
||||||
|
|
||||||
|
for device in self.placeholders:
|
||||||
|
db.session.add(device)
|
||||||
|
|
||||||
|
if commit:
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return self.placeholders
|
||||||
|
|
|
@ -273,10 +273,37 @@ class DeviceCreateView(GenericMixin):
|
||||||
return flask.render_template(self.template_name, **self.context)
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceEditView(GenericMixin):
|
||||||
|
methods = ['GET', 'POST']
|
||||||
|
decorators = [login_required]
|
||||||
|
template_name = 'inventory/device_create.html'
|
||||||
|
|
||||||
|
def dispatch_request(self, id):
|
||||||
|
self.get_context()
|
||||||
|
device = (
|
||||||
|
Device.query.filter(Device.owner_id == current_user.id)
|
||||||
|
.filter(Device.devicehub_id == id)
|
||||||
|
.one()
|
||||||
|
)
|
||||||
|
form = NewDeviceForm(_obj=device)
|
||||||
|
self.context.update(
|
||||||
|
{
|
||||||
|
'page_title': 'Edit Device',
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if form.validate_on_submit():
|
||||||
|
next_url = url_for('inventory.device_details', id=id)
|
||||||
|
form.save(commit=True)
|
||||||
|
messages.success('Device "{}" edited successfully!'.format(form.type.data))
|
||||||
|
return flask.redirect(next_url)
|
||||||
|
|
||||||
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
|
|
||||||
class TagLinkDeviceView(View):
|
class TagLinkDeviceView(View):
|
||||||
methods = ['POST']
|
methods = ['POST']
|
||||||
decorators = [login_required]
|
decorators = [login_required]
|
||||||
# template_name = 'inventory/device_list.html'
|
|
||||||
|
|
||||||
def dispatch_request(self):
|
def dispatch_request(self):
|
||||||
form = TagDeviceForm()
|
form = TagDeviceForm()
|
||||||
|
@ -853,10 +880,11 @@ class UploadPlaceholderView(GenericMixin):
|
||||||
if lot_id:
|
if lot_id:
|
||||||
lots = self.context['lots']
|
lots = self.context['lots']
|
||||||
lot = lots.filter(Lot.id == lot_id).one()
|
lot = lots.filter(Lot.id == lot_id).one()
|
||||||
for snap in snapshots:
|
for device in snapshots:
|
||||||
lot.devices.add(snap.device)
|
lot.devices.add(device)
|
||||||
db.session.add(lot)
|
db.session.add(lot)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
messages.success('Placeholders uploaded successfully!')
|
||||||
|
|
||||||
return flask.render_template(self.template_name, **self.context)
|
return flask.render_template(self.template_name, **self.context)
|
||||||
|
|
||||||
|
@ -900,6 +928,9 @@ devices.add_url_rule(
|
||||||
'/lot/<string:lot_id>/device/add/',
|
'/lot/<string:lot_id>/device/add/',
|
||||||
view_func=DeviceCreateView.as_view('lot_device_add'),
|
view_func=DeviceCreateView.as_view('lot_device_add'),
|
||||||
)
|
)
|
||||||
|
devices.add_url_rule(
|
||||||
|
'/device/edit/<string:id>/', view_func=DeviceEditView.as_view('device_edit')
|
||||||
|
)
|
||||||
devices.add_url_rule(
|
devices.add_url_rule(
|
||||||
'/tag/devices/add/', view_func=TagLinkDeviceView.as_view('tag_devices_add')
|
'/tag/devices/add/', view_func=TagLinkDeviceView.as_view('tag_devices_add')
|
||||||
)
|
)
|
||||||
|
|
|
@ -601,6 +601,34 @@ class Device(Thing):
|
||||||
args[POLYMORPHIC_ON] = cls.type
|
args[POLYMORPHIC_ON] = cls.type
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
def appearance(self):
|
||||||
|
actions = copy.copy(self.actions)
|
||||||
|
actions.sort(key=lambda x: x.created)
|
||||||
|
with suppress(LookupError, ValueError, StopIteration):
|
||||||
|
action = next(e for e in reversed(actions) if e.type == 'VisualTest')
|
||||||
|
return action.appearance_range
|
||||||
|
|
||||||
|
def functionality(self):
|
||||||
|
actions = copy.copy(self.actions)
|
||||||
|
actions.sort(key=lambda x: x.created)
|
||||||
|
with suppress(LookupError, ValueError, StopIteration):
|
||||||
|
action = next(e for e in reversed(actions) if e.type == 'VisualTest')
|
||||||
|
return action.functionality_range
|
||||||
|
|
||||||
|
def set_appearance(self, value):
|
||||||
|
actions = copy.copy(self.actions)
|
||||||
|
actions.sort(key=lambda x: x.created)
|
||||||
|
with suppress(LookupError, ValueError, StopIteration):
|
||||||
|
action = next(e for e in reversed(actions) if e.type == 'VisualTest')
|
||||||
|
action.appearance_range = value
|
||||||
|
|
||||||
|
def set_functionality(self, value):
|
||||||
|
actions = copy.copy(self.actions)
|
||||||
|
actions.sort(key=lambda x: x.created)
|
||||||
|
with suppress(LookupError, ValueError, StopIteration):
|
||||||
|
action = next(e for e in reversed(actions) if e.type == 'VisualTest')
|
||||||
|
action.functionality_range = value
|
||||||
|
|
||||||
def is_status(self, action):
|
def is_status(self, action):
|
||||||
from ereuse_devicehub.resources.device import states
|
from ereuse_devicehub.resources.device import states
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
<div>
|
<div>
|
||||||
<div class="form-group has-validation mb-2">
|
<div class="form-group has-validation mb-2">
|
||||||
<label for="name" class="form-label">Type *</label>
|
<label for="name" class="form-label">Type *</label>
|
||||||
<select id="type" class="form-control" name="type" required="">
|
<select id="type" class="form-control" name="type" required="" {% if form.type.render_kw.disabled %}disabled="disabled"{% endif %}>
|
||||||
<option value="">Select one Type</option>
|
<option value="">Select one Type</option>
|
||||||
<optgroup label="Computer">
|
<optgroup label="Computer">
|
||||||
<option value="Laptop"
|
<option value="Laptop"
|
||||||
|
@ -184,27 +184,33 @@
|
||||||
<div class="from-group has-validation mb-2">
|
<div class="from-group has-validation mb-2">
|
||||||
<label for="model" class="form-label">{{ form.appearance.label }}</label>
|
<label for="model" class="form-label">{{ form.appearance.label }}</label>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="Z">
|
<input class="form-check-input" type="radio" name="appearance" value="Z"
|
||||||
|
{% if form.appearance.data == 'Z' %}checked="cheked"{% endif %}>
|
||||||
<label class="form-check-label">0. The device is new.</label>
|
<label class="form-check-label">0. The device is new.</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="A">
|
<input class="form-check-input" type="radio" name="appearance" value="A"
|
||||||
|
{% if form.appearance.data == 'A' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">A. Like new (no visual damage))</label>
|
<label class="form-check-label">A. Like new (no visual damage))</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="B">
|
<input class="form-check-input" type="radio" name="appearance" value="B"
|
||||||
|
{% if form.appearance.data == 'B' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">B. In very good condition (small visual damage to hard-to-detect parts)</label>
|
<label class="form-check-label">B. In very good condition (small visual damage to hard-to-detect parts)</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="C">
|
<input class="form-check-input" type="radio" name="appearance" value="C"
|
||||||
|
{% if form.appearance.data == 'C' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">C. In good condition (small visual damage to easy-to-detect parts, not the screen))</label>
|
<label class="form-check-label">C. In good condition (small visual damage to easy-to-detect parts, not the screen))</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="D">
|
<input class="form-check-input" type="radio" name="appearance" value="D"
|
||||||
|
{% if form.appearance.data == 'D' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">D. It is acceptable (visual damage to visible parts, not on the screen)</label>
|
<label class="form-check-label">D. It is acceptable (visual damage to visible parts, not on the screen)</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="appearance" value="E">
|
<input class="form-check-input" type="radio" name="appearance" value="E"
|
||||||
|
{% if form.appearance.data == 'E' %}checked="checked"{% endif %}>
|
||||||
<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>
|
||||||
|
@ -220,19 +226,23 @@
|
||||||
<div class="from-group has-validation mb-2">
|
<div class="from-group has-validation mb-2">
|
||||||
<label for="model" class="form-label">{{ form.functionality.label }}</label>
|
<label for="model" class="form-label">{{ form.functionality.label }}</label>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="functionality" value="A">
|
<input class="form-check-input" type="radio" name="functionality" value="A"
|
||||||
|
{% if form.functionality.data == 'A' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">A. Everything works perfectly (buttons, and no scratches on the screen)</label>
|
<label class="form-check-label">A. Everything works perfectly (buttons, and no scratches on the screen)</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="functionality" value="B">
|
<input class="form-check-input" type="radio" name="functionality" value="B"
|
||||||
|
{% if form.functionality.data == 'B' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">B. There is a hard to press button or small scratches on the corners of the screen</label>
|
<label class="form-check-label">B. There is a hard to press button or small scratches on the corners of the screen</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="functionality" value="C">
|
<input class="form-check-input" type="radio" name="functionality" value="C"
|
||||||
|
{% if form.functionality.data == 'C' %}checked="checked"{% endif %}>
|
||||||
<label class="form-check-label">C. A non-essential button does not work; the screen has multiple scratches on the corners</label>
|
<label class="form-check-label">C. A non-essential button does not work; the screen has multiple scratches on the corners</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="radio" name="functionality" value="D">
|
<input class="form-check-input" type="radio" name="functionality" value="D"
|
||||||
|
{% if form.functionality.data == 'D' %}checked="checked"{% endif %}>
|
||||||
<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>
|
||||||
|
|
|
@ -54,7 +54,8 @@
|
||||||
<div class="tab-content pt-2">
|
<div class="tab-content pt-2">
|
||||||
|
|
||||||
<div class="tab-pane fade show active" id="type">
|
<div class="tab-pane fade show active" id="type">
|
||||||
<h5 class="card-title">Type Details</h5>
|
<h5 class="card-title">Details</h5>
|
||||||
|
{% if device.placeholder %}(<a href="{{ url_for('inventory.device_edit', id=device.devicehub_id)}}">edit</a>){% endif %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-3 col-md-4 label ">Type</div>
|
<div class="col-lg-3 col-md-4 label ">Type</div>
|
||||||
|
|
|
@ -92,6 +92,13 @@
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
{{ form.placeholder_file }}
|
{{ form.placeholder_file }}
|
||||||
</div>
|
</div>
|
||||||
|
{% if form.placeholder_file.errors %}
|
||||||
|
<p class="text-danger">
|
||||||
|
{% for error in form.placeholder_file.errors %}
|
||||||
|
{{ error }}<br/>
|
||||||
|
{% endfor %}
|
||||||
|
</p>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -49,3 +49,5 @@ pandas==1.3.5
|
||||||
numpy==1.21.6
|
numpy==1.21.6
|
||||||
odfpy==1.4.1
|
odfpy==1.4.1
|
||||||
xlrd==2.0.1
|
xlrd==2.0.1
|
||||||
|
openpyxl==3.0.10
|
||||||
|
et_xmlfile==1.1.0
|
||||||
|
|
Binary file not shown.
|
@ -1634,10 +1634,150 @@ def test_add_placeholder_excel(user3: UserClientFlask):
|
||||||
'placeholder_file': excel,
|
'placeholder_file': excel,
|
||||||
}
|
}
|
||||||
user3.post(uri, data=data, content_type="multipart/form-data")
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
||||||
assert Device.query.count() == 1
|
assert Device.query.count() == 3
|
||||||
dev = Device.query.first()
|
dev = Device.query.first()
|
||||||
assert dev.hid == 'laptop-sony-vaio-12345678'
|
assert dev.hid == 'laptop-sony-vaio-12345678'
|
||||||
assert dev.placeholder.phid == 'a123'
|
assert dev.placeholder.phid == 'a123'
|
||||||
assert dev.placeholder.info == 'Good conditions'
|
assert dev.placeholder.info == 'Good conditions'
|
||||||
assert dev.placeholder.pallet == '24A'
|
assert dev.placeholder.pallet == '24A'
|
||||||
assert dev.placeholder.id_device_supplier == 'TTT'
|
assert dev.placeholder.id_device_supplier == 'TTT'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.mvp
|
||||||
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
||||||
|
def test_add_placeholder_csv(user3: UserClientFlask):
|
||||||
|
|
||||||
|
uri = '/inventory/upload-placeholder/'
|
||||||
|
body, status = user3.get(uri)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert "Upload Placeholder" in body
|
||||||
|
|
||||||
|
file_path = Path(__file__).parent.joinpath('files').joinpath('placeholder_test.csv')
|
||||||
|
with open(file_path, 'rb') as excel:
|
||||||
|
data = {
|
||||||
|
'csrf_token': generate_csrf(),
|
||||||
|
'type': "Laptop",
|
||||||
|
'placeholder_file': excel,
|
||||||
|
}
|
||||||
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
||||||
|
assert Device.query.count() == 3
|
||||||
|
dev = Device.query.first()
|
||||||
|
assert dev.hid == 'laptop-sony-vaio-12345678'
|
||||||
|
assert dev.placeholder.phid == 'a123'
|
||||||
|
assert dev.placeholder.info == 'Good conditions'
|
||||||
|
assert dev.placeholder.pallet == '24A'
|
||||||
|
assert dev.placeholder.id_device_supplier == 'TTT'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.mvp
|
||||||
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
||||||
|
def test_add_placeholder_ods(user3: UserClientFlask):
|
||||||
|
|
||||||
|
uri = '/inventory/upload-placeholder/'
|
||||||
|
body, status = user3.get(uri)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert "Upload Placeholder" in body
|
||||||
|
|
||||||
|
file_path = Path(__file__).parent.joinpath('files').joinpath('placeholder_test.ods')
|
||||||
|
with open(file_path, 'rb') as excel:
|
||||||
|
data = {
|
||||||
|
'csrf_token': generate_csrf(),
|
||||||
|
'type': "Laptop",
|
||||||
|
'placeholder_file': excel,
|
||||||
|
}
|
||||||
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
||||||
|
assert Device.query.count() == 3
|
||||||
|
dev = Device.query.first()
|
||||||
|
assert dev.hid == 'laptop-sony-vaio-12345678'
|
||||||
|
assert dev.placeholder.phid == 'a123'
|
||||||
|
assert dev.placeholder.info == 'Good conditions'
|
||||||
|
assert dev.placeholder.pallet == '24A'
|
||||||
|
assert dev.placeholder.id_device_supplier == 'TTT'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.mvp
|
||||||
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
||||||
|
def test_add_placeholder_office_open_xml(user3: UserClientFlask):
|
||||||
|
|
||||||
|
uri = '/inventory/upload-placeholder/'
|
||||||
|
body, status = user3.get(uri)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert "Upload Placeholder" in body
|
||||||
|
|
||||||
|
file_path = (
|
||||||
|
Path(__file__).parent.joinpath('files').joinpath('placeholder_test.xlsx')
|
||||||
|
)
|
||||||
|
with open(file_path, 'rb') as excel:
|
||||||
|
data = {
|
||||||
|
'csrf_token': generate_csrf(),
|
||||||
|
'type': "Laptop",
|
||||||
|
'placeholder_file': excel,
|
||||||
|
}
|
||||||
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
||||||
|
assert Device.query.count() == 3
|
||||||
|
dev = Device.query.first()
|
||||||
|
assert dev.hid == 'laptop-sony-vaio-12345678'
|
||||||
|
assert dev.placeholder.phid == 'a123'
|
||||||
|
assert dev.placeholder.info == 'Good conditions'
|
||||||
|
assert dev.placeholder.pallet == '24A'
|
||||||
|
assert dev.placeholder.id_device_supplier == 'TTT'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.mvp
|
||||||
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
||||||
|
def test_edit_laptop(user3: UserClientFlask):
|
||||||
|
uri = '/inventory/device/add/'
|
||||||
|
body, status = user3.get(uri)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert "New Device" in body
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'csrf_token': generate_csrf(),
|
||||||
|
'type': "Laptop",
|
||||||
|
'serial_number': "AAAAB",
|
||||||
|
'model': "LC27T55",
|
||||||
|
'manufacturer': "Samsung",
|
||||||
|
'generation': 1,
|
||||||
|
'weight': 0.1,
|
||||||
|
'height': 0.1,
|
||||||
|
'depth': 0.1,
|
||||||
|
'id_device_supplier': "b2",
|
||||||
|
}
|
||||||
|
body, status = user3.post(uri, data=data)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert 'Device "Laptop" created successfully!' in body
|
||||||
|
dev = Device.query.one()
|
||||||
|
assert dev.type == 'Laptop'
|
||||||
|
assert dev.hid == 'laptop-samsung-lc27t55-aaaab'
|
||||||
|
assert dev.placeholder.phid == '1'
|
||||||
|
assert dev.placeholder.id_device_supplier == 'b2'
|
||||||
|
assert dev.serial_number == 'aaaab'
|
||||||
|
assert dev.model == 'lc27t55'
|
||||||
|
|
||||||
|
uri = '/inventory/device/edit/{}/'.format(dev.devicehub_id)
|
||||||
|
body, status = user3.get(uri)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert "Edit Device" in body
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'csrf_token': generate_csrf(),
|
||||||
|
'type': "Laptop",
|
||||||
|
'serial_number': "AAAAC",
|
||||||
|
'model': "LC27T56",
|
||||||
|
'manufacturer': "Samsung",
|
||||||
|
'generation': 1,
|
||||||
|
'weight': 0.1,
|
||||||
|
'height': 0.1,
|
||||||
|
'depth': 0.1,
|
||||||
|
'id_device_supplier': "a2",
|
||||||
|
}
|
||||||
|
body, status = user3.post(uri, data=data)
|
||||||
|
assert status == '200 OK'
|
||||||
|
assert 'Device "Laptop" edited successfully!' in body
|
||||||
|
dev = Device.query.one()
|
||||||
|
assert dev.type == 'Laptop'
|
||||||
|
assert dev.hid == 'laptop-samsung-lc27t55-aaaab'
|
||||||
|
assert dev.placeholder.phid == '1'
|
||||||
|
assert dev.placeholder.id_device_supplier == 'a2'
|
||||||
|
assert dev.serial_number == 'aaaac'
|
||||||
|
assert dev.model == 'lc27t56'
|
||||||
|
|
Reference in New Issue