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 %} - +