Merge branch 'develop' of ssh://gl.id-east.ru:222/gm/gm-backend into develop

This commit is contained in:
Александр Пархомин 2020-02-10 12:39:34 +03:00
commit dcf88408ae
9 changed files with 156 additions and 17 deletions

View File

@ -534,7 +534,7 @@ class EstablishmentQuerySet(models.QuerySet):
"""Return QuerySet with establishments that user has an access.""" """Return QuerySet with establishments that user has an access."""
from account.models import UserRole from account.models import UserRole
if not user.is_superuser: if not user.is_superuser and not user.is_anonymous:
filters = {'address__city__country__code': country_code} filters = {'address__city__country__code': country_code}
if user.is_establishment_administrator and not user.is_establishment_manager: if user.is_establishment_administrator and not user.is_establishment_manager:
filters.update({ filters.update({

View File

@ -232,6 +232,8 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer):
last_review = ReviewBaseSerializer(read_only=True) last_review = ReviewBaseSerializer(read_only=True)
must_of_the_week = serializers.BooleanField(required=False, )
class Meta(model_serializers.EstablishmentBaseSerializer.Meta): class Meta(model_serializers.EstablishmentBaseSerializer.Meta):
fields = [ fields = [
'id', 'id',
@ -264,6 +266,7 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer):
'must_of_the_week', 'must_of_the_week',
'last_update_by_gm', 'last_update_by_gm',
'last_update_by_manager', 'last_update_by_manager',
'public_mark',
] ]
def to_representation(self, instance): def to_representation(self, instance):

View File

@ -17,7 +17,50 @@ from utils.permissions import (
# Address # Address
class AddressListCreateView(common.AddressViewMixin, generics.ListCreateAPIView): class AddressListCreateView(common.AddressViewMixin, generics.ListCreateAPIView):
"""Create view for model Address.""" """
## List/Create view
### *GET*
#### Description
Get paginated list of addresses
##### Response
E.g.:
```
{
"count": 58,
"next": 2,
"previous": null,
"results": [
{
"id": 1,
...
}
]
}
```
### *POST*
#### Description
Create a new address
##### Request
Required
* latitude (`float`) - latitude
* longitude (`float`) - longitude
* city_id (`int`) - identifier of city
Available
* district_name (`str`) - city district name
* street_name_1 (`str`) - street name
* street_name_2 (`str`) - street name (additional)
* number (`int`) - city name
* postal_code (`str`) - city postal code
##### Response
E.g.:
```
{
"id": 1,
...
}
```
"""
serializer_class = serializers.AddressDetailSerializer serializer_class = serializers.AddressDetailSerializer
queryset = models.Address.objects.all() queryset = models.Address.objects.all()
permission_classes = get_permission_classes( permission_classes = get_permission_classes(
@ -28,7 +71,48 @@ class AddressListCreateView(common.AddressViewMixin, generics.ListCreateAPIView)
class AddressRUDView(common.AddressViewMixin, generics.RetrieveUpdateDestroyAPIView): class AddressRUDView(common.AddressViewMixin, generics.RetrieveUpdateDestroyAPIView):
"""RUD view for model Address.""" """
## Retrieve/Update/Destroy view
### *GET*
#### Description
Return serialized object of an address by an identifier.
##### Response
E.g.:
```
{
"id": 1,
...
}
```
### *PUT*/*PATCH*
#### Description
Completely/Partially update an address object by an identifier.
##### Request
Available
* latitude (`float`) - latitude
* longitude (`float`) - longitude
* city_id (`int`) - identifier of city
* district_name (`str`) - city district name
* street_name_1 (`str`) - street name
* street_name_2 (`str`) - street name (additional)
* number (`int`) - city name
* postal_code (`str`) - city postal code
##### Response
E.g.
```
{
"id": 1,
...
}
```
### *DELETE*
#### Description
Delete an address object by an identifier.
##### Response
```
No content
```
"""
serializer_class = serializers.AddressDetailSerializer serializer_class = serializers.AddressDetailSerializer
queryset = models.Address.objects.all() queryset = models.Address.objects.all()
permission_classes = get_permission_classes( permission_classes = get_permission_classes(

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.7 on 2020-02-10 08:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('review', '0020_reviewtextauthor'),
]
operations = [
migrations.AddField(
model_name='review',
name='visited_at',
field=models.DateField(blank=True, null=True),
),
]

View File

@ -94,6 +94,7 @@ class Review(BaseAttributes, TranslatedFieldsMixin):
mark = models.FloatField(verbose_name=_('mark'), blank=True, null=True, default=None) mark = models.FloatField(verbose_name=_('mark'), blank=True, null=True, default=None)
priority = models.PositiveSmallIntegerField(_('Priority'), blank=True, null=True, default=None) priority = models.PositiveSmallIntegerField(_('Priority'), blank=True, null=True, default=None)
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
visited_at = models.DateField(blank=True, null=True)
objects = ReviewQuerySet.as_manager() objects = ReviewQuerySet.as_manager()
@ -101,6 +102,17 @@ class Review(BaseAttributes, TranslatedFieldsMixin):
def status_display(self): def status_display(self):
return self.REVIEW_STATUSES[self.status][1] return self.REVIEW_STATUSES[self.status][1]
@property
def visited_on(self):
from account.models import User
from account.serializers import UserBaseSerializer
if isinstance(self.reviewer, User):
return {
'user': UserBaseSerializer(self.reviewer).data,
'date': self.visited_at,
}
return None
class Meta: class Meta:
"""Meta class.""" """Meta class."""
verbose_name = _('Review') verbose_name = _('Review')

View File

@ -6,6 +6,7 @@ from review.models import Review, Inquiries, GridItems
class ReviewBaseSerializer(serializers.ModelSerializer): class ReviewBaseSerializer(serializers.ModelSerializer):
text_translated = serializers.CharField(read_only=True) text_translated = serializers.CharField(read_only=True)
status_display = serializers.CharField(read_only=True) status_display = serializers.CharField(read_only=True)
visited_on = serializers.DictField(read_only=True, allow_null=True)
class Meta: class Meta:
model = Review model = Review
@ -23,6 +24,7 @@ class ReviewBaseSerializer(serializers.ModelSerializer):
'country', 'country',
'content_type', 'content_type',
'object_id', 'object_id',
'visited_on',
) )

View File

@ -542,22 +542,42 @@ class AwardsModelMixin:
class CarouselMixin: class CarouselMixin:
def __must_of_the_week_info_from_self(self) -> dict:
from main.models import Country
return {
'content_type': ContentType.objects.get_for_model(self),
'object_id': getattr(self, 'pk'),
'country': getattr(self, 'country', get_object_or_404(Country, id=getattr(self, 'country_id', 0))),
}
def __must_of_the_week_has_fields(self) -> bool:
return hasattr(self, 'pk') and (hasattr(self, 'country') or hasattr(self, 'country_id'))
@property @property
def must_of_the_week(self) -> bool: def must_of_the_week(self) -> bool:
from main import models as main_models
"""Detects whether current item in carousel""" """Detects whether current item in carousel"""
from main.models import Carousel if self.__must_of_the_week_has_fields():
kwargs = self.__must_of_the_week_info_from_self()
if hasattr(self, 'pk') and (hasattr(self, 'country') or hasattr(self, 'country_id')): return main_models.Carousel.objects.filter(**kwargs).exists()
kwargs = {
'content_type': ContentType.objects.get_for_model(self),
'object_id': self.pk,
'country': getattr(self, 'country', getattr(self, 'country_id', None)),
}
return Carousel.objects.filter(**kwargs).exists()
return False return False
@must_of_the_week.setter
def must_of_the_week(self, status: bool):
from main import models as main_models
"""Update field by status"""
if status != self.must_of_the_week and self.__must_of_the_week_has_fields():
carousel, _ = main_models.Carousel.objects.get_or_create(
**self.__must_of_the_week_info_from_self()
)
if not status and isinstance(carousel, main_models.Carousel):
carousel.delete()
class UpdateByMixin(models.Model): class UpdateByMixin(models.Model):
"""Modify by mixin""" """Modify by mixin"""

View File

@ -66,8 +66,8 @@ COOKIE_DOMAIN = '.id-east.ru'
# Email settings # Email settings
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'anatolyfeteleu@gmail.com' EMAIL_HOST_USER = 'dev.fr.test.gm.back.1@gmail.com'
EMAIL_HOST_PASSWORD = 'nggrlnbehzksgmbt' EMAIL_HOST_PASSWORD = 'onvwzsggdhdfqemi'
EMAIL_PORT = 587 EMAIL_PORT = 587
MIDDLEWARE.append('utils.middleware.log_db_queries_per_API_request') MIDDLEWARE.append('utils.middleware.log_db_queries_per_API_request')

View File

@ -117,8 +117,8 @@ ELASTICSEARCH_DSL_AUTOSYNC = False
# Email settings # Email settings
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'anatolyfeteleu@gmail.com' EMAIL_HOST_USER = 'dev.fr.test.gm.back.1@gmail.com'
EMAIL_HOST_PASSWORD = 'nggrlnbehzksgmbt' EMAIL_HOST_PASSWORD = 'onvwzsggdhdfqemi'
EMAIL_PORT = 587 EMAIL_PORT = 587
# ADD TRANSFER TO INSTALLED APPS # ADD TRANSFER TO INSTALLED APPS