from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper from AppCode.Log import LogData, LogHelper import os import config import re import mysql.connector from mysql.connector import Error class Village: isSuccess = False resultMessage = "" def __init__(self): self.isSuccess = False self.resultMessage = "" def AddVillage(self, request): 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() block_id = request.form.get('block_Id') village_name = request.form.get('Village_Name', '').strip() LogHelper.log_action("Add Village", f"User {current_user.id} adding village '{village_name}' to block '{block_id}'") if not block_id: self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("block"), 400) # Assuming this is a valid response return if not re.match(RegEx.patternAlphabetOnly, village_name): self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) return try: # Check if the village already exists in the block cursor.callproc("GetVillageByNameAndBlock", (village_name, block_id,)) for rs in cursor.stored_results(): existing_village = rs.fetchone() if existing_village: self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("village"), 409) return # Insert new village cursor.callproc('SaveVillage', (village_name, block_id)) connection.commit() self.isSuccess = True self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_success("village"), 200) return except mysql.connector.Error as e: print(f"Database Error: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("village"), 500) return finally: cursor.close() connection.close() def GetAllVillages(self, request): villages = [] connection = config.get_db_connection() self.isSuccess = False self.resultMessage = "" if not connection: return [] cursor = connection.cursor() try: cursor.callproc("GetAllVillages") for result in cursor.stored_results(): villages = result.fetchall() self.isSuccess = True except mysql.connector.Error as e: print(f"Error fetching villages: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("village"), 500) return [] finally: cursor.close() connection.close() return villages def CheckVillage(self, request): self.isSuccess = False self.resultMessage = "" connection = config.get_db_connection() if not connection: return HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) cursor = connection.cursor() block_id = request.form.get('block_Id') village_name = request.form.get('Village_Name', '').strip() LogHelper.log_action("Check Village", f"User {current_user.id} checked village '{village_name}' in block '{block_id}'") if not re.match(RegEx.patternAlphabetOnly, village_name): self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) return self.resultMessage if not block_id or not village_name: self.isSuccess = False self.resultMessage = HtmlHelper.json_response( {'status': 'error', 'message': 'Block and Village Name are required!'}, 400) return self.resultMessage try: cursor.callproc("GetVillageByNameAndBlocks", (village_name, block_id)) for rs in cursor.stored_results(): existing_village = rs.fetchone() if existing_village: self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("village"), 409) else: self.isSuccess = True self.resultMessage = HtmlHelper.json_response(ResponseHandler.is_available("village"), 200) return self.resultMessage except mysql.connector.Error as e: print(f"Error checking village: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("village"), 500) return self.resultMessage finally: cursor.close() connection.close() def DeleteVillage(self, request, village_id): self.isSuccess = False self.resultMessage = "" connection = config.get_db_connection() cursor = connection.cursor() LogHelper.log_action("Delete Village", f"User {current_user.id} deleted village '{village_id}'") try: cursor.callproc("DeleteVillage", (village_id,)) connection.commit() self.resultMessage = ResponseHandler.delete_success("village") # Simple message, route will handle redirect self.isSuccess = True except mysql.connector.Error as e: print(f"Error deleting village: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.delete_failure("village"), 500) finally: cursor.close() connection.close() return self.resultMessage def EditVillage(self, request, village_id): self.isSuccess = False self.resultMessage = "" connection = config.get_db_connection() cursor = connection.cursor() village_name = request.form['Village_Name'].strip() block_id = request.form['block_Id'] LogHelper.log_action("Edit Village", f"User {current_user.id} edited village '{village_id}' to name '{village_name}'") if not re.match(RegEx.patternAlphabetOnly, village_name): self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) return self.resultMessage try: # Using the stored procedure pattern from your State class cursor.callproc("UpdateVillage", (village_id, block_id, village_name,)) connection.commit() self.isSuccess = True self.resultMessage = ResponseHandler.update_success("village") except mysql.connector.Error as e: print(f"Error updating data: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.update_failure("village"), 500) finally: cursor.close() connection.close() return self.resultMessage def GetVillageByID(self, request, id): village_data = None self.isSuccess = False self.resultMessage = "" connection = config.get_db_connection() if not connection: return None cursor = connection.cursor() try: cursor.callproc("GetVillageDetailsById", (id,)) for rs in cursor.stored_results(): village_data = rs.fetchone() if village_data: self.isSuccess = True self.resultMessage = "Success in Fetching" else: self.isSuccess = False self.resultMessage = "Village Not Found" except mysql.connector.Error as e: print(f"Error fetching village: {e}") self.isSuccess = False self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("village"), 500) finally: cursor.close() connection.close() return village_data def GetAllBlocks(self, request): blocks = [] self.isSuccess = False self.resultMessage = "" connection = config.get_db_connection() if not connection: return [] cursor = connection.cursor() try: cursor.callproc('GetAllBlocks') for result in cursor.stored_results(): blocks = result.fetchall() self.isSuccess = True 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) finally: cursor.close() connection.close() return blocks