Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # models.py
- class SalaryFork(models.Model):
- """
- Модель вилки пользователя
- """
- user = models.ForeignKey(User, verbose_name='Пользователь', related_name='salarys', on_delete=models.CASCADE)
- pay_rate = models.IntegerField('Ставка')
- class Meta:
- verbose_name = 'Ставка зарплаты'
- verbose_name_plural = 'Ставки зарплат'
- def __str__(self):
- return f'Ставка для пользователя {self.user} в размере {self.pay_rate}'
- @staticmethod
- def get_fork_by_user(user):
- return SalaryFork.objects.filter(user=user).first().pay_rate
- class Payment(models.Model):
- """
- Модель выплаты
- """
- tasks = models.ManyToManyField(Task, verbose_name='Задача')
- commission = models.IntegerField(verbose_name='Комиссия')
- salary = models.IntegerField(verbose_name='Итого к выплате', default=0)
- recipient = models.ForeignKey(User, verbose_name='Получатель', on_delete=models.SET_NULL, null=True, blank=True)
- payment_date = models.DateField(verbose_name='Дата оплаты', null=True, blank=True)
- payed = models.BooleanField('Оплачено', default=False)
- class Meta:
- verbose_name = 'Выплата'
- verbose_name_plural = 'Выплаты'
- def __str__(self):
- return f'Выплата пользователю {self.recipient} на сумму {self.salary}'
- # forms.py
- class PaymentForm(StyledModelForm):
- recipient = forms.ModelChoiceField(
- queryset=User.objects.all(),
- label='Пользователь',
- widget=ModelSelect2Widget(
- model=User,
- search_fields=['username__icontains']
- )
- )
- tasks = forms.ModelMultipleChoiceField(
- queryset=Task.objects.filter(payed=False),
- label='Задачи',
- widget=ModelSelect2MultipleWidget(
- model=Task,
- search_fields=['title__icontains'],
- dependent_field={'recipient': 'task_executor'},
- max_results=500
- )
- )
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.fields['tasks'].queryset = Task.objects.filter(status=TaskStatuses.resolved)
- self.fields['salary'].disabled = True
- class Meta:
- model = Payment
- fields = ('recipient', 'tasks', 'commission', 'payment_date', 'salary',)
- def clean(self):
- super().clean()
- now = tz_now().date()
- payment_date = self.cleaned_data.get('payment_date')
- if payment_date and payment_date > now:
- self.add_error('payment_date', 'Не может быть больше сегодняшней даты')
- commission = self.cleaned_data.get('commission')
- if commission and commission < 0:
- self.add_error('commission', 'Не может быть отрицательным числом')
- return self.cleaned_data
- def save(self, commit=True):
- payment = super().save(commit=False)
- payment.salary = self.cleaned_data.get('tasks').all() \
- .aggregate(Sum('wasted_time')) \
- .get('wasted_time__sum', 0) * SalaryFork.get_fork_by_user(user=payment.recipient)
- payment.save()
- return payment
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement