I used @fluffy's code and I want to thank him. And here's a complete code for advanced filters to everybody who wants to avoid errors. It took me 3.5 hours to find this post.
def visualize_lists(self, pattern=""):
query = None
app = MDApp.get_running_app()
try:
with db_session:
query = self.get_search_bar().current_filter.get_elements(self.get_search_bar().get_pattern())
start_age = self.get_start_age().get_value() #* 365
end_age = self.get_end_age().get_value() #* 365
start_date_adm = self.get_adm_date_start().text
end_date_adm = self.get_adm_date_end().text
start_date = None if start_date_adm == "YYYY-MM-DD"else datetime.strptime( start_date_adm , "%Y-%m-%d").date()
end_date = None if end_date_adm == "YYYY-MM-DD" else datetime.strptime( end_date_adm , "%Y-%m-%d").date()
query = select(
pat for pat in query
for adm in pat.admissions
if (
adm.get_start_date().year - pat.get_dob().year
- int((adm.start_date.month, adm.start_date.day) < (pat.get_dob().month, pat.get_dob().day))
>= start_age
)
and (
adm.get_start_date().year - pat.get_dob().year
- int((adm.start_date.month, adm.start_date.day) < (pat.get_dob().month, pat.get_dob().day))
<= end_age
)
#and (start_date==None or adm.get_start_date() >= start_date )
#and (end_date==None or adm.get_start_date() <= end_date )
)
if start_date and end_date:
query = query.filter(
lambda pat : exists(
adm for adm in pat.admissions
if adm.get_start_date() >= start_date
and adm.get_start_date() >= end_date
)
)
chosen_pathologies = self.get_list_pathologies().get_active_checkboxes()
#if( len(chosen_pathologies) != 0 ):
#for chosen_pathology in chosen_pathologies:
query = query.filter(
lambda pat : exists(
adm for adm in pat.admissions
for pathology in adm.pathology
if pathology.get_type() in chosen_pathologies
)
)
#.filter(lambda patient: "arl" in patient.get_name())
print( list(set(query[:])) )
visualize_pats = app.get_screen("visualize_patients")
visualize_pats.fill_table( list(set(query[:])) )
db.commit()
except OperationalError as e:
messagebox.showerror("Connection to database", e)
return
self.get_adm_date_start().text = "YYYY-MM-DD"
self.get_adm_date_end().text = "YYYY-MM-DD"
app.change_page("visualize_patients")