-
Notifications
You must be signed in to change notification settings - Fork 244
/
Copy pathsignals.py
156 lines (131 loc) · 5.34 KB
/
signals.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# leave/signals.py
import threading
from django.apps import apps
from django.db.models.signals import post_migrate, pre_save, post_save, pre_delete
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from horilla.methods import get_horilla_model_class
from leave.models import LeaveRequest
if apps.is_installed("attendance"):
@receiver(pre_save, sender=LeaveRequest)
def leaverequest_pre_save(sender, instance, **_kwargs):
"""
Overriding LeaveRequest model save method
"""
WorkRecords = get_horilla_model_class(
app_label="attendance", model="workrecords"
)
if (
instance.start_date == instance.end_date
and instance.end_date_breakdown != instance.start_date_breakdown
):
instance.end_date_breakdown = instance.start_date_breakdown
super(LeaveRequest, instance).save()
period_dates = instance.requested_dates()
if instance.status == "approved":
for date in period_dates:
try:
work_entry = (
WorkRecords.objects.filter(
date=date,
employee_id=instance.employee_id,
).first()
if WorkRecords.objects.filter(
date=date,
employee_id=instance.employee_id,
).exists()
else WorkRecords()
)
work_entry.employee_id = instance.employee_id
work_entry.is_leave_record = True
work_entry.leave_request_id = instance
work_entry.day_percentage = (
0.50
if instance.start_date == date
and instance.start_date_breakdown == "first_half"
or instance.end_date == date
and instance.end_date_breakdown == "second_half"
else 0.00
)
status = (
"CONF"
if instance.start_date == date
and instance.start_date_breakdown == "first_half"
or instance.end_date == date
and instance.end_date_breakdown == "second_half"
else "ABS"
)
work_entry.work_record_type = status
work_entry.date = date
work_entry.message = (
"Leave"
if status == "ABS"
else _("Half day Attendance need to validate")
)
work_entry.save()
except Exception as e:
print(e)
else:
for date in period_dates:
WorkRecords.objects.filter(
is_leave_record=True,
date=date,
employee_id=instance.employee_id,
).delete()
@receiver(pre_delete, sender=LeaveRequest)
def leaverequest_pre_delete(sender, instance, **kwargs):
from attendance.models import WorkRecords
work_records = WorkRecords.objects.filter(leave_request_id=instance).delete()
@receiver(post_save, sender=LeaveRequest)
def update_available(sender, instance, **kwargs):
"""
post save method to update the available leaves
"""
_sender = sender
def update_leaves():
try:
if instance.leave_type_id:
available_leaves = instance.employee_id.available_leave.filter(
leave_type_id=instance.leave_type_id
)
for assigned in available_leaves:
assigned.save()
except Exception as e:
pass
thread = threading.Thread(target=update_leaves)
thread.start()
@receiver(post_migrate)
def add_missing_leave_to_workrecords(sender, **kwargs):
if sender.label not in ["attendance", "leave"]:
return
if not apps.is_installed("attendance"):
return
try:
from attendance.models import WorkRecords
from leave.models import LeaveRequest
work_records = WorkRecords.objects.filter(
is_leave_record=True, leave_request_id__isnull=True
)
if not work_records.exists():
return
leave_requests = LeaveRequest.objects.all()
date_leave_map = {}
for leave in leave_requests:
for date in leave.requested_dates():
key = (leave.employee_id, date)
date_leave_map[key] = leave
records_to_update = []
for record in work_records:
leave_request = date_leave_map.get((record.employee_id, record.date))
if leave_request:
record.leave_request_id = leave_request
records_to_update.append(record)
if records_to_update:
WorkRecords.objects.bulk_update(
records_to_update, ["leave_request_id"], batch_size=500
)
print(
f"Successfully updated {len(records_to_update)} work records with leave information"
)
except Exception as e:
print(f"Error in leave/work records sync: {e}")