diff --git a/.env b/.env
index 5bfeba1..31d678d 100644
--- a/.env
+++ b/.env
@@ -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
diff --git a/activity.log b/activity.log
index e69de29..ae143f5 100644
--- a/activity.log
+++ b/activity.log
@@ -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'
diff --git a/controllers/village_controller.py b/controllers/village_controller.py
index 64f8a65..8612354 100644
--- a/controllers/village_controller.py
+++ b/controllers/village_controller.py
@@ -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
diff --git a/model/ItemCRUD.py b/model/ItemCRUD.py
index 19f8dfb..149cfea 100644
--- a/model/ItemCRUD.py
+++ b/model/ItemCRUD.py
@@ -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):
diff --git a/model/Village.py b/model/Village.py
index f716073..3e4b618 100644
--- a/model/Village.py
+++ b/model/Village.py
@@ -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:
diff --git a/static/js/village.js b/static/js/village.js
index e07e455..760ed87 100644
--- a/static/js/village.js
+++ b/static/js/village.js
@@ -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('');
+
+// data.forEach(function (district) {
+
+// districtDropdown.append(
+// ''
+// );
+
+// });
+
+// 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('');
+
+// data.forEach(function (block) {
+
+// blockDropdown.append(
+// ''
+// );
+
+// });
+
+// 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 () {
});
-});
\ No newline at end of file
+});
+
+
+// 🔥 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.");
+ }
+
+ });
+}
\ No newline at end of file
diff --git a/templates/add_village.html b/templates/add_village.html
index dd5e4ce..8adf450 100644
--- a/templates/add_village.html
+++ b/templates/add_village.html
@@ -28,7 +28,7 @@
{% endfor %}
-
+