Files
ihrm/employee/forms.py
Nikhil Ravi Cybrosys e1794e7422 [UPDT]translations in the views (#4)
[UPDT]Translations in the views
[FIX]major bug fixes
2023-05-18 15:05:28 +05:30

208 lines
7.8 KiB
Python

from django import forms
from django.contrib.auth.models import User
from employee.models import Employee, EmployeeWorkInformation, EmployeeBankDetails
from django.forms import DateInput,TextInput
from django.db import models
from django.core.exceptions import ValidationError
import json
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
import re
import datetime
class ModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field_name, field in self.fields.items():
widget = field.widget
if isinstance(widget, (forms.NumberInput, forms.EmailInput, forms.TextInput, forms.FileInput)):
label = _(field.label.title())
field.widget.attrs.update(
{'class': 'oh-input w-100', 'placeholder': label})
elif isinstance(widget,(forms.Select,)):
label = ''
if field.label is not None:
label = _(field.label)
field.empty_label = _('---Choose {label}---').format(label=label)
field.widget.attrs.update({'class': 'oh-select oh-select-2 select2-hidden-accessible'})
elif isinstance(widget,(forms.Textarea)):
field.widget.attrs.update({'class': 'oh-input w-100','placeholder':field.label,'rows':2,'cols':40})
elif isinstance(widget, (forms.CheckboxInput,forms.CheckboxSelectMultiple,)):
field.widget.attrs.update({'class': 'oh-switch__checkbox'})
class UserForm(ModelForm):
class Meta:
fields = ('groups',)
model = User
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, **kwargs)
class UserPermissionForm(ModelForm):
class Meta:
fields = ('groups','user_permissions')
model = User
def __init__(self, *args, **kwargs):
super(UserPermissionForm, self).__init__(*args, **kwargs)
class EmployeeForm(ModelForm):
class Meta:
model = Employee
fields = '__all__'
exclude = ('employee_user_id',)
widgets = {
'dob': TextInput(attrs={'type': 'date','id':'dob'}),
}
def __init__(self, *args, **kwargs):
super(EmployeeForm, self).__init__(*args, **kwargs)
if instance := kwargs.get('instance'):
'''
django forms not showing value inside the date, time html element.
so here overriding default forms instance method to set initial value
'''
initial = {}
if instance.dob is not None:
initial['dob'] = instance.dob.strftime('%H:%M')
kwargs['initial']=initial
else:
self.initial = {"badge_id":self.get_next_badge_id()}
def get_next_badge_id(self):
try:
# total_employee_count = Employee.objects.count()
badge_ids = Employee.objects.filter(~Q(badge_id=None)).order_by('-badge_id')
greatest_id = badge_ids.first().badge_id
match = re.findall(r'\d+', greatest_id[::-1])
total_employee_count = 0
if match:
total_employee_count = int(match[0][::-1])
except:
total_employee_count = 0
try:
string = Employee.objects.filter(~Q(badge_id=None)).order_by('-badge_id').last().badge_id
except:
string = "DUDE"
# Find the index of the last integer group in the string
integer_group_index = None
for i in range(len(string) - 1, -1, -1):
if string[i].isdigit():
integer_group_index = i
elif integer_group_index is not None:
break
if integer_group_index is None:
# There is no integer group in the string, so just append #01
return string + '#01'
else:
# Extract the integer group from the string
integer_group = string[integer_group_index:]
prefix = string[:integer_group_index]
# Set the integer group to the total number of employees plus one
new_integer_group = str(total_employee_count + 1).zfill(len(integer_group))
# Return the new string
return prefix + new_integer_group
def clean_badge_id(self):
badge_id = self.cleaned_data['badge_id']
if badge_id:
qs = Employee.objects.filter(badge_id=badge_id).exclude(pk=self.instance.pk if self.instance else None)
if qs.exists():
raise forms.ValidationError(_("Badge ID must be unique."))
if not re.search(r'\d', badge_id):
raise forms.ValidationError(_("Badge ID must contain at least one digit."))
return badge_id
class EmployeeWorkInformationForm(ModelForm):
employees = Employee.objects.filter(employee_work_info=None)
employee_id = forms.ModelChoiceField(queryset=employees)
class Meta:
model = EmployeeWorkInformation
fields = '__all__'
widgets = {
'date_joining': DateInput(attrs={'type': 'date'}),
'contract_end_date': DateInput(attrs={'type': 'date'}),
}
def __init__(self, *args,disable=False, **kwargs):
super(EmployeeWorkInformationForm, self).__init__(*args, **kwargs)
for field in self.fields:
self.fields[field].widget.attrs['placeholder'] = self.fields[field].label
if disable:
self.fields[field].disabled = True
def clean(self):
cleaned_data = super().clean()
if 'employee_id' in self.errors:
del self.errors['employee_id']
class EmployeeWorkInformationUpdateForm(ModelForm):
class Meta:
model = EmployeeWorkInformation
fields = '__all__'
exclude = ('employee_id',)
widgets = {
'date_joining': DateInput(attrs={'type': 'date'}),
'contract_end_date': DateInput(attrs={'type': 'date'}),
}
def __init__(self, *args, **kwargs):
super(EmployeeWorkInformationUpdateForm, self).__init__(*args, **kwargs)
class EmployeeBankDetailsForm(ModelForm):
address = forms.CharField(widget=forms.Textarea(attrs={'rows': 2, 'cols': 40}))
class Meta:
model = EmployeeBankDetails
fields = '__all__'
exclude = ['employee_id',]
def __init__(self, *args, **kwargs):
super(EmployeeBankDetailsForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs['class'] = 'oh-input w-100'
# for field in self.fields:
# self.fields[field].widget.attrs['placeholder'] = self.fields[field].label
# self.fields['reporting_manager_id'].widget.attrs.update({'class': 'oh-select oh-select-2 select2-hidden-accessible'})
class EmployeeBankDetailsUpdateForm(ModelForm):
class Meta:
model = EmployeeBankDetails
fields = '__all__'
exclude = ('employee_id',)
def __init__(self, *args, **kwargs):
super(EmployeeBankDetailsUpdateForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs['class'] = 'oh-input w-100'
for field in self.fields:
self.fields[field].widget.attrs['placeholder'] = self.fields[field].label
class EmployeeProfileBankDetailsForm(ModelForm):
class Meta:
model = EmployeeBankDetails
fields = '__all__'
exclude = ('employee_id',)
def __init__(self, *args, **kwargs):
super(EmployeeProfileBankDetailsForm, self).__init__(*args, **kwargs)
for visible in self.visible_fields():
visible.field.widget.attrs['class'] = 'oh-input w-100'