refactored method to get similar list on entities (see todo: establishment/models.py)

This commit is contained in:
Anatoly 2019-12-23 17:53:48 +03:00
parent f576825a71
commit db5c879459
5 changed files with 170 additions and 14 deletions

View File

@ -1,10 +1,35 @@
from django.contrib.gis import admin from django.contrib.gis import admin
from mptt.admin import DraggableMPTTAdmin, TreeRelatedFieldListFilter from mptt.admin import DraggableMPTTAdmin
from utils.admin import BaseModelAdminMixin from utils.admin import BaseModelAdminMixin
from collection import models from collection import models
class GuideFilterInline(admin.TabularInline):
"""Tabular inline for GuideFilter model."""
extra = 0
model = models.GuideFilter
class GuideElementInline(admin.TabularInline):
"""Tabular inline for GuideElement model."""
extra = 0
model = models.GuideElement
raw_id_fields = [
'guide_element_type',
'establishment',
'review',
'wine_region',
'product',
'city',
'wine_color_section',
'section',
'guide',
'parent',
'label_photo',
]
@admin.register(models.Collection) @admin.register(models.Collection)
class CollectionAdmin(admin.ModelAdmin): class CollectionAdmin(admin.ModelAdmin):
"""Collection admin.""" """Collection admin."""
@ -13,6 +38,7 @@ class CollectionAdmin(admin.ModelAdmin):
@admin.register(models.Guide) @admin.register(models.Guide)
class GuideAdmin(admin.ModelAdmin): class GuideAdmin(admin.ModelAdmin):
"""Guide admin.""" """Guide admin."""
inlines = [GuideFilterInline, ]
@admin.register(models.GuideElementType) @admin.register(models.GuideElementType)
@ -29,6 +55,3 @@ class GuideElementAdmin(DraggableMPTTAdmin, BaseModelAdminMixin, admin.ModelAdmi
'wine_color_section', 'section', 'guide', 'wine_color_section', 'section', 'guide',
'parent', 'parent',
] ]
# list_filter = (
# ('parent', TreeRelatedFieldListFilter),
# )

View File

@ -6,17 +6,17 @@ from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from mptt.models import MPTTModel, TreeForeignKey from mptt.models import MPTTModel, TreeForeignKey
from django.conf import settings
from collection import tasks
from location.models import Country, Region, WineRegion, WineSubRegion from location.models import Country, Region, WineRegion, WineSubRegion
from review.models import Review from review.models import Review
from translation.models import Language from translation.models import Language
from utils.models import IntermediateGalleryModelMixin, GalleryModelMixin
from utils.models import ( from utils.models import (
ProjectBaseMixin, TJSONField, TranslatedFieldsMixin, ProjectBaseMixin, TJSONField, TranslatedFieldsMixin,
URLImageMixin, URLImageMixin, IntermediateGalleryModelMixin
) )
from utils.querysets import RelatedObjectsCountMixin from utils.querysets import RelatedObjectsCountMixin
from utils.models import IntermediateGalleryModelMixin, GalleryMixin
# Mixins # Mixins
@ -434,6 +434,13 @@ class GuideFilter(ProjectBaseMixin):
model=EstablishmentType, model=EstablishmentType,
lookup_field='index_name') lookup_field='index_name')
@property
def establishment_type_ids(self):
from establishment.models import EstablishmentType
return self.get_value_list(json_field=self.establishment_type_json,
model=EstablishmentType,
lookup_field='id')
@property @property
def locales(self): def locales(self):
return self.get_value_list(json_field=self.locale_json, return self.get_value_list(json_field=self.locale_json,
@ -456,6 +463,12 @@ class GuideFilter(ProjectBaseMixin):
model=Country, model=Country,
lookup_field='name_translated') lookup_field='name_translated')
@property
def country_ids(self):
return self.get_value_list(json_field=self.country_json,
model=Country,
lookup_field='id')
@property @property
def region_names(self): def region_names(self):
return self.get_value_list(json_field=self.region_json, return self.get_value_list(json_field=self.region_json,
@ -463,15 +476,96 @@ class GuideFilter(ProjectBaseMixin):
lookup_field='name') lookup_field='name')
@property @property
def sub_region_names(self): def region_ids(self):
return self.get_value_list(json_field=self.region_json, return self.get_value_list(json_field=self.region_json,
model=Country, model=Region,
lookup_field='id')
@property
def sub_region_names(self):
return self.get_value_list(json_field=self.sub_region_json,
model=Region,
lookup_field='name_translated') lookup_field='name_translated')
@property
def sub_region_ids(self):
return self.get_value_list(json_field=self.sub_region_json,
model=Region,
lookup_field='id')
@property
def wine_region_ids(self):
return self.get_value_list(json_field=self.wine_region_json,
model=WineRegion,
lookup_field='id')
@property @property
def review_vintages(self): def review_vintages(self):
return self.review_vintage_json.get('vintage') return self.review_vintage_json.get('vintage')
@property
def available_filters(self):
filters = list()
for i in self._meta.fields:
if isinstance(i, JSONField):
has_values = list(getattr(self, f'{i.name}').values())[0]
if has_values:
filters.append(i.name)
return filters
@property
def establishment_filter_set(self):
filters = {
# establishment.Establishment
'public_mark__in': [self.min_mark, self.max_mark],
# review.Reviews
'reviews__vintage__in': self.review_vintages,
}
if self.establishment_type_ids:
filters.update({
# establishment.EstablishmentType
'establishment_type_id__in': self.establishment_type_ids,
})
if self.country_ids:
filters.update({
# location.Country
'address__city__country_id__in': self.country_ids,
})
if self.region_ids:
filters.update({
# location.Region
'address__city__region__parent_id__in': self.region_ids,
})
if self.sub_region_ids:
filters.update({
# location.Region
'address__city__region__parent_id__in': self.region_ids,
'address__city__region_id__in': self.sub_region_ids,
})
if self.wine_region_ids:
filters.update({
# location.WineRegion
'wine_region_id__in': self.wine_region_ids,
})
if self.with_mark:
filters.update({
# establishment.Establishment
'public_mark__isnull': False,
})
if self.locale_json:
filters.update({
'reviews__text__has_any_keys': self.locales,
})
return filters
class GuideElementType(models.Model): class GuideElementType(models.Model):
"""Model for type of guide elements.""" """Model for type of guide elements."""
@ -558,6 +652,21 @@ class GuideElementManager(models.Manager):
class GuideElementQuerySet(models.QuerySet): class GuideElementQuerySet(models.QuerySet):
"""QuerySet for model Guide elements.""" """QuerySet for model Guide elements."""
def base_related(self):
"""Return QuerySet with base related."""
return self.select_related(
'guide_element_type',
'establishment',
'review',
'wine_region',
'product',
'city',
'wine_color_section',
'section',
'guide',
'label_photo',
)
def restaurant_nodes(self): def restaurant_nodes(self):
"""Return GuideElement with type RestaurantSectionNode.""" """Return GuideElement with type RestaurantSectionNode."""
return self.filter(guide_element_type__name='RestaurantSectionNode') return self.filter(guide_element_type__name='RestaurantSectionNode')

View File

@ -7,6 +7,7 @@ from utils.serializers import TranslatedField
from rest_framework_recursive.fields import RecursiveField from rest_framework_recursive.fields import RecursiveField
from establishment.serializers import EstablishmentGuideElementSerializer from establishment.serializers import EstablishmentGuideElementSerializer
from product.serializers import ProductGuideElementSerializer from product.serializers import ProductGuideElementSerializer
from django.shortcuts import get_object_or_404
class CollectionBaseSerializer(serializers.ModelSerializer): class CollectionBaseSerializer(serializers.ModelSerializer):
@ -161,13 +162,12 @@ class GuideFilterBaseSerializer(serializers.ModelSerializer):
"""Get url kwargs from request.""" """Get url kwargs from request."""
return self.context.get('request').parser_context.get('kwargs') return self.context.get('request').parser_context.get('kwargs')
def get_guide(self):
"""Get guide instance from kwargs."""
return self.request_kwargs.get()
def create(self, validated_data): def create(self, validated_data):
"""Overridden create method.""" """Overridden create method."""
validated_data['guide'] = self.get_guide(validated_data.pop('guide', None)) guide = get_object_or_404(models.Guide.objects.all(),
pk=self.request_kwargs.get('pk'))
validated_data['guide'] = guide
return super().create(validated_data) return super().create(validated_data)
@ -190,6 +190,7 @@ class GuideElementBaseSerializer(serializers.ModelSerializer):
"""Meta class.""" """Meta class."""
model = models.GuideElement model = models.GuideElement
fields = [ fields = [
'id',
'node_name', 'node_name',
'establishment_detail', 'establishment_detail',
'review', 'review',

21
apps/collection/tasks.py Normal file
View File

@ -0,0 +1,21 @@
"""Collectoin app celery tasks."""
import logging
from celery import shared_task
from django.utils.translation import gettext_lazy as _
from collection import models as collection_models
logging.basicConfig(format='[%(levelname)s] %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
# todo: finish this
@shared_task
def generate_guide_elements(guide_id: int):
"""Send verification email to user."""
try:
obj = collection_models.Guide.objects.get(id=guide_id)
except Exception as e:
logger.error(f'METHOD_NAME: {generate_guide_elements.__name__}\n'
f'DETAIL: guide {guide_id}, - {e}')

View File

@ -25,11 +25,13 @@ class ProductAdmin(BaseModelAdminMixin, admin.ModelAdmin):
@admin.register(ProductType) @admin.register(ProductType)
class ProductTypeAdmin(admin.ModelAdmin): class ProductTypeAdmin(admin.ModelAdmin):
"""Admin page for model ProductType.""" """Admin page for model ProductType."""
raw_id_fields = ['tag_categories', 'default_image']
@admin.register(ProductSubType) @admin.register(ProductSubType)
class ProductSubTypeAdmin(admin.ModelAdmin): class ProductSubTypeAdmin(admin.ModelAdmin):
"""Admin page for model ProductSubType.""" """Admin page for model ProductSubType."""
raw_id_fields = ['product_type', 'default_image']
@admin.register(Unit) @admin.register(Unit)