position filter for employee

This commit is contained in:
alex 2020-01-16 16:23:10 +03:00
parent de55154d89
commit 2aec0bdfb4
3 changed files with 36 additions and 21 deletions

View File

@ -1,6 +1,5 @@
"""Account models""" """Account models"""
from datetime import datetime from datetime import datetime
from tabnanny import verbose
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager

View File

@ -1,8 +1,8 @@
"""Establishment app filters.""" """Establishment app filters."""
from django.core.validators import EMPTY_VALUES from django.core.validators import EMPTY_VALUES
from django.utils.translation import ugettext_lazy as _
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from rest_framework.serializers import ValidationError from rest_framework.serializers import ValidationError
from django.utils.translation import ugettext_lazy as _
from establishment import models from establishment import models
@ -10,8 +10,8 @@ from establishment import models
class EstablishmentFilter(filters.FilterSet): class EstablishmentFilter(filters.FilterSet):
"""Establishment filter set.""" """Establishment filter set."""
tag_id = filters.NumberFilter(field_name='tags__metadata__id',) tag_id = filters.NumberFilter(field_name='tags__metadata__id', )
award_id = filters.NumberFilter(field_name='awards__id',) award_id = filters.NumberFilter(field_name='awards__id', )
search = filters.CharFilter(method='search_text') search = filters.CharFilter(method='search_text')
type = filters.CharFilter(method='by_type') type = filters.CharFilter(method='by_type')
subtype = filters.CharFilter(method='by_subtype') subtype = filters.CharFilter(method='by_subtype')
@ -67,6 +67,7 @@ class EmployeeBackFilter(filters.FilterSet):
"""Employee filter set.""" """Employee filter set."""
search = filters.CharFilter(method='search_by_name_or_last_name') search = filters.CharFilter(method='search_by_name_or_last_name')
position_id = filters.CharFilter(method='search_by_actual_position_id')
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -74,6 +75,7 @@ class EmployeeBackFilter(filters.FilterSet):
model = models.Employee model = models.Employee
fields = ( fields = (
'search', 'search',
'position_id',
) )
def search_by_name_or_last_name(self, queryset, name, value): def search_by_name_or_last_name(self, queryset, name, value):
@ -82,6 +84,12 @@ class EmployeeBackFilter(filters.FilterSet):
return queryset.search_by_name_or_last_name(value) return queryset.search_by_name_or_last_name(value)
return queryset return queryset
def search_by_actual_position_id(self, queryset, name, value):
"""Search by actual position_id."""
if value not in EMPTY_VALUES:
return queryset.search_by_position_id(value)
return queryset
class EmployeeBackSearchFilter(EmployeeBackFilter): class EmployeeBackSearchFilter(EmployeeBackFilter):
def search_by_name_or_last_name(self, queryset, name, value): def search_by_name_or_last_name(self, queryset, name, value):

View File

@ -266,16 +266,16 @@ class EstablishmentQuerySet(models.QuerySet):
2 With ordering by distance. 2 With ordering by distance.
""" """
qs = self.similar_base(establishment) \ qs = self.similar_base(establishment) \
.filter(**filters) .filter(**filters)
if establishment.address and establishment.address.coordinates: if establishment.address and establishment.address.coordinates:
return Subquery( return Subquery(
qs.annotate_distance(point=establishment.location) qs.annotate_distance(point=establishment.location)
.order_by('distance') .order_by('distance')
.distinct() .distinct()
.values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS] .values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS]
) )
return Subquery( return Subquery(
qs.values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS] qs.values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS]
) )
def similar_restaurants(self, restaurant): def similar_restaurants(self, restaurant):
@ -293,10 +293,10 @@ class EstablishmentQuerySet(models.QuerySet):
} }
) )
return self.filter(id__in=ids_by_subquery.queryset) \ return self.filter(id__in=ids_by_subquery.queryset) \
.annotate_intermediate_public_mark() \ .annotate_intermediate_public_mark() \
.annotate_mark_similarity(mark=restaurant.public_mark) \ .annotate_mark_similarity(mark=restaurant.public_mark) \
.order_by('mark_similarity') \ .order_by('mark_similarity') \
.distinct('mark_similarity', 'id') .distinct('mark_similarity', 'id')
def annotate_same_subtype(self, establishment): def annotate_same_subtype(self, establishment):
"""Annotate flag same subtype.""" """Annotate flag same subtype."""
@ -325,8 +325,8 @@ class EstablishmentQuerySet(models.QuerySet):
similarity_rules['distinctions'].append('distance') similarity_rules['distinctions'].append('distance')
return base_qs.has_published_reviews() \ return base_qs.has_published_reviews() \
.order_by(*similarity_rules['ordering']) \ .order_by(*similarity_rules['ordering']) \
.distinct(*similarity_rules['distinctions'], 'id') .distinct(*similarity_rules['distinctions'], 'id')
def by_wine_region(self, wine_region): def by_wine_region(self, wine_region):
""" """
@ -360,7 +360,7 @@ class EstablishmentQuerySet(models.QuerySet):
similarity_rules['distinctions'].append('distance') similarity_rules['distinctions'].append('distance')
return base_qs.order_by(*similarity_rules['ordering']) \ return base_qs.order_by(*similarity_rules['ordering']) \
.distinct(*similarity_rules['distinctions'], 'id') .distinct(*similarity_rules['distinctions'], 'id')
def similar_distilleries(self, distillery): def similar_distilleries(self, distillery):
""" """
@ -380,9 +380,9 @@ class EstablishmentQuerySet(models.QuerySet):
similarity_rules['distinctions'].append('distance') similarity_rules['distinctions'].append('distance')
return base_qs.published() \ return base_qs.published() \
.has_published_reviews() \ .has_published_reviews() \
.order_by(*similarity_rules['ordering']) \ .order_by(*similarity_rules['ordering']) \
.distinct(*similarity_rules['distinctions'], 'id') .distinct(*similarity_rules['distinctions'], 'id')
def similar_food_producers(self, food_producer): def similar_food_producers(self, food_producer):
""" """
@ -402,7 +402,7 @@ class EstablishmentQuerySet(models.QuerySet):
similarity_rules['distinctions'].append('distance') similarity_rules['distinctions'].append('distance')
return base_qs.order_by(*similarity_rules['ordering']) \ return base_qs.order_by(*similarity_rules['ordering']) \
.distinct(*similarity_rules['distinctions'], 'id') .distinct(*similarity_rules['distinctions'], 'id')
def last_reviewed(self, point: Point): def last_reviewed(self, point: Point):
""" """
@ -653,7 +653,6 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin,
country = self.address.city.country country = self.address.city.country
return country.low_price, country.high_price return country.low_price, country.high_price
def set_establishment_type(self, establishment_type): def set_establishment_type(self, establishment_type):
self.establishment_type = establishment_type self.establishment_type = establishment_type
self.establishment_subtypes.exclude( self.establishment_subtypes.exclude(
@ -991,6 +990,15 @@ class EmployeeQuerySet(models.QuerySet):
"""Search by name or last_name.""" """Search by name or last_name."""
return self._generic_search(value, ['name', 'last_name']) return self._generic_search(value, ['name', 'last_name'])
def search_by_position_id(self, value):
"""Search by position_id."""
return self.filter(
Q(establishmentemployee__position_id=value),
Q(establishmentemployee__from_date__lte=datetime.now()),
Q(establishmentemployee__to_date__gte=datetime.now()) |
Q(establishmentemployee__to_date__isnull=True)
)
def actual_establishment(self): def actual_establishment(self):
e = EstablishmentEmployee.objects.actual().filter(employee=self) e = EstablishmentEmployee.objects.actual().filter(employee=self)
return self.prefetch_related(models.Prefetch('establishmentemployee_set', return self.prefetch_related(models.Prefetch('establishmentemployee_set',