refactored product, fix transfer and etc., see changelist

This commit is contained in:
Anatoly 2019-11-21 09:58:29 +03:00
parent a2a8b2927f
commit 617552841f
19 changed files with 220 additions and 81 deletions

View File

@ -63,7 +63,7 @@ class SendConfirmationEmailView(generics.GenericAPIView):
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
class ConfirmEmailView(JWTGenericViewMixin): class ConfirmEmailView(JWTGenericViewMixin, generics.GenericAPIView):
"""View for confirm changing email""" """View for confirm changing email"""
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)

View File

@ -33,7 +33,7 @@ class PasswordResetView(generics.GenericAPIView):
return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
class PasswordResetConfirmView(JWTGenericViewMixin): class PasswordResetConfirmView(JWTGenericViewMixin, generics.GenericAPIView):
"""View for confirmation new password""" """View for confirmation new password"""
serializer_class = serializers.PasswordResetConfirmSerializer serializer_class = serializers.PasswordResetConfirmSerializer
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)

View File

@ -45,7 +45,7 @@ class AdvertisementPageListCreateView(AdvertisementBackOfficeViewMixin,
ad_qs = Advertisement.objects.all() ad_qs = Advertisement.objects.all()
filtered_ad_qs = self.filter_queryset(ad_qs) filtered_ad_qs = self.filter_queryset(ad_qs)
ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['pk']) ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, ad) self.check_object_permissions(self.request, ad)
@ -68,8 +68,8 @@ class AdvertisementPageRUDView(AdvertisementBackOfficeViewMixin,
ad_qs = Advertisement.objects.all() ad_qs = Advertisement.objects.all()
filtered_ad_qs = self.filter_queryset(ad_qs) filtered_ad_qs = self.filter_queryset(ad_qs)
ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs['ad_pk']) ad = get_object_or_404(filtered_ad_qs, pk=self.kwargs.get('ad_pk'))
page = get_object_or_404(ad.pages.all(), pk=self.kwargs['page_pk']) page = get_object_or_404(ad.pages.all(), pk=self.kwargs.get('page_pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, page) self.check_object_permissions(self.request, page)

View File

@ -71,7 +71,7 @@ class OAuth2ViewMixin(CsrfExemptMixin, OAuthLibMixin, BaseOAuth2ViewMixin):
# Sign in via Facebook # Sign in via Facebook
class OAuth2SignUpView(OAuth2ViewMixin, JWTGenericViewMixin): class OAuth2SignUpView(OAuth2ViewMixin, JWTGenericViewMixin, generics.GenericAPIView):
""" """
Implements an endpoint to convert a provider token to an access token Implements an endpoint to convert a provider token to an access token
@ -142,7 +142,7 @@ class SignUpView(generics.GenericAPIView):
return Response(status=status.HTTP_201_CREATED) return Response(status=status.HTTP_201_CREATED)
class ConfirmationEmailView(JWTGenericViewMixin): class ConfirmationEmailView(JWTGenericViewMixin, generics.GenericAPIView):
"""View for confirmation email""" """View for confirmation email"""
permission_classes = (permissions.AllowAny, ) permission_classes = (permissions.AllowAny, )
@ -174,7 +174,7 @@ class ConfirmationEmailView(JWTGenericViewMixin):
# Login by username|email + password # Login by username|email + password
class LoginByUsernameOrEmailView(JWTGenericViewMixin): class LoginByUsernameOrEmailView(JWTGenericViewMixin, generics.GenericAPIView):
"""Login by email and password""" """Login by email and password"""
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = serializers.LoginByUsernameOrEmailSerializer serializer_class = serializers.LoginByUsernameOrEmailSerializer
@ -197,7 +197,7 @@ class LoginByUsernameOrEmailView(JWTGenericViewMixin):
# Logout # Logout
class LogoutView(JWTGenericViewMixin): class LogoutView(JWTGenericViewMixin, generics.GenericAPIView):
"""Logout user""" """Logout user"""
permission_classes = (IsAuthenticatedAndTokenIsValid, ) permission_classes = (IsAuthenticatedAndTokenIsValid, )
@ -215,7 +215,7 @@ class LogoutView(JWTGenericViewMixin):
# Refresh token # Refresh token
class RefreshTokenView(JWTGenericViewMixin): class RefreshTokenView(JWTGenericViewMixin, generics.GenericAPIView):
"""Refresh access_token""" """Refresh access_token"""
permission_classes = (permissions.AllowAny, ) permission_classes = (permissions.AllowAny, )
serializer_class = serializers.RefreshTokenSerializer serializer_class = serializers.RefreshTokenSerializer

View File

@ -7,7 +7,7 @@ from comment.models import Comment
from utils.admin import BaseModelAdminMixin from utils.admin import BaseModelAdminMixin
from establishment import models from establishment import models
from main.models import Award from main.models import Award
from product.models import Product from product.models import Product, PurchasedProduct
from review import models as review_models from review import models as review_models
@ -69,13 +69,19 @@ class EstablishmentNote(admin.TabularInline):
extra = 0 extra = 0
class PurchasedProduct(admin.TabularInline):
model = PurchasedProduct
extra = 0
@admin.register(models.Establishment) @admin.register(models.Establishment)
class EstablishmentAdmin(BaseModelAdminMixin, admin.ModelAdmin): class EstablishmentAdmin(BaseModelAdminMixin, admin.ModelAdmin):
"""Establishment admin.""" """Establishment admin."""
list_display = ['id', '__str__', 'image_tag', ] list_display = ['id', '__str__', 'image_tag', ]
search_fields = ['id', 'name', 'index_name', 'slug'] search_fields = ['id', 'name', 'index_name', 'slug']
list_filter = ['public_mark', 'toque_number'] list_filter = ['public_mark', 'toque_number']
inlines = [GalleryImageInline, CompanyInline, EstablishmentNote] inlines = [GalleryImageInline, CompanyInline, EstablishmentNote,
PurchasedProduct]
# inlines = [ # inlines = [
# AwardInline, ContactPhoneInline, ContactEmailInline, # AwardInline, ContactPhoneInline, ContactEmailInline,

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.7 on 2019-11-20 12:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('product', '0018_purchasedproduct'),
('establishment', '0064_auto_20191119_1546'),
]
operations = [
migrations.AddField(
model_name='establishment',
name='purchased_products',
field=models.ManyToManyField(blank=True, help_text='Attribute from legacy db.\nMust be deleted after the implementation of the market.', related_name='establishments', through='product.PurchasedProduct', to='product.Product', verbose_name='purchased plaques'),
),
]

View File

@ -397,6 +397,13 @@ class Establishment(GalleryModelMixin, ProjectBaseMixin, URLImageMixin, Translat
currency = models.ForeignKey(Currency, blank=True, null=True, default=None, currency = models.ForeignKey(Currency, blank=True, null=True, default=None,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('currency')) verbose_name=_('currency'))
purchased_products = models.ManyToManyField('product.Product', blank=True,
through='product.PurchasedProduct',
related_name='establishments',
verbose_name=_('purchased plaques'),
help_text=_('Attribute from legacy db.\n'
'Must be deleted after the '
'implementation of the market.'))
objects = EstablishmentQuerySet.as_manager() objects = EstablishmentQuerySet.as_manager()
@ -409,6 +416,12 @@ class Establishment(GalleryModelMixin, ProjectBaseMixin, URLImageMixin, Translat
def __str__(self): def __str__(self):
return f'id:{self.id}-{self.name}' return f'id:{self.id}-{self.name}'
def clean_fields(self, exclude=None):
super().clean_fields(exclude)
if self.purchased_products.filter(product_type__index_name='souvenir').exists():
raise ValidationError(
_('Only souvenirs.'))
def delete(self, using=None, keep_parents=False): def delete(self, using=None, keep_parents=False):
"""Overridden delete method""" """Overridden delete method"""
# Delete all related companies # Delete all related companies

View File

@ -4,7 +4,9 @@ from django.db.models import Q, F
from establishment.models import Establishment from establishment.models import Establishment
from location.models import Address from location.models import Address
from transfer.models import Establishments, Dishes, EstablishmentNotes from product.models import PurchasedProduct, Product
from transfer.models import Establishments, Dishes, EstablishmentNotes, \
EstablishmentMerchandises
from transfer.serializers.establishment import EstablishmentSerializer, \ from transfer.serializers.establishment import EstablishmentSerializer, \
EstablishmentNoteSerializer EstablishmentNoteSerializer
from transfer.serializers.plate import PlateSerializer from transfer.serializers.plate import PlateSerializer
@ -140,6 +142,43 @@ def transfer_establishment_note():
pprint(f"transfer_establishment_note errors: {errors}") pprint(f"transfer_establishment_note errors: {errors}")
def transfer_purchased_plaques():
update_products_counter = 0
already_updated_counter = 0
not_existed_establishment_counter = 0
purchased = EstablishmentMerchandises.objects.values_list(
'establishment_id',
'merchandise__vintage',
'gifted',
'quantity'
)
for old_est_id, vintage, gifted, quantity in purchased:
establishment_qs = Establishment.objects.filter(old_id=old_est_id)
product_qs = Product.objects.filter(name='Plaque restaurants',
vintage=vintage)
if establishment_qs.exists() and product_qs.exists():
product = product_qs.first()
establishment = establishment_qs.first()
purchases, created = PurchasedProduct.objects.get_or_create(
establishment=establishment,
product=product,
is_gifted=gifted,
quantity=quantity
)
if created:
update_products_counter += 1
else:
already_updated_counter += 1
else:
not_existed_establishment_counter += 1
print(f'Updated products: {update_products_counter}\n'
f'Already updated: {already_updated_counter}\n'
f'Not existed establishment: {not_existed_establishment_counter}')
data_types = { data_types = {
"establishment": [ "establishment": [
transfer_establishment, transfer_establishment,
@ -149,4 +188,7 @@ data_types = {
transfer_establishment_addresses transfer_establishment_addresses
], ],
"menu": [transfer_menu], "menu": [transfer_menu],
"purchased_plaques": [
transfer_purchased_plaques
],
} }

View File

@ -6,6 +6,7 @@ from establishment import filters, models, serializers
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
from utils.permissions import IsCountryAdmin, IsEstablishmentManager from utils.permissions import IsCountryAdmin, IsEstablishmentManager
from utils.views import CreateDestroyGalleryViewMixin from utils.views import CreateDestroyGalleryViewMixin
from timetable.models import Timetable
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
@ -36,13 +37,14 @@ class EstablishmentRUDView(generics.RetrieveUpdateDestroyAPIView):
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView): class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Establishment schedule RUD view""" """Establishment schedule RUD view"""
serializer_class = ScheduleRUDSerializer serializer_class = ScheduleRUDSerializer
permission_classes = [IsEstablishmentManager]
def get_object(self): def get_object(self):
""" """
Returns the object the view is displaying. Returns the object the view is displaying.
""" """
establishment_pk = self.kwargs['pk'] establishment_pk = self.kwargs.get('pk')
schedule_id = self.kwargs['schedule_id'] schedule_id = self.kwargs.get('schedule_id')
establishment = get_object_or_404(klass=models.Establishment.objects.all(), establishment = get_object_or_404(klass=models.Establishment.objects.all(),
pk=establishment_pk) pk=establishment_pk)
@ -59,6 +61,8 @@ class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
class EstablishmentScheduleCreateView(generics.CreateAPIView): class EstablishmentScheduleCreateView(generics.CreateAPIView):
"""Establishment schedule Create view""" """Establishment schedule Create view"""
serializer_class = ScheduleCreateSerializer serializer_class = ScheduleCreateSerializer
queryset = Timetable.objects.all()
permission_classes = [IsEstablishmentManager]
class MenuListCreateView(generics.ListCreateAPIView): class MenuListCreateView(generics.ListCreateAPIView):
@ -200,8 +204,9 @@ class EstablishmentGalleryCreateDestroyView(EstablishmentMixinViews,
""" """
establishment_qs = self.filter_queryset(self.get_queryset()) establishment_qs = self.filter_queryset(self.get_queryset())
establishment = get_object_or_404(establishment_qs, pk=self.kwargs['pk']) establishment = get_object_or_404(establishment_qs, pk=self.kwargs.get('pk'))
gallery = get_object_or_404(establishment.establishment_gallery, image_id=self.kwargs['image_id']) gallery = get_object_or_404(establishment.establishment_gallery,
image_id=self.kwargs.get('image_id'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, gallery) self.check_object_permissions(self.request, gallery)
@ -217,7 +222,7 @@ class EstablishmentGalleryListView(EstablishmentMixinViews,
def get_object(self): def get_object(self):
"""Override get_object method.""" """Override get_object method."""
qs = super(EstablishmentGalleryListView, self).get_queryset() qs = super(EstablishmentGalleryListView, self).get_queryset()
establishment = get_object_or_404(qs, pk=self.kwargs['pk']) establishment = get_object_or_404(qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, establishment) self.check_object_permissions(self.request, establishment)
@ -240,7 +245,7 @@ class EstablishmentCompanyListCreateView(EstablishmentMixinViews,
establishment_qs = models.Establishment.objects.all() establishment_qs = models.Establishment.objects.all()
filtered_ad_qs = self.filter_queryset(establishment_qs) filtered_ad_qs = self.filter_queryset(establishment_qs)
establishment = get_object_or_404(filtered_ad_qs, pk=self.kwargs['pk']) establishment = get_object_or_404(filtered_ad_qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, establishment) self.check_object_permissions(self.request, establishment)
@ -263,8 +268,8 @@ class EstablishmentCompanyRUDView(EstablishmentMixinViews,
establishment_qs = models.Establishment.objects.all() establishment_qs = models.Establishment.objects.all()
filtered_ad_qs = self.filter_queryset(establishment_qs) filtered_ad_qs = self.filter_queryset(establishment_qs)
establishment = get_object_or_404(filtered_ad_qs, pk=self.kwargs['pk']) establishment = get_object_or_404(filtered_ad_qs, pk=self.kwargs.get('pk'))
company = get_object_or_404(establishment.companies.all(), pk=self.kwargs['company_pk']) company = get_object_or_404(establishment.companies.all(), pk=self.kwargs.get('company_pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, company) self.check_object_permissions(self.request, company)
@ -273,7 +278,7 @@ class EstablishmentCompanyRUDView(EstablishmentMixinViews,
class EstablishmentNoteListCreateView(EstablishmentMixinViews, class EstablishmentNoteListCreateView(EstablishmentMixinViews,
generics.ListCreateAPIView): generics.ListCreateAPIView):
"""Retrieve|Update|Destroy establishment note view.""" """Retrieve|Update|Destroy establishment note view."""
serializer_class = serializers.EstablishmentNoteListCreateSerializer serializer_class = serializers.EstablishmentNoteListCreateSerializer
@ -283,7 +288,7 @@ class EstablishmentNoteListCreateView(EstablishmentMixinViews,
establishment_qs = models.Establishment.objects.all() establishment_qs = models.Establishment.objects.all()
filtered_establishment_qs = self.filter_queryset(establishment_qs) filtered_establishment_qs = self.filter_queryset(establishment_qs)
establishment = get_object_or_404(filtered_establishment_qs, pk=self.kwargs['pk']) establishment = get_object_or_404(filtered_establishment_qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, establishment) self.check_object_permissions(self.request, establishment)
@ -306,7 +311,7 @@ class EstablishmentNoteRUDView(EstablishmentMixinViews,
establishment_qs = models.Establishment.objects.all() establishment_qs = models.Establishment.objects.all()
filtered_establishment_qs = self.filter_queryset(establishment_qs) filtered_establishment_qs = self.filter_queryset(establishment_qs)
establishment = get_object_or_404(filtered_establishment_qs, pk=self.kwargs['pk']) establishment = get_object_or_404(filtered_establishment_qs, pk=self.kwargs.get('pk'))
note = get_object_or_404(establishment.notes.all(), pk=self.kwargs['note_pk']) note = get_object_or_404(establishment.notes.all(), pk=self.kwargs['note_pk'])
# May raise a permission denied # May raise a permission denied

View File

@ -51,8 +51,8 @@ class CityGalleryCreateDestroyView(common.CityViewMixin,
""" """
city_qs = self.filter_queryset(self.get_queryset()) city_qs = self.filter_queryset(self.get_queryset())
city = get_object_or_404(city_qs, pk=self.kwargs['pk']) city = get_object_or_404(city_qs, pk=self.kwargs.get('pk'))
gallery = get_object_or_404(city.city_gallery, image_id=self.kwargs['image_id']) gallery = get_object_or_404(city.city_gallery, image_id=self.kwargs.get('image_id'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, gallery) self.check_object_permissions(self.request, gallery)

View File

@ -108,8 +108,8 @@ class NewsBackOfficeGalleryCreateDestroyView(NewsBackOfficeMixinView,
""" """
news_qs = self.filter_queryset(self.get_queryset()) news_qs = self.filter_queryset(self.get_queryset())
news = get_object_or_404(news_qs, pk=self.kwargs['pk']) news = get_object_or_404(news_qs, pk=self.kwargs.get('pk'))
gallery = get_object_or_404(news.news_gallery, image_id=self.kwargs['image_id']) gallery = get_object_or_404(news.news_gallery, image_id=self.kwargs.get('image_id'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, gallery) self.check_object_permissions(self.request, gallery)
@ -125,7 +125,7 @@ class NewsBackOfficeGalleryListView(NewsBackOfficeMixinView,
def get_object(self): def get_object(self):
"""Override get_object method.""" """Override get_object method."""
qs = super(NewsBackOfficeGalleryListView, self).get_queryset() qs = super(NewsBackOfficeGalleryListView, self).get_queryset()
news = get_object_or_404(qs, pk=self.kwargs['pk']) news = get_object_or_404(qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, news) self.check_object_permissions(self.request, news)
@ -160,7 +160,7 @@ class NewsFavoritesCreateDestroyView(generics.CreateAPIView, generics.DestroyAPI
""" """
Returns the object the view is displaying. Returns the object the view is displaying.
""" """
news = get_object_or_404(models.News, slug=self.kwargs['slug']) news = get_object_or_404(models.News, slug=self.kwargs.get('slug'))
favorites = get_object_or_404(news.favorites.filter(user=self.request.user)) favorites = get_object_or_404(news.favorites.filter(user=self.request.user))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, favorites) self.check_object_permissions(self.request, favorites)

View File

@ -0,0 +1,30 @@
# Generated by Django 2.2.7 on 2019-11-20 12:49
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('establishment', '0064_auto_20191119_1546'),
('product', '0017_auto_20191119_1546'),
]
operations = [
migrations.CreateModel(
name='PurchasedProduct',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_gifted', models.NullBooleanField(default=None, verbose_name='is gifted')),
('quantity', models.PositiveSmallIntegerField(verbose_name='quantity')),
('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='purchased_plaques', to='establishment.Establishment', verbose_name='establishment')),
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='purchased_by_establishments', to='product.Product', verbose_name='plaque')),
],
options={
'verbose_name': 'purchased plaque',
'verbose_name_plural': 'purchased plaques',
'unique_together': {('establishment', 'product')},
},
),
]

View File

@ -263,12 +263,17 @@ class Product(GalleryModelMixin, TranslatedFieldsMixin, BaseAttributes, HasTagsM
def grape_variety(self): def grape_variety(self):
return self.tags.filter(category__index_name='grape-variety') return self.tags.filter(category__index_name='grape-variety')
@property
def bottle_sizes(self):
return self.tags.filter(category__index_name='bottle_size')
@property @property
def related_tags(self): def related_tags(self):
return super().visible_tags.exclude(category__index_name__in=[ return super().visible_tags.exclude(category__index_name__in=[
'sugar-content', 'wine-color', 'bottles-produced', 'sugar-content', 'wine-color', 'bottles-produced',
'serial-number', 'grape-variety'] 'serial-number', 'grape-variety', 'serial_number',
) 'alcohol_percentage', 'bottle_size',
])
@property @property
def display_name(self): def display_name(self):
@ -315,6 +320,26 @@ class OnlineProduct(Product):
verbose_name_plural = _('Online products') verbose_name_plural = _('Online products')
class PurchasedProduct(models.Model):
"""Model for storing establishment purchased plaques."""
establishment = models.ForeignKey('establishment.Establishment', on_delete=models.CASCADE,
related_name='purchased_plaques',
verbose_name=_('establishment'))
product = models.ForeignKey('product.Product', on_delete=models.CASCADE,
related_name='purchased_by_establishments',
verbose_name=_('plaque'))
is_gifted = models.NullBooleanField(default=None,
verbose_name=_('is gifted'))
quantity = models.PositiveSmallIntegerField(verbose_name=_('quantity'))
class Meta:
"""Meta class."""
verbose_name = _('purchased plaque')
verbose_name_plural = _('purchased plaques')
unique_together = ('establishment', 'product')
class Unit(models.Model): class Unit(models.Model):
"""Product unit model.""" """Product unit model."""
name = models.CharField(max_length=255, name = models.CharField(max_length=255,

View File

@ -57,8 +57,8 @@ class ProductBackOfficeGalleryCreateDestroyView(ProductBackOfficeMixinView,
""" """
product_qs = self.filter_queryset(self.get_queryset()) product_qs = self.filter_queryset(self.get_queryset())
product = get_object_or_404(product_qs, pk=self.kwargs['pk']) product = get_object_or_404(product_qs, pk=self.kwargs.get('pk'))
gallery = get_object_or_404(product.product_gallery, image_id=self.kwargs['image_id']) gallery = get_object_or_404(product.product_gallery, image_id=self.kwargs.get('image_id'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, gallery) self.check_object_permissions(self.request, gallery)
@ -75,7 +75,7 @@ class ProductBackOfficeGalleryListView(ProductBackOfficeMixinView,
def get_object(self): def get_object(self):
"""Override get_object method.""" """Override get_object method."""
qs = super(ProductBackOfficeGalleryListView, self).get_queryset() qs = super(ProductBackOfficeGalleryListView, self).get_queryset()
product = get_object_or_404(qs, pk=self.kwargs['pk']) product = get_object_or_404(qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, product) self.check_object_permissions(self.request, product)
@ -149,7 +149,7 @@ class ProductNoteListCreateView(ProductBackOfficeMixinView,
product_qs = models.Product.objects.all() product_qs = models.Product.objects.all()
filtered_product_qs = self.filter_queryset(product_qs) filtered_product_qs = self.filter_queryset(product_qs)
product = get_object_or_404(filtered_product_qs, pk=self.kwargs['pk']) product = get_object_or_404(filtered_product_qs, pk=self.kwargs.get('pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, product) self.check_object_permissions(self.request, product)
@ -173,8 +173,8 @@ class ProductNoteRUDView(ProductBackOfficeMixinView,
product_qs = models.Product.objects.all() product_qs = models.Product.objects.all()
filtered_product_qs = self.filter_queryset(product_qs) filtered_product_qs = self.filter_queryset(product_qs)
product = get_object_or_404(filtered_product_qs, pk=self.kwargs['pk']) product = get_object_or_404(filtered_product_qs, pk=self.kwargs.get('pk'))
note = get_object_or_404(product.notes.all(), pk=self.kwargs['note_pk']) note = get_object_or_404(product.notes.all(), pk=self.kwargs.get('note_pk'))
# May raise a permission denied # May raise a permission denied
self.check_object_permissions(self.request, note) self.check_object_permissions(self.request, note)

View File

@ -8,6 +8,9 @@ from timetable.models import Timetable
class ScheduleRUDSerializer(serializers.ModelSerializer): class ScheduleRUDSerializer(serializers.ModelSerializer):
"""Serializer for Establishment model.""" """Serializer for Establishment model."""
NULLABLE_FIELDS = ['lunch_start', 'lunch_end', 'dinner_start',
'dinner_end', 'opening_at', 'closed_at']
weekday_display = serializers.CharField(source='get_weekday_display', weekday_display = serializers.CharField(source='get_weekday_display',
read_only=True) read_only=True)
@ -18,9 +21,6 @@ class ScheduleRUDSerializer(serializers.ModelSerializer):
opening_at = serializers.TimeField(required=False) opening_at = serializers.TimeField(required=False)
closed_at = serializers.TimeField(required=False) closed_at = serializers.TimeField(required=False)
NULLABLE_FIELDS = ['lunch_start', 'lunch_end', 'dinner_start',
'dinner_end', 'opening_at', 'closed_at']
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = Timetable model = Timetable

View File

@ -39,6 +39,7 @@ class Command(BaseCommand):
'rating_count', 'rating_count',
'product_review', 'product_review',
'newsletter_subscriber', # подписчики на рассылку - переносить после переноса пользователей №1 'newsletter_subscriber', # подписчики на рассылку - переносить после переноса пользователей №1
'purchased_plaques', # №6 - перенос купленных тарелок
] ]
def handle(self, *args, **options): def handle(self, *args, **options):

View File

@ -581,22 +581,19 @@ class EstablishmentInfos(MigrateMixin):
db_table = 'establishment_infos' db_table = 'establishment_infos'
# class EstablishmentMerchandises(MigrateMixin): class EstablishmentMerchandises(MigrateMixin):
# using = 'legacy' using = 'legacy'
#
# establishment = models.ForeignKey('Establishments', models.DO_NOTHING, blank=True, null=True)
# TODO: модели Merchandises нету в гугл таблице Check Migrations establishment = models.ForeignKey('Establishments', models.DO_NOTHING, blank=True, null=True)
merchandise = models.ForeignKey('Merchandise', models.DO_NOTHING, blank=True, null=True)
gifted = models.NullBooleanField(blank=True, null=True)
quantity = models.IntegerField(blank=True, null=True)
created_at = models.DateTimeField()
updated_at = models.DateTimeField()
# merchandise = models.ForeignKey('Merchandises', models.DO_NOTHING, blank=True, null=True) class Meta:
# gifted = models.IntegerField(blank=True, null=True) managed = False
# quantity = models.IntegerField(blank=True, null=True) db_table = 'establishment_merchandises'
# created_at = models.DateTimeField()
# updated_at = models.DateTimeField()
#
# class Meta:
# managed = False
# db_table = 'establishment_merchandises'
class Menus(MigrateMixin): class Menus(MigrateMixin):

View File

@ -265,7 +265,7 @@ class ProductSerializer(TransferSerializerMixin):
state = serializers.CharField() state = serializers.CharField()
bottles_produced = serializers.CharField(allow_null=True, allow_blank=True) bottles_produced = serializers.CharField(allow_null=True, allow_blank=True)
unique_key = serializers.CharField(allow_null=True) unique_key = serializers.CharField(allow_null=True)
price = serializers.DecimalField(max_digits=14, decimal_places=2) price = serializers.DecimalField(max_digits=14, decimal_places=2, allow_null=True)
class Meta: class Meta:
model = models.Product model = models.Product

View File

@ -12,7 +12,7 @@ from gallery.tasks import delete_image
# JWT # JWT
# Login base view mixins # Login base view mixins
class JWTGenericViewMixin(generics.GenericAPIView): class JWTGenericViewMixin:
"""JWT view mixin""" """JWT view mixin"""
ACCESS_TOKEN_HTTP_ONLY = False ACCESS_TOKEN_HTTP_ONLY = False
@ -39,30 +39,31 @@ class JWTGenericViewMixin(generics.GenericAPIView):
""" """
COOKIES = [] COOKIES = []
if hasattr(self.request, 'locale'): if hasattr(self, 'request'):
COOKIES.append(self.COOKIE(key='locale', if hasattr(self.request, 'locale'):
value=self.request.locale, COOKIES.append(self.COOKIE(key='locale',
http_only=self.ACCESS_TOKEN_HTTP_ONLY, value=self.request.locale,
secure=self.LOCALE_SECURE, http_only=self.ACCESS_TOKEN_HTTP_ONLY,
max_age=settings.COOKIES_MAX_AGE if permanent else None)) secure=self.LOCALE_SECURE,
if hasattr(self.request, 'country_code'): max_age=settings.COOKIES_MAX_AGE if permanent else None))
COOKIES.append(self.COOKIE(key='country_code', if hasattr(self.request, 'country_code'):
value=self.request.country_code, COOKIES.append(self.COOKIE(key='country_code',
http_only=self.COUNTRY_CODE_HTTP_ONLY, value=self.request.country_code,
secure=self.COUNTRY_CODE_SECURE, http_only=self.COUNTRY_CODE_HTTP_ONLY,
max_age=settings.COOKIES_MAX_AGE if permanent else None)) secure=self.COUNTRY_CODE_SECURE,
if access_token: max_age=settings.COOKIES_MAX_AGE if permanent else None))
COOKIES.append(self.COOKIE(key='access_token', if access_token:
value=access_token, COOKIES.append(self.COOKIE(key='access_token',
http_only=self.ACCESS_TOKEN_HTTP_ONLY, value=access_token,
secure=self.ACCESS_TOKEN_SECURE, http_only=self.ACCESS_TOKEN_HTTP_ONLY,
max_age=settings.COOKIES_MAX_AGE if permanent else None)) secure=self.ACCESS_TOKEN_SECURE,
if refresh_token: max_age=settings.COOKIES_MAX_AGE if permanent else None))
COOKIES.append(self.COOKIE(key='refresh_token', if refresh_token:
value=refresh_token, COOKIES.append(self.COOKIE(key='refresh_token',
http_only=self.REFRESH_TOKEN_HTTP_ONLY, value=refresh_token,
secure=self.REFRESH_TOKEN_SECURE, http_only=self.REFRESH_TOKEN_HTTP_ONLY,
max_age=settings.COOKIES_MAX_AGE if permanent else None)) secure=self.REFRESH_TOKEN_SECURE,
max_age=settings.COOKIES_MAX_AGE if permanent else None))
return COOKIES return COOKIES
def _put_cookies_in_response(self, cookies: list, response: Response): def _put_cookies_in_response(self, cookies: list, response: Response):