#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright (C) 2010-2025 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # See the file COPYING for details. from django.conf import settings from django.conf.urls import include from django.conf.urls.static import static from django.urls import path, re_path from django.views.generic import TemplateView from .menus import Menu from ishtar_common import models, views, views_item, views_api from ishtar_common.utils import check_permissions, get_urls_for_model # be careful: each check_permissions must be relevant with ishtar_menu # forms urlpatterns = [ re_path(r"^status/$", views.status, name="status"), re_path(r"^raise-error/$", views.raise_error, name="raise-error"), re_path(r"^raise-task-error/$", views.raise_task_error, name="raise-task-error"), re_path(r"^ty/(?P[a-zA-Z0-9]+)$", views.tiny_redirect, name="tiny-redirect"), re_path( r"^robots\.txt$", TemplateView.as_view(template_name="robots.txt", content_type="text/plain"), ), # internationalization re_path(r"^i18n/", include("django.conf.urls.i18n")), re_path(r"^js/settings.js", views.settings_js, name="settings-js"), # General re_path(r"shortcut_menu/", views.shortcut_menu, name="shortcut-menu"), re_path(r"news-feed/", views.display_news_feed, name="news-feed"), re_path( r"display/(?P\w+)/(?P\d+)/", views.DisplayItemView.as_view(), name="display-item", ), re_path(r"qrcode/search/", views.QRCodeForSearchView.as_view(), name="search-qrcode"), re_path( r"qrcode/(?P[-a-z]+)/(?P[-a-z]+)/(?P\d+)/", views.QRCodeView.as_view(), name="qrcode-item", ), re_path( r"^generate-labels/(?P[-a-z0-9]+)/", views.GenerateLabelView.as_view(), name="generate-labels", ), re_path( r"^generate-document/(?P[-a-z0-9]+)/(" r"?P\d+)/", views.GenerateView.as_view(), name="generate-document", ), path( "export-media///", views.ExportMediaView.as_view(), name="export-media" ), re_path( r"person_search/(?P.+)?$", check_permissions( ["ishtar_common.view_person", "ishtar_common.view_own_person"] )(views.person_search_wizard), name="person_search", ), re_path( r"person_creation/(?P.+)?$", check_permissions(["ishtar_common.add_person"])(views.person_creation_wizard), name="person_creation", ), re_path( r"person_modification/(?P.+)?$", check_permissions( ["ishtar_common.change_person", "ishtar_common.change_own_person"] )(views.person_modification_wizard), name="person_modification", ), re_path(r"person_modify/(?P.+)/$", views.person_modify, name="person_modify"), re_path( r"person_deletion/(?P.+)?$", check_permissions( ["ishtar_common.delete_person", "ishtar_common.delete_own_person"] )(views.person_deletion_wizard), name="person_deletion", ), re_path(r"person_delete/(?P.+)/$", views.person_delete, name="person_delete"), re_path( r"^person-edit/$", check_permissions(["ishtar_common.add_person"])(views.PersonCreate.as_view()), name="person_create", ), re_path( r"^person-edit/(?P\d+)$", check_permissions( ["ishtar_common.change_person", "ishtar_common.change_own_person"] )(views.PersonEdit.as_view()), name="person_edit", ), re_path( r"^person-qa-bulk-update/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_person", "ishtar_common.change_own_person"] )(views.QAPersonForm.as_view()), name="person-qa-bulk-update", ), re_path( r"^person-qa-bulk-update/(?P[0-9-]+)?/confirm/$", check_permissions( ["ishtar_common.change_person", "ishtar_common.change_own_person"] )(views.QAPersonForm.as_view()), name="person-qa-bulk-update-confirm", kwargs={"confirm": True}, ), re_path( r"organization_search/(?P.+)?$", check_permissions( ["ishtar_common.view_organization", "ishtar_common.view_own_organization"] )(views.organization_search_wizard), name="organization_search", ), re_path( r"organization_creation/(?P.+)?$", check_permissions( ["ishtar_common.add_organization"] )(views.organization_creation_wizard), name="organization_creation", ), re_path( r"organization_modification/(?P.+)?$", check_permissions( ["ishtar_common.change_organization", "ishtar_common.change_own_organization"] )(views.organization_modification_wizard), name="organization_modification", ), re_path( r"organization_modify/(?P.+)/$", views.organization_modify, name="organization_modify", ), re_path( r"organization_deletion/(?P.+)?$", check_permissions( ["ishtar_common.delete_organization", "ishtar_common.delete_own_organization"] )(views.organization_deletion_wizard), name="organization_deletion", ), re_path( r"organization_delete/(?P.+)/$", views.organization_delete, name="delete-organization", ), re_path( r"organization-edit/$", check_permissions( ["ishtar_common.add_organization"] )(views.OrganizationCreate.as_view()), name="organization_create", ), re_path( r"organization-edit/(?P\d+)$", check_permissions( ["ishtar_common.change_organization", "ishtar_common.change_own_organization"] )(views.OrganizationEdit.as_view()), name="organization_edit", ), re_path( r"organization-person-edit/$", check_permissions( ["ishtar_common.add_organization"] )(views.OrganizationPersonCreate.as_view()), name="organization_person_create", ), re_path( r"organization-person-edit/(?P\d+)$", check_permissions( ["ishtar_common.change_organization", "ishtar_common.change_own_organization"] )(views.OrganizationPersonEdit.as_view()), name="organization_person_edit", ), re_path( r"^organization-qa-bulk-update/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_organization", "ishtar_common.change_own_organization"] )(views.QAOrganizationForm.as_view()), name="organization-qa-bulk-update", ), re_path( r"^organization-qa-bulk-update/(?P[0-9-]+)?/confirm/$", check_permissions( ["ishtar_common.change_organization", "ishtar_common.change_own_organization"] )(views.QAOrganizationForm.as_view()), name="organization-qa-bulk-update-confirm", kwargs={"confirm": True}, ), re_path(r"get-ishtaruser/(?P.+)?$", views.get_ishtaruser, name="get-ishtaruser"), re_path( r"account_management/(?P.+)?$", check_permissions( ["ishtar_common.add_ishtaruser"] )(views.account_management_wizard), name="account_management", ), re_path( r"account_manage/(?P\d+)$", views.account_manage, name="account-manage", ), re_path( r"account_deletion/(?P.+)?$", check_permissions( ["ishtar_common.add_ishtaruser"] )(views.account_deletion_wizard), name="account_deletion", ), re_path( r"^import-new/$", check_permissions( ["ishtar_common.add_import", "ishtar_common.add_own_import"] )(views.NewImportView.as_view()), name="new_import", ), re_path( r"^import-edit/(?P[0-9]+)/$", check_permissions( ["ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.EditImportView.as_view()), name="edit_import", ), re_path( r"^import-new-gis/$", check_permissions( ["ishtar_common.add_import", "ishtar_common.add_own_import"] )(views.NewImportGISView.as_view()), name="new_import_gis", ), re_path( r"^import-new-group/$", check_permissions( ["ishtar_common.add_import", "ishtar_common.add_own_import"] )(views.NewImportGroupView.as_view()), name="new_import_group", ), re_path( r"^import-list/$", check_permissions( ["ishtar_common.view_import", "ishtar_common.view_own_import", "ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.ImportListView.as_view()), name="current_imports", ), re_path( r"^import-list-table/$", check_permissions( ["ishtar_common.view_import", "ishtar_common.view_own_import", "ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.ImportListTableView.as_view()), name="current_imports_table", ), re_path( r"^import-get-status/$", check_permissions( ["ishtar_common.view_import", "ishtar_common.view_own_import", "ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.import_get_status), name="import_get_status", ), re_path( r"^import-list-old/$", check_permissions( ["ishtar_common.view_import", "ishtar_common.view_own_import", "ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.ImportOldListView.as_view()), name="old_imports", ), re_path( r"^import-delete/(?P[0-9]+)/$", check_permissions( ["ishtar_common.delete_import", "ishtar_common.delete_own_import"] )(views.ImportDeleteView.as_view()), name="import_delete", ), re_path( r"^import-group-delete/(?P[0-9]+)/$", check_permissions( ["ishtar_common.delete_import", "ishtar_common.delete_own_import"] )(views.ImportGroupDeleteView.as_view()), name="import_group_delete", ), re_path( r"^import-link-unmatched/(?P[0-9]+)/$", check_permissions( ["ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.ImportMatchView.as_view()), name="import_link_unmatched", ), re_path( r"^import-csv-view/(?Psource|result|match|error)/(?Pgroup\-)?(?P[0-9]+)/$", check_permissions( ["ishtar_common.view_import", "ishtar_common.view_own_import"] )(views.ImportCSVView.as_view()), name="import_display_csv", ), re_path( r"^import-step-by-step/all/(?P[0-9]+)/(?P[0-9]+)/$", views.ImportStepByStepView.as_view(), name="import_step_by_step_all", kwargs={"all_pages": True}, ), re_path( r"^import-step-by-step/(?P[0-9]+)/(?P[0-9]+)/$", views.ImportStepByStepView.as_view(), name="import_step_by_step", ), re_path( r"^import-pre-form/(?P[0-9]+)/$", check_permissions( ["ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.ImportPreFormView.as_view()), name="import_pre_import_form", ), re_path( r"^import-ignore-line/(?P[0-9]+)/$", check_permissions( ["ishtar_common.change_import", "ishtar_common.change_own_import"] )(views.line_error), name="import_ignore_line", ), path( "gis/tokens/list", check_permissions( ["ishtar_common.change_geovectordata", "ishtar_common.change_own_geovectordata"] )(views.GISTokenListView.as_view()), name="gis-token-list", ), path( "gis/tokens/delete//", check_permissions( ["ishtar_common.change_geovectordata", "ishtar_common.change_own_geovectordata"] )(views.gis_token_delete), name="gis-token-delete", ), path( "gis/tokens/request-key/", check_permissions( ["ishtar_common.change_geovectordata", "ishtar_common.change_own_geovectordata"] )(views.gis_generate_request_key), name="gis-request-key", ), path( "gis/tokens/create///", views.gis_create_token, name="gis-token-create", ), path( "api/gis/sources/", views_api.GISSourceAPI.as_view(), name="api-gis-sources", ), path( "api/gis/import///", views_api.GISImportAPI.as_view(), name="api-gis-sources", ), path( "api/gis/type///", views_api.GISTypeAPI.as_view(), name="api-gis-type", ), re_path(r"^profile(?:/(?P[0-9]+))?/$", views.ProfileEdit.as_view(), name="profile"), re_path( r"^save-search/(?P[a-z-]+)/(?P[a-z-]+)/$", views.SearchQueryEdit.as_view(), name="save-search-query", ), re_path( r"^bookmarks/(?P[a-z-]+)/(?P[a-z-]+)/$", views.BookmarkList.as_view(), name="bookmark-list", ), re_path(r"^bookmark/(?P[0-9]+)/$", views.get_bookmark, name="bookmark"), re_path( r"^bookmark/delete/(?P[0-9]+)/$", views.SearchQueryDelete.as_view(), name="bookmark-delete", ), re_path(r"^alerts/$", views.AlertList.as_view(), name="alert-list"), re_path( r"^success(?:/(?P[a-z-]+)(?:/(?P[0-9a-z-|]+))?)?/$", views.SuccessView.as_view(), name="success", ), ] menu = Menu(None) menu.init() actions = [] for section in menu.ref_childs: for menu_item in section.childs: if hasattr(menu_item, "childs"): for menu_subitem in menu_item.childs: actions.append(menu_subitem.idx) else: actions.append(menu_item.idx) actions = r"|".join(actions) # other views urlpatterns += [ # General re_path( r"update-current-item/$", views.update_current_item, name="update-current-item" ), re_path( r"pin/(?P[a-z-]+)/(?P\d+)/$", views.update_current_item, name="pin", ), re_path(r"pin-search/(?P[a-z-]+)/$", views.pin_search, name="pin-search"), re_path(r"unpin/(?P[a-z-]+)/$", views.unpin, name="unpin"), re_path( r"get-by-importer/(?P[\w-]+)/(?P[a-z-]+)?$", views.get_by_importer, name="get-by-importer", ), re_path( r"new-person/(?:(?P[^/]+)/)?(?:(?P[^/]+)/)?$", views.new_person, name="new-person", ), re_path( r"modify-person/(?:(?P[^/]+)/)?(?P[\d+]+)/$", views.modify_person, name="modify-person", ), re_path(r"detail-person/(?P[\d+]+)/$", views.detail_person, name="detail-person"), re_path( r"modify-organization/(?:(?P[^/]+)/)?(?P[\d+]+)/$", views.modify_organization, name="modify-organization", ), re_path( r"detail-organization/(?P[\d+]+)/$", views.detail_organization, name="detail-organization", ), re_path( r"new-person-noorga/" r"(?:(?P[^/]+)/)?(?:(?P[^/]+)/)?$", views.new_person_noorga, name="new-person-noorga", ), re_path(r"autocomplete-area/$", views.autocomplete_area, name="autocomplete-area"), re_path(r"autocomplete-user/$", views.autocomplete_user, name="autocomplete-user"), re_path( r"autocomplete-ishtaruser/$", views.autocomplete_ishtaruser, name="autocomplete-ishtaruser", ), re_path( r"autocomplete-person(?:/([0-9_]+))?(?:/([0-9_]*))?/(user)?$", views.autocomplete_person, name="autocomplete-person", ), re_path( r"autocomplete-person-permissive(?:/([0-9_]+))?(?:/([0-9_]*))?" r"/(user)?$", views.autocomplete_person_permissive, name="autocomplete-person-permissive", ), re_path(r"get-person/(?P.+)?$", views.get_person, name="get-person"), re_path( r"get-person-full/(?P.+)?$", views.get_person, name="get-person-full", kwargs={"full": True}, ), re_path( r"get-person-for-account/(?P.+)?$", views.get_person_for_account, name="get-person-for-account", ), re_path( r"show-person(?:/(?P.+))?/(?P.+)?$", views.show_person, name="show-person", ), path( "show-ishtaruser/", check_permissions(["ishtaradmin"])(views.show_ishtaruser), name="show-ishtaruser", ), path( "show-ishtaruser//", check_permissions(["ishtaradmin"])(views.show_ishtaruser), name="show-ishtaruser", ), re_path( r"show-biographicalnote(?:/(?P.+))?/(?P.+)?$", views.show_biographical_note, name="show-biographicalnote", ), re_path( r"new-biographicalnote/(?:(?P[^/]+)/)?(?:(?P[^/]+)/)?$", views.new_biographical_note, name="new-biographicalnote", ), re_path( r"^biographicalnote-qa-edit/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_biographicalnote", "ishtar_common.change_own_biographicalnote"] )(views.QABiographicalNoteForm.as_view()), name="biographicalnote-qa-edit", ), re_path( r"department-by-state/(?P.+)?$", views.department_by_state, name="department-by-state", ), re_path( r"show-area(?:/(?P.+))?/(?P.+)?$", views.show_area, name="show-area", ), re_path( r"show-town(?:/(?P.+))?/(?P.+)?$", views.show_town, name="show-town", ), re_path(r"autocomplete-town/?$", views.autocomplete_town, name="autocomplete-town"), re_path( r"autocomplete-advanced-town/(?P[0-9]+[ABab]?)?$", views.autocomplete_advanced_town, name="autocomplete-advanced-town", ), re_path( r"autocomplete-department/?$", views.autocomplete_department, name="autocomplete-department", ), re_path( r"new-author/(?:(?P[^/]+)/)?(?:(?P[^/]+)/)?$", views.new_author, name="new-author", ), re_path( r"autocomplete-author/$", views.autocomplete_author, name="autocomplete-author" ), re_path( r"new-organization/(?:(?P[^/]+)/)?" r"(?:(?P[^/]+)/)?$", views.new_organization, name="new-organization", ), re_path( r"get-organization/(?P.+)?$", views.get_organization, name="get-organization", ), re_path( r"get-organization-full/(?P.+)?$", views.get_organization, name="get-organization-full", kwargs={"full": True}, ), re_path( r"show-organization(?:/(?P.+))?/(?P.+)?$", views.show_organization, name="show-organization", ), re_path( r"show-import(?:/(?P\d+))?/(?Podt|pdf)?$", views.show_import, name="show-import", ), re_path(r"autocomplete-import/$", views.autocomplete_import, name="autocomplete-import"), re_path( r"show-importgroup(?:/(?P\d+))?/(?Podt|pdf)?$", views.show_import_group, name="show-importgroup", ), re_path( r"autocomplete-organization/([0-9_]+)?$", views.autocomplete_organization, name="autocomplete-organization", ), re_path( r"autocomplete-biographical-note/$", views.autocomplete_biographical_note, name="autocomplete-biographicalnote" ), re_path(r"changelog/(?:(?P\d+)/)?", views.ChangelogView.as_view(), name="changelog"), re_path(r"person-merge/(?:(?P\d+)/)?$", views.person_merge, name="person_merge"), re_path( r"person-manual-merge/$", views.PersonManualMerge.as_view(), name="person_manual_merge", ), re_path( r"person-manual-merge-items/(?P[0-9_]+?)/$", views.PersonManualMergeItems.as_view(), name="person_manual_merge_items", ), re_path( r"organization-merge/(?:(?P\d+)/)?$", views.organization_merge, name="organization_merge", ), re_path( r"orga-manual-merge/$", views.OrgaManualMerge.as_view(), name="orga_manual_merge", ), re_path( r"orga-manual-merge-items/(?P[0-9_]+?)/$", views.OrgaManualMergeItems.as_view(), name="orga_manual_merge_items", ), re_path(r"reset/$", views.reset_wizards, name="reset_wizards"), re_path( r"activate-all-search/$", views.activate_all_search, name="activate-all-search" ), re_path( r"activate-own-search/$", views.activate_own_search, name="activate-own-search" ), re_path( r"activate-advanced-menu/$", views.activate_advanced_shortcut_menu, name="activate-advanced-menu", ), re_path( r"activate-simple-menu/$", views.activate_simple_shortcut_menu, name="activate-simple-menu", ), re_path(r"hide-shortcut-menu/$", views.hide_shortcut_menu, name="hide-shortcut-menu"), re_path(r"show-shortcut-menu/$", views.show_shortcut_menu, name="show-shortcut-menu"), re_path( r"regenerate-external-id/$", views.regenerate_external_id, name="regenerate-external-id", ), path( "regenerate-permissions//", views.regenerate_permissions, name="regenerate-permissions", ), re_path( r"document/search/(?P.+)?$", check_permissions( ["ishtar_common.view_document", "ishtar_common.view_own_document"] )(views.document_search_wizard), name="search-document", ), re_path( r"document/search/(?P.+)?$", check_permissions( ["ishtar_common.view_document", "ishtar_common.view_own_document"] )(views.document_search_wizard), name="document_search", ), re_path( r"document/create/$", check_permissions( ["ishtar_common.add_document"] )(views.DocumentCreateView.as_view()), name="create-document", ), re_path( r"document/edit/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.DocumentSelectView.as_view()), name="edit-document", ), re_path( r"document/edit/(?P.+)/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.DocumentEditView.as_view()), name="edit-document", ), re_path( r"document/delete/(?P.+)?$", check_permissions( ["ishtar_common.delete_document", "ishtar_common.delete_own_document"] )(views.document_deletion_wizard), name="document_deletion", ), re_path( r"autocomplete-document/$", views.autocomplete_document, name="autocomplete-document", ), re_path( r"document/shortcut/delete/(?P.+)/$", views.document_delete, name="delete-document", ), re_path( r"^document-qa-bulk-update/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.QADocumentForm.as_view()), name="document-qa-bulk-update", ), re_path( r"^document-qa-bulk-update/(?P[0-9-]+)?/confirm/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.QADocumentForm.as_view()), name="document-qa-bulk-update-confirm", kwargs={"confirm": True}, ), re_path( r"^document-qa-duplicate/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.QADocumentDuplicateFormView.as_view()), name="document-qa-duplicate", ), path( "document-qa-unlink//-/", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.QADocumentUnlink.as_view()), name="document-qa-unlink", ), re_path( r"^document-qa-packaging/(?P[0-9-]+)?/$", check_permissions( ["ishtar_common.change_document", "ishtar_common.change_own_document"] )(views.QADocumentPackagingFormView.as_view()), name="document-qa-packaging", ), re_path( r"autocomplete-documenttag/$", views.autocomplete_documenttag, name="autocomplete-documenttag", ), re_path( r"new-documenttag/(?:(?P[^/]+)/)?" r"(?:(?P[^/]+)/)?$", views.new_document_tag, name="new-documenttag", ), re_path( r"geo/create/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/$", check_permissions( ["ishtar_common.add_geovectordata"] )(views.GeoPreCreateView.as_view()), name="create-pre-geo", ), re_path( r"geo/create/(?P[-\w]+)/(?P[-\w]+)/(?P\d+)/(?P[-\w]+)/$", check_permissions( ["ishtar_common.add_geovectordata"] )(views.GeoCreateView.as_view()), name="create-geo", ), re_path( r"geo/edit/(?P\d+)/$", check_permissions( ["ishtar_common.change_geovectordata", "ishtar_common.change_own_geovectordata"] )(views.GeoEditView.as_view()), name="edit-geo", ), re_path( r"geo/delete/(?P\d+)/$", check_permissions( ["ishtar_common.delete_geovectordata", "ishtar_common.delete_own_geovectordata"] )(views.GeoDeleteView.as_view()), name="delete-geo", ), re_path( r"^qa-not-available(?:/(?P[0-9a-z-]+))?/$", views.QANotAvailable.as_view(), name="qa-not-available", ), path( "external-search///", views_item.get_distant_item, name="external-search" ), path( "external-search///", views_item.get_distant_item, name="external-search" ), path( "external-export////", views_item.external_export, name="external-export" ), ] urlpatterns += get_urls_for_model(models.Document, views, own=True) urlpatterns += [ re_path(r"(?P" + actions + r")/$", views.action, name="action"), ] if settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)