2025-02-28 18:53:01 +05:30
|
|
|
import datetime
|
|
|
|
|
import sys
|
|
|
|
|
|
2025-04-18 14:04:09 +05:30
|
|
|
import pytz
|
2025-03-06 12:10:47 +05:30
|
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
2025-04-18 14:04:09 +05:30
|
|
|
from django.conf import settings
|
2025-02-28 18:53:01 +05:30
|
|
|
|
2025-04-18 14:04:09 +05:30
|
|
|
from base.backends import logger
|
2025-02-28 18:53:01 +05:30
|
|
|
|
|
|
|
|
|
2025-04-18 14:04:09 +05:30
|
|
|
def create_work_record():
|
2025-02-28 18:53:01 +05:30
|
|
|
from attendance.models import WorkRecords
|
|
|
|
|
from employee.models import Employee
|
|
|
|
|
|
2025-04-18 14:04:09 +05:30
|
|
|
date = datetime.datetime.today()
|
|
|
|
|
work_records = WorkRecords.objects.filter(date=date).values_list(
|
|
|
|
|
"employee_id", flat=True
|
|
|
|
|
)
|
|
|
|
|
employees = Employee.objects.exclude(id__in=work_records)
|
|
|
|
|
records_to_create = []
|
|
|
|
|
|
|
|
|
|
for employee in employees:
|
|
|
|
|
try:
|
|
|
|
|
shift_schedule = employee.get_shift_schedule()
|
|
|
|
|
if shift_schedule is None:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
shift = employee.get_shift()
|
|
|
|
|
record = WorkRecords(
|
|
|
|
|
employee_id=employee,
|
|
|
|
|
date=date,
|
|
|
|
|
work_record_type="DFT",
|
|
|
|
|
shift_id=shift,
|
|
|
|
|
message="",
|
|
|
|
|
)
|
|
|
|
|
records_to_create.append(record)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"Error preparing work record for {employee}: {e}")
|
|
|
|
|
|
|
|
|
|
if records_to_create:
|
|
|
|
|
try:
|
|
|
|
|
WorkRecords.objects.bulk_create(records_to_create)
|
|
|
|
|
print(f"Created {len(records_to_create)} work records for {date}.")
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logger.error(f"Failed to bulk create work records: {e}")
|
2025-02-28 18:53:01 +05:30
|
|
|
else:
|
2025-04-18 14:04:09 +05:30
|
|
|
print(f"No new work records to create for {date}.")
|
2025-02-28 18:53:01 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
if not any(
|
|
|
|
|
cmd in sys.argv
|
|
|
|
|
for cmd in ["makemigrations", "migrate", "compilemessages", "flush", "shell"]
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
Initializes and starts background tasks using APScheduler when the server is running.
|
|
|
|
|
"""
|
2025-04-18 14:04:09 +05:30
|
|
|
scheduler = BackgroundScheduler(timezone=pytz.timezone(settings.TIME_ZONE))
|
|
|
|
|
|
2025-03-07 10:02:52 +05:30
|
|
|
scheduler.add_job(
|
2025-04-18 14:04:09 +05:30
|
|
|
create_work_record, "interval", minutes=30, misfire_grace_time=3600 * 3
|
2025-03-07 10:02:52 +05:30
|
|
|
)
|
|
|
|
|
scheduler.add_job(
|
2025-04-18 14:04:09 +05:30
|
|
|
create_work_record,
|
|
|
|
|
"cron",
|
|
|
|
|
hour=0,
|
|
|
|
|
minute=30,
|
|
|
|
|
misfire_grace_time=3600 * 9,
|
|
|
|
|
id="create_daily_work_record",
|
|
|
|
|
replace_existing=True,
|
2025-03-07 10:02:52 +05:30
|
|
|
)
|
2025-02-28 18:53:01 +05:30
|
|
|
|
|
|
|
|
scheduler.start()
|