From 4421785429124d042d5bd97fce4c6b50ec26940e Mon Sep 17 00:00:00 2001 From: Jiri Kalvoda <jirikalvoda@kam.mff.cuni.cz> Date: Fri, 24 Sep 2021 15:58:07 +0200 Subject: [PATCH] =?UTF-8?q?=20OrgFilterForm=20nepou=C5=BEiv=C3=A1=20f=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mo/web/org_users.py | 88 +++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 64 deletions(-) diff --git a/mo/web/org_users.py b/mo/web/org_users.py index 77a62234..b549096b 100644 --- a/mo/web/org_users.py +++ b/mo/web/org_users.py @@ -129,9 +129,9 @@ class OrgsFilterForm(PagerForm): search_right_for_place = mo_fields.Place('Právo pro oblast', validators=[validators.Optional()]) search_in_place = mo_fields.Place('V oblasti', validators=[validators.Optional()]) search_place_level = wtforms.SelectMultipleField("Úroveň oblasti", choices=[(i.level, i.name) for i in db.place_levels], validators=[validators.Optional()], coerce=int) - search_year = wtforms.StringField('Ročník', validators=[validators.Optional()]) + search_year = mo_fields.IntList('Ročník', validators=[validators.Optional()]) search_category = wtforms.StringField("Kategorie", validators=[validators.Optional()]) - search_seq = wtforms.StringField("Kolo", validators=[validators.Optional()]) + search_seq = mo_fields.IntList("Kolo", validators=[validators.Optional()]) submit = wtforms.SubmitField("Filtrovat") show_role_filter = wtforms.SubmitField("Zobrazit filtrování dle rolí") @@ -139,50 +139,6 @@ class OrgsFilterForm(PagerForm): is_role_filter = wtforms.HiddenField(default="") # "" -> skrýt. "yes" -> zobrazit - # Výstupní hodnoty filtru, None při nepoužitém filtru nebo špatné hodnotě (takové filtry ignorujeme) - f_search_name: Optional[str] = None - f_search_email: Optional[str] = None - f_search_role: Optional[List[db.RoleType]] = None - f_search_right_for_place: Optional[db.Place] = None - f_search_in_place: Optional[db.Place] = None - f_search_year: Optional[List[int]] = None - f_search_category: Optional[List[str]] = None - f_search_place_level: Optional[List[int]] = None - f_search_seq: Optional[List[int]] = None - - def validate_search_name(self, field): - self.f_search_name = f"%{field.data}%" - - def validate_search_email(self, field): - self.f_search_email = f"%{field.data}%" - - def validate_search_role(self, field): - self.f_search_role = field.data - - def validate_search_right_for_place(self, field): - self.f_search_right_for_place = field.place - - def validate_search_in_place(self, field): - self.f_search_in_place = field.place - - def validate_search_year(self, field): - try: - self.f_search_year = mo.util.parse_int_list(field.data) - except mo.CheckError as e: - raise wtforms.ValidationError(str(e)) - - def validate_search_category(self, field): - self.f_search_category = field.data.split(",") - - def validate_search_place_level(self, field): - self.f_search_place_level = field.data - - def validate_search_seq(self, field): - try: - self.f_search_seq = mo.util.parse_int_list(field.data) - except mo.CheckError as e: - raise wtforms.ValidationError(str(e)) - def prepare_role_filter(self): if self.show_role_filter.data: self.is_role_filter.data = "yes" @@ -213,30 +169,34 @@ def org_orgs(): filter.validate() filter.prepare_role_filter() - if filter.f_search_name: + if filter.search_name.data: q = q.filter(or_( - db.User.first_name.ilike(filter.f_search_name), - db.User.last_name.ilike(filter.f_search_name) + db.User.first_name.ilike(f"%{filter.search_name.data}%"), + db.User.last_name .ilike(f"%{filter.search_name.data}%") )) + if filter.search_email.data: + q = q.filter(db.User.email.ilike(f"%{filter.search_email.data}%")) def query_filter_role(qr: flask_sqlalchemy.BaseQuery) -> flask_sqlalchemy.BaseQuery: - if filter.f_search_role is not None: - qr = qr.filter(db.UserRole.role.in_(filter.f_search_role)) - if filter.f_search_category is not None: - qr = qr.filter(or_(db.UserRole.category.in_(filter.f_search_category), db.UserRole.category == None)) - if filter.f_search_seq is not None: - qr = qr.filter(or_(db.UserRole.seq.in_(filter.f_search_seq), db.UserRole.seq == None)) - if filter.f_search_year is not None: - qr = qr.filter(or_(db.UserRole.year.in_(filter.f_search_year), db.UserRole.year == None)) - if filter.f_search_in_place is not None: - qr = qr.filter(db.UserRole.place_id.in_(db.place_descendant_cte(filter.f_search_in_place))) - if filter.f_search_right_for_place is not None: - qr = qr.filter(db.UserRole.place_id.in_([x.place_id for x in db.get_place_parents(filter.f_search_right_for_place)])) + if filter.search_role.data: + qr = qr.filter(db.UserRole.role.in_(filter.search_role.data)) + if filter.search_category.data: + qr = qr.filter(or_(db.UserRole.category.in_(filter.search_category.data.split(",")), db.UserRole.category == None)) + if filter.search_seq.list: + qr = qr.filter(or_(db.UserRole.seq.in_(filter.search_seq.list), db.UserRole.seq == None)) + if filter.search_year.list: + qr = qr.filter(or_(db.UserRole.year.in_(filter.search_year.list), db.UserRole.year == None)) + pass + if filter.search_in_place.place is not None: + qr = qr.filter(db.UserRole.place_id.in_(db.place_descendant_cte(filter.search_in_place.place))) + if filter.search_right_for_place.place is not None: + qr = qr.filter(db.UserRole.place_id.in_([x.place_id for x in db.get_place_parents(filter.search_right_for_place.place)])) # Po n>3 hodinách v mo.db jsem dospěl k závěru, že to hezčeji neumím (neumím vyrobit place_parents_cte) - if filter.f_search_place_level is not None: + if filter.search_place_level.data: qr = qr.filter(db.UserRole.place_id.in_( - sess.query(db.Place.place_id).filter(db.Place.level.in_(filter.f_search_place_level)) - )) + sess.query(db.Place.place_id).filter(db.Place.level.in_(filter.search_place_level.data)) + )) + print(qr) return qr if filter.is_role_filter.data: -- GitLab