SYMBOL INDEX (319 symbols across 40 files) FILE: app.py function create_app (line 19) | def create_app(): function bootstrap_admin (line 49) | def bootstrap_admin(): function get_free_port (line 154) | def get_free_port(start_port): function start_server (line 164) | def start_server(): FILE: build_exe.py function start_flask (line 20) | def start_flask(): function run_pywebview (line 26) | def run_pywebview(): function build_exe (line 62) | def build_exe(): FILE: config.py function _get_or_create_secret_key (line 17) | def _get_or_create_secret_key(): FILE: core/database.py function load_users (line 37) | def load_users(): function save_users (line 41) | def save_users(users): function load_records (line 50) | def load_records(): function save_records (line 58) | def save_records(records): function load_feedback (line 67) | def load_feedback(): function save_feedback (line 71) | def save_feedback(feedback_data): function _log_audit (line 80) | def _log_audit(action, performed_by, record_id=None, details=None): function get_audit_collection (line 108) | def get_audit_collection(): function get_data_dir (line 111) | def get_data_dir(): FILE: core/logic.py function _mask_owner_for_viewer (line 3) | def _mask_owner_for_viewer(record): function _strip_b64_from_list (line 19) | def _strip_b64_from_list(records): function _apply_filters_to_records (line 33) | def _apply_filters_to_records(records, params): function _generate_ulpin (line 61) | def _generate_ulpin(): function _calculate_estimated_value (line 64) | def _calculate_estimated_value(area_ha, circle_rate_inr, land_use): function _update_nested (line 80) | def _update_nested(record, parent_key, child_key, value): FILE: core/security.py function admin_required (line 8) | def admin_required(f): function viewer_or_admin_required (line 17) | def viewer_or_admin_required(f): function role_required (line 26) | def role_required(*allowed_roles): function generate_captcha (line 38) | def generate_captcha(): function verify_captcha_logic (line 45) | def verify_captcha_logic(token, user_answer): FILE: gis_processor.py function get_india_boundary_shape (line 14) | def get_india_boundary_shape(): function calculate_area (line 61) | def calculate_area(geometry_dict): function _geodesic_area_m2 (line 100) | def _geodesic_area_m2(geom): function validate_polygon (line 169) | def validate_polygon(geometry_dict): function check_overlap (line 240) | def check_overlap(new_geometry_dict, existing_records): function get_centroid (line 283) | def get_centroid(geometry_dict): function geojson_to_wkt (line 303) | def geojson_to_wkt(geometry_dict): function calculate_perimeter (line 321) | def calculate_perimeter(geometry_dict): FILE: report_generator.py function _fmt_inr (line 38) | def _fmt_inr(value): function generate_property_card_pdf (line 59) | def generate_property_card_pdf(record, map_image_base64=None): class PropertyCardPDF (line 319) | class PropertyCardPDF(FPDF): method header (line 322) | def header(self): method footer (line 329) | def footer(self): function generate_village_excel (line 333) | def generate_village_excel(records, village_name="All Villages"): FILE: routes/auth.py function get_captcha (line 9) | def get_captcha(): function verify_captcha (line 14) | def verify_captcha(): function admin_login (line 29) | def admin_login(): function logout (line 56) | def logout(): function session_info (line 61) | def session_info(): function forgot_password (line 69) | def forgot_password(): FILE: routes/documents.py function print_property_card (line 10) | def print_property_card(ulpin): function export_village_ledger (line 26) | def export_village_ledger(): FILE: routes/feedback.py function get_feedback (line 16) | def get_feedback(): function submit_feedback (line 22) | def submit_feedback(): function dashboard_analytics (line 45) | def dashboard_analytics(): function list_audit (line 126) | def list_audit(): function delete_feedback (line 143) | def delete_feedback(feedback_id): function update_feedback_status (line 153) | def update_feedback_status(feedback_id): FILE: routes/gis.py function get_india_boundary (line 11) | def get_india_boundary(): function api_calculate_area (line 22) | def api_calculate_area(): function api_validate_geometry (line 35) | def api_validate_geometry(): function location_from_coordinates (line 45) | def location_from_coordinates(): function get_location_catalog (line 90) | def get_location_catalog(): FILE: routes/pages.py function index (line 7) | def index(): function login_page (line 11) | def login_page(): function admin_dashboard (line 21) | def admin_dashboard(): function viewer_page (line 28) | def viewer_page(): FILE: routes/records.py function generate_ulpin (line 13) | def generate_ulpin(state_name, district_name): function get_records (line 22) | def get_records(): function get_record (line 40) | def get_record(record_id): function search_records (line 59) | def search_records(): function filter_records (line 78) | def filter_records(): function location_catalog (line 93) | def location_catalog(): function create_record (line 114) | def create_record(): function update_record (line 194) | def update_record(record_id): function delete_record (line 274) | def delete_record(record_id): function restore_record (line 310) | def restore_record(record_id): function generate_property_card (line 329) | def generate_property_card(ulpin): FILE: routes/users.py function _get_current_user (line 9) | def _get_current_user(users): function get_profile (line 15) | def get_profile(): function update_profile (line 25) | def update_profile(): function list_users (line 48) | def list_users(): function create_user (line 61) | def create_user(): function get_user (line 119) | def get_user(user_id): function update_user (line 133) | def update_user(user_id): function delete_user (line 190) | def delete_user(user_id): FILE: routes/utils.py function app_config (line 7) | def app_config(): FILE: scripts/inspect_recovery.py function main (line 12) | def main(): FILE: scripts/recover_superadmin_auto.py function random_password (line 18) | def random_password(length=20): function upsert_superadmin (line 23) | def upsert_superadmin(username=None, password=None, dry_run=False): FILE: static/js/api.js constant API_BASE (line 6) | const API_BASE = ''; constant FETCH_OPTS (line 9) | const FETCH_OPTS = { function verifyCaptcha (line 14) | async function verifyCaptcha(answer, token) { function getCaptcha (line 24) | async function getCaptcha() { function adminLogin (line 32) | async function adminLogin(username, password) { function logout (line 42) | async function logout() { function getSessionInfo (line 51) | async function getSessionInfo() { function forgotPassword (line 59) | async function forgotPassword() { function fetchRecords (line 68) | async function fetchRecords() { function fetchRecord (line 80) | async function fetchRecord(recordId) { function searchRecords (line 92) | async function searchRecords(query) { function fetchLocationCatalog (line 104) | async function fetchLocationCatalog() { function createRecord (line 110) | async function createRecord(recordData) { function updateRecord (line 124) | async function updateRecord(recordId, updateData) { function deleteRecord (line 138) | async function deleteRecord(recordId) { function restoreRecord (line 150) | async function restoreRecord(recordId) { function calculateArea (line 163) | async function calculateArea(geometry) { function validateGeometry (line 177) | async function validateGeometry(geometry) { function fetchLocationFromCoordinates (line 191) | async function fetchLocationFromCoordinates(lat, lng) { function fetchFilteredRecords (line 211) | async function fetchFilteredRecords(filters = {}) { function fetchDashboardAnalytics (line 235) | async function fetchDashboardAnalytics(filters = {}) { function fetchAppConfig (line 259) | async function fetchAppConfig() { function fetchAudit (line 271) | async function fetchAudit(limit = 50) { function getPropertyCardUrl (line 284) | function getPropertyCardUrl(ulpin) { return `${API_BASE}/api/print-card/... function getVillageExcelUrl (line 286) | function getVillageExcelUrl(village) { function downloadFile (line 291) | function downloadFile(url, filename) { function showToast (line 301) | function showToast(message, type = 'info', duration = 3000) { function updateRealTimeClock (line 328) | function updateRealTimeClock() { FILE: static/js/auth.js function showCaptchaError (line 127) | function showCaptchaError(msg) { function showLoginError (line 192) | function showLoginError(msg) { function checkSessionAndRedirect (line 205) | async function checkSessionAndRedirect() { FILE: static/js/map.js function setupTabSwitching (line 75) | function setupTabSwitching() { function switchMainTab (line 93) | function switchMainTab(tabId) { function switchFormTab (line 136) | function switchFormTab(tabId) { function performAdminSearch (line 163) | async function performAdminSearch() { function viewRecordDetails (line 167) | async function viewRecordDetails(recordId) { FILE: static/js/map_OLD_BAK.js constant DEFAULT_SNAP_DISTANCE (line 27) | const DEFAULT_SNAP_DISTANCE = 20; function showConfirmModal (line 30) | function showConfirmModal(message, onConfirm) { function sortedValues (line 85) | function sortedValues(values) { function asNumber (line 89) | function asNumber(value) { function formatInr (line 94) | function formatInr(value) { function escapeHtml (line 98) | function escapeHtml(value) { function debounce (line 108) | function debounce(fn, wait = 200) { function ensureLocationInCatalog (line 117) | function ensureLocationInCatalog(state, district, village) { function syncLocationCatalogWithRecords (line 132) | function syncLocationCatalogWithRecords(records) { function populateStateFilter (line 139) | function populateStateFilter(records) { function populateDistrictFilter (line 161) | function populateDistrictFilter(records) { function getAdminFilterState (line 183) | function getAdminFilterState() { function filterRecordsByState (line 197) | function filterRecordsByState(records, filterState) { function renderKpiCards (line 222) | function renderKpiCards(records) { function buildDonutChart (line 250) | function buildDonutChart(slices, colors) { function buildRankedList (line 288) | function buildRankedList(items, colors) { function renderLandUseDistribution (line 307) | function renderLandUseDistribution(records) { function renderDistrictOverview (line 324) | function renderDistrictOverview(records) { function renderTopValueParcel (line 347) | function renderTopValueParcel(records) { function renderRecentMutations (line 383) | function renderRecentMutations(records) { function renderDashboardAnalytics (line 417) | function renderDashboardAnalytics(filteredRecords) { function applyAdminFilters (line 425) | function applyAdminFilters(notify) { function renderKpiCardsFromServer (line 480) | function renderKpiCardsFromServer(kpis) { function renderLandUseDistributionFromServer (line 492) | function renderLandUseDistributionFromServer(stats) { function renderDistrictOverviewFromServer (line 503) | function renderDistrictOverviewFromServer(districts) { function renderTopValueParcelFromServer (line 516) | function renderTopValueParcelFromServer(parcel) { function renderRecentMutationsFromServer (line 532) | function renderRecentMutationsFromServer(mutations) { function getFormElements (line 549) | function getFormElements() { function populateSelect (line 563) | function populateSelect(selectEl, values, placeholder, selectedValue) { function refreshStateOptions (line 591) | function refreshStateOptions(selectedState) { function refreshDistrictOptions (line 598) | function refreshDistrictOptions(selectedDistrict) { function refreshVillageOptions (line 607) | function refreshVillageOptions(selectedVillage) { function setLocationValues (line 620) | function setLocationValues(state, district, village) { function setLocationSource (line 639) | function setLocationSource(text) { function isManualLocationOverrideEnabled (line 646) | function isManualLocationOverrideEnabled() { function toggleManualLocationOverride (line 651) | function toggleManualLocationOverride(enabled) { function getEffectiveLocationValues (line 689) | function getEffectiveLocationValues() { function initializeLocationFilters (line 714) | function initializeLocationFilters() { function updateAutofillStatus (line 768) | function updateAutofillStatus(message, isError) { function isMapAutofillEnabled (line 777) | function isMapAutofillEnabled() { function shouldApplyLocationUpdate (line 782) | function shouldApplyLocationUpdate(nextLocation, forceUpdate) { function applyResolvedLocation (line 806) | function applyResolvedLocation(locationData, forceUpdate) { function scheduleMapLocationLookup (line 824) | function scheduleMapLocationLookup(lat, lng, forceUpdate) { function initializeFormTabs (line 847) | function initializeFormTabs() { function switchFormTab (line 860) | function switchFormTab(tabName) { function setMutationMode (line 874) | function setMutationMode(enabled) { function updateSnapDistanceLabel (line 884) | function updateSnapDistanceLabel() { function getDrawSettings (line 892) | function getDrawSettings() { function clearMetricsUI (line 904) | function clearMetricsUI() { function clearGeometrySelection (line 925) | function clearGeometrySelection(alsoDisableDraw) { function startPolygonDraw (line 943) | function startPolygonDraw() { function finishPolygonDraw (line 953) | function finishPolygonDraw() { function cancelPolygonSelection (line 959) | function cancelPolygonSelection() { function clearPolygonSelection (line 965) | function clearPolygonSelection() { function initializeDrawSettingsPanel (line 971) | function initializeDrawSettingsPanel() { function updateGeometryMetrics (line 1015) | async function updateGeometryMetrics(geometry, options) { function switchBaseLayer (line 1088) | function switchBaseLayer(layerName) { function addIndiaMask (line 1097) | async function addIndiaMask(mapInstance) { function initMap (line 1165) | function initMap(adminMode) { function loadRecordsOnMap (line 1315) | async function loadRecordsOnMap() { function clearMapLayers (line 1346) | function clearMapLayers() { function addRecordsToMap (line 1353) | function addRecordsToMap(records) { function getLandUseColor (line 1427) | function getLandUseColor(landUse) { function onParcelClick (line 1440) | function onParcelClick(record) { function flyToRecord (line 1449) | function flyToRecord(record) { function switchRecordsView (line 1456) | function switchRecordsView(mode) { function renderRecordsList (line 1472) | function renderRecordsList(records) { function selectRecord (line 1576) | async function selectRecord(recordId) { function viewRecordDetails (line 1597) | async function viewRecordDetails(recordId) { function initViewRecordMap (line 1671) | function initViewRecordMap(record) { function showAuditModal (line 1764) | function showAuditModal(entries) { function showAdminDetails (line 2001) | function showAdminDetails(record) { function editRecord (line 2172) | async function editRecord(recordId) { function capturePolygonMapForPdf (line 2266) | async function capturePolygonMapForPdf(geometry) { function printCard (line 2306) | async function printCard(ulpin) { function confirmDelete (line 2342) | function confirmDelete(recordId, khasraNo) { function initAddRecordMap (line 2364) | function initAddRecordMap() { function lookupLocationForAddRecord (line 2548) | function lookupLocationForAddRecord(lat, lng) { function updateGeometryMetricsForAddRecord (line 2614) | async function updateGeometryMetricsForAddRecord(geometry) { function switchSidebarTab (line 2663) | function switchSidebarTab(tabName) { function switchMainTab (line 2668) | function switchMainTab(tabName) { function showProfileEditForm (line 2964) | function showProfileEditForm() { function hideCreateUserForm (line 3018) | function hideCreateUserForm() { document.getElementById('create-user-for... function performAdminSearch (line 3040) | async function performAdminSearch() { function fileToBase64 (line 3053) | function fileToBase64(file) { function handleFormSubmit (line 3062) | async function handleFormSubmit() { function resetForm (line 3264) | function resetForm() { function loadProfile (line 3329) | async function loadProfile() { function displayProfile (line 3338) | function displayProfile(profile) { function loadFeedback (line 3367) | async function loadFeedback() { function deleteFeedback (line 3413) | function deleteFeedback(feedbackId) { function loadUsers (line 3432) | async function loadUsers() { function renderUsersTable (line 3444) | function renderUsersTable() { function getSessionUsername (line 3518) | async function getSessionUsername() { function editUser (line 3527) | async function editUser(userId) { function closeEditUserModal (line 3549) | function closeEditUserModal() { function deleteUser (line 3616) | function deleteUser(userId, username) { FILE: static/js/modules/admin.js function showAuditModal (line 12) | function showAuditModal(entries) { function showAdminDetails (line 179) | function showAdminDetails(record) { function capturePolygonMapForPdf (line 242) | async function capturePolygonMapForPdf(geometry) { function printCard (line 265) | async function printCard(ulpin) { function confirmDelete (line 279) | function confirmDelete(recordId, khasraNo) { function loadProfile (line 289) | async function loadProfile() { function displayProfile (line 298) | function displayProfile(profile) { function loadFeedback (line 401) | async function loadFeedback() { function loadUsers (line 478) | async function loadUsers() { function renderUsersTable (line 490) | function renderUsersTable() { function getSessionUsername (line 569) | async function getSessionUsername() { function editUser (line 578) | async function editUser(userId) { function closeEditUserModal (line 635) | function closeEditUserModal() { function deleteUser (line 642) | function deleteUser(userId, username) { function hideCreateUserForm (line 730) | function hideCreateUserForm() { FILE: static/js/modules/dashboard.js function renderKpiCards (line 5) | function renderKpiCards(records) { function buildDonutChart (line 33) | function buildDonutChart(slices, colors) { function buildRankedList (line 70) | function buildRankedList(items, colors) { function renderLandUseDistribution (line 88) | function renderLandUseDistribution(records) { function renderDistrictOverview (line 105) | function renderDistrictOverview(records) { function renderTopValueParcel (line 128) | function renderTopValueParcel(records) { function renderRecentMutations (line 164) | function renderRecentMutations(records) { function renderDashboardAnalytics (line 198) | function renderDashboardAnalytics(filteredRecords) { function renderKpiCardsFromServer (line 207) | function renderKpiCardsFromServer(kpis) { function renderLandUseDistributionFromServer (line 219) | function renderLandUseDistributionFromServer(stats) { function renderDistrictOverviewFromServer (line 230) | function renderDistrictOverviewFromServer(districts) { function renderTopValueParcelFromServer (line 243) | function renderTopValueParcelFromServer(parcel) { function renderRecentMutationsFromServer (line 259) | function renderRecentMutationsFromServer(mutations) { FILE: static/js/modules/forms.js function getFormElements (line 5) | function getFormElements() { function populateSelect (line 19) | function populateSelect(selectEl, values, placeholder, selectedValue) { function refreshStateOptions (line 47) | function refreshStateOptions(selectedState) { function refreshDistrictOptions (line 54) | function refreshDistrictOptions(selectedDistrict) { function refreshVillageOptions (line 63) | function refreshVillageOptions(selectedVillage) { function setLocationValues (line 76) | function setLocationValues(state, district, village) { function setLocationSource (line 95) | function setLocationSource(text) { function isManualLocationOverrideEnabled (line 102) | function isManualLocationOverrideEnabled() { function toggleManualLocationOverride (line 107) | function toggleManualLocationOverride(enabled) { function getEffectiveLocationValues (line 145) | function getEffectiveLocationValues() { function initializeLocationFilters (line 170) | function initializeLocationFilters() { function isMapAutofillEnabled (line 261) | function isMapAutofillEnabled() { function updateGpsBanner (line 266) | function updateGpsBanner(locationData) { function shouldApplyLocationUpdate (line 318) | function shouldApplyLocationUpdate(nextLocation, forceUpdate) { function applyResolvedLocation (line 344) | function applyResolvedLocation(locationData, forceUpdate) { function scheduleMapLocationLookup (line 373) | function scheduleMapLocationLookup(lat, lng, forceUpdate) { function setMutationMode (line 407) | function setMutationMode(enabled) { function editRecord (line 417) | async function editRecord(recordId) { function handleFormSubmit (line 485) | async function handleFormSubmit() { function resetForm (line 674) | function resetForm() { function ensureLocationInCatalog (line 709) | function ensureLocationInCatalog(state, district, village) { FILE: static/js/modules/gis.js function updateGeometryMetrics (line 5) | async function updateGeometryMetrics(geometry, options) { function updateGeometryMetricsForAddRecord (line 68) | async function updateGeometryMetricsForAddRecord(geometry) { function clearMetricsUI (line 126) | function clearMetricsUI() { function clearGeometrySelection (line 143) | function clearGeometrySelection(clearAddRecordMap) { FILE: static/js/modules/map_engine.js function switchBaseLayer (line 5) | function switchBaseLayer(layerName) { function addIndiaMask (line 13) | async function addIndiaMask(mapInstance) { function initMap (line 46) | function initMap(adminMode) { function loadRecordsOnMap (line 114) | async function loadRecordsOnMap() { function clearMapLayers (line 137) | function clearMapLayers() { function addRecordsToMap (line 142) | function addRecordsToMap(records) { function getLandUseColor (line 167) | function getLandUseColor(landUse) { function onParcelClick (line 172) | function onParcelClick(record) { function flyToRecord (line 177) | function flyToRecord(record) { function initViewRecordMap (line 183) | function initViewRecordMap(record) { function initAddRecordMap (line 223) | function initAddRecordMap() { FILE: static/js/modules/records.js function ensureLocationInCatalog (line 5) | function ensureLocationInCatalog(state, district, village) { function syncLocationCatalogWithRecords (line 20) | function syncLocationCatalogWithRecords(records) { function populateStateFilter (line 27) | function populateStateFilter(records) { function populateDistrictFilter (line 49) | function populateDistrictFilter(records) { function populateVillageFilter (line 71) | function populateVillageFilter(records) { function getAdminFilterState (line 93) | function getAdminFilterState() { function initializeRecordFilters (line 109) | function initializeRecordFilters() { function filterRecordsByState (line 134) | function filterRecordsByState(records, filterState) { function switchRecordsView (line 159) | function switchRecordsView(mode) { function renderRecordsList (line 175) | function renderRecordsList(records) { function applyAdminFilters (line 279) | function applyAdminFilters(notify) { FILE: static/js/modules/state.js constant DEFAULT_SNAP_DISTANCE (line 29) | const DEFAULT_SNAP_DISTANCE = 20; FILE: static/js/modules/utils.js function showConfirmModal (line 5) | function showConfirmModal(message, onConfirm) { function sortedValues (line 60) | function sortedValues(values) { function asNumber (line 64) | function asNumber(value) { function formatInr (line 69) | function formatInr(value) { function escapeHtml (line 73) | function escapeHtml(value) { function debounce (line 82) | function debounce(fn, wait = 200) { function updateAutofillStatus (line 91) | function updateAutofillStatus(message, isError) { function fileToBase64 (line 100) | function fileToBase64(file) { function calculateValuation (line 108) | function calculateValuation(areaHa, circleRateInr, landUse) { FILE: tests/check_users_roles.py function report_case (line 13) | def report_case(scenario, action, expected, actual, passed): function check (line 17) | def check(): FILE: tests/generate_test_report.py function main (line 15) | def main(): FILE: tests/robust_role_test.py function report_case (line 23) | def report_case(scenario, action, expected, actual, passed): function run_tests (line 27) | def run_tests(): FILE: tests/test_advanced_gis.py function report_case (line 11) | def report_case(scenario, action, expected, actual, passed): FILE: tests/test_logins.py function report_case (line 35) | def report_case(scenario, action, expected, actual, passed): FILE: tests/test_record_soft_delete.py function report_case (line 30) | def report_case(scenario, action, expected, actual, passed): FILE: tests/test_recovery_flow.py function report_case (line 30) | def report_case(scenario, action, expected, actual, passed): FILE: tests/test_report_gen.py function test_report_generation (line 11) | def test_report_generation(): FILE: tests/test_restore_flow.py function report_case (line 24) | def report_case(scenario, action, expected, actual, passed): FILE: utils.py function resource_path (line 10) | def resource_path(relative_path): function safe_divide (line 20) | def safe_divide(numerator, denominator, default=0):