From 630ee1744f6de528a3714e41fb8d4212b76b9394 Mon Sep 17 00:00:00 2001 From: Swapnil9693 Date: Tue, 24 Mar 2026 11:28:14 +0530 Subject: [PATCH 1/5] Backup Before Changes village Task --- .env | 2 +- activity.log | 13 + controllers/village_controller.py | 2 +- model/ItemCRUD.py | 450 ++++++++++++++++++++++++++---- model/Village.py | 201 ++++++++++++- static/js/village.js | 269 +++++++++++++++++- templates/add_village.html | 12 +- 7 files changed, 873 insertions(+), 76 deletions(-) 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 %} - +