Merge pull request 'Village module delete issue resolved and also message shown in alert' (#8) from swapnil-dev into main

Reviewed-on: #8
This commit was merged in pull request #8.
This commit is contained in:
2026-03-24 06:25:19 +00:00
6 changed files with 135 additions and 76 deletions

3
.gitignore vendored
View File

@@ -3,4 +3,5 @@ venv/
__pycache__/
static/downloads/
static/uploads/
static/uploads/

View File

@@ -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

View File

@@ -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):

View File

@@ -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:

View File

@@ -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 () {
});
});
});
// 🔥 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.");
}
});
}

View File

@@ -28,7 +28,7 @@
<option value="{{ state[0] }}">{{ state[1] }}</option>
{% endfor %}
</select>
<label for="district_Id">District:</label>
<select id="district_Id" name="district_Id" required disabled>
<option value="" disabled selected>Select District</option>
@@ -84,11 +84,11 @@
</a>
</td>
<td>
<a href="{{ url_for('village.delete_village', village_id=village[0]) }}"
onclick="return confirm('Are you sure you want to delete this village?');">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}" alt="Delete"
class="icon">
</a>
<a href="#"
onclick="deleteVillage({{ village[0] }}); return false;">
<img src="{{ url_for('static', filename='images/icons/bin_red_icon.png') }}"
alt="Delete" class="icon">
</a>
</td>
</tr>
{% endfor %}