diff --git a/.gitignore b/.gitignore
index 76cd0d4..f22dbe7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@ venv/
__pycache__/
static/downloads/
-static/uploads/
\ No newline at end of file
+static/uploads/
+
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..ed00ae7 100644
--- a/model/ItemCRUD.py
+++ b/model/ItemCRUD.py
@@ -1,3 +1,6 @@
+
+
+
from flask_login import current_user
from model.Utilities import RegEx, ResponseHandler, HtmlHelper, ItemCRUDType
from model.Log import LogHelper
@@ -35,6 +38,7 @@ class ItemCRUD:
def __init__(self, itemType):
self.isSuccess = False
self.resultMessage = ""
+ self.response = {} # ✅ ADDED
self.itemCRUDType = itemType
self.itemCRUDMapping = itemCRUDMapping(itemType)
@@ -56,16 +60,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 +81,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 +93,8 @@ class ItemCRUD:
)
try:
- # ======================================================
- # SUBCONTRACTOR (MULTI-FIELD)
- # ======================================================
+ # SUBCONTRACTOR
if data:
-
- # Duplicate check
cursor.callproc(storedprocfetch, (data['Contractor_Name'],))
existing_item = None
@@ -106,12 +103,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 +122,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 +144,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 +156,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 +183,6 @@ class ItemCRUD:
)
try:
- # ======================================================
- # SUBCONTRACTOR (MULTI-FIELD)
- # ======================================================
if data:
cursor.callproc(storedprocupdate, (
childid,
@@ -218,17 +200,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 +218,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 +255,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 +290,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..d6f0bb2 100644
--- a/model/Village.py
+++ b/model/Village.py
@@ -1,9 +1,11 @@
+
+
from model.Utilities import ResponseHandler, HtmlHelper, ItemCRUDType
import config
import mysql.connector
from model.ItemCRUD import ItemCRUD
-
+
class Village:
isSuccess = False
resultMessage = ""
@@ -11,12 +13,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 +37,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 +75,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 +113,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 +175,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..94917f7 100644
--- a/static/js/village.js
+++ b/static/js/village.js
@@ -1,9 +1,40 @@
+
+
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 +210,7 @@ $(document).ready(function () {
} else {
- alert('Error adding village. Please try again.');
+ alert(response.message || 'Error adding village. Please try again.');
}
@@ -195,4 +226,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 %}
-
+