| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- from flask_login import current_user
- from sqlalchemy import and_
- from functools import reduce
- import app
- from app.datamgmt.manage.manage_cases_db import user_list_cases_view
- from app.datamgmt.conversions import convert_sort_direction
- from app.models.cases import Cases
- from app.models.models import CaseAssets
- from app.models.models import Client
- def get_filtered_assets(case_id=None,
- client_id=None,
- asset_type_id=None,
- asset_id=None,
- asset_name=None,
- asset_description=None,
- asset_ip=None,
- page=1,
- per_page=10,
- sort_by='name',
- sort_dir='asc'):
- """ Returns a list of assets, filtered by the given parameters.
- """
- conditions = []
- if case_id:
- conditions.append(CaseAssets.case_id == case_id)
- if client_id:
- conditions.append(Client.client_id == client_id)
- if asset_type_id:
- conditions.append(CaseAssets.asset_type_id == asset_type_id)
- if asset_id:
- conditions.append(CaseAssets.asset_id == asset_id)
- if asset_name:
- conditions.append(CaseAssets.asset_name.ilike(f'%{asset_name}%'))
- if asset_description:
- conditions.append(CaseAssets.asset_description.ilike(f'%{asset_description}%'))
- if asset_ip:
- conditions.append(CaseAssets.asset_ip.ilike(f'%{asset_ip}%'))
- if len(conditions) > 1:
- conditions = [reduce(and_, conditions)]
- conditions.append(CaseAssets.case_id.in_(user_list_cases_view(current_user.id)))
- data = CaseAssets.query.filter(*conditions)
- # If client ID then we need to join the client table
- if client_id:
- data = data.join(CaseAssets.case).join(Cases.client)
- if sort_by is not None:
- order_func = convert_sort_direction(sort_dir)
- if sort_by == 'name':
- data = data.order_by(order_func(CaseAssets.asset_name))
- elif sort_by == 'description':
- data = data.order_by(order_func(CaseAssets.asset_description))
- elif sort_by == 'ip':
- data = data.order_by(order_func(CaseAssets.asset_ip))
- elif sort_by == 'type':
- data = data.order_by(order_func(CaseAssets.asset_type_id))
- elif sort_by == 'id':
- data = data.order_by(order_func(CaseAssets.asset_id))
- elif sort_by == 'client':
- data = data.order_by(order_func(Client.name))
- elif sort_by == 'case':
- data = data.order_by(order_func(CaseAssets.case_id))
- else:
- data = data.order_by(order_func(CaseAssets.asset_name))
- try:
- filtered_assets = data.paginate(page=page, per_page=per_page)
- except Exception as e:
- app.logger.exception(f"Failed to get filtered assets: {e}")
- raise e
- return filtered_assets
|