Advertisement
Guest User

Untitled

a guest
Feb 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. import re
  2. from decimal import Decimal
  3.  
  4. from django.db.models import Count
  5. from resumes.models import Resume
  6. import ipdb
  7.  
  8. class ResumesQuery:
  9. """ Advanced Query class for the Resume """
  10.  
  11. VALID_ORDER_FIELDS = [
  12. 'title',
  13. 'salary',
  14. 'created_at',
  15. 'updated_at',
  16. 'workplaces_count'
  17. ]
  18.  
  19. def __init__(self, params):
  20. """ Constructor; Set parameters instead of default ones """
  21.  
  22. self.params = params
  23.  
  24.  
  25. def list(self):
  26. """ Perform query for extracting the list of the Resume instances """
  27.  
  28. queryset = Resume.objects.select_related('user').prefetch_related(
  29. 'user__avatars'
  30. ).annotate(workplaces_count=Count('workplaces'))
  31.  
  32. if self.salary:
  33. queryset = queryset.filter(salary__range=[
  34. self.salary.get('min'), self.salary.get('max')
  35. ])
  36.  
  37. if self.skills:
  38. queryset = queryset.prefetch_related(
  39. 'skills'
  40. ).filter(skills__id__in=self.skills)
  41.  
  42. if self.order:
  43. queryset = queryset.order_by(self.order)
  44.  
  45. return queryset
  46.  
  47. @property
  48. def salary(self):
  49. """ Return salary value """
  50.  
  51. salary = self.params.get('salary')
  52. return salary if self.is_valid_salary(salary) else None
  53.  
  54.  
  55. @property
  56. def order(self):
  57. """ Retur order value """
  58.  
  59. order = self.params.get('order')
  60. return order if self.is_valid_order(order) else None
  61.  
  62. @property
  63. def skills(self):
  64. """ Return skills value """
  65.  
  66. skills = self.params.get('skills')
  67. return skills if self.is_valid_skills(skills) else None
  68.  
  69. def is_valid_order(self, order):
  70. """ Return whether or not the order value is valid """
  71.  
  72. order_template = re.compile('-')
  73. if order_template.match(str(order)):
  74. order = order[1:]
  75. return order in self.VALID_ORDER_FIELDS
  76.  
  77. def is_valid_salary(self, salary):
  78. """ Return whether or not the salary is valid """
  79.  
  80. try:
  81. Decimal(salary.get('min'))
  82. Decimal(salary.get('max'))
  83. return True
  84. except (AttributeError, TypeError, ValueError):
  85. return None
  86.  
  87. def is_valid_skills(self, skills):
  88. """ Return whether or not skills are valid """
  89.  
  90. try:
  91. list(skills)
  92. [int(item) for item in skills]
  93. return True
  94. except (TypeError, ValueError):
  95. return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement