Advertisement
Guest User

Untitled

a guest
Jan 25th, 2021
11
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.54 KB | None | 0 0
  1. # --------------------------------- views.py --------------------------------- #
  2.  
  3. from django.db import models
  4. from django.db.models import F, FloatField
  5. from rest_framework import mixins
  6. from rest_framework import viewsets
  7. from rest_framework.permissions import IsAuthenticated
  8.  
  9. from backend.media_planer.models import Product, ProductContent, ProductPlan
  10. from .serializers import BaseProductContentSerializers, BaseProductSerializer, BaseProductPlanSerializer
  11.  
  12.  
  13. class ProductPlanViewSet(mixins.UpdateModelMixin,
  14. mixins.DestroyModelMixin,
  15. mixins.ListModelMixin,
  16. mixins.CreateModelMixin,
  17. viewsets.GenericViewSet):
  18. serializer_class = BaseProductPlanSerializer
  19. permission_classes = (IsAuthenticated,)
  20.  
  21. def get_queryset(self):
  22. total_dirty_contracts_count = models.Sum(F('products__dirty_contracts_count'))
  23.  
  24. # ANNOTATE FIELDS FROM Product MODEL
  25.  
  26. return ProductPlan.objects.filter(creator=self.request.user).prefetch_related('products').annotate(
  27. total_dirty_contracts_count=total_dirty_contracts_count
  28. )
  29.  
  30.  
  31. class ProductViewSet(mixins.UpdateModelMixin,
  32. mixins.DestroyModelMixin,
  33. mixins.ListModelMixin,
  34. mixins.CreateModelMixin,
  35. viewsets.GenericViewSet):
  36. serializer_class = BaseProductSerializer
  37. permission_classes = (IsAuthenticated,)
  38. queryset = Product.objects.all().select_related('related_plan')
  39.  
  40. def get_queryset(self):
  41. days_to_meeting = models.Avg(F('related_plan__days_to_meeting'), output_field=FloatField())
  42. days_in_month = models.Avg(F('related_plan__days_in_month'), output_field=FloatField())
  43. dirty_contracts_count = models.Avg(models.F('dirty_contracts_count'), output_field=FloatField())
  44. dirty_leads_count = 100 * dirty_contracts_count / F('dirty_cr')
  45. leads_count = models.Sum(F('values__lead_value'), output_field=FloatField())
  46. contracts_count = models.Sum(F('values__contract_value'), output_field=FloatField())
  47. ext_incr_lead_pay_count = days_in_month * leads_count / days_to_meeting
  48. ext_incr_contact_pay_count = days_in_month * contracts_count / days_to_meeting
  49. ext_incr_lead_pay_percent = 100 * dirty_leads_count / ext_incr_lead_pay_count
  50. ext_incr_contact_pay_percent = 100 * dirty_contracts_count / ext_incr_contact_pay_count
  51. ext_dirty_cr = 100 * contracts_count / leads_count
  52. desired_lead_pay_count = models.Avg(F('desired_lead_pay_count'), output_field=FloatField())
  53. desired_contract_pay_count = desired_lead_pay_count * models.Avg(F('desired_cr'), output_field=FloatField())
  54. desired_lead_pay_percent = desired_lead_pay_count / dirty_leads_count * 100
  55. desired_contract_pay_percent = 100 * desired_contract_pay_count / dirty_contracts_count
  56.  
  57. return self.queryset.filter(
  58. related_plan__pk=self.kwargs['plan_pk'],
  59. related_plan__creator=self.request.user
  60. ).annotate(
  61. dirty_leads_count=dirty_leads_count,
  62. leads_count=leads_count,
  63. contracts_count=contracts_count,
  64. ext_incr_lead_pay_count=ext_incr_lead_pay_count,
  65. ext_incr_lead_pay_percent=ext_incr_lead_pay_percent,
  66. ext_incr_contact_pay_count=ext_incr_contact_pay_count,
  67. ext_dirty_cr=ext_dirty_cr,
  68. ext_incr_contact_pay_percent=ext_incr_contact_pay_percent,
  69. desired_contract_pay_count=desired_contract_pay_count,
  70. desired_contract_pay_percent=desired_contract_pay_percent,
  71. desired_lead_pay_percent=desired_lead_pay_percent
  72. )
  73.  
  74.  
  75. class ProductContentViewSet(mixins.UpdateModelMixin,
  76. mixins.DestroyModelMixin,
  77. mixins.ListModelMixin,
  78. mixins.CreateModelMixin,
  79. viewsets.GenericViewSet):
  80. serializer_class = BaseProductContentSerializers
  81. permission_classes = (IsAuthenticated,)
  82.  
  83. def get_queryset(self):
  84. return ProductContent.objects.filter(related_product__pk=self.kwargs['product_pk'])
  85.  
  86. # --------------------------------- models.py --------------------------------- #
  87.  
  88. import logging
  89.  
  90. from django.conf import settings
  91. from django.db import models
  92. from django.db.models import FloatField
  93. from django.utils.translation import ugettext_lazy as _
  94.  
  95. __all__ = ('Product',
  96. 'ProductContent',
  97. 'ProductPlan')
  98.  
  99. logger = logging.getLogger(name=__name__)
  100.  
  101.  
  102. class ProductPlan(models.Model):
  103. creator = models.ForeignKey(
  104. settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_('Creator'), null=True
  105. )
  106. days_in_month = models.IntegerField(
  107. blank=True, null=True, verbose_name=_('Days in month')
  108. )
  109. days_to_meeting = models.IntegerField(
  110. blank=True, null=True, verbose_name=_('Days to meeting')
  111. )
  112.  
  113. @property
  114. def products_count(self):
  115. return self.products.count()
  116.  
  117. def __str__(self):
  118. return self.id
  119.  
  120. class Meta:
  121. ordering = ('id',)
  122. verbose_name = _('Product plan')
  123. verbose_name_plural = _('Product plans')
  124.  
  125.  
  126. class Product(models.Model):
  127. related_plan = models.ForeignKey(
  128. ProductPlan, on_delete=models.CASCADE, verbose_name=_('Related product plan'), related_name='products',
  129. null=True
  130. )
  131. desired_lead_pay_count = models.IntegerField(
  132. default=0, verbose_name=_('Desired pay count')
  133. )
  134. desired_cr = models.FloatField(
  135. default=0, verbose_name=_('Desired CR')
  136. )
  137. name = models.CharField(
  138. max_length=200, blank=True, null=True, verbose_name=_('Name')
  139. )
  140. lead_custom_name = models.CharField(
  141. max_length=100, blank=True, null=True, verbose_name=_('Lead custom name')
  142. )
  143. contract_custom_name = models.CharField(
  144. max_length=100, blank=True, null=True, verbose_name=_('Contract custom name')
  145. )
  146. dirty_contracts_count = models.IntegerField(
  147. default=0, verbose_name=_('Contracts count')
  148. )
  149. dirty_cr = models.FloatField(default=0, verbose_name=_('Dirty CR'))
  150.  
  151. @property
  152. def values_count(self):
  153. return self.values.count()
  154.  
  155. def __str__(self):
  156. return self.name
  157.  
  158. class Meta:
  159. ordering = ('id',)
  160. verbose_name = _('Product')
  161. verbose_name_plural = _('Products')
  162.  
  163.  
  164. class ProductContent(models.Model):
  165. lead_value = models.IntegerField(
  166. default=0, verbose_name=_('Lead value')
  167. )
  168. contract_value = models.IntegerField(
  169. default=0, verbose_name=_('Contract value')
  170. )
  171. date = models.DateTimeField(
  172. auto_now_add=True, verbose_name=_('Data')
  173. )
  174. related_product = models.ForeignKey(
  175. Product, on_delete=models.CASCADE, related_name='values',
  176. )
  177.  
  178. def __str__(self):
  179. return 'Product %s: Contracts: %i, Leads: %i' % (
  180. self.related_product.name, self.contract_value, self.lead_value)
  181.  
  182. class Meta:
  183. ordering = ('id',)
  184. verbose_name = _('Product content')
  185. verbose_name_plural = _('Product contents')
  186.  
  187.  
  188. # --------------------------------- serializers.py --------------------------------- #
  189.  
  190. from rest_framework import serializers
  191. from ..card.utils.serializers import get_obj_or_raise_error
  192.  
  193. from backend.media_planer.models import Product, ProductContent, ProductPlan
  194.  
  195.  
  196. class BaseProductPlanSerializer(serializers.ModelSerializer):
  197. creator = serializers.HiddenField(
  198. default=serializers.CurrentUserDefault(),
  199. )
  200. products_count = serializers.IntegerField(default=0, read_only=True)
  201. total_dirty_leads_count = serializers.IntegerField(default=0, read_only=True)
  202. total_dirty_contracts_count = serializers.IntegerField(default=0, read_only=True)
  203.  
  204. class Meta:
  205. model = ProductPlan
  206. fields = '__all__'
  207.  
  208.  
  209. class BaseProductSerializer(serializers.ModelSerializer):
  210. dirty_leads_count = serializers.FloatField(default=0, read_only=True)
  211. leads_count = serializers.IntegerField(default=0, read_only=True)
  212. contracts_count = serializers.IntegerField(default=0, read_only=True)
  213. ext_incr_lead_pay_count = serializers.IntegerField(default=0, read_only=True)
  214. ext_incr_lead_pay_percent = serializers.IntegerField(default=0, read_only=True)
  215. ext_incr_contact_pay_count = serializers.IntegerField(default=0, read_only=True)
  216. ext_incr_contact_pay_percent = serializers.IntegerField(default=0, read_only=True)
  217. ext_dirty_cr = serializers.IntegerField(default=0, read_only=True)
  218. desired_contract_pay_count = serializers.IntegerField(default=0, read_only=True)
  219. desired_contract_pay_percent = serializers.FloatField(default=0, read_only=True)
  220. desired_lead_pay_percent = serializers.FloatField(default=0, read_only=True)
  221.  
  222. def create(self, validated_data):
  223. get_obj_or_raise_error(validated_data, self.context, model=ProductPlan, pk_args='plan_pk')
  224. return super(BaseProductSerializer, self).create(validated_data)
  225.  
  226. class Meta:
  227. model = Product
  228. exclude = ('related_plan',)
  229.  
  230.  
  231. class BaseProductContentSerializers(serializers.ModelSerializer):
  232. def create(self, validated_data):
  233. get_obj_or_raise_error(validated_data, self.context, model=Product, pk_args='product_pk')
  234. return super(BaseProductContentSerializers, self).create(validated_data)
  235.  
  236. class Meta:
  237. model = ProductContent
  238. exclude = ('related_product',)
  239.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement