|
9 | 9 | from ckan import model |
10 | 10 | from ckan.types import Action, Context, DataDict |
11 | 11 | from ckan.types.logic import ActionResult |
| 12 | +from ckan.logic import validate |
| 13 | +from ckan.model import ResourceView |
| 14 | +from ckanext.datavic_odp_theme.logic import scheme |
12 | 15 |
|
13 | 16 | from ckanext.datavic_odp_theme import jobs |
14 | 17 |
|
@@ -198,3 +201,57 @@ def datavic_list_incomplete_resources(context, data_dict): |
198 | 201 | "num_packages": num_packages, |
199 | 202 | "results": results, |
200 | 203 | } |
| 204 | + |
| 205 | + |
| 206 | +@validate(scheme.datatables_view_prioritize) |
| 207 | +def datavic_datatables_view_prioritize( |
| 208 | + context: Context, data_dict: DataDict |
| 209 | +) -> ActionResult: |
| 210 | + """Check if the datatables view is prioritized over the recline view. |
| 211 | + If not, swap their order. |
| 212 | + """ |
| 213 | + tk.check_access("vic_datatables_view_prioritize", context, data_dict) |
| 214 | + |
| 215 | + resource_id = data_dict["resource_id"] |
| 216 | + res_views = sorted( |
| 217 | + model.Session.query(ResourceView) |
| 218 | + .filter(ResourceView.resource_id == resource_id) |
| 219 | + .all(), |
| 220 | + key=lambda x: x.order, |
| 221 | + ) |
| 222 | + datatables_views = _filter_views(res_views, "datatables_view") |
| 223 | + recline_views = _filter_views(res_views, "recline_view") |
| 224 | + |
| 225 | + if not ( |
| 226 | + datatables_views |
| 227 | + and recline_views |
| 228 | + and datatables_views[0].order > recline_views[0].order |
| 229 | + ): |
| 230 | + return {"updated": False} |
| 231 | + |
| 232 | + datatables_views[0].order, recline_views[0].order = ( |
| 233 | + recline_views[0].order, |
| 234 | + datatables_views[0].order, |
| 235 | + ) |
| 236 | + order = [view.id for view in sorted(res_views, key=lambda x: x.order)] |
| 237 | + tk.get_action("resource_view_reorder")( |
| 238 | + {"ignore_auth": True}, {"id": resource_id, "order": order} |
| 239 | + ) |
| 240 | + return {"updated": True} |
| 241 | + |
| 242 | + |
| 243 | +@tk.chained_action |
| 244 | +def resource_view_create(next_, context, data_dict): |
| 245 | + result = next_(context, data_dict) |
| 246 | + if data_dict["view_type"] == "datatables_view": |
| 247 | + tk.get_action("datavic_datatables_view_prioritize")( |
| 248 | + {"ignore_auth": True}, {"resource_id": data_dict["resource_id"]} |
| 249 | + ) |
| 250 | + return result |
| 251 | + |
| 252 | + |
| 253 | +def _filter_views( |
| 254 | + res_views: list[ResourceView], view_type: str |
| 255 | +) -> list[ResourceView]: |
| 256 | + """Return a list of views with the given view type.""" |
| 257 | + return [view for view in res_views if view.view_type == view_type] |
0 commit comments