from flask import Request from app.extensions import db from app.models.pet import Pet from app.models.pet_kind import PetKind class PetService: @staticmethod def get_pets(request: Request,results_per_page=8): def sex_n_to_str(sex: str): if sex == '1': return 'F' elif sex == '2': return 'M' else: return None type = request.args.get('type') sex = sex_n_to_str(request.args.get('sex')) age_from = request.args.get('age-from') age_to = request.args.get('age-to') query = db.select(Pet) page = request.args.get('page', 1) if sex != None: query = query.filter_by(sex=sex) if type != None: types = db.session.execute(db.select(PetKind.id)).scalars().all() if int(type) in types: query = query.filter_by(kind_id=type) if age_from != None: age_from = int(age_from) if age_from >= 0 and age_from <= 7: query = query.filter(Pet.age >= age_from) if age_to != None: age_to = int(age_to) if age_to >= 1 and age_to < 7: query = query.filter(Pet.age <= age_to) try: return db.paginate( select=query, page=int(page), per_page=results_per_page, ) except: return db.paginate( select=query, page=1, per_page=results_per_page, ) @staticmethod def get_options(request: Request): type = request.args.get('type') sex = request.args.get('sex') age_from = request.args.get('age-from') options = dict() options["type"] = PetService.get_pets_kind_options(type) options["sex"] = PetService.get_sex_options(sex) options["age_from"] = PetService.get_age_from_options(age_from) return options @staticmethod def get_pets_kind_options(selected_kind=None): pet_kinds = db.session.execute(db.select(PetKind)).scalars() options = [] options.append({ "value": "", "text": "Type", "selected": selected_kind == None }) options.append({ "value": "0", "text": "Any", "selected": selected_kind == "0" }) for pet_kind in pet_kinds: options.append({ "value": str(pet_kind.id), "text": pet_kind.name, "selected": selected_kind == str(pet_kind.id) }) PetService.selected_safeguard(selected_kind,options[0],len(options)) return options @staticmethod def get_age_from_options(selected_year=None): options = [] options.append({ "value": "0", "text": "0", "selected": selected_year == "0" or selected_year == None }) for i in range(1,7): options.append({ "value": str(i), "text": str(i), "selected": selected_year == str(i) }) options.append({ "value": "7", "text": "7+", "selected": selected_year == "7" }) PetService.selected_safeguard(selected_year,options[0],len(options)) return options @staticmethod def get_sex_options(selected_sex=None): options = [ { "value": "", "text": "Sex", "selected": selected_sex == None }, { "value": "0", "text": "Any", "selected": selected_sex == "0" }, { "value": "1", "text": "Female", "selected": selected_sex == "1" }, { "value": "2", "text": "Male", "selected": selected_sex == "2" }, ] PetService.selected_safeguard(selected_sex,options[0],len(options)) return options @staticmethod def selected_safeguard(selected_arg: str | None, select_default, options_length: int): try: selected_arg = int(selected_arg) if selected_arg < 0 or selected_arg > options_length: select_default["selected"] = True except: select_default["selected"] = True