Merge branch 'develop' into feature/permission_winery
This commit is contained in:
commit
bd567200c8
|
|
@ -1,3 +1,3 @@
|
|||
FROM mdillon/postgis:latest
|
||||
FROM mdillon/postgis:10
|
||||
RUN localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8
|
||||
ENV LANG ru_RU.utf8
|
||||
|
|
|
|||
|
|
@ -16,7 +16,24 @@ class RoleSerializer(serializers.ModelSerializer):
|
|||
class BackUserSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = User
|
||||
fields = '__all__'
|
||||
fields = (
|
||||
'id',
|
||||
'last_login',
|
||||
'is_superuser',
|
||||
'username',
|
||||
'last_name',
|
||||
'first_name',
|
||||
'is_active',
|
||||
'date_joined',
|
||||
'image_url',
|
||||
'cropped_image_url',
|
||||
'email',
|
||||
'email_confirmed',
|
||||
'unconfirmed_email',
|
||||
'email_confirmed',
|
||||
'newsletter',
|
||||
'roles',
|
||||
)
|
||||
extra_kwargs = {
|
||||
'password': {'write_only': True}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from rest_framework import generics, permissions
|
||||
from rest_framework.filters import OrderingFilter
|
||||
|
||||
from account import models
|
||||
from account.models import User
|
||||
|
|
@ -18,10 +19,10 @@ class UserRoleLstView(generics.ListCreateAPIView):
|
|||
|
||||
class UserLstView(generics.ListCreateAPIView):
|
||||
"""User list create view."""
|
||||
queryset = User.objects.all()
|
||||
queryset = User.objects.prefetch_related('roles')
|
||||
serializer_class = serializers.BackUserSerializer
|
||||
permission_classes = (permissions.IsAdminUser,)
|
||||
filter_backends = (DjangoFilterBackend,)
|
||||
filter_backends = (DjangoFilterBackend, OrderingFilter)
|
||||
filterset_fields = (
|
||||
'email_confirmed',
|
||||
'is_staff',
|
||||
|
|
@ -29,6 +30,14 @@ class UserLstView(generics.ListCreateAPIView):
|
|||
'is_superuser',
|
||||
'roles',
|
||||
)
|
||||
ordering_fields = (
|
||||
'email_confirmed',
|
||||
'is_staff',
|
||||
'is_active',
|
||||
'is_superuser',
|
||||
'roles',
|
||||
'last_login'
|
||||
)
|
||||
|
||||
|
||||
class UserRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
|
|
|
|||
|
|
@ -87,6 +87,42 @@ class Collection(ProjectBaseMixin, CollectionDateMixin,
|
|||
verbose_name = _('collection')
|
||||
verbose_name_plural = _('collections')
|
||||
|
||||
@property
|
||||
def _related_objects(self) -> list:
|
||||
"""Return list of related objects."""
|
||||
related_objects = []
|
||||
# get related objects
|
||||
for related_object in self._meta.related_objects:
|
||||
related_objects.append(related_object)
|
||||
return related_objects
|
||||
|
||||
@property
|
||||
def count_related_objects(self) -> int:
|
||||
"""Return count of related objects."""
|
||||
counter = 0
|
||||
# count of related objects
|
||||
for related_object in [related_object.name for related_object in self._related_objects]:
|
||||
counter += getattr(self, f'{related_object}').count()
|
||||
return counter
|
||||
|
||||
@property
|
||||
def related_object_names(self) -> list:
|
||||
"""Return related object names."""
|
||||
raw_object_names = []
|
||||
for related_object in [related_object.name for related_object in self._related_objects]:
|
||||
instances = getattr(self, f'{related_object}')
|
||||
if instances.exists():
|
||||
for instance in instances.all():
|
||||
raw_object_names.append(instance.slug if hasattr(instance, 'slug') else None)
|
||||
|
||||
# parse slugs
|
||||
object_names = []
|
||||
re_pattern = r'[\w]+'
|
||||
for raw_name in raw_object_names:
|
||||
result = re.findall(re_pattern, raw_name)
|
||||
if result: object_names.append(' '.join(result).capitalize())
|
||||
return set(object_names)
|
||||
|
||||
|
||||
class GuideTypeQuerySet(models.QuerySet):
|
||||
"""QuerySet for model GuideType."""
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ class CollectionBackOfficeSerializer(CollectionBaseSerializer):
|
|||
collection_type_display = serializers.CharField(
|
||||
source='get_collection_type_display', read_only=True)
|
||||
country = CountrySimpleSerializer(read_only=True)
|
||||
count_related_objects = serializers.IntegerField(read_only=True)
|
||||
related_object_names = serializers.ListField(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = models.Collection
|
||||
|
|
@ -36,6 +38,8 @@ class CollectionBackOfficeSerializer(CollectionBaseSerializer):
|
|||
'slug',
|
||||
'start',
|
||||
'end',
|
||||
'count_related_objects',
|
||||
'related_object_names',
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -114,10 +114,7 @@ class EstablishmentCommentListView(generics.ListAPIView):
|
|||
"""Override get_queryset method"""
|
||||
|
||||
establishment = get_object_or_404(models.Establishment, slug=self.kwargs['slug'])
|
||||
return comment_models.Comment.objects.by_content_type(app_label='establishment',
|
||||
model='establishment') \
|
||||
.by_object_id(object_id=establishment.pk) \
|
||||
.order_by('-created')
|
||||
return establishment.comments.order_by('-created')
|
||||
|
||||
|
||||
class EstablishmentCommentRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
|
|
|
|||
37
apps/main/management/commands/add_home_page_carousel.py
Normal file
37
apps/main/management/commands/add_home_page_carousel.py
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
from tqdm import tqdm
|
||||
|
||||
from establishment.models import Establishment
|
||||
from main.models import Carousel
|
||||
from transfer.models import HomePages
|
||||
from location.models import Country
|
||||
from django.db.models import F
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Add establishment form HomePage to Carousel!'''
|
||||
|
||||
@staticmethod
|
||||
def get_country(country_code):
|
||||
return Country.objects.filter(code__iexact=country_code).first()
|
||||
|
||||
def handle(self, *args, **kwargs):
|
||||
objects = []
|
||||
deleted = 0
|
||||
hp_list = HomePages.objects.annotate(
|
||||
country=F('site__country_code_2'),
|
||||
).all()
|
||||
for hm in tqdm(hp_list, desc='Add home_page.establishments to carousel'):
|
||||
est = Establishment.objects.filter(old_id=hm.selection_of_week).first()
|
||||
if est:
|
||||
if est.carousels.exists():
|
||||
est.carousels.all().delete()
|
||||
deleted += 1
|
||||
carousel = Carousel(
|
||||
content_object=est,
|
||||
country=self.get_country(hm.country)
|
||||
)
|
||||
objects.append(carousel)
|
||||
Carousel.objects.bulk_create(objects)
|
||||
self.stdout.write(
|
||||
self.style.WARNING(f'Created {len(objects)}/Deleted {deleted} carousel objects.'))
|
||||
|
|
@ -60,10 +60,7 @@ class ProductCommentListView(generics.ListAPIView):
|
|||
def get_queryset(self):
|
||||
"""Override get_queryset method"""
|
||||
product = get_object_or_404(Product, slug=self.kwargs['slug'])
|
||||
return Comment.objects.by_content_type(app_label='product',
|
||||
model='product') \
|
||||
.by_object_id(object_id=product.pk) \
|
||||
.order_by('-created')
|
||||
return product.comments.order_by('-created')
|
||||
|
||||
|
||||
class ProductCommentRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
|
|
|
|||
|
|
@ -1000,7 +1000,7 @@ class ProductNotes(MigrateMixin):
|
|||
db_table = 'product_notes'
|
||||
|
||||
|
||||
class HomePages(models.Model):
|
||||
class HomePages(MigrateMixin):
|
||||
using = 'legacy'
|
||||
|
||||
site = models.ForeignKey(Sites, models.DO_NOTHING, blank=True, null=True)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
"""Custom middleware."""
|
||||
from django.utils import translation
|
||||
from django.utils import translation, timezone
|
||||
from account.models import User
|
||||
|
||||
from configuration.models import TranslationSettings
|
||||
from translation.models import Language
|
||||
|
|
@ -12,6 +13,14 @@ def get_locale(cookie_dict):
|
|||
def get_country_code(cookie_dict):
|
||||
return cookie_dict.get('country_code')
|
||||
|
||||
def user_last_visit(get_response):
|
||||
"""Updates user last visit w/ current"""
|
||||
def middleware(request):
|
||||
response = get_response(request)
|
||||
if request.user.is_authenticated:
|
||||
User.objects.filter(pk=request.user.pk).update(last_login=timezone.now())
|
||||
return response
|
||||
return middleware
|
||||
|
||||
def parse_cookies(get_response):
|
||||
"""Parse cookies."""
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
./manage.py transfer -a
|
||||
./manage.py transfer -d
|
||||
./manage.py transfer -e
|
||||
./manage.py transfer -n
|
||||
./manage.py rm_empty_images # команда для удаления картинок с относительным урлом из news.description
|
||||
./manage.py upd_transportation
|
||||
./manage.py transfer --fill_city_gallery
|
||||
./manage.py transfer -l
|
||||
|
|
|
|||
|
|
@ -118,6 +118,7 @@ MIDDLEWARE = [
|
|||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'utils.middleware.parse_cookies',
|
||||
'utils.middleware.user_last_visit',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'project.urls'
|
||||
|
|
@ -524,3 +525,6 @@ INTERNATIONAL_COUNTRY_CODES = ['www', 'main', 'next']
|
|||
THUMBNAIL_ENGINE = 'utils.thumbnail_engine.GMEngine'
|
||||
|
||||
COOKIE_DOMAIN = None
|
||||
|
||||
ELASTICSEARCH_DSL = {}
|
||||
ELASTICSEARCH_INDEX_NAMES = {}
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ DATABASES = {
|
|||
'HOST': os.environ.get('DB_HOSTNAME'),
|
||||
'PORT': os.environ.get('DB_PORT'),
|
||||
'OPTIONS': {
|
||||
'options': '-c search_path=gm'
|
||||
'options': '-c search_path=gm,public'
|
||||
},
|
||||
},
|
||||
'legacy': {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user