Backup Before Changes village Task

This commit is contained in:
Swapnil9693
2026-03-24 11:28:14 +05:30
parent 2679554e98
commit 630ee1744f
7 changed files with 873 additions and 76 deletions

2
.env
View File

@@ -2,7 +2,7 @@ Secret_Key = 9f2a1b8c4d6e7f0123456789abcdef01
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_PASSWORD=tiger
MYSQL_DB=test
DEFAULT_USERNAME=admin

View File

@@ -0,0 +1,13 @@
Timestamp: 2026-03-24 10:27:31 | User: Unknown | Action: Edit Village | Details: User admin edited '39'
Timestamp: 2026-03-24 10:27:36 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '39'
Timestamp: 2026-03-24 10:33:47 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '35'
Timestamp: 2026-03-24 10:40:41 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '35'
Timestamp: 2026-03-24 11:05:41 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '55'
Timestamp: 2026-03-24 11:08:04 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '40'
Timestamp: 2026-03-24 11:13:07 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '13'
Timestamp: 2026-03-24 11:13:15 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '23'
Timestamp: 2026-03-24 11:15:20 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '28'
Timestamp: 2026-03-24 11:16:35 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '30'
Timestamp: 2026-03-24 11:17:12 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '33'
Timestamp: 2026-03-24 11:19:08 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '41'
Timestamp: 2026-03-24 11:23:57 | User: Unknown | Action: Delete Village | Details: User admin deleted Village '14'

View File

@@ -19,7 +19,7 @@ village_bp = Blueprint('village', __name__)
def add_village():
village = Village()
if request.method == 'POST':
village.AddVillage(request=request)
return village.resultMessage

View File

@@ -1,3 +1,364 @@
# from flask_login import current_user
# from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
# from model.Log import LogHelper
# import config
# import re
# import mysql.connector
# # ----------------------------------------------------------
# # Mapping Class
# # ----------------------------------------------------------
# class itemCRUDMapping:
# def __init__(self, itemType):
# if itemType is ItemCRUDType.Village:
# self.name = "Village"
# elif itemType is ItemCRUDType.Block:
# self.name = "Block"
# elif itemType is ItemCRUDType.State:
# self.name = "State"
# elif itemType is ItemCRUDType.HoldType:
# self.name = "Hold Type"
# elif itemType is ItemCRUDType.Subcontractor:
# self.name = "Subcontractor"
# else:
# self.name = "Item"
# # ----------------------------------------------------------
# # Generic CRUD Class
# # ----------------------------------------------------------
# class ItemCRUD:
# def __init__(self, itemType):
# self.isSuccess = False
# self.resultMessage = ""
# self.itemCRUDType = itemType
# self.itemCRUDMapping = itemCRUDMapping(itemType)
# # ----------------------------------------------------------
# # DELETE
# # ----------------------------------------------------------
# def DeleteItem(self, request, itemID, storedprocDelete):
# connection = config.get_db_connection()
# cursor = connection.cursor()
# LogHelper.log_action(
# f"Delete {self.itemCRUDMapping.name}",
# f"User {current_user.id} deleted {self.itemCRUDMapping.name} '{itemID}'"
# )
# try:
# cursor.callproc(storedprocDelete, (itemID,))
# connection.commit()
# self.isSuccess = True
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.delete_success(self.itemCRUDMapping.name), 200
# )
# except mysql.connector.Error as e:
# print(f"Error deleting {self.itemCRUDMapping.name}: {e}")
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.delete_failure(self.itemCRUDMapping.name), 500
# )
# finally:
# cursor.close()
# connection.close()
# # ----------------------------------------------------------
# # ADD
# # ----------------------------------------------------------
# def AddItem(self, request, parentid=None, childname=None, storedprocfetch=None, storedprocadd=None, data=None):
# connection = config.get_db_connection()
# if not connection:
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.db_connection_failure(), 500
# )
# return
# cursor = connection.cursor()
# LogHelper.log_action(
# f"Add {self.itemCRUDMapping.name}",
# f"User {current_user.id} adding '{childname if childname else (data.get('Contractor_Name') if data else '')}'"
# )
# try:
# # ======================================================
# # SUBCONTRACTOR (MULTI-FIELD)
# # ======================================================
# if data:
# # Duplicate check
# cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
# existing_item = None
# for rs in cursor.stored_results():
# existing_item = rs.fetchone()
# if existing_item:
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
# )
# return
# # Insert
# cursor.callproc(storedprocadd, (
# data['Contractor_Name'],
# data['Address'],
# data['Mobile_No'],
# data['PAN_No'],
# data['Email'],
# data['Gender'],
# data['GST_Registration_Type'],
# data['GST_No'],
# data['Contractor_password']
# ))
# connection.commit()
# self.isSuccess = True
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.add_success(self.itemCRUDMapping.name), 200
# )
# return
# # ======================================================
# # NORMAL (Village / Block / State)
# # ======================================================
# if not re.match(RegEx.patternAlphabetOnly, childname):
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
# )
# return
# # Duplicate check
# if parentid is None:
# cursor.callproc(storedprocfetch, (childname,))
# else:
# cursor.callproc(storedprocfetch, (childname, parentid))
# existing_item = None
# for rs in cursor.stored_results():
# existing_item = rs.fetchone()
# if existing_item:
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
# )
# return
# # Insert
# if parentid is None:
# cursor.callproc(storedprocadd, (childname,))
# else:
# cursor.callproc(storedprocadd, (childname, parentid))
# connection.commit()
# self.isSuccess = True
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.add_success(self.itemCRUDMapping.name), 200
# )
# except mysql.connector.Error as e:
# print(f"Database Error: {e}")
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.add_failure(self.itemCRUDMapping.name), 500
# )
# finally:
# cursor.close()
# connection.close()
# # ----------------------------------------------------------
# # EDIT
# # ----------------------------------------------------------
# def EditItem(self, request, childid, parentid=None, childname=None, storedprocupdate=None, data=None):
# connection = config.get_db_connection()
# cursor = connection.cursor()
# LogHelper.log_action(
# f"Edit {self.itemCRUDMapping.name}",
# f"User {current_user.id} edited '{childid}'"
# )
# try:
# # ======================================================
# # SUBCONTRACTOR (MULTI-FIELD)
# # ======================================================
# if data:
# cursor.callproc(storedprocupdate, (
# childid,
# data['Contractor_Name'],
# data['Address'],
# data['Mobile_No'],
# data['PAN_No'],
# data['Email'],
# data['Gender'],
# data['GST_Registration_Type'],
# data['GST_No'],
# data['Contractor_password']
# ))
# connection.commit()
# self.isSuccess = True
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.update_success(self.itemCRUDMapping.name), 200
# )
# return
# # ======================================================
# # NORMAL
# # ======================================================
# if not re.match(RegEx.patternAlphabetOnly, childname):
# self.isSuccess = False
# self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
# return
# if parentid is None:
# cursor.callproc(storedprocupdate, (childid, childname))
# else:
# cursor.callproc(storedprocupdate, (childid, parentid, childname))
# connection.commit()
# self.isSuccess = True
# self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
# except mysql.connector.Error as e:
# print(f"Error updating {self.itemCRUDMapping.name}: {e}")
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.update_failure(self.itemCRUDMapping.name), 500
# )
# finally:
# cursor.close()
# connection.close()
# # ----------------------------------------------------------
# # GET ALL
# # ----------------------------------------------------------
# def GetAllData(self, request, storedproc):
# data = []
# connection = config.get_db_connection()
# if not connection:
# return []
# cursor = connection.cursor()
# try:
# cursor.callproc(storedproc)
# for result in cursor.stored_results():
# data = result.fetchall()
# self.isSuccess = True
# except mysql.connector.Error as e:
# print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
# )
# return []
# finally:
# cursor.close()
# connection.close()
# return data
# # ----------------------------------------------------------
# # GET BY ID
# # ----------------------------------------------------------
# def GetDataByID(self, id, storedproc):
# data = None
# connection = config.get_db_connection()
# cursor = connection.cursor()
# try:
# cursor.callproc(storedproc, (id,))
# for rs in cursor.stored_results():
# data = rs.fetchone()
# except mysql.connector.Error as e:
# print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
# finally:
# cursor.close()
# connection.close()
# return data
# # ----------------------------------------------------------
# # CHECK ITEM
# # ----------------------------------------------------------
# def CheckItem(self, request, parentid, childname, storedprocfetch):
# connection = config.get_db_connection()
# cursor = connection.cursor()
# LogHelper.log_action(
# f"Check {self.itemCRUDMapping.name}",
# f"User {current_user.id} checked '{childname}'"
# )
# if not re.match(RegEx.patternAlphabetOnly, childname):
# return HtmlHelper.json_response(
# ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
# )
# try:
# if parentid is None:
# cursor.callproc(storedprocfetch, (childname,))
# else:
# cursor.callproc(storedprocfetch, (childname, parentid))
# existing_item = None
# for rs in cursor.stored_results():
# existing_item = rs.fetchone()
# if existing_item:
# return HtmlHelper.json_response(
# ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
# )
# return HtmlHelper.json_response(
# ResponseHandler.is_available(self.itemCRUDMapping.name), 200
# )
# except mysql.connector.Error as e:
# print(f"Error checking {self.itemCRUDMapping.name}: {e}")
# return HtmlHelper.json_response(
# ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
# )
# finally:
# cursor.close()
# connection.close()
from flask_login import current_user
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
from model.Log import LogHelper
@@ -35,6 +396,7 @@ class ItemCRUD:
def __init__(self, itemType):
self.isSuccess = False
self.resultMessage = ""
self.response = {} # ✅ ADDED
self.itemCRUDType = itemType
self.itemCRUDMapping = itemCRUDMapping(itemType)
@@ -56,16 +418,14 @@ class ItemCRUD:
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.delete_success(self.itemCRUDMapping.name), 200
)
self.response = ResponseHandler.delete_success(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
except mysql.connector.Error as e:
print(f"Error deleting {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.delete_failure(self.itemCRUDMapping.name), 500
)
self.response = ResponseHandler.delete_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
finally:
cursor.close()
@@ -79,9 +439,8 @@ class ItemCRUD:
connection = config.get_db_connection()
if not connection:
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.db_connection_failure(), 500
)
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
cursor = connection.cursor()
@@ -92,12 +451,8 @@ class ItemCRUD:
)
try:
# ======================================================
# SUBCONTRACTOR (MULTI-FIELD)
# ======================================================
# SUBCONTRACTOR
if data:
# Duplicate check
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
existing_item = None
@@ -106,12 +461,10 @@ class ItemCRUD:
if existing_item:
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
)
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
# Insert
cursor.callproc(storedprocadd, (
data['Contractor_Name'],
data['Address'],
@@ -127,22 +480,17 @@ class ItemCRUD:
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
)
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
# ======================================================
# NORMAL (Village / Block / State)
# ======================================================
# NORMAL
if not re.match(RegEx.patternAlphabetOnly, childname):
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.invalid_name(self.itemCRUDMapping.name), 400
)
self.response = ResponseHandler.invalid_name(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
# Duplicate check
if parentid is None:
cursor.callproc(storedprocfetch, (childname,))
else:
@@ -154,12 +502,10 @@ class ItemCRUD:
if existing_item:
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.already_exists(self.itemCRUDMapping.name), 409
)
self.response = ResponseHandler.already_exists(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
# Insert
if parentid is None:
cursor.callproc(storedprocadd, (childname,))
else:
@@ -168,17 +514,14 @@ class ItemCRUD:
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.add_success(self.itemCRUDMapping.name), 200
)
self.response = ResponseHandler.add_success(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
except mysql.connector.Error as e:
print(f"Database Error: {e}")
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.add_failure(self.itemCRUDMapping.name), 500
)
self.response = ResponseHandler.add_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
finally:
cursor.close()
@@ -198,9 +541,6 @@ class ItemCRUD:
)
try:
# ======================================================
# SUBCONTRACTOR (MULTI-FIELD)
# ======================================================
if data:
cursor.callproc(storedprocupdate, (
childid,
@@ -218,17 +558,14 @@ class ItemCRUD:
connection.commit()
self.isSuccess = True
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.update_success(self.itemCRUDMapping.name), 200
)
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
# ======================================================
# NORMAL
# ======================================================
if not re.match(RegEx.patternAlphabetOnly, childname):
self.isSuccess = False
self.resultMessage = ResponseHandler.update_failure(self.itemCRUDMapping.name)['message']
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return
if parentid is None:
@@ -239,14 +576,14 @@ class ItemCRUD:
connection.commit()
self.isSuccess = True
self.resultMessage = ResponseHandler.update_success(self.itemCRUDMapping.name)['message']
self.response = ResponseHandler.update_success(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
except mysql.connector.Error as e:
print(f"Error updating {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.update_failure(self.itemCRUDMapping.name), 500
)
self.response = ResponseHandler.update_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
finally:
cursor.close()
@@ -276,9 +613,8 @@ class ItemCRUD:
except mysql.connector.Error as e:
print(f"Error fetching {self.itemCRUDMapping.name}: {e}")
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.fetch_failure(self.itemCRUDMapping.name), 500
)
self.response = ResponseHandler.fetch_failure(self.itemCRUDMapping.name)
self.resultMessage = self.response["message"]
return []
finally:
@@ -312,7 +648,7 @@ class ItemCRUD:
return data
# ----------------------------------------------------------
# CHECK ITEM
# CHECK ITEM (KEEP AS IS - API USE)
# ----------------------------------------------------------
def CheckItem(self, request, parentid, childname, storedprocfetch):

View File

@@ -1,9 +1,182 @@
# from model.Utilities import ResponseHandler, HtmlHelper, ItemCRUDType
# import config
# import mysql.connector
# from model.ItemCRUD import ItemCRUD
# class Village:
# isSuccess = False
# resultMessage = ""
# def __init__(self):
# self.isSuccess = False
# self.resultMessage = ""
# self.village = ItemCRUD(itemType=ItemCRUDType.Village)
# # 🔹 Helper: sync status
# def _set_status(self, village):
# self.isSuccess = village.isSuccess
# self.resultMessage = village.resultMessage
# # 🔹 Helper: get request data
# def _get_form_data(self, request):
# block_id = request.form.get('block_Id')
# village_name = request.form.get('Village_Name', '').strip()
# return block_id, village_name
# def AddVillage(self, request):
# block_id, village_name = self._get_form_data(request)
# if not village_name:
# self.isSuccess = False
# self.resultMessage = "Village name cannot be empty"
# return
# try:
# self.village.AddItem(
# request=request,
# parentid=block_id,
# childname=village_name,
# storedprocfetch="GetVillageByNameAndBlock",
# storedprocadd="SaveVillage"
# )
# self._set_status(self.village)
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# def GetAllVillages(self, request):
# try:
# villagesdata = self.village.GetAllData(
# request=request,
# storedproc="GetAllVillages"
# )
# self._set_status(self.village)
# return villagesdata
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# return []
# def CheckVillage(self, request):
# block_id, village_name = self._get_form_data(request)
# if not village_name:
# self.isSuccess = False
# self.resultMessage = "Village name cannot be empty"
# return None
# try:
# result = self.village.CheckItem(
# request=request,
# parentid=block_id,
# childname=village_name,
# storedprocfetch="GetVillageByNameAndBlocks"
# )
# self._set_status(self.village)
# return result
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# return None
# def DeleteVillage(self, request, village_id):
# try:
# self.village.DeleteItem(
# request=request,
# itemID=village_id,
# storedprocDelete="DeleteVillage"
# )
# self._set_status(self.village)
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# def EditVillage(self, request, village_id):
# block_id, village_name = self._get_form_data(request)
# if not village_name:
# self.isSuccess = False
# self.resultMessage = "Village name cannot be empty"
# return
# try:
# self.village.EditItem(
# request=request,
# childid=village_id,
# parentid=block_id,
# childname=village_name,
# storedprocupdate="UpdateVillage"
# )
# self._set_status(self.village)
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# def GetVillageByID(self, id):
# try:
# villagedetailsdata = self.village.GetDataByID(
# id=id,
# storedproc="GetVillageDetailsById"
# )
# if villagedetailsdata:
# self.isSuccess = True
# else:
# self.isSuccess = False
# self.resultMessage = "Village not found"
# return villagedetailsdata
# except Exception as e:
# self.isSuccess = False
# self.resultMessage = str(e)
# return None
# def GetAllBlocks(self):
# blocks = []
# self.isSuccess = False
# self.resultMessage = ""
# connection = config.get_db_connection()
# if not connection:
# return []
# try:
# with connection.cursor() as cursor:
# cursor.callproc('GetAllBlocks')
# for result in cursor.stored_results():
# blocks.extend(result.fetchall())
# self.isSuccess = True
# return blocks
# except mysql.connector.Error as e:
# print(f"Error fetching blocks: {e}")
# self.isSuccess = False
# self.resultMessage = HtmlHelper.json_response(
# ResponseHandler.fetch_failure("block"), 500
# )
# return []
# finally:
# connection.close()
from model.Utilities import ResponseHandler, HtmlHelper, ItemCRUDType
import config
import mysql.connector
from model.ItemCRUD import ItemCRUD
class Village:
isSuccess = False
resultMessage = ""
@@ -11,12 +184,19 @@ class Village:
def __init__(self):
self.isSuccess = False
self.resultMessage = ""
self.response = {} # ✅ ADDED
self.village = ItemCRUD(itemType=ItemCRUDType.Village)
# 🔹 Helper: sync status
def _set_status(self, village):
self.isSuccess = village.isSuccess
self.resultMessage = village.resultMessage
# ✅ UPDATED (safe handling)
if hasattr(village, "response"):
self.response = village.response
self.resultMessage = village.response.get("message", "")
else:
self.resultMessage = village.resultMessage
# 🔹 Helper: get request data
def _get_form_data(self, request):
@@ -28,8 +208,9 @@ class Village:
block_id, village_name = self._get_form_data(request)
if not village_name:
self.response = ResponseHandler.invalid_name("village") # ✅ UPDATED
self.resultMessage = self.response["message"]
self.isSuccess = False
self.resultMessage = "Village name cannot be empty"
return
try:
@@ -65,8 +246,9 @@ class Village:
block_id, village_name = self._get_form_data(request)
if not village_name:
self.response = ResponseHandler.invalid_name("village") # ✅ UPDATED
self.resultMessage = self.response["message"]
self.isSuccess = False
self.resultMessage = "Village name cannot be empty"
return None
try:
@@ -102,8 +284,9 @@ class Village:
block_id, village_name = self._get_form_data(request)
if not village_name:
self.response = ResponseHandler.invalid_name("village") # ✅ UPDATED
self.resultMessage = self.response["message"]
self.isSuccess = False
self.resultMessage = "Village name cannot be empty"
return
try:
@@ -163,9 +346,11 @@ class Village:
except mysql.connector.Error as e:
print(f"Error fetching blocks: {e}")
self.isSuccess = False
self.resultMessage = HtmlHelper.json_response(
ResponseHandler.fetch_failure("block"), 500
)
# ✅ FIXED (removed jsonify response)
self.response = ResponseHandler.fetch_failure("block")
self.resultMessage = self.response["message"]
return []
finally:

View File

@@ -1,9 +1,237 @@
// window.onload = function () {
// document.getElementById('Village_Name').focus();
// };
// $(document).ready(function () {
// // STATE → DISTRICT
// $('#state_Id').change(function () {
// var stateId = $(this).val();
// if (stateId) {
// $.ajax({
// url: '/get_districts/' + stateId,
// type: 'GET',
// success: function (data) {
// var districtDropdown = $('#district_Id');
// districtDropdown.empty();
// districtDropdown.append('<option value="" disabled selected>Select District</option>');
// data.forEach(function (district) {
// districtDropdown.append(
// '<option value="' + district.id + '">' + district.name + '</option>'
// );
// });
// districtDropdown.prop('disabled', false);
// }
// });
// }
// });
// // DISTRICT → BLOCK
// $('#district_Id').change(function () {
// var districtId = $(this).val();
// if (districtId) {
// $.ajax({
// url: '/get_blocks/' + districtId,
// type: 'GET',
// success: function (data) {
// var blockDropdown = $('#block_Id');
// blockDropdown.empty();
// blockDropdown.append('<option value="" disabled selected>Select Block</option>');
// data.forEach(function (block) {
// blockDropdown.append(
// '<option value="' + block.id + '">' + block.name + '</option>'
// );
// });
// blockDropdown.prop('disabled', false);
// }
// });
// }
// });
// // VILLAGE NAME VALIDATION
// $('#Village_Name').on('input', function () {
// var villageName = $(this).val();
// var validPattern = /^[A-Za-z ]*$/;
// if (!validPattern.test(villageName)) {
// $('#villageMessage')
// .text('Only letters and spaces are allowed!')
// .css('color', 'red');
// $('#submitVillage').prop('disabled', true);
// } else {
// $('#villageMessage').text('');
// $('#submitVillage').prop('disabled', false);
// }
// });
// // CHECK DUPLICATE VILLAGE
// $('#Village_Name, #block_Id').on('change keyup', function () {
// var blockId = $('#block_Id').val();
// var villageName = $('#Village_Name').val().trim();
// if (blockId && villageName) {
// $.ajax({
// url: '/check_village',
// type: 'POST',
// data: {
// block_Id: blockId,
// Village_Name: villageName
// },
// success: function (response) {
// if (response.status === 'exists') {
// $('#villageMessage')
// .text(response.message)
// .css('color', 'red');
// $('#submitVillage').prop('disabled', true);
// } else {
// $('#villageMessage')
// .text(response.message)
// .css('color', 'green');
// $('#submitVillage').prop('disabled', false);
// }
// },
// error: function () {
// $('#villageMessage')
// .text('Error checking village name')
// .css('color', 'red');
// $('#submitVillage').prop('disabled', true);
// }
// });
// }
// });
// // ADD VILLAGE
// $('#villageForm').submit(function (event) {
// event.preventDefault();
// $.ajax({
// url: '/add_village',
// type: 'POST',
// data: $(this).serialize(),
// success: function (response) {
// if (response.status === 'success') {
// alert('Village added successfully!');
// location.reload();
// } else {
// alert('Error adding village. Please try again.');
// }
// },
// error: function () {
// alert('An error occurred. Please try again.');
// }
// });
// });
// });
window.onload = function () {
document.getElementById('Village_Name').focus();
};
$(document).ready(function () {
// 🔥 RESTORE VIEW MODE AFTER RELOAD
var viewMode = localStorage.getItem("viewMode");
if (viewMode === "table") {
$('#addForm').hide();
$('#addTable').show();
} else {
$('#addForm').show();
$('#addTable').hide();
}
// 🔥 BUTTON TOGGLE LOGIC
$('#addButton').click(function () {
$('#addForm').show();
$('#addTable').hide();
localStorage.setItem("viewMode", "form");
});
$('#displayButton').click(function () {
$('#addForm').hide();
$('#addTable').show();
localStorage.setItem("viewMode", "table");
});
// STATE → DISTRICT
$('#state_Id').change(function () {
@@ -179,7 +407,7 @@ $(document).ready(function () {
} else {
alert('Error adding village. Please try again.');
alert(response.message || 'Error adding village. Please try again.');
}
@@ -195,4 +423,39 @@ $(document).ready(function () {
});
});
});
// 🔥 DELETE FUNCTION (UPDATED)
function deleteVillage(villageId) {
if (!confirm("Are you sure you want to delete this village?")) {
return;
}
// ✅ save that user is on table
localStorage.setItem("viewMode", "table");
$.ajax({
url: '/delete_village/' + villageId,
type: 'GET',
success: function () {
setTimeout(function () {
alert("Village deleted successfully!");
// reload but stay on table
location.reload();
}, 1000);
},
error: function () {
alert("Error deleting village. Please try again.");
}
});
}

View File

@@ -28,7 +28,7 @@
<option value="{{ state[0] }}">{{ state[1] }}</option>
{% endfor %}
</select>
<label for="district_Id">District:</label>
<select id="district_Id" name="district_Id" required disabled>
<option value="" disabled selected>Select District</option>
@@ -84,11 +84,11 @@
</a>
</td>
<td>
<a href="{{ url_for('village.delete_village', village_id=village[0]) }}"
onclick="return confirm('Are you sure you want to delete this village?');">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
class="icon">
</a>
<a href="#"
onclick="deleteVillage({{ village[0] }}); return false;">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}"
alt="Delete" class="icon">
</a>
</td>
</tr>
{% endfor %}