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

This commit is contained in:
a.feteleu 2019-11-19 18:29:20 +03:00
commit 10579843af
11 changed files with 192 additions and 11 deletions

View File

@ -1,6 +1,7 @@
"""Back account serializers"""
from rest_framework import serializers
from account import models
from account.models import User
class RoleSerializer(serializers.ModelSerializer):
@ -18,4 +19,33 @@ class UserRoleSerializer(serializers.ModelSerializer):
fields = [
'user',
'role'
]
]
class BackUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
extra_kwargs = {
'password': {'write_only': True}
}
read_only_fields = ('old_password', 'last_login', 'date_joined')
def create(self, validated_data):
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user
class BackDetailUserSerializer(BackUserSerializer):
class Meta:
model = User
exclude = ('password',)
read_only_fields = ('old_password', 'last_login', 'date_joined')
def create(self, validated_data):
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
return user

View File

@ -99,6 +99,18 @@ class UserBaseSerializer(serializers.ModelSerializer):
read_only_fields = fields
class UserShortSerializer(UserSerializer):
"""Compact serializer for model User."""
class Meta(UserSerializer.Meta):
"""Meta class."""
fields = [
'id',
'fullname',
'email',
]
class ChangePasswordSerializer(serializers.ModelSerializer):
"""Serializer for model User."""

View File

@ -8,5 +8,6 @@ app_name = 'account'
urlpatterns = [
path('role/', views.RoleLstView.as_view(), name='role-list-create'),
path('user-role/', views.UserRoleLstView.as_view(), name='user-role-list-create'),
path('user/', views.UserLstView.as_view(), name='user-list-create'),
path('user/<int:id>/', views.UserRUDView.as_view(), name='user-rud'),
]

View File

@ -1,4 +1,7 @@
from rest_framework import generics
from django_filters.rest_framework import DjangoFilterBackend, filters
from rest_framework import generics, permissions
from account.models import User
from account.serializers import back as serializers
from account import models
@ -10,4 +13,28 @@ class RoleLstView(generics.ListCreateAPIView):
class UserRoleLstView(generics.ListCreateAPIView):
serializer_class = serializers.UserRoleSerializer
queryset = models.Role.objects.all()
queryset = models.Role.objects.all()
class UserLstView(generics.ListCreateAPIView):
"""User list create view."""
queryset = User.objects.all()
serializer_class = serializers.BackUserSerializer
permission_classes = (permissions.IsAdminUser,)
filter_backends = (DjangoFilterBackend, filters.OrderingFilter,)
filterset_fields = (
'email_confirmed',
'is_staff',
'is_active',
'is_superuser',
'roles',
)
ordering_fields = '__all__'
class UserRUDView(generics.RetrieveUpdateDestroyAPIView):
"""User RUD view."""
queryset = User.objects.all()
serializer_class = serializers.BackDetailUserSerializer
permission_classes = (permissions.IsAdminUser,)
lookup_field = 'id'

View File

@ -64,13 +64,18 @@ class CompanyInline(admin.TabularInline):
extra = 0
class EstablishmentNote(admin.TabularInline):
model = models.EstablishmentNote
extra = 0
@admin.register(models.Establishment)
class EstablishmentAdmin(BaseModelAdminMixin, admin.ModelAdmin):
"""Establishment admin."""
list_display = ['id', '__str__', 'image_tag', ]
search_fields = ['id', 'name', 'index_name', 'slug']
list_filter = ['public_mark', 'toque_number']
inlines = [GalleryImageInline, CompanyInline]
inlines = [GalleryImageInline, CompanyInline, EstablishmentNote]
# inlines = [
# AwardInline, ContactPhoneInline, ContactEmailInline,

View File

@ -9,15 +9,15 @@ from django.contrib.contenttypes import fields as generic
from django.contrib.gis.db.models.functions import Distance
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance as DistanceMeasure
from django.contrib.postgres.fields import ArrayField
from django.core.exceptions import ValidationError
from django.core.validators import MinValueValidator, MaxValueValidator
from django.db import models
from django.db.models import When, Case, F, ExpressionWrapper, Subquery, Q
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField
from timezone_field import TimeZoneField
from django.contrib.postgres.fields import ArrayField
from django.core.validators import MinValueValidator, MaxValueValidator
from collection.models import Collection
from location.models import Address

View File

@ -231,6 +231,12 @@ class Product(GalleryModelMixin, TranslatedFieldsMixin, BaseAttributes, HasTagsM
"""Override str dunder method."""
return f'{self.name}'
def delete(self, using=None, keep_parents=False):
"""Overridden delete method"""
# Delete all related notes
self.notes.all().delete()
return super().delete(using, keep_parents)
@property
def product_type_translated_name(self):
"""Get translated name of product type."""
@ -431,7 +437,7 @@ class ProductNote(ProjectBaseMixin):
old_id = models.PositiveIntegerField(null=True, blank=True)
text = models.TextField(verbose_name=_('text'))
product = models.ForeignKey(Product, on_delete=models.PROTECT,
related_name='product_notes',
related_name='notes',
verbose_name=_('product'))
user = models.ForeignKey('account.User', on_delete=models.PROTECT,
null=True,

View File

@ -7,6 +7,7 @@ from product import models
from product.serializers import ProductDetailSerializer, ProductTypeBaseSerializer, \
ProductSubTypeBaseSerializer
from tag.models import TagCategory
from account.serializers.common import UserShortSerializer
class ProductBackOfficeGallerySerializer(serializers.ModelSerializer):
@ -127,3 +128,55 @@ class ProductSubTypeBackOfficeDetailSerializer(ProductSubTypeBaseSerializer):
'name',
'index_name',
]
class ProductNoteBaseSerializer(serializers.ModelSerializer):
"""Serializer for model ProductNote."""
user_detail = UserShortSerializer(read_only=True, source='user')
class Meta:
"""Meta class."""
model = models.ProductNote
fields = [
'id',
'created',
'modified',
'text',
'user',
'user_detail',
'product',
]
extra_kwargs = {
'created': {'read_only': True},
'modified': {'read_only': True},
'product': {'required': False, 'write_only': True},
'user': {'required': False, 'write_only': True},
}
@property
def serializer_view(self):
"""Return view instance."""
return self.context.get('view')
class ProductNoteListCreateSerializer(ProductNoteBaseSerializer):
"""Serializer for List|Create action for model ProductNote."""
def create(self, validated_data):
"""Overridden create method."""
validated_data['user'] = self.user
validated_data['product'] = self.product
return super().create(validated_data)
@property
def user(self):
"""Return user instance from view."""
if self.serializer_view:
return self.serializer_view.request.user
@property
def product(self):
"""Return product instance from view."""
if self.serializer_view:
return self.serializer_view.get_object()

View File

@ -6,6 +6,8 @@ from product import views
urlpatterns = [
path('', views.ProductListCreateBackOfficeView.as_view(), name='list-create'),
path('<int:pk>/', views.ProductDetailBackOfficeView.as_view(), name='rud'),
path('<int:pk>/notes/', views.ProductNoteListCreateView.as_view(), name='note-list-create'),
path('<int:pk>/notes/<int:note_pk>/', views.ProductNoteRUDView.as_view(), name='note-rud'),
path('<int:pk>/gallery/', views.ProductBackOfficeGalleryListView.as_view(),
name='gallery-list'),
path('<int:pk>/gallery/<int:image_id>/', views.ProductBackOfficeGalleryCreateDestroyView.as_view(),

View File

@ -12,7 +12,7 @@ from utils.views import CreateDestroyGalleryViewMixin
class ProductBackOfficeMixinView(ProductBaseView):
"""Product back-office mixin view."""
permission_classes = (permissions.IsAuthenticated,)
permission_classes = (permissions.IsAuthenticated, )
def get_queryset(self):
"""Override get_queryset method."""
@ -135,3 +135,48 @@ class ProductSubTypeRUDBackOfficeView(BackOfficeListCreateMixin,
generics.RetrieveUpdateDestroyAPIView):
"""Product sub type back-office retrieve-update-destroy view."""
serializer_class = serializers.ProductSubTypeBackOfficeDetailSerializer
class ProductNoteListCreateView(ProductBackOfficeMixinView,
BackOfficeListCreateMixin,
generics.ListCreateAPIView):
"""Retrieve|Update|Destroy product note view."""
serializer_class = serializers.ProductNoteListCreateSerializer
def get_object(self):
"""Returns the object the view is displaying."""
product_qs = models.Product.objects.all()
filtered_product_qs = self.filter_queryset(product_qs)
product = get_object_or_404(filtered_product_qs, pk=self.kwargs['pk'])
# May raise a permission denied
self.check_object_permissions(self.request, product)
return product
def get_queryset(self):
"""Overridden get_queryset method."""
return self.get_object().notes.all()
class ProductNoteRUDView(ProductBackOfficeMixinView,
BackOfficeListCreateMixin,
generics.RetrieveUpdateDestroyAPIView):
"""Create|Retrieve|Update|Destroy product note view."""
serializer_class = serializers.ProductNoteBaseSerializer
def get_object(self):
"""Returns the object the view is displaying."""
product_qs = models.Product.objects.all()
filtered_product_qs = self.filter_queryset(product_qs)
product = get_object_or_404(filtered_product_qs, pk=self.kwargs['pk'])
note = get_object_or_404(product.notes.all(), pk=self.kwargs['note_pk'])
# May raise a permission denied
self.check_object_permissions(self.request, note)
return note

View File

@ -43,8 +43,8 @@ INSTALLED_APPS.append('transfer.apps.TransferConfig')
DATABASES.update({
'legacy': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '172.22.0.1',
# 'HOST': 'mysql_db',
# 'HOST': '172.22.0.1',
'HOST': 'mysql_db',
'PORT': 3306,
'NAME': 'dev',
'USER': 'dev',