def add_reader_category_filter(query, category, joined_entities): """ Modifies query to filter by reader type. :param query: The query to further filter. :param category: The category type. :param joined_entities: Which entities have already been joined in the query. Reader filters may require additional joins. This list will be modified if an additional join is made. :return: query (side-effected) """ if Box2 not in joined_entities: query = query.join(Box2) if category == READER_PRODUCTION: query = query.filter(Box2.prod_query()).filter(Box2.reference != True) #elif category == READER_GROOVE: # query = query.filteR(Box2.code.in_()) elif category == READER_LAB: query = query.filter(Box2.lab_query()) elif category == READER_GOLDEN_DR: query = query.filter(Box2.reference == True) elif category == READER_FLUIDICS_MODULES: query = query.filter(Box2.fluidics_module_query()) elif category == READER_DETECTOR_MODULES: query = query.filter(Box2.detector_module_query()) elif category == READER_QX100: query = query.filter(SystemVersion.type == 'QX100') elif category == READER_QX150: query = query.filter(SystemVersion.type == 'QX150') elif category == READER_QX200: query = query.filter(SystemVersion.type == 'QX200') return query
def total_events(): plate_query = Session.query(QLBPlate, func.sum(QLBWell.event_count).label('total_count')).\ join(QLBWell).\ join(QLBPlate.plate).\ join(Plate.box2).\ filter(and_(QLBPlate.plate_id != None, QLBWell.file_id != None)).\ group_by(QLBWell.plate_id) if wowo('contractor'): plate_query = plate_query.filter(Box2.prod_query()) return sum([total_count or 0 for plate, total_count in plate_query.all()])
def time_events(start, end): plate_query = QLBPlate.filter_by_host_datetime(Session.query(QLBPlate, func.sum(QLBWell.event_count).label('total_count')). join(QLBWell).\ join(QLBPlate.plate).\ join(Plate.box2).\ filter(and_(QLBPlate.plate_id != None, QLBWell.file_id != None)), start, end) if wowo('contractor'): plate_query = plate_query.filter(Box2.prod_query()) return sum([total_count or 0 for plate, total_count in plate_query.all()])
def box2_field(selected=None, empty='--', prod_only=False, exclude_fluidics_modules=False,order_by='name',order_desc=False): if ( order_desc ): box_q = Session.query(Box2).order_by( getattr(Box2,order_by).desc() ) else: box_q = Session.query(Box2).order_by( getattr(Box2,order_by) ) if prod_only or wowo('contractor'): box_q = box_q.filter(Box2.prod_query()) if exclude_fluidics_modules: box_q = box_q.filter(Box2.whole_readers_only_query()) boxes = box_q.all() return {'value': selected or '', 'options': [('',empty)]+ [(box.id, box.name) for box in boxes]}
def plate_runtimes_for_operator_range(start, end): plate_query = QLBPlate.filter_by_host_datetime(Session.query(QLBPlate, func.count(QLBWell).label('wells'), func.sum(func.if_(QLBWell.event_count >= 1000, 1, 0)).label('data_wells'), func.sum(QLBWell.event_count).label('data_well_events')). join(QLBWell).\ join(QLBPlate.plate).\ join(Plate.box2).\ filter(and_(QLBPlate.plate_id != None, QLBWell.file_id != None)), start, end).group_by(QLBWell.plate_id).options(joinedload_all('plate.box2', innerjoin=True), joinedload_all('plate.operator')) if wowo('contractor'): plate_query = plate_query.filter(Box2.prod_query()) return plate_query.all()
def plate_runtimes_for_box_range(start, end): plate_query = QLBPlate.filter_by_host_datetime(Session.query(QLBPlate, func.min(QLBWell.host_datetime).label('start_time'), func.max(QLBWell.host_datetime).label('end_time')). join(QLBWell).\ join(QLBPlate.plate).\ join(Plate.box2).\ filter(and_(QLBPlate.plate_id != None, QLBWell.file_id != None)), start, end).group_by(QLBWell.plate_id).options(joinedload_all('plate.box2', innerjoin=True), joinedload_all('plate.operator')) if wowo('contractor'): plate_query = plate_query.filter(Box2.prod_query()) runtimes = plate_query.all() # TODO: engineer quick fix for this return [runtime for runtime in runtimes if runtime.start_time and runtime.end_time]
def lab_reader_group_field(empty='--'): """ Intended to be set in a manual environment. Should be ported to a Bootstrap-type scheme like comparable_metric_field() """ box_q = Session.query(Box2).order_by(Box2.name) lab_readers = box_q.filter(Box2.lab_query()).all() prod_readers = box_q.filter(Box2.prod_query()).all() # htmlfill-compatible. if not wowo('contractor'): return [('',empty), ([(box.id, box.name) for box in lab_readers], 'Lab'), ([(box.id, box.name) for box in prod_readers],'Production')] else: return [('',empty), ([(box.id, box.name) for box in prod_readers],'Production')]