[IMP] Protect method for model fields
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 ">
|
||||
|
||||
@@ -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="">
|
||||
|
||||
@@ -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",
|
||||
),
|
||||
|
||||
@@ -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", "/"))
|
||||
|
||||
@@ -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}"))
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
18
pms/views.py
18
pms/views.py
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user