Compare commits

...
This repository has been archived on 2024-05-31. You can view files and clone it, but cannot push or open issues or pull requests.

3 Commits

Author SHA1 Message Date
Cayo Puigdefabregas ea9e55b1ff add one form generic for show the correct form add or del devices of a lot 2022-03-11 18:44:31 +01:00
Cayo Puigdefabregas 07d0ab4171 precommit 2022-03-10 14:09:17 +01:00
Cayo Puigdefabregas 3f7fd1b6ec precommit 2022-03-09 14:02:56 +01:00
4 changed files with 113 additions and 3 deletions

View File

@ -137,8 +137,35 @@ class FilterForm(FlaskForm):
class LotDeviceForm(FlaskForm): class LotDeviceForm(FlaskForm):
lot = StringField('Lot', [validators.UUID()]) devices = StringField(
devices = StringField('Devices', [validators.length(min=1)]) 'Devices', [validators.length(min=1)], render_kw={'class': "d-none"}
)
lot = SelectField('Lot', choices=[], render_kw={'class': "form-select"})
def __init__(self, *args, **kwargs):
self.action = kwargs.pop('action', None)
self._devices = kwargs.pop('_devices', None)
super().__init__(*args, **kwargs)
# import pdb; pdb.set_trace()
self._lots = Lot.query.filter(Lot.owner_id == g.user.id)
lots = []
if self._devices:
lots = [set(dev.lots) for dev in self._devices]
if self.action == 'del' and lots:
x = lots[0]
common_lots = x.intersection(*lots[1:])
self.lot.choices = [
(lot.id, lot.name) for lot in self._lots if lot in common_lots
]
elif self.action == 'add' and lots:
x = lots[0]
common_lots = x.union(*lots[1:])
self.lot.choices = [
(lot.id, lot.name) for lot in self._lots if lot not in common_lots
]
else:
self.lot.choices = [(lot.id, lot.name) for lot in self._lots]
def validate(self, extra_validators=None): def validate(self, extra_validators=None):
is_valid = super().validate(extra_validators) is_valid = super().validate(extra_validators)
@ -1046,3 +1073,22 @@ class TradeDocumentForm(FlaskForm):
db.session.commit() db.session.commit()
return self._obj return self._obj
class LotDeviceShowForm(FlaskForm):
devices = StringField(render_kw={'class': "devicesList d-none"})
action = StringField(render_kw={'class': "d-none"})
def validate(self, extra_validators=None):
is_valid = super().validate(extra_validators)
if not self.devices.data:
return False
if self.action.data not in ['add', 'del']:
return False
device_ids = self.devices.data.split(",")
self._devices = Device.query.filter(Device.id.in_(device_ids)).all()
return is_valid

View File

@ -18,6 +18,7 @@ from ereuse_devicehub.inventory.forms import (
DataWipeForm, DataWipeForm,
FilterForm, FilterForm,
LotDeviceForm, LotDeviceForm,
LotDeviceShowForm,
LotForm, LotForm,
NewActionForm, NewActionForm,
NewDeviceForm, NewDeviceForm,
@ -119,6 +120,8 @@ class DeviceListMix(GenericMixView):
'form_new_datawipe': form_new_datawipe, 'form_new_datawipe': form_new_datawipe,
'form_new_trade': form_new_trade, 'form_new_trade': form_new_trade,
'form_filter': form_filter, 'form_filter': form_filter,
'form_lot_device_del': LotDeviceShowForm(action='del'),
'form_lot_device_add': LotDeviceShowForm(action='add'),
'lot': lot, 'lot': lot,
'tags': tags, 'tags': tags,
'list_devices': list_devices, 'list_devices': list_devices,
@ -189,10 +192,40 @@ class LotDeviceDeleteView(View):
else: else:
messages.error('Error removing devices from lot!') messages.error('Error removing devices from lot!')
next_url = request.referrer or url_for('inventory.devices.devicelist') next_url = url_for('inventory.devices.lotdevicelist', lot_id=form._lot.id)
return flask.redirect(next_url) return flask.redirect(next_url)
class LotDeviceView(GenericMixView):
methods = ['POST']
decorators = [login_required]
template_name = 'inventory/removeDeviceslot2.html'
title = 'Remove from a lot'
def dispatch_request(self, lot_id=None):
# import pdb; pdb.set_trace()
url = url_for('inventory.devices.lot_devices_del')
next_url = request.referrer or url_for('inventory.devices.devicelist')
form = LotDeviceShowForm()
if not form.validate_on_submit():
messages.error('Error, you need select one or more devices!')
if lot_id:
next_url = url_for('inventory.devices.lotdevicelist', lot_id=form.id)
return flask.redirect(next_url)
if form.action.data == 'add':
self.title = 'Add devices to a lot'
url = url_for('inventory.devices.lot_devices_add')
lots = self.get_lots()
form_lot = LotDeviceForm(
devices=form.devices, action=form.action.data, _devices=form._devices
)
context = {'form': form_lot, 'title': self.title, 'lots': lots, 'url': url}
return flask.render_template(self.template_name, **context)
class LotCreateView(GenericMixView): class LotCreateView(GenericMixView):
methods = ['GET', 'POST'] methods = ['GET', 'POST']
decorators = [login_required] decorators = [login_required]
@ -676,6 +709,7 @@ devices.add_url_rule(
devices.add_url_rule( devices.add_url_rule(
'/lot/devices/del/', view_func=LotDeviceDeleteView.as_view('lot_devices_del') '/lot/devices/del/', view_func=LotDeviceDeleteView.as_view('lot_devices_del')
) )
devices.add_url_rule('/lot/devices/', view_func=LotDeviceView.as_view('lot_devices'))
devices.add_url_rule('/lot/add/', view_func=LotCreateView.as_view('lot_add')) devices.add_url_rule('/lot/add/', view_func=LotCreateView.as_view('lot_add'))
devices.add_url_rule( devices.add_url_rule(
'/lot/<string:id>/del/', view_func=LotDeleteView.as_view('lot_del') '/lot/<string:id>/del/', view_func=LotDeleteView.as_view('lot_del')

View File

@ -180,3 +180,11 @@ function export_file(type_file) {
$("#exportAlertModal").click(); $("#exportAlertModal").click();
} }
} }
function lot_devices_del() {
$('#lot_devices_del').submit();
}
function lot_devices_add() {
$('#lot_devices_add').submit();
}

View File

@ -92,6 +92,28 @@
Remove selected devices from a lot Remove selected devices from a lot
</a> </a>
</li> </li>
<li>
<form id="lot_devices_add" method="post" action="{{ url_for('inventory.devices.lot_devices') }}">
{% for f in form_lot_device_add %}
{{ f }}
{% endfor %}
<a href="javascript:lot_devices_add()" class="dropdown-item">
<i class="bi bi-x"></i>
Add selected Devices to a lot
</a>
</form>
</li>
<li>
<form id="lot_devices_del" method="post" action="{{ url_for('inventory.devices.lot_devices') }}">
{% for f in form_lot_device_del %}
{{ f }}
{% endfor %}
<a href="javascript:lot_devices_del()" class="dropdown-item">
<i class="bi bi-x"></i>
Remove selected devices from a lot
</a>
</form>
</li>
</ul> </ul>
</div> </div>
<div class="btn-group dropdown ml-1" uib-dropdown=""> <div class="btn-group dropdown ml-1" uib-dropdown="">