loko/streetup/assets/urls.py

258 lines
26 KiB
Python

from django.urls import path
from .views import core, locations, nature, publiclighting, trafficlights, artworks, structures, controlcenters, sign, roads, its, clean, asset_editing, history, location_editing, export, asset_permissions, water, buildings, outdoor, parking
app_name = "assets"
urlpatterns = [
path("", core.unified_assets_index, name="index"),
path("parking/", parking.parking_index, name="parking_index"),
path("parking/assets/", parking.parking_assets, name="parking_assets"),
path("parking/assets/geojson/", parking.parking_assets_geojson, name="parking_assets_geojson"),
path("parking/assets/autocomplete/", parking.parking_assets_autocomplete, name="parking_autocomplete_assets"),
path("parking/locations/geojson/", parking.parking_locations_geojson, name="parking_locations_geojson"),
path("parking/<str:asset_model>/<int:asset_id>/", parking.parking_assets_detail, name="parking_assets_detail"),
path("buildings/", buildings.buildings_index, name="buildings_index"),
path("buildings/<int:pk>/", buildings.building_detail, name="publicbuilding_detail"),
path("buildings/<int:pk>/edit/", buildings.publicbuilding_edit, name="publicbuilding_edit"),
path("buildings/<str:asset_model>/<int:asset_id>/", buildings.publicbuildings_assets_detail, name="publicbuildings_assets_detail"),
path("export/", export.export_assets, name="export_assets"),
# ------------------------------------------------
# Per-instance & per-type permission management
# ------------------------------------------------
path('permissions/<int:content_type_id>/<int:object_id>/', asset_permissions.asset_permissions_panel, name='asset_permissions_panel'),
path('permissions/access/<int:access_id>/edit/', asset_permissions.asset_access_edit, name='asset_access_edit'),
path('permissions/access/<int:access_id>/delete/', asset_permissions.asset_access_delete, name='asset_access_delete'),
path('permissions/type/<int:content_type_id>/', asset_permissions.asset_type_permissions_page, name='asset_type_permissions_page'),
path('permissions/type-access/<int:type_access_id>/edit/', asset_permissions.asset_type_access_edit, name='asset_type_access_edit'),
path('permissions/type-access/<int:type_access_id>/delete/', asset_permissions.asset_type_access_delete, name='asset_type_access_delete'),
# ------------------------------------------------
# Generic Location Editing (create / update / delete)
# ------------------------------------------------
path('locations/<str:thematic_code>/<str:location_type>/form/', location_editing.location_form_html, name='location_form_html_create'),
path('locations/<str:thematic_code>/<str:location_type>/<int:location_id>/form/', location_editing.location_form_html, name='location_form_html_edit'),
path('locations/<str:thematic_code>/<str:location_type>/create/', location_editing.create_location, name='create_location'),
path('locations/<str:thematic_code>/<str:location_type>/<int:location_id>/update/', location_editing.update_location, name='update_location'),
path('locations/<str:thematic_code>/<str:location_type>/<int:location_id>/delete/', location_editing.delete_location, name='delete_location'),
# Asset editing API endpoints
path('<str:asset_model>/<int:asset_id>/update/', asset_editing.update_asset, name='update_asset'),
path('<str:asset_model>/<int:asset_id>/archive/', asset_editing.archive_asset, name='archive_asset'),
path('<str:asset_model>/<int:asset_id>/replace/', asset_editing.replace_asset, name='replace_asset'),
path('<str:asset_model>/<int:asset_id>/create-intervention/', asset_editing.create_intervention_for_asset, name='create_intervention_for_asset'),
path('<str:asset_model>/<int:asset_id>/documents/add/', asset_editing.asset_add_document, name='asset_add_document'),
path('<str:asset_model>/<int:asset_id>/documents/<int:document_id>/delete/', asset_editing.asset_delete_document, name='asset_delete_document'),
path('<str:asset_model>/<int:asset_id>/documents/', asset_editing.asset_document_list_html, name='asset_document_list_html'),
# Linked assets API endpoints
path('<str:asset_model>/<int:asset_id>/linked-types/', asset_editing.get_linked_asset_types, name='get_linked_asset_types'),
path('<str:parent_model>/<int:parent_id>/link-child/', asset_editing.link_child_asset, name='link_child_asset'),
path('<str:parent_model>/<int:parent_id>/unlink-child/', asset_editing.unlink_child_asset, name='unlink_child_asset'),
path('<str:asset_model>/<int:asset_id>/set-parent/', asset_editing.set_parent_asset, name='set_parent_asset'),
path('<str:parent_model>/<int:parent_id>/create-child/', asset_editing.create_and_link_child_asset, name='create_and_link_child_asset'),
path('api/search-assets/<str:model_name>/', asset_editing.search_assets_by_model, name='search_assets_by_model'),
path('api/child-asset-form-fields/<str:model_name>/', asset_editing.get_child_asset_form_fields, name='get_child_asset_form_fields'),
# History API endpoints (without thematic)
path('<str:asset_model>/<int:asset_id>/history/', history.get_asset_history, name='get_asset_history'),
path('<str:asset_model>/<int:asset_id>/history/status-at-date/', history.get_asset_status_at_date, name='get_asset_status_at_date'),
path('history/global/', history.get_global_history, name='get_global_history'),
# History API endpoints (with thematic - must come after specific routes)
path('<str:thematic_code>/<str:asset_model>/<int:asset_id>/history/', history.get_asset_history, name='get_asset_history_thematic'),
path('<str:thematic_code>/<str:asset_model>/<int:asset_id>/history/status-at-date/', history.get_asset_status_at_date, name='get_asset_status_at_date_thematic'),
path('<str:thematic_code>/history/global/', history.get_global_history, name='get_global_history_thematic'),
path('<str:thematic_code>/<str:location_type>/<int:location_id>/create-asset/', asset_editing.create_asset, name='create_asset'),
path('<str:thematic_code>/<str:location_type>/<int:location_id>/bulk-archive/', asset_editing.bulk_archive_assets, name='bulk_archive_assets'),
path('<str:thematic_code>/categories/', asset_editing.get_asset_categories_for_thematic, name='get_asset_categories'),
path('<str:thematic_code>/category/<int:category_id>/models/', asset_editing.get_asset_models_for_category, name='get_asset_models'),
path('<str:thematic_code>/asset/<int:asset_id>/available-locations/', asset_editing.get_available_locations_for_asset, name='get_available_locations'),
path('api/create-asset/', asset_editing.create_asset_api, name='create_asset_api'),
path('api/bulk-edit/', asset_editing.bulk_edit_assets, name='bulk_edit_assets'),
path('locations/autocomplete/', locations.locations_autocomplete, name='locations_autocomplete'),
# path('<str:thematic>/<str:asset_model>/<int:asset_id>/add-document/', core.add_document, name='assets_add_document'),
path('trafficlights/', trafficlights.trafficlights_index, name='trafficlights_index'),
path('trafficlights/intersections/', trafficlights.trafficlights_intersections, name='trafficlights_intersections'),
path('trafficlights/intersections/get-nearest/', trafficlights.get_nearest_trafficlight_intersection, name='get_nearest_trafficlight_intersection'),
path('trafficlights/intersections/geojson/', trafficlights.trafficlights_intersections_geojson, name='trafficlights_intersections_geojson'),
path('trafficlights/intersections/documents/history/', trafficlights.fetch_document_history, name='trafficlights_intersections_document_history'),
path('trafficlights/intersections/autocomplete/', trafficlights.trafficlights_locations_autocomplete, name='trafficlights_autocomplete_locations'),
path('trafficlights/intersections/<int:intersection_id>/', trafficlights.trafficlights_intersections_detail, name='trafficlights_intersections_detail'),
path('trafficlights/intersections/<int:intersection_id>/contracts/add/', trafficlights.trafficlights_intersections_contracts_add, name='trafficlights_intersections_contracts_add'),
path('trafficlights/intersections/<int:intersection_id>/contracts/<int:tl_contract_id>/remove/', trafficlights.trafficlights_intersections_contracts_remove, name='trafficlights_intersections_contracts_remove'),
path('trafficlights/intersections/<int:intersection_id>/document-config/', trafficlights.get_document_config, name='trafficlights_intersections_document_config'),
path('trafficlights/intersections/<str:intersection_code>/', trafficlights.trafficlights_intersections_get_by_code, name='trafficlights_interstrafficlights_intersections_get_by_codeections_detail'),
path('trafficlights/intersections/<int:intersection_id>/add-document/', trafficlights.trafficlights_intersections_add_document, name='trafficlights_intersections_add_document'),
path('trafficlights/intersections/<int:document_id>/delete-document/', trafficlights.trafficlights_intersections_delete_document, name='trafficlights_intersections_delete_document'),
path('trafficlights/assets/', trafficlights.trafficlights_assets, name='trafficlights_assets'),
path('trafficlights/assets/geojson/', trafficlights.trafficlights_assets_geojson, name='trafficlights_assets_geojson'),
path('trafficlights/assets/controllers/', trafficlights.trafficlights_controllers, name='trafficlights_controllers'),
path('trafficlights/assets/controllers/<int:asset_id>/', trafficlights.trafficlights_controllers_detail, name='trafficlights_controllers_detail'),
path('trafficlights/assets/autocomplete/', trafficlights.trafficlights_assets_autocomplete, name='trafficlights_autocomplete_assets'),
path('trafficlights/<str:asset_model>/<int:asset_id>/', trafficlights.trafficlights_assets_detail, name='trafficlights_assets_detail'),
path('publiclighting/', publiclighting.publiclighting_index, name='publiclighting_index'),
path('publiclighting/streets/', publiclighting.publiclighting_streets, name='publiclighting_streets'),
path('publiclighting/streets/geojson/', publiclighting.publiclighting_streets_geojson, name='publiclighting_streets_geojson'),
path('publiclighting/streets/documents/history/', publiclighting.fetch_document_history, name='publiclighting_streets_document_history'),
path('publiclighting/streets/get-nearest/', publiclighting.get_nearest_publiclighting_street, name='get_nearest_publiclighting_street'),
path('publiclighting/streets/autocomplete/', publiclighting.publiclighting_locations_autocomplete, name='publiclighting_autocomplete_locations'),
path('publiclighting/streets/<int:street_id>/', publiclighting.publiclighting_streets_detail, name='publiclighting_streets_detail'),
path('publiclighting/streets/<int:street_id>/add-document/', publiclighting.publiclighting_streets_add_document, name='publiclighting_streets_add_document'),
path('publiclighting/streets/<int:street_id>/delete-document/', publiclighting.publiclighting_streets_delete_document, name='publiclighting_streets_delete_document'),
path('publiclighting/assets/', publiclighting.publiclighting_assets, name='publiclighting_assets'),
path('publiclighting/assets/geojson/', publiclighting.publiclighting_assets_geojson, name='publiclighting_assets_geojson'),
path('publiclighting/assets/autocomplete/', publiclighting.publiclighting_assets_autocomplete, name='publiclighting_autocomplete_assets'),
path('publiclighting/<str:asset_model>/<int:asset_id>/', publiclighting.publiclighting_assets_detail, name='publiclighting_assets_detail'),
path('artworks/', artworks.artworks_index, name='artworks_index'),
path('artworks/streets/', artworks.artworks_streets, name='artworks_streets'),
path('artworks/streets/geojson/', artworks.artworks_streets_geojson, name='artworks_streets_geojson'),
path('artworks/streets/get-nearest/', artworks.get_nearest_artworks_street, name='get_nearest_artworks_street'),
path('artworks/streets/<int:street_id>/', artworks.artworks_streets_detail, name='artworks_streets_detail'),
path('artworks/fountains/', artworks.artworks_fountains, name='artworks_fountains'),
path('artworks/fountains/geojson/', artworks.fountains_geojson, name='artworks_fountains_geojson'),
path('artworks/fountains/<int:asset_id>/', artworks.artworks_fountains_detail, name='artworks_fountains_detail'),
path('artworks/monuments/', artworks.artworks_monuments, name='artworks_monuments'),
path('artworks/monuments/geojson/', artworks.monuments_geojson, name='artworks_monuments_geojson'),
path('artworks/monuments/<int:asset_id>/', artworks.artworks_monuments_detail, name='artworks_monuments_detail'),
path('artworks/assets/', artworks.artworks_assets, name='artworks_assets'),
path('artworks/assets/<str:asset_model>/<int:asset_id>/', artworks.artworks_assets_detail_redirect, name='artworks_assets_detail'),
path('artworks/assets/geojson/', artworks.artworks_assets_geojson, name='artworks_assets_geojson'),
path('artworks/assets/autocomplete/', artworks.artworks_assets_autocomplete, name='artworks_autocomplete_assets'),
path('artworks/assets/get-nearest/', artworks.get_nearest_artworks_asset, name='get_nearest_artworks_asset'),
path('nature/', nature.nature_index, name='nature_index'),
path('nature/locations/', nature.nature_locations, name='nature_locations'),
path('nature/locations/geojson/', nature.nature_locations_geojson, name='nature_locations_geojson'),
path('nature/locations/<int:location_id>/', nature.nature_locations_detail, name='nature_locations_detail'),
path('nature/locations/get-nearest/', nature.get_nearest_nature_location, name='get_nearest_nature_location'),
path('nature/locations/autocomplete/', nature.nature_locations_autocomplete, name='nature_autocomplete_locations'),
path('nature/assets/', nature.nature_assets, name='nature_assets'),
path('nature/assets/geojson/', nature.nature_assets_geojson, name='nature_assets_geojson'),
path('nature/assets/autocomplete/', nature.nature_assets_autocomplete, name='nature_autocomplete_assets'),
path('nature/assets/bulk-update/', nature.nature_bulk_update_assets, name='nature_bulk_update_assets'),
path('nature/assets/bulk-delete/', nature.nature_bulk_delete_assets, name='nature_bulk_delete_assets'),
path('nature/assets/undo/', nature.nature_undo_action, name='nature_undo_action'),
path('nature/assets/save-geometries/', nature.nature_save_geometries, name='nature_save_geometries'),
# Green Surfaces Comments API (must be before generic nature/<str:asset_model>/<int:asset_id>/)
path('nature/comments/geojson/', nature.green_surfaces_comments_geojson, name='green_surfaces_comments_geojson'),
path('nature/comments/<int:comment_id>/', nature.green_surfaces_comment_detail, name='green_surfaces_comment_detail'),
path('nature/comments/save/', nature.green_surfaces_comment_save, name='green_surfaces_comment_save'),
path('nature/comments/<int:comment_id>/add-photos/', nature.green_surfaces_comment_add_photos, name='green_surfaces_comment_add_photos'),
path('nature/comments/<int:comment_id>/delete/', nature.green_surfaces_comment_delete, name='green_surfaces_comment_delete'),
path('nature/<str:asset_model>/<int:asset_id>/', nature.nature_assets_detail, name='nature_assets_detail'),
path('structures/', structures.structures_index, name='structures_index'),
path('structures/structures/documents/history/', structures.fetch_document_history, name='structures_document_history'),
path('structures/structures/documents/config/<int:structure_id>/', structures.get_document_config, name='structures_document_config'),
path('structures/structures/<int:structure_id>/add-document/', structures.structures_add_document, name='structures_add_document'),
path('structures/structures/<int:document_id>/delete-document/', structures.structures_delete_document, name='structures_delete_document'),
path('structures/locations/', structures.structures_locations, name='structures_locations'),
path('structures/locations/geojson/', structures.structures_locations_geojson, name='structures_locations_geojson'),
path('structures/locations/get-nearest/', structures.get_nearest_structure_location, name='get_nearest_structure_location'),
# path('structures/locations/autocomplete/', structures.structures_locations_autocomplete, name='structures_autocomplete_locations'),
path('structures/locations/<int:location_id>/', structures.structures_locations_detail, name='structures_locations_detail'),
path('structures/assets/', structures.structures_assets, name='structures_assets'),
path('structures/assets/geojson/', structures.structures_assets_geojson, name='structures_assets_geojson'),
path('structures/assets/autocomplete/', structures.structures_assets_autocomplete, name='structures_autocomplete_assets'),
path('structures/<str:asset_model>/<int:asset_id>/', structures.structures_assets_detail, name='structures_assets_detail'),
path('controlcenters/', controlcenters.controlcenters_index, name='controlcenters_index'),
path('controlcenters/locations/', controlcenters.controlcenters_locations, name='controlcenters_locations'),
path('controlcenters/locations/geojson/', controlcenters.controlcenters_locations_geojson, name='controlcenters_locations_geojson'),
path('controlcenters/locations/<int:location_id>/', controlcenters.controlcenters_locations_detail, name='controlcenters_locations_detail'),
path('controlcenters/assets/', controlcenters.controlcenters_assets, name='controlcenters_assets'),
path('controlcenters/assets/geojson/', controlcenters.controlcenters_assets_geojson, name='controlcenters_assets_geojson'),
path('controlcenters/assets/autocomplete/', controlcenters.controlcenters_assets_autocomplete, name='controlcenters_autocomplete_assets'),
path('controlcenters/<str:asset_model>/<int:asset_id>/', controlcenters.controlcenters_assets_detail, name='controlcenters_assets_detail'),
path('controlcenters/controlcenters/<int:controlcenter_id>/add-document/', controlcenters.controlcenters_add_document, name='controlcenters_add_document'),
path('controlcenters/controlcenters/<int:document_id>/delete-document/', controlcenters.controlcenters_delete_document, name='controlcenters_delete_document'),
path('sign/', sign.sign_index, name='sign_index'),
path('sign/streets/', sign.sign_streets, name='sign_streets'),
path('sign/streets/geojson/', sign.sign_streets_geojson, name='sign_streets_geojson'),
path('sign/streets/documents/history/', sign.fetch_document_history, name='sign_streets_document_history'),
path('sign/streets/get-nearest/', sign.get_nearest_sign_street, name='get_nearest_sign_street'),
path('sign/streets/<int:street_id>/', sign.sign_streets_detail, name='sign_streets_detail'),
path('sign/streets/<int:street_id>/add-document/', sign.sign_streets_add_document, name='sign_streets_add_document'),
path('sign/streets/<int:street_id>/delete-document/', sign.sign_streets_delete_document, name='sign_streets_delete_document'),
path('sign/assets/', sign.sign_assets, name='sign_assets'),
path('sign/assets/geojson/', sign.sign_assets_geojson, name='sign_assets_geojson'),
path('sign/assets/autocomplete/', sign.sign_assets_autocomplete, name='sign_autocomplete_assets'),
path('sign/<str:asset_model>/<int:asset_id>/', sign.sign_assets_detail, name='sign_assets_detail'),
path('roads/', roads.roads_index, name='roads_index'),
path('roads/streets/', roads.roads_streets, name='roads_streets'),
path('roads/streets/geojson/', roads.roads_streets_geojson, name='roads_streets_geojson'),
path('roads/streets/documents/history/', roads.fetch_document_history, name='roads_streets_document_history'),
path('roads/streets/get-nearest/', roads.get_nearest_roads_street, name='get_nearest_roads_street'),
path('roads/streets/<int:street_id>/', roads.roads_streets_detail, name='roads_streets_detail'),
path('roads/streets/<int:street_id>/add-document/', roads.roads_streets_add_document, name='roads_streets_add_document'),
path('roads/streets/<int:street_id>/delete-document/', roads.roads_streets_delete_document, name='roads_streets_delete_document'),
path('roads/assets/', roads.roads_assets, name='roads_assets'),
path('roads/assets/geojson/', roads.roads_assets_geojson, name='roads_assets_geojson'),
path('roads/assets/autocomplete/', roads.roads_assets_autocomplete, name='roads_autocomplete_assets'),
path('roads/<str:asset_model>/<int:asset_id>/', roads.roads_assets_detail, name='roads_assets_detail'),
path('its/', its.its_index, name='its_index'),
path('its/locations/', its.its_locations, name='its_locations'),
path('its/locations/geojson/', its.its_locations_geojson, name='its_locations_geojson'),
path('its/locations/<int:location_id>/', its.its_locations_detail, name='its_locations_detail'),
path('its/locations/<int:location_id>/add-document/', its.its_location_add_document, name='its_location_add_document'),
path('its/locations/<int:document_id>/delete-document/', its.its_location_delete_document, name='its_location_delete_document'),
path('its/assets/', its.its_assets, name='its_assets'),
path('its/assets/geojson/', its.its_assets_geojson, name='its_assets_geojson'),
path('its/assets/autocomplete/', its.its_assets_autocomplete, name='its_autocomplete_assets'),
path('its/<str:asset_model>/<int:asset_id>/', its.its_assets_detail, name='its_assets_detail'),
path('clean/', clean.clean_index, name='clean_index'),
path('clean/locations/geojson/', clean.clean_locations_geojson, name='clean_locations_geojson'),
path('clean/locations/get-nearest/', clean.get_nearest_clean_location, name='get_nearest_clean_location'),
path('clean/locations/<int:location_id>/', clean.clean_location_detail, name='clean_location_detail'),
path('clean/assets/geojson/', clean.clean_assets_geojson, name='clean_assets_geojson'),
path('clean/assets/autocomplete/', clean.clean_assets_autocomplete, name='clean_autocomplete_assets'),
path('clean/litterbin/<int:asset_id>/observations/update/', clean.update_litter_bin_observations, name='clean_update_litter_bin_observations'),
path('clean/<str:asset_model>/<int:asset_id>/', clean.clean_assets_detail, name='clean_assets_detail'),
path('water/', water.water_index, name='water_index'),
path('water/locations/geojson/', water.water_locations_geojson, name='water_locations_geojson'),
path('water/locations/get-nearest/', water.get_nearest_water_location, name='get_nearest_water_location'),
path('water/zirw/<int:location_id>/', water.zirw_detail, name='zirw_detail'),
path('water/zirw/<int:location_id>/add-document/', water.zirw_add_document, name='zirw_add_document'),
path('water/zirw/document-history/', water.fetch_document_history, name='zirw_document_history'),
path('water/zirw/<int:location_id>/document-config/', water.get_document_config, name='zirw_document_config'),
path('water/assets/geojson/', water.water_assets_geojson, name='water_assets_geojson'),
path('water/assets/autocomplete/', water.water_assets_autocomplete, name='water_autocomplete_assets'),
path('water/<str:asset_model>/<int:asset_id>/', water.water_assets_detail, name='water_assets_detail'),
# Public buildings GeoJSON URLs
path('publicbuildings/locations/geojson/', buildings.publicbuildings_locations_geojson, name='publicbuildings_locations_geojson'),
path('publicbuildings/assets/geojson/', buildings.publicbuildings_assets_geojson, name='publicbuildings_assets_geojson'),
# Outdoor facilities GeoJSON & Detail URLs
path('outdoor/locations/geojson/', outdoor.outdoor_locations_geojson, name='outdoor_locations_geojson'),
path('outdoor/locations/<int:pk>/', outdoor.outdoor_location_detail, name='outdoor_location_detail'),
path('outdoor/assets/geojson/', outdoor.outdoor_assets_geojson, name='outdoor_assets_geojson'),
path('outdoor/<str:asset_model>/<int:asset_id>/', outdoor.outdoor_assets_detail, name='outdoor_assets_detail'),
# DXF import URLs
path('trafficlights/intersections/<int:intersection_id>/import-dxf/', trafficlights.import_dxf, name='import_dxf'),
path('trafficlights/intersections/<int:intersection_id>/stage-dxf/', trafficlights.stage_dxf, name='stage_dxf'),
path('trafficlights/intersections/<int:intersection_id>/save-dxf-layers/', trafficlights.save_dxf_layers, name='save_dxf_layers'),
path('trafficlights/intersections/<int:intersection_id>/integrate-dxf/', trafficlights.integrate_dxf, name='integrate_dxf'),
path('trafficlights/intersections/<int:intersection_id>/dxf-layout-geojson/', trafficlights.dxf_layout_geojson, name='dxf_layout_geojson'),
path('trafficlights/intersections/<int:intersection_id>/dxf-layers/', trafficlights.dxf_layers, name='dxf_layers'),
path('trafficlights/intersections/<int:intersection_id>/add-staged-pole/', trafficlights.add_staged_pole, name='add_staged_pole'),
path('trafficlights/intersections/<int:intersection_id>/delete-staged-pole/<int:pole_id>/', trafficlights.delete_staged_pole, name='delete_staged_pole'),
path('trafficlights/intersections/<int:intersection_id>/update-staged-pole-position/<int:pole_id>/', trafficlights.update_staged_pole_position, name='update_staged_pole_position'),
# Cross plan (Excel) import URLs
path('trafficlights/intersections/<int:intersection_id>/import-cross-plan/', trafficlights.import_cross_plan, name='import_cross_plan'),
path('trafficlights/intersections/<int:intersection_id>/integrate-cross-plan/', trafficlights.integrate_cross_plan, name='integrate_cross_plan'),
path('trafficlights/intersections/<int:intersection_id>/upload-dxf-ajax/', trafficlights.upload_dxf_ajax, name='upload_dxf_ajax'),
]