add generics filters

This commit is contained in:
Cayo Puigdefabregas 2022-05-09 13:43:02 +02:00
parent 252c5285d8
commit 04e4f4ff74
2 changed files with 104 additions and 39 deletions

View File

@ -52,16 +52,30 @@ from ereuse_devicehub.resources.user.exceptions import InsufficientPermission
from ereuse_devicehub.resources.user.models import User from ereuse_devicehub.resources.user.models import User
DEVICES = { DEVICES = {
"All": ["Devices", "Components"], "All": ["All Devices", "All Components"],
"Computer": [ "Computer": [
"All Computers",
"Desktop", "Desktop",
"Laptop", "Laptop",
"Server", "Server",
], ],
"Monitor": ["ComputerMonitor", "Monitor", "TelevisionSet", "Projector"], "Monitor": [
"Mobile, tablet & smartphone": ["Mobile", "Tablet", "Smartphone", "Cellphone"], "All Monitors",
"DataStorage": ["HardDrive", "SolidStateDrive"], "ComputerMonitor",
"Monitor",
"TelevisionSet",
"Projector",
],
"Mobile, tablet & smartphone": [
"All Mobile",
"Mobile",
"Tablet",
"Smartphone",
"Cellphone",
],
"DataStorage": ["All DataStorage", "HardDrive", "SolidStateDrive"],
"Accessories & Peripherals": [ "Accessories & Peripherals": [
"All Peripherals",
"GraphicCard", "GraphicCard",
"Motherboard", "Motherboard",
"NetworkAdapter", "NetworkAdapter",
@ -75,26 +89,101 @@ DEVICES = {
], ],
} }
COMPUTERS = ['Desktop', 'Laptop', 'Server']
COMPONENTS = [
'GraphicCard',
'DataStorage',
'HardDrive',
'DataStorage',
'SolidStateDrive',
'Motherboard',
'NetworkAdapter',
'Processor',
'RamModule',
'SoundCard',
'Display',
'Battery',
'Camera',
]
MONITORS = ["ComputerMonitor", "Monitor", "TelevisionSet", "Projector"]
MOBILE = ["Mobile", "Tablet", "Smartphone", "Cellphone"]
DATASTORAGE = ["HardDrive", "SolidStateDrive"]
PERIPHERALS = [
"GraphicCard",
"Motherboard",
"NetworkAdapter",
"Processor",
"RamModule",
"SoundCard",
"Battery",
"Keyboard",
"Mouse",
"MemoryCardReader",
]
class FilterForm(FlaskForm): class FilterForm(FlaskForm):
filter = SelectField( filter = SelectField(
'', choices=DEVICES, default="Computer", render_kw={'class': "form-select"} '', choices=DEVICES, default="All Computers", render_kw={'class': "form-select"}
) )
def __init__(self, *args, **kwargs): def __init__(self, lots, lot_id, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.lots = lots
self.lot_id = lot_id
self._get_types()
def _get_types(self):
types_of_devices = [item for sublist in DEVICES.values() for item in sublist] types_of_devices = [item for sublist in DEVICES.values() for item in sublist]
dev = request.args.get('filter') dev = request.args.get('filter')
self.device = dev if dev in types_of_devices else None self.device_type = dev if dev in types_of_devices else None
if self.device: if self.device_type:
self.filter.data = self.device self.filter.data = self.device_type
def search(self): def search(self):
if self.device: # Filter from lots
return [self.device] if self.lot_id:
self.lot = self.lots.filter(Lot.id == self.lot_id).one()
device_ids = (d.id for d in self.lot.devices)
self.devices = Device.query.filter(Device.id.in_(device_ids))
else:
self.devices = Device.query.filter(Device.owner_id == g.user.id).filter_by(
lots=None
)
return ['Desktop', 'Laptop', 'Server'] filter_type = None
if self.device_type:
filter_type = [self.device_type]
else:
# Case without Filter
filter_type = COMPUTERS
# Generic Filters
if "All Devices" == self.device_type:
filter_type = None
if "All Components" == self.device_type:
filter_type = COMPONENTS
elif "All Monitors" == self.device_type:
filter_type = MONITORS
elif "All Mobile" == self.device_type:
filter_type = MOBILE
elif "All DataStorage" == self.device_type:
filter_type = DATASTORAGE
elif "All Peripherals" == self.device_type:
filter_type = PERIPHERALS
if filter_type:
self.devices = self.devices.filter(Device.type.in_(filter_type))
return self.devices.order_by(Device.updated.desc())
class LotForm(FlaskForm): class LotForm(FlaskForm):

View File

@ -40,35 +40,11 @@ logger = logging.getLogger(__name__)
class DeviceListMix(GenericMixView): class DeviceListMix(GenericMixView):
template_name = 'inventory/device_list.html' template_name = 'inventory/device_list.html'
def _get_devices(self, lots, lot):
if lot_id:
lot = lots.filter(Lot.id == lot_id).one()
devices = lot.devices
if "All" not in filter_types:
devices = [dev for dev in lot.devices if dev.type in filter_types]
devices = sorted(devices, key=lambda x: x.updated, reverse=True)
else:
if "All" in filter_types:
devices = (
Device.query.filter(Device.owner_id == current_user.id)
.filter_by(lots=None)
.order_by(Device.updated.desc())
)
else:
devices = (
Device.query.filter(Device.owner_id == current_user.id)
.filter_by(lots=None)
.filter(Device.type.in_(filter_types))
.order_by(Device.updated.desc())
)
return devices
def get_context(self, lot_id): def get_context(self, lot_id):
super().get_context() super().get_context()
lots = self.context['lots'] lots = self.context['lots']
form_filter = FilterForm() form_filter = FilterForm(lots, lot_id)
filter_types = form_filter.search() devices = form_filter.search()
lot = None lot = None
tags = ( tags = (
Tag.query.filter(Tag.owner_id == current_user.id) Tag.query.filter(Tag.owner_id == current_user.id)
@ -98,7 +74,7 @@ class DeviceListMix(GenericMixView):
self.context.update( self.context.update(
{ {
'devices': self._get_devices(lots, lot), 'devices': devices,
'form_tag_device': TagDeviceForm(), 'form_tag_device': TagDeviceForm(),
'form_new_action': form_new_action, 'form_new_action': form_new_action,
'form_new_allocate': form_new_allocate, 'form_new_allocate': form_new_allocate,