refactored product, fix transfer and etc., see changelist
This commit is contained in:
parent
a2a8b2927f
commit
617552841f
|
|
@ -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,)
|
||||||
|
|
|
||||||
|
|
@ -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,)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
30
apps/product/migrations/0018_purchasedproduct.py
Normal file
30
apps/product/migrations/0018_purchasedproduct.py
Normal 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')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user