[IMP] Protect method for model fields

This commit is contained in:
Horilla
2023-09-19 15:56:53 +05:30
parent 4c9c121132
commit bf5a3ee497
10 changed files with 44 additions and 34 deletions

View File

@@ -51,12 +51,12 @@ class Asset(models.Model):
asset_tracking_id = models.CharField(max_length=30, null=False, unique=True)
asset_purchase_date = models.DateField()
asset_purchase_cost = models.DecimalField(max_digits=10, decimal_places=2)
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.CASCADE)
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.PROTECT)
asset_status = models.CharField(
choices=ASSET_STATUS, default="Available", max_length=40
)
asset_lot_number_id = models.ForeignKey(
AssetLot, on_delete=models.CASCADE, null=True, blank=True
AssetLot, on_delete=models.PROTECT, null=True, blank=True
)
objects = models.Manager()
@@ -91,14 +91,14 @@ class AssetAssignment(models.Model):
("Healthy", _("Healthy")),
]
asset_id = models.ForeignKey(
Asset, on_delete=models.CASCADE,
Asset, on_delete=models.PROTECT,
)
assigned_to_employee_id = models.ForeignKey(
Employee, on_delete=models.CASCADE, related_name="allocated_employeee"
Employee, on_delete=models.PROTECT, related_name="allocated_employeee"
)
assigned_date = models.DateField(auto_now_add=True)
assigned_by_employee_id = models.ForeignKey(
Employee, on_delete=models.CASCADE, related_name="assigned_by"
Employee, on_delete=models.PROTECT, related_name="assigned_by"
)
return_date = models.DateField(null=True, blank=True)
return_condition = models.TextField(null=True, blank=True)
@@ -120,12 +120,12 @@ class AssetRequest(models.Model):
]
requested_employee_id = models.ForeignKey(
Employee,
on_delete=models.CASCADE,
on_delete=models.PROTECT,
related_name="requested_employee",
null=False,
blank=False,
)
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.CASCADE)
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.PROTECT)
asset_request_date = models.DateField(auto_now_add=True)
description = models.TextField(null=True, blank=True)
asset_request_status = models.CharField(

View File

@@ -3,8 +3,8 @@
<table class="oh-table ">
<thead>
<tr>
<th>{% trans "Batch Number" %}</th>
<th>{% trans "Description" %}</th>
<th style="font-size:16px; font-weight:bold;">{% trans "Description" %}</th>
<th style="font-size:16px; font-weight:bold;">{% trans "Batch Number" %}</th>
<th></th>
</tr>
</thead>

View File

@@ -1,6 +1,6 @@
{% load i18n %}
<h5 >{% trans "Asset Approve" %}</h5>
<form hx-post="{%url 'asset-request-approve' id=id %}" hx-target="#asset-request-allocation-modal-target">
<form hx-post="{%url 'asset-request-approve' req_id=id %}" hx-target="#asset-request-allocation-modal-target">
{% csrf_token %}
<div class=" m-3">
<!-- <div class="oh-input__group ">

View File

@@ -141,7 +141,7 @@
<div class="oh-sticky-table__td">
<div class="oh-btn-group" >
<a class="oh-btn oh-btn--success" role="button" data-toggle="oh-modal-toggle"
data-target="#asset-request-allocation-modal" hx-get="{%url 'asset-request-approve' id=asset_request.id %}" hx-target="#asset-request-allocation-modal-target" >
data-target="#asset-request-allocation-modal" hx-get="{%url 'asset-request-approve' req_id=asset_request.id %}" hx-target="#asset-request-allocation-modal-target" >
<ion-icon name="checkmark-outline"></ion-icon>
{% trans "Approve" %}
</a>
@@ -205,7 +205,7 @@
{% if perms.asset.add_assetassignment %}
{% if asset_request.asset_request_status == 'Requested' %}
<a class="oh-btn oh-btn--success " role="button" data-toggle="oh-modal-toggle"
data-target="#asset-request-allocation-modal" hx-get="{%url 'asset-request-approve' id=asset_request.id %}" hx-target="#asset-request-allocation-modal-target" title="{% trans 'Approve' %}">
data-target="#asset-request-allocation-modal" hx-get="{%url 'asset-request-approve' req_id=asset_request.id %}" hx-target="#asset-request-allocation-modal-target" title="{% trans 'Approve' %}">
<ion-icon name="checkmark-outline"></ion-icon>
</a>
<form action="{% url 'asset-request-reject' req_id=asset_request.id %}" method="post" class="">

View File

@@ -51,7 +51,7 @@ urlpatterns = [
name="asset-request-allocation-view-search-filter",
),
path(
"asset-request-approve/<int:id>/",
"asset-request-approve/<int:req_id>/",
views.asset_request_approve,
name="asset-request-approve",
),

View File

@@ -470,7 +470,6 @@ def asset_request_approve(request, req_id):
A redirect response to the asset request allocation view, or an error message if the
request with the given ID cannot be found or its asset has already been allocated.
"""
asset_request = AssetRequest.objects.filter(id=req_id).first()
asset_category = asset_request.asset_category_id
assets = asset_category.asset_set.filter(asset_status="Available")
@@ -1049,7 +1048,7 @@ def delete_asset_category(request, cat_id):
"""
try:
AssetCategory.objects.get(id=cat_id).delete()
messages.success(request, "Asset category deleted.")
messages.success(request, _("Asset category deleted."))
except:
messages.error(request, "Something went wrong!")
messages.error(request, _("Assets are located within this category."))
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))

View File

@@ -24,6 +24,7 @@ from django.contrib import messages
from django.core.paginator import Paginator
from django.shortcuts import render, redirect
from django.utils.translation import gettext_lazy as _
from django.utils.translation import gettext as __
from django.contrib.auth.models import User
from django.views.decorators.http import require_http_methods
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
@@ -698,8 +699,14 @@ def employee_delete(request, obj_id):
messages.success(request, _("Employee deleted"))
except Employee.DoesNotExist:
messages.error(request, _("Employee not found."))
except ProtectedError:
messages.error(request, _("You cannot delete this user/employee"))
except ProtectedError as e:
model_verbose_names_set = set()
for obj in e.protected_objects:
model_verbose_names_set.add(__(obj._meta.verbose_name.capitalize()))
model_names_str = ", ".join(model_verbose_names_set)
messages.error(
request, _("This employee already related in {}.".format(model_names_str))
)
return HttpResponseRedirect(request.META.get("HTTP_REFERER", f"/view={view}"))

View File

@@ -52,10 +52,10 @@ class CandidateStage(models.Model):
"""
candidate_id = models.OneToOneField(
Candidate, on_delete=models.CASCADE, related_name="onboarding_stage"
Candidate, on_delete=models.PROTECT, related_name="onboarding_stage"
)
onboarding_stage_id = models.ForeignKey(
OnboardingStage, on_delete=models.CASCADE, related_name="candidate"
OnboardingStage, on_delete=models.PROTECT, related_name="candidate"
)
onboarding_end_date = models.DateField(blank=True,null=True)
sequence = models.IntegerField(null=True,default=0)
@@ -90,10 +90,10 @@ class CandidateTask(models.Model):
("done", _("Done")),
)
candidate_id = models.ForeignKey(
Candidate, on_delete=models.CASCADE, related_name="candidate_task"
Candidate, on_delete=models.PROTECT, related_name="candidate_task"
)
status = models.CharField(max_length=50, choices=choice, blank=True, null=True)
onboarding_task_id = models.ForeignKey(OnboardingTask, on_delete=models.CASCADE)
onboarding_task_id = models.ForeignKey(OnboardingTask, on_delete=models.PROTECT)
def __str__(self):
return f"{self.candidate_id} | {self.onboarding_task_id} | {self.status}"
@@ -112,7 +112,7 @@ class OnboardingPortal(models.Model):
"""
candidate_id = models.OneToOneField(
Candidate, on_delete=models.CASCADE, related_name="onboarding_portal"
Candidate, on_delete=models.PROTECT, related_name="onboarding_portal"
)
token = models.CharField(max_length=200)
used = models.BooleanField(default=False)

View File

@@ -37,7 +37,7 @@ class EmployeeObjective(models.Model):
created_at = models.DateField(auto_now_add=True)
employee_id = models.ForeignKey(
Employee,
on_delete=models.DO_NOTHING,
on_delete=models.PROTECT,
related_name="employee_objective",
null=True,
blank=True,
@@ -185,7 +185,7 @@ class QuestionOptions(models.Model):
question_id = models.ForeignKey(
Question,
on_delete=models.CASCADE,
on_delete=models.PROTECT,
related_name="question_options",
null=True,
blank=True,
@@ -271,7 +271,7 @@ class Answer(models.Model):
blank=True,
)
feedback_id = models.ForeignKey(
Feedback, on_delete=models.CASCADE, related_name="feedback_answer"
Feedback, on_delete=models.PROTECT, related_name="feedback_answer"
)
objects = models.Manager()
@@ -282,7 +282,7 @@ class Answer(models.Model):
class KeyResultFeedback(models.Model):
feedback_id = models.ForeignKey(
Feedback,
on_delete=models.CASCADE,
on_delete=models.PROTECT,
related_name="feedback_key_result",
null=True,
blank=True,

View File

@@ -187,15 +187,19 @@ def objective_delete(request, obj_id):
"""
try:
objective = EmployeeObjective.objects.get(id=obj_id)
objective.delete()
messages.success(
request,
_("Objective %(objective)s deleted") % {"objective": objective.objective},
)
if objective.status == 'Not Started' or objective.status == 'Closed' :
objective.delete()
messages.success(
request,
_("Objective %(objective)s deleted") % {"objective": objective.objective},
)
else:
messages.warning(
request,
_("You can't delete objective %(objective)s with status %(status)s") % {"objective": objective.objective, "status": objective.status},
)
except EmployeeObjective.DoesNotExist:
messages.error(request, _("Objective not found."))
except ProtectedError:
messages.error(request, _("Related entries exists"))
return redirect(objective_list_view)