extended establishment api enpoint by attribute of 'employees'

This commit is contained in:
evgeniy-st 2019-09-01 14:17:03 +03:00
parent 805bda3267
commit 1b001f303a
4 changed files with 96 additions and 2 deletions

View File

@ -34,3 +34,8 @@ class EstablishmentAdmin(admin.ModelAdmin):
@admin.register(models.EstablishmentSchedule) @admin.register(models.EstablishmentSchedule)
class EstablishmentSchedule(admin.ModelAdmin): class EstablishmentSchedule(admin.ModelAdmin):
"""Establishment schedule""" """Establishment schedule"""
@admin.register(models.Position)
class PositionAdmin(admin.ModelAdmin):
"""Position admin."""

View File

@ -1,12 +1,13 @@
"""Establishment models.""" """Establishment models."""
from functools import reduce from functools import reduce
from django.contrib.contenttypes import fields as generic
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from location.models import Address from location.models import Address
from utils.models import (ProjectBaseMixin, ImageMixin, TJSONField, from utils.models import (ProjectBaseMixin, ImageMixin, TJSONField,
TraslatedFieldsMixin, BaseAttributes) TraslatedFieldsMixin, BaseAttributes)
from django.contrib.contenttypes import fields as generic
# todo: establishment type&subtypes check # todo: establishment type&subtypes check
@ -70,6 +71,14 @@ class EstablishmentQuerySet(models.QuerySet):
else: else:
return self.none() return self.none()
def prefetch_actual_employees(self):
"""Prefetch actual employees."""
return self.prefetch_related(
models.Prefetch('establishmentemployee_set',
queryset=EstablishmentEmployee.objects.actual().select_related(
'position'),
to_attr='actual_establishment_employees'))
class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin): class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin):
"""Establishment model.""" """Establishment model."""
@ -123,6 +132,7 @@ class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin):
country = self.address.city.country country = self.address.city.country
return country.low_price, country.high_price return country.low_price, country.high_price
# todo: make via prefetch
@property @property
def subtypes(self): def subtypes(self):
return EstablishmentSubType.objects.filter( return EstablishmentSubType.objects.filter(
@ -141,6 +151,65 @@ class Establishment(ProjectBaseMixin, ImageMixin, TraslatedFieldsMixin):
self.establishment_subtypes.add(establishment_subtype) self.establishment_subtypes.add(establishment_subtype)
class Position(BaseAttributes, TraslatedFieldsMixin):
"""Position model."""
name = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'),
help_text='{"en":"some text"}')
class Meta:
"""Meta class."""
verbose_name = _('Position')
verbose_name_plural = _('Positions')
class EstablishmentEmployeeQuerySet(models.QuerySet):
"""Extended queryset for EstablishmEntemployee model."""
def actual(self):
"""Actual objects.."""
now = timezone.now()
return self.filter(models.Q(from_date__lte=now),
(models.Q(to_date__gte=now) |
models.Q(to_date__isnull=True)))
class EstablishmentEmployee(BaseAttributes):
"""EstablishmentEmployee model."""
establishment = models.ForeignKey(Establishment, on_delete=models.PROTECT,
verbose_name=_('Establishment'))
employee = models.ForeignKey('establishment.Employee', on_delete=models.PROTECT,
verbose_name=_('Employee'))
from_date = models.DateTimeField(default=timezone.now, verbose_name=_('From date'))
to_date = models.DateTimeField(blank=True, null=True, default=None,
verbose_name=_('To date'))
position = models.ForeignKey(Position, on_delete=models.PROTECT,
verbose_name=_('Position'))
objects = EstablishmentEmployeeQuerySet.as_manager()
class Employee(BaseAttributes):
"""Employee model."""
user = models.OneToOneField('account.User', on_delete=models.PROTECT,
null=True, blank=True, default=None,
verbose_name=_('User'))
name = models.CharField(max_length=255, verbose_name=_('Last name'))
establishments = models.ManyToManyField(Establishment, related_name='employees',
through=EstablishmentEmployee)
awards = generic.GenericRelation(to='main.Award')
tags = generic.GenericRelation(to='main.MetaDataContent')
class Meta:
"""Meta class."""
verbose_name = _('Employee')
verbose_name_plural = _('Employees')
class EstablishmentScheduleQuerySet(models.QuerySet): class EstablishmentScheduleQuerySet(models.QuerySet):
"""QuerySet for model EstablishmentSchedule""" """QuerySet for model EstablishmentSchedule"""

View File

@ -46,6 +46,20 @@ class EstablishmentScheduleSerializer(serializers.ModelSerializer):
) )
class EstablishmentEmployeeSerializer(serializers.ModelSerializer):
"""Serializer for actual employees."""
id = serializers.IntegerField(source='employee.id')
name = serializers.CharField(source='employee.name')
position_translated = serializers.CharField(source='position.name_translated')
class Meta:
"""Meta class."""
model = models.Employee
fields = ('id', 'name', 'position_translated')
class EstablishmentSerializer(serializers.ModelSerializer): class EstablishmentSerializer(serializers.ModelSerializer):
"""Serializer for Establishment model.""" """Serializer for Establishment model."""
@ -59,6 +73,8 @@ class EstablishmentSerializer(serializers.ModelSerializer):
schedule = EstablishmentScheduleSerializer(source='schedule.schedule', schedule = EstablishmentScheduleSerializer(source='schedule.schedule',
many=True, many=True,
allow_null=True) allow_null=True)
employees = EstablishmentEmployeeSerializer(source='actual_establishment_employees',
many=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -79,4 +95,5 @@ class EstablishmentSerializer(serializers.ModelSerializer):
'tags', 'tags',
'awards', 'awards',
'schedule', 'schedule',
'employees',
) )

View File

@ -10,9 +10,12 @@ class EstablishmentListView(JWTGenericViewMixin, generics.ListAPIView):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = serializers.EstablishmentSerializer serializer_class = serializers.EstablishmentSerializer
queryset = models.Establishment.objects.all()
filter_class = filters.EstablishmentFilter filter_class = filters.EstablishmentFilter
def get_queryset(self):
"""Overrided method 'get_queryset'."""
return models.Establishment.objects.all().prefetch_actual_employees()
class EstablishmentRetrieveView(JWTGenericViewMixin, generics.RetrieveAPIView): class EstablishmentRetrieveView(JWTGenericViewMixin, generics.RetrieveAPIView):
"""Resource for getting a establishment.""" """Resource for getting a establishment."""