Files
ihrm/horilla_documents/models.py

133 lines
4.3 KiB
Python
Raw Normal View History

from datetime import date
import os
from django.db import models
from django.forms import ValidationError
from django.utils.translation import gettext as _
from asset.models import Asset, AssetCategory
from base.horilla_company_manager import HorillaCompanyManager
from employee.models import Employee
from django.db.models.signals import post_save, m2m_changed
from django.dispatch import receiver
STATUS = [
2024-01-31 12:14:51 +05:30
("requested", "Requested"),
("approved", "Approved"),
("rejected", "Rejected"),
]
FORMATS = [
2024-01-31 12:14:51 +05:30
("any", "Any"),
("pdf", "PDF"),
("txt", "TXT"),
("docx", "DOCX"),
("xlsx", "XLSX"),
("jpg", "JPG"),
("png", "PNG"),
("jpeg", "JPEG"),
]
2024-01-31 12:14:51 +05:30
def document_create(instance):
employees = instance.employee_id.all()
for employee in employees:
Document.objects.get_or_create(
2024-01-31 12:14:51 +05:30
title=f"Upload {instance.title}",
employee_id=employee,
2024-01-31 12:14:51 +05:30
document_request_id=instance,
)
2024-01-31 12:14:51 +05:30
class DocumentRequest(models.Model):
title = models.CharField(max_length=100)
employee_id = models.ManyToManyField(Employee)
2024-01-31 12:14:51 +05:30
format = models.CharField(choices=FORMATS, max_length=10)
max_size = models.IntegerField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
objects = HorillaCompanyManager()
is_active = models.BooleanField(default=True)
2024-01-31 12:14:51 +05:30
def __str__(self):
return self.title
2024-01-31 12:14:51 +05:30
@receiver(post_save, sender=DocumentRequest)
def doc_request_post_save(sender, instance, **kwargs):
document_create(instance)
2024-01-31 12:14:51 +05:30
@receiver(m2m_changed, sender=DocumentRequest.employee_id.through)
def your_model_m2m_changed(sender, instance, action, **kwargs):
2024-01-31 12:14:51 +05:30
if action == "post_add":
document_create(instance)
2024-01-31 12:14:51 +05:30
elif action == "post_remove":
document_create(instance)
class Document(models.Model):
title = models.CharField(max_length=25)
2024-01-31 12:14:51 +05:30
employee_id = models.ForeignKey(Employee, on_delete=models.PROTECT)
document_request_id = models.ForeignKey(
DocumentRequest, on_delete=models.PROTECT, null=True
)
document = models.FileField(upload_to="employee/documents", null=True)
status = models.CharField(choices=STATUS, max_length=10, default="requested")
reject_reason = models.TextField(blank=True, null=True)
is_active = models.BooleanField(default=True)
2024-02-05 11:46:20 +05:30
expiry_date = models.DateField(null=True,blank=True)
notify_before = models.IntegerField(default=1,null=True)
is_digital_asset = models.BooleanField(default=False)
objects = HorillaCompanyManager(
related_company_field="employee_id__employee_work_info__company_id"
)
def __str__(self) -> str:
return f"{self.title}"
def clean(self, *args, **kwargs):
super().clean(*args, **kwargs)
file = self.document
if file and self.document_request_id:
format = self.document_request_id.format
max_size = self.document_request_id.max_size
if max_size:
if file.size > max_size * 1024 * 1024:
raise ValidationError("File size exceeds the limit")
2024-01-31 12:14:51 +05:30
ext = file.name.split(".")[1].lower()
if format == "any":
pass
elif ext != format:
raise ValidationError(f"Please upload {format} file only.")
2024-01-31 12:14:51 +05:30
def save(self, *args, **kwargs):
if len(self.title) < 3:
raise ValidationError(_("Title must be at least 3 characters"))
2024-02-05 11:46:20 +05:30
super().save(*args, **kwargs)
if self.is_digital_asset:
2024-01-31 12:14:51 +05:30
asset_category = AssetCategory.objects.get_or_create(
asset_category_name="Digital Asset"
)
Asset.objects.create(
2024-01-31 12:14:51 +05:30
asset_name=self.title,
asset_purchase_date=date.today(),
asset_category_id=asset_category[0],
asset_status="Not-Available",
asset_purchase_cost=0,
2024-02-05 11:46:20 +05:30
expiry_date = self.expiry_date,
notify_before = self.notify_before,
asset_tracking_id = f"DIG_ID0{self.pk}",
)
2024-01-31 12:14:51 +05:30
2024-01-31 12:14:51 +05:30
def upload_documents_count(self):
total_requests = Document.objects.filter(
document_request_id=self.document_request_id
)
without_documents = total_requests.filter(document ='').count()
count = total_requests.count() - without_documents
return count