Advertisement
Guest User

Untitled

a guest
Nov 25th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.41 KB | None | 0 0
  1. # models.py
  2.  
  3. class SalaryFork(models.Model):
  4.     """
  5.    Модель вилки пользователя
  6.    """
  7.     user = models.ForeignKey(User, verbose_name='Пользователь', related_name='salarys', on_delete=models.CASCADE)
  8.     pay_rate = models.IntegerField('Ставка')
  9.  
  10.     class Meta:
  11.         verbose_name = 'Ставка зарплаты'
  12.         verbose_name_plural = 'Ставки зарплат'
  13.  
  14.     def __str__(self):
  15.         return f'Ставка для пользователя {self.user} в размере {self.pay_rate}'
  16.  
  17.     @staticmethod
  18.     def get_fork_by_user(user):
  19.         return SalaryFork.objects.filter(user=user).first().pay_rate
  20.  
  21.  
  22. class Payment(models.Model):
  23.     """
  24.    Модель выплаты
  25.    """
  26.     tasks = models.ManyToManyField(Task, verbose_name='Задача')
  27.     commission = models.IntegerField(verbose_name='Комиссия')
  28.     salary = models.IntegerField(verbose_name='Итого к выплате', default=0)
  29.     recipient = models.ForeignKey(User, verbose_name='Получатель', on_delete=models.SET_NULL, null=True, blank=True)
  30.     payment_date = models.DateField(verbose_name='Дата оплаты', null=True, blank=True)
  31.     payed = models.BooleanField('Оплачено', default=False)
  32.  
  33.     class Meta:
  34.         verbose_name = 'Выплата'
  35.         verbose_name_plural = 'Выплаты'
  36.  
  37.     def __str__(self):
  38.         return f'Выплата пользователю {self.recipient} на сумму {self.salary}'
  39.  
  40. # forms.py
  41.  
  42. class PaymentForm(StyledModelForm):
  43.  
  44.     recipient = forms.ModelChoiceField(
  45.         queryset=User.objects.all(),
  46.         label='Пользователь',
  47.         widget=ModelSelect2Widget(
  48.             model=User,
  49.             search_fields=['username__icontains']
  50.         )
  51.     )
  52.  
  53.     tasks = forms.ModelMultipleChoiceField(
  54.         queryset=Task.objects.filter(payed=False),
  55.         label='Задачи',
  56.         widget=ModelSelect2MultipleWidget(
  57.             model=Task,
  58.             search_fields=['title__icontains'],
  59.             dependent_field={'recipient': 'task_executor'},
  60.             max_results=500
  61.         )
  62.     )
  63.  
  64.  
  65.     def __init__(self, *args, **kwargs):
  66.         super().__init__(*args, **kwargs)
  67.         self.fields['tasks'].queryset = Task.objects.filter(status=TaskStatuses.resolved)
  68.         self.fields['salary'].disabled = True
  69.  
  70.     class Meta:
  71.         model = Payment
  72.         fields = ('recipient', 'tasks', 'commission', 'payment_date', 'salary',)
  73.  
  74.     def clean(self):
  75.         super().clean()
  76.  
  77.         now = tz_now().date()
  78.         payment_date = self.cleaned_data.get('payment_date')
  79.         if payment_date and payment_date > now:
  80.             self.add_error('payment_date', 'Не может быть больше сегодняшней даты')
  81.  
  82.         commission = self.cleaned_data.get('commission')
  83.         if commission and commission < 0:
  84.             self.add_error('commission', 'Не может быть отрицательным числом')
  85.  
  86.         return self.cleaned_data
  87.  
  88.     def save(self, commit=True):
  89.         payment = super().save(commit=False)
  90.         payment.salary = self.cleaned_data.get('tasks').all() \
  91.                               .aggregate(Sum('wasted_time')) \
  92.                               .get('wasted_time__sum', 0) * SalaryFork.get_fork_by_user(user=payment.recipient)
  93.         payment.save()
  94.         return payment
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement