def search(*, common: dict = Depends(common_parameters), type: SearchTypes): """Perform a search.""" if common["query_str"]: models = [get_class_by_tablename(t) for t in type] results = composite_search( db_session=common["db_session"], query_str=common["query_str"], models=models, current_user=common["current_user"], ) # add a filter for restricted incidents # TODO won't currently show incidents that you are a member admin_projects = [] for p in common["current_user"].projects: if p.role == UserRoles.admin: admin_projects.append(p) filtered_incidents = [] for incident in results["Incident"]: if incident.project in admin_projects or incident.visibility == Visibility.open: filtered_incidents.append(incident) results["Incident"] = filtered_incidents else: results = [] return SearchResponse(**{ "query": common["query_str"], "results": results }).dict(by_alias=False)
def match(*, db_session, filter_spec: List[dict], class_instance: Base): """Matches a class instance with a given search filter.""" table_name = get_table_name_by_class_instance(class_instance) model_cls = get_class_by_tablename(table_name) query = db_session.query(model_cls) query = apply_filters(query, filter_spec) return query.filter(model_cls.id == class_instance.id).one_or_none()
def search( *, db_session: Session = Depends(get_db), skip: int = 0, limit: int = 10, q: str = None, type: List[str] = [ v.value for v in SearchTypes ], # hack for pydantic enum json generation see: https://github.com/samuelcolvin/pydantic/pull/1749 current_user: DispatchUser = Depends(get_current_user), ): """ Perform a search. """ if q: models = [get_class_by_tablename(t) for t in type] results = composite_search(db_session=db_session, query_str=q, models=models) else: results = [] # add a filter for restricted incidents if current_user.role != UserRoles.admin: results["Incident"] = [ i for i in results["Incident"] if i.visibility == Visibility.open ] return SearchResponse(**{ "query": q, "results": results }).dict(by_alias=False)
def search( *, common: dict = Depends(common_parameters), type: List[str] = [ v.value for v in SearchTypes ], # hack for pydantic enum json generation see: https://github.com/samuelcolvin/pydantic/pull/1749 ): """ Perform a search. """ if common["query_str"]: models = [get_class_by_tablename(t) for t in type] results = composite_search( db_session=common["db_session"], query_str=common["query_str"], models=models, current_user=common["current_user"], ) else: results = [] # add a filter for restricted incidents # TODO won't currently show incidents that you are a member admin_projects = [] for p in common["current_user"].projects: if p.role == UserRoles.admin: admin_projects.append(p) filtered_incidents = [] for incident in results["Incident"]: if incident.project in admin_projects: filtered_incidents.append(incident) continue if incident.visibility == Visibility.open: filtered_incidents.append(incident) results["Incident"] = filtered_incidents return SearchResponse(**{ "query": common["query_str"], "results": results }).dict(by_alias=False)
def get_tag_recommendations(*, db_session: Session = Depends(get_db), model_name: str, id: int): """ Retrieves a tag recommendation based on the model and model id. """ model_object = get_class_by_tablename(model_name) model = db_session.query(model_object).filter( model_object.id == id).one_or_none() if not model: raise HTTPException( status_code=404, detail=f"No model found. ModelName: {model_name} Id: {id}") tags = get_recommendations(db_session, [t.id for t in model.tags], model_name) return {"items": tags, "total": len(tags)}
def get_tag_recommendations(*, db_session: Session = Depends(get_db), model_name: str, id: int): """Retrieves a tag recommendation based on the model and model id.""" model_object = get_class_by_tablename(model_name) model = db_session.query(model_object).filter( model_object.id == id).one_or_none() project_slug = model.project.slug organization_slug = model.project.organization.slug if not model: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=[{ "msg": f"No model found. ModelName: {model_name} Id: {id}" }], ) tags = get_recommendations(db_session, [t.id for t in model.tags], organization_slug, project_slug, model_name) return {"items": tags, "total": len(tags)}