|
3 | 3 |
|
4 | 4 | Model views for the admin interface. |
5 | 5 | """ |
| 6 | +from unidecode import unidecode |
6 | 7 |
|
7 | 8 | from flask import (url_for, |
8 | 9 | jsonify, |
@@ -124,6 +125,10 @@ def is_accessible(self): |
124 | 125 | return True |
125 | 126 |
|
126 | 127 |
|
| 128 | + |
| 129 | + |
| 130 | + |
| 131 | + |
127 | 132 | class UserView(ModelView): |
128 | 133 | edit_template = 'admin/edit.user.html' |
129 | 134 | create_template = 'admin/edit.user.html' |
@@ -571,6 +576,41 @@ def render(self, template, **kwargs): |
571 | 576 | return super(PrinterView, self).render(template, **kwargs) |
572 | 577 | return super(PrinterView, self).render(template, **kwargs) |
573 | 578 |
|
| 579 | + def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): |
| 580 | + query = self.session.query(self.model) |
| 581 | + all_rows = query.all() |
| 582 | + |
| 583 | + if search: |
| 584 | + normalized_search = unidecode(search).lower().strip() |
| 585 | + search_tokens = normalized_search.split() |
| 586 | + |
| 587 | + def match(row): |
| 588 | + combined = f"{row.lastname or ''} {row.firstnames or ''}" |
| 589 | + normalized_combined = unidecode(combined).lower() |
| 590 | + return all(token in normalized_combined for token in search_tokens) |
| 591 | + |
| 592 | + filtered_rows = list(filter(match, all_rows)) |
| 593 | + else: |
| 594 | + filtered_rows = all_rows |
| 595 | + |
| 596 | + count = len(filtered_rows) |
| 597 | + |
| 598 | + # Tri optionnel |
| 599 | + if sort_field: |
| 600 | + reverse = sort_desc |
| 601 | + filtered_rows.sort( |
| 602 | + key=lambda x: getattr(x, sort_field, '').lower() if getattr(x, sort_field) else '', |
| 603 | + reverse=reverse |
| 604 | + ) |
| 605 | + |
| 606 | + # Pagination Python |
| 607 | + if page_size: |
| 608 | + start = page * page_size |
| 609 | + end = start + page_size |
| 610 | + filtered_rows = filtered_rows[start:end] |
| 611 | + |
| 612 | + return count, filtered_rows |
| 613 | + |
574 | 614 | # Expose custom routes for printer view |
575 | 615 | # for Ajax requests |
576 | 616 |
|
@@ -1101,6 +1141,41 @@ def on_model_change(self, form, model, is_created): |
1101 | 1141 | model.last_editor = current_user.username |
1102 | 1142 | session.commit() |
1103 | 1143 |
|
| 1144 | + def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None): |
| 1145 | + query = self.session.query(self.model) |
| 1146 | + all_rows = query.all() |
| 1147 | + |
| 1148 | + if search: |
| 1149 | + normalized_search = unidecode(search).lower().strip() |
| 1150 | + search_tokens = normalized_search.split() |
| 1151 | + |
| 1152 | + def match(row): |
| 1153 | + combined = f"{row.label or ''}" |
| 1154 | + normalized_combined = unidecode(combined).lower() |
| 1155 | + return all(token in normalized_combined for token in search_tokens) |
| 1156 | + |
| 1157 | + filtered_rows = list(filter(match, all_rows)) |
| 1158 | + else: |
| 1159 | + filtered_rows = all_rows |
| 1160 | + |
| 1161 | + count = len(filtered_rows) |
| 1162 | + |
| 1163 | + # Tri optionnel |
| 1164 | + if sort_field: |
| 1165 | + reverse = sort_desc |
| 1166 | + filtered_rows.sort( |
| 1167 | + key=lambda x: getattr(x, sort_field, '').lower() if getattr(x, sort_field) else '', |
| 1168 | + reverse=reverse |
| 1169 | + ) |
| 1170 | + |
| 1171 | + # Pagination Python |
| 1172 | + if page_size: |
| 1173 | + start = page * page_size |
| 1174 | + end = start + page_size |
| 1175 | + filtered_rows = filtered_rows[start:end] |
| 1176 | + |
| 1177 | + return count, filtered_rows |
| 1178 | + |
1104 | 1179 |
|
1105 | 1180 | class AboutView(BaseView): |
1106 | 1181 | """Custom view for database documentation.""" |
|
0 commit comments