Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	apps/collection/urls/common.py
This commit is contained in:
Anatoly 2019-08-28 11:50:15 +03:00
commit 0f6147c1dc
45 changed files with 344 additions and 129 deletions

View File

@ -6,6 +6,6 @@ from account.views import common as views
app_name = 'account'
urlpatterns = [
path('user/', views.UserView.as_view(), name='user_get_update'),
path('device/', views.FCMDeviceViewSet.as_view(), name='fcm_device_create'),
path('user/', views.UserView.as_view(), name='user-get-update'),
]

View File

@ -6,5 +6,5 @@ from advertisement.views import web as views
app_name = 'advertisement'
urlpatterns = [
path('list/', views.AdvertisementListView.as_view(), name='advertisements_list')
path('', views.AdvertisementListView.as_view(), name='list')
]

View File

@ -6,36 +6,7 @@ from collection.views import common as views
app_name = 'collection'
urlpatterns = [
path('list/', views.CollectionListView.as_view(),
name='collections_list'),
path('create/', views.CollectionCreateView.as_view(),
name='collection_create'),
# path('<int:pk>/', views.CollectionRetrieveView.as_view(),
# name='collection_retrieve'),
# path('<int:pk>/delete/', views.CollectionDestroyView.as_view(),
# name='collection_destroy'),
# path('<int:pk>/update/', views.CollectionUpdateView.as_view(),
# name='collection_update'),
path('collection_items/', views.CollectionItemListView.as_view(),
name='collection_items_list'),
# path('collection_items/create/', views.CollectionItemCreateView.as_view(),
# name='collection_items_create'),
# path('collection_items/<int:pk>/', views.CollectionItemRetrieveView.as_view(),
# name='collection_items_retrieve'),
# path('collection_items/<int:pk>/delete/', views.CollectionDestroyView.as_view(),
# name='collection_items_destroy'),
# path('collection_items/<int:pk>/update/', views.CollectionItemUpdateView.as_view(),
# name='collection_items_update'),
path('guides/', views.GuideListView.as_view(),
name='guides_list'),
# path('guides/create/', views.GuideCreateView.as_view(),
# name='guide_create'),
# path('guides/<int:pk>/', views.GuideRetrieveView.as_view(),
# name='guide_retrieve'),
# path('guides/<int:pk>/delete/', views.GuideDestroyView.as_view(),
# name='guide_destroy'),
# path('guides/<int:pk>/update/', views.GuideUpdateView.as_view(),
# name='guide_update'),
path('', views.CollectionListView.as_view(), name='list'),
path('items/', views.CollectionItemListView.as_view(), name='collection-items-list'),
path('guides/', views.GuideListView.as_view(), name='guides-list'),
]

View File

@ -1,4 +1,26 @@
"""Establishment admin conf."""
from django.contrib import admin
from establishment import models
from django.contrib.contenttypes.admin import GenericTabularInline
from main.models import Award
# Register your models here.
@admin.register(models.EstablishmentType)
class EstablishmentTypeAdmin(admin.ModelAdmin):
"""EstablishmentType admin."""
@admin.register(models.EstablishmentSubType)
class EstablishmentSubTypeAdmin(admin.ModelAdmin):
"""EstablishmentSubType admin."""
class AwardInline(GenericTabularInline):
model = Award
extra = 0
@admin.register(models.Establishment)
class EstablishmentAdmin(admin.ModelAdmin):
"""Establishment admin."""
inlines = [AwardInline, ]

View File

@ -5,6 +5,7 @@ from django.db import models
from django.utils.translation import gettext_lazy as _
from location.models import Address
from utils.models import ProjectBaseMixin, ImageMixin, LocaleManagerMixin
from django.contrib.contenttypes import fields as generic
# todo: establishment type&subtypes check
@ -91,6 +92,7 @@ class Establishment(ProjectBaseMixin, ImageMixin):
price_level = models.PositiveIntegerField(blank=True, null=True,
default=None,
verbose_name=_('Price level'))
awards = generic.GenericRelation(to='main.Award')
objects = EstablishmentManager()

View File

@ -6,6 +6,5 @@ from . import views
app_name = 'gallery'
urlpatterns = [
path('upload/', views.ImageUploadView.as_view(),
name='upload_image')
path('upload/', views.ImageUploadView.as_view(), name='upload-image')
]

View File

@ -6,25 +6,15 @@ from location import views
app_name = 'location'
urlpatterns = [
path('country/', views.CountryListView.as_view(), name='country-list'),
path('country/<int:pk>/', views.CountryRetrieveView.as_view(),
name='country-retrieve'),
path('addresses/', views.AddressListView.as_view(), name='address-list'),
path('addresses/<int:pk>/', views.AddressRetrieveView.as_view(), name='address-retrieve'),
path('region/', views.RegionListView.as_view(), name='region_list'),
path('region/create/', views.RegionCreateView.as_view(), name='region_create'),
path('region/<int:pk>/', views.RegionRetrieveView.as_view(), name='region_retrieve'),
path('region/<int:pk>/delete/', views.RegionDestroyView.as_view(), name='region_destroy'),
path('region/<int:pk>/update/', views.RegionUpdateView.as_view(), name='region_update'),
path('cities/', views.CityListView.as_view(), name='city-list'),
path('cities/<int:pk>/', views.CityRetrieveView.as_view(), name='city-retrieve'),
path('city/', views.CityListView.as_view(), name='city_list'),
path('city/create/', views.CityCreateView.as_view(), name='city_create'),
path('city/<int:pk>/', views.CityRetrieveView.as_view(), name='city_retrieve'),
path('city/<int:pk>/delete/', views.CityDestroyView.as_view(), name='city_destroy'),
path('city/<int:pk>/update/', views.CityUpdateView.as_view(), name='city_update'),
path('countries/', views.CountryListView.as_view(), name='country-list'),
path('countries/<int:pk>/', views.CountryRetrieveView.as_view(), name='country-retrieve'),
path('address/', views.AddressListView.as_view(), name='address_list'),
path('address/create/', views.AddressCreateView.as_view(), name='address_create'),
path('address/<int:pk>/', views.AddressRetrieveView.as_view(), name='address_retrieve'),
path('address/<int:pk>/delete/', views.AddressDestroyView.as_view(), name='address_destroy'),
path('address/<int:pk>/update/', views.AddressUpdateView.as_view(), name='address_update'),
path('regions/', views.RegionListView.as_view(), name='region-list'),
path('regions/<int:pk>/', views.RegionRetrieveView.as_view(), name='region-retrieve'),
]

View File

@ -11,3 +11,15 @@ class SiteSettingsAdmin(admin.ModelAdmin):
@admin.register(models.Feature)
class FeatureAdmin(admin.ModelAdmin):
"""Feature admin conf."""
@admin.register(models.AwardType)
class AwardTypeAdmin(admin.ModelAdmin):
"""Award type admin conf."""
@admin.register(models.Award)
class AwardAdmin(admin.ModelAdmin):
"""Award admin conf."""
# list_display = ['id', '__str__']
# list_display_links = ['id', '__str__']

View File

@ -0,0 +1,35 @@
# Generated by Django 2.2.4 on 2019-08-27 13:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('location', '0005_auto_20190822_1144'),
('contenttypes', '0002_remove_content_type_name'),
('main', '0006_auto_20190822_1118'),
]
operations = [
migrations.CreateModel(
name='AwardType',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='name')),
('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='location.Country', verbose_name='country')),
],
),
migrations.CreateModel(
name='Award',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(default='', max_length=255, verbose_name='title')),
('vintage_year', models.CharField(default='', max_length=255, verbose_name='vintage year')),
('object_id', models.PositiveIntegerField()),
('award_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.AwardType')),
('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')),
],
),
]

View File

@ -0,0 +1,14 @@
# Generated by Django 2.2.4 on 2019-08-27 14:33
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0007_award_awardtype'),
('main', '0007_sitefeature_main'),
]
operations = [
]

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.4 on 2019-08-28 07:03
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0008_merge_20190827_1433'),
]
operations = [
migrations.RemoveField(
model_name='award',
name='title',
),
]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.4 on 2019-08-28 07:05
import django.contrib.postgres.fields.jsonb
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('main', '0009_remove_award_title'),
]
operations = [
migrations.AddField(
model_name='award',
name='title',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=None, help_text='{"en":"some text"}', null=True, verbose_name='title'),
),
]

View File

@ -1,9 +1,10 @@
"""Main app models."""
from django.conf import settings
from django.contrib.contenttypes import fields as generic
from django.contrib.postgres.fields import JSONField
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from location.models import Country
from main import methods
from utils.models import ProjectBaseMixin
@ -182,3 +183,32 @@ class SiteFeature(ProjectBaseMixin):
verbose_name = _('Site feature')
verbose_name_plural = _('Site features')
unique_together = ('site_settings', 'feature')
class Award(models.Model):
"""Award model."""
award_type = models.ForeignKey('main.AwardType', on_delete=models.CASCADE)
title = JSONField(
_('title'), null=True, blank=True,
default=None, help_text='{"en":"some text"}')
vintage_year = models.CharField(_('vintage year'), max_length=255, default='')
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def __str__(self):
title = 'None'
if self.title and 'en' in self.title:
title = self.title['en']
return f'id:{self.id}-{title}'
class AwardType(models.Model):
"""AwardType model."""
country = models.ForeignKey(
'location.Country', verbose_name=_('country'), on_delete=models.CASCADE)
name = models.CharField(_('name'), max_length=255)
def __str__(self):
return self.name

View File

@ -68,3 +68,15 @@ class SiteSettingsSerializer(serializers.ModelSerializer):
# 'site_settings',
# 'feature',
# )
class AwardSerializer(serializers.ModelSerializer):
"""Award serializer."""
class Meta:
model = models.Award
fields = [
# 'title',
'award_type',
'vintage_year',
]

View File

@ -5,16 +5,8 @@ from main import views
app = 'main'
urlpatterns = [
path('determine-site/', views.DetermineSiteView.as_view(),
name='determine-site'),
path('site-settings/<subdomain>/', views.SiteSettingsView.as_view(),
name='site-settings', ),
# path('features/', views.FeaturesLCView.as_view(),
# name='features-lc'),
# path('features/<int:pk>/', views.FeaturesRUDView.as_view(),
# name='features-rud'),
# path('site-features/', views.SiteFeaturesLCView.as_view(),
# name='site-features-lc'),
# path('site-features/<int:pk>/', views.SiteFeaturesRUDView.as_view(),
# name='site-features-rud'),
path('determine-site/', views.DetermineSiteView.as_view(), name='determine-site'),
path('site-settings/<subdomain>/', views.SiteSettingsView.as_view(), name='site-settings'),
path('awards/', views.AwardView.as_view(), name='awards_list'),
path('awards/<int:pk>/', views.AwardRetrieveView.as_view(), name='awards_retrieve'),
]

View File

@ -60,3 +60,17 @@ class SiteSettingsView(generics.RetrieveAPIView):
# class SiteFeaturesRUDView(SiteFeaturesViewMixin,
# generics.RetrieveUpdateDestroyAPIView):
# """Site features RUD."""
class AwardView(generics.ListAPIView):
"""Awards list view."""
serializer_class = serializers.AwardSerializer
queryset = models.Award.objects.all()
permission_classes = (permissions.AllowAny, )
class AwardRetrieveView(generics.RetrieveAPIView):
"""Award retrieve view."""
serializer_class = serializers.AwardSerializer
queryset = models.Award.objects.all()
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

View File

@ -1,6 +1,7 @@
from django.contrib.postgres.fields import JSONField
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.utils.translation import get_language
from utils.models import (ProjectBaseMixin, BaseAttributes,
LocaleManagerMixin, ImageMixin)
@ -80,3 +81,8 @@ class News(BaseAttributes):
def __str__(self):
return f'news: {self.id}'
@property
def test_trans(self):
language = get_language()
return self.title.get(language)

View File

@ -6,10 +6,7 @@ from news.views import common
app_name = 'news'
urlpatterns = [
path('', common.NewsList.as_view(), name='news_list'),
path('create/', common.NewsCreate.as_view(), name='news_create'),
path('<int:pk>/', common.NewsDetail.as_view(), name='news_detail'),
path('<int:pk>/update/', common.NewsUpdate.as_view(), name='news_update'),
path('<int:pk>/delete/', common.NewsDelete.as_view(), name='news_delete'),
path('type/', common.NewsTypeList.as_view(), name='news_type'),
path('', common.NewsListView.as_view(), name='list'),
path('<int:pk>/', common.NewsDetailView.as_view(), name='rud'),
path('type/', common.NewsTypeListView.as_view(), name='type'),
]

View File

@ -16,7 +16,7 @@ class NewsViewMixin(JWTGenericViewMixin):
return News.objects.annotate_localized_fields(locale=self.request.locale)
class NewsList(NewsViewMixin, JWTListAPIView):
class NewsListView(NewsViewMixin, JWTListAPIView):
"""News list view."""
permission_classes = (permissions.AllowAny, )
serializer_class = serializers.NewsSerializer
@ -30,32 +30,20 @@ class NewsList(NewsViewMixin, JWTListAPIView):
.order_by('-is_highlighted', '-created')
class NewsCreate(generics.CreateAPIView):
"""News list view."""
queryset = News.objects.all()
permission_classes = (permissions.IsAuthenticated, )
serializer_class = serializers.NewsCreateUpdateSerializer
# class NewsCreateView(generics.CreateAPIView):
# """News list view."""
# queryset = News.objects.all()
# permission_classes = (permissions.IsAuthenticated, )
# serializer_class = serializers.NewsCreateUpdateSerializer
class NewsDetail(NewsViewMixin, generics.RetrieveAPIView):
class NewsDetailView(NewsViewMixin, generics.RetrieveAPIView):
"""News detail view."""
permission_classes = (permissions.AllowAny, )
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
serializer_class = serializers.NewsSerializer
class NewsDelete(generics.DestroyAPIView):
"""News delete view."""
queryset = News.objects.all()
permission_classes = (permissions.IsAuthenticated, )
class NewsUpdate(NewsViewMixin, generics.UpdateAPIView):
"""News update view."""
permission_classes = (permissions.IsAuthenticated, )
serializer_class = serializers.NewsCreateUpdateSerializer
class NewsTypeList(generics.ListAPIView):
class NewsTypeListView(generics.ListAPIView):
"""NewsType list view."""
serializer_class = serializers.NewsTypeSerializer
permission_classes = (permissions.AllowAny, )

View File

@ -6,6 +6,5 @@ from partner.views import common as views
app_name = 'partner'
urlpatterns = [
path('list/', views.PartnerListView.as_view(),
name='partner_list')
path('', views.PartnerListView.as_view(), name='list')
]

View File

3
apps/products/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

8
apps/products/apps.py Normal file
View File

@ -0,0 +1,8 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ProductsConfig(AppConfig):
"""Products model."""
name = 'products'
verbose_name = _('products')

View File

63
apps/products/models.py Normal file
View File

@ -0,0 +1,63 @@
# from django.contrib.postgres.fields import JSONField
# from django.db import models
# from django.utils.translation import gettext_lazy as _
#
# from utils.models import BaseAttributes
#
#
# class ProductManager(models.Manager):
# """Product manager."""
#
#
# class ProductQuerySet(models.QuerySet):
# """Product queryset."""
#
#
# class Product(BaseAttributes):
# """Product models."""
# name = models.CharField(_('name'), max_length=255)
# country = models.ForeignKey('location.Country', on_delete=models.CASCADE)
# region = models.ForeignKey('location.Region', on_delete=models.CASCADE)
# # ASK: What is the "subregion"
#
# description = JSONField(_('description'))
# characteristics = JSONField(_('characteristics'))
# metadata_values = JSONField(_('metadata_values'))
# # common_relations_id
# # product_region_id
# code = models.CharField(_('code'), max_length=255)
# available = models.BooleanField(_('available'))
#
# # dealer_type
# # target_scope
# # target_type
# # rank
# # excluding_tax_unit_price
# # column_21
# # currencies_id
# # vintage
# # producer_price
# # producer_description
# # annual_produced_quantity
# # production_method_description
# # unit_name
# # unit
# # unit_values
# # organic_source
# # certificates
# # establishments_id
# # restrictions
# #
# objects = ProductManager.from_queryset(ProductQuerySet)()
#
# class Meta:
# verbose_name = _('product')
# verbose_name_plural = _('products')
#
#
# class ProductType(models.Model):
# """ProductType model."""
#
# class Meta:
# verbose_name_plural = _('product types')
# verbose_name = _('product type')

View File

View File

@ -0,0 +1 @@
from rest_framework import serializers

View File

View File

3
apps/products/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

View File

View File

View File

View File

View File

View File

View File

@ -0,0 +1 @@
# Create your views here.

View File

View File

@ -5,12 +5,9 @@ from translation import views
app_name = 'translation'
urlpatterns = [
path('languages/', views.LanguageListCreateView.as_view(),
name='languages'),
path('languages/<int:pk>/', views.LanguageRetrieveUpdateDestroyView.as_view(),
name='language'),
path('site/', views.SiteInterfaceDictionaryView.as_view(),
name='site-interface'),
path('site/<int:pk>/', views.SiteInterfaceDictionaryRUDView.as_view(),
path('languages/', views.LanguageListView.as_view(), name='languages'),
path('languages/<int:pk>/', views.LanguageRetrieveView.as_view(), name='language'),
path('site/', views.SiteInterfaceDictionaryView.as_view(), name='site-interface'),
path('site/<int:pk>/', views.SiteInterfaceDictionaryRetrieveView.as_view(),
name='site-interface-rud'),
]

View File

@ -14,15 +14,14 @@ class LanguageViewMixin(generics.GenericAPIView):
# Views
class LanguageListCreateView(LanguageViewMixin, generics.ListCreateAPIView):
class LanguageListView(LanguageViewMixin, generics.ListAPIView):
"""List view for model Language"""
pagination_class = None
permission_classes = (permissions.IsAuthenticatedOrReadOnly, )
class LanguageRetrieveUpdateDestroyView(LanguageViewMixin,
generics.RetrieveUpdateDestroyAPIView):
class LanguageRetrieveView(LanguageViewMixin, generics.RetrieveAPIView):
"""Retrieve, Update, Destroy view for model Language"""
@ -37,7 +36,7 @@ class SiteInterfaceDictionaryMixin:
class SiteInterfaceDictionaryView(JWTGenericViewMixin,
SiteInterfaceDictionaryMixin,
generics.ListCreateAPIView):
generics.ListAPIView):
"""Site interface dictionary LC view."""
pagination_class = None
@ -46,9 +45,9 @@ class SiteInterfaceDictionaryView(JWTGenericViewMixin,
filter_fields = ['page', 'keywords']
class SiteInterfaceDictionaryRUDView(JWTGenericViewMixin,
SiteInterfaceDictionaryMixin,
generics.RetrieveUpdateDestroyAPIView):
class SiteInterfaceDictionaryRetrieveView(JWTGenericViewMixin,
SiteInterfaceDictionaryMixin,
generics.RetrieveAPIView):
"""Site interface dictionary RUD view."""
permission_classes = (permissions.AllowAny,)

View File

@ -20,7 +20,7 @@ from django.urls import path, include, re_path
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework import permissions
from account.views.common import FCMDeviceViewSet
# Docs urls
schema_view = get_schema_view(
@ -48,22 +48,13 @@ urlpatterns_doc = [
name='schema-redoc'),
]
# API urls
urlpatterns_auth = [
path('api/auth/', include('authorization.urls.common')),
]
api_urlpatterns = [
path('gallery/', include(('gallery.urls', 'gallery'),
namespace='gallery')),
path('location/', include(('location.urls', 'location'),
namespace='location')),
path('main/', include(('main.urls', 'main'),
namespace='main')),
path('translation/', include(('translation.urls', 'translation'),
namespace='translation')),
path('web/', include(('project.urls.web', 'web'),
namespace='web')),
path('auth/', include('authorization.urls.common')),
path('device/', FCMDeviceViewSet.as_view(), name='fcm-device-create'),
path('web/', include(('project.urls.web', 'web'), namespace='web')),
path('back/', include(('project.urls.back', 'back'), namespace='back')),
path('mobile/', include(('project.urls.mobile', 'mobile'), namespace='mobile')),
]
urlpatterns = [
@ -72,9 +63,7 @@ urlpatterns = [
]
urlpatterns = urlpatterns + \
urlpatterns_auth + \
static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
if settings.DEBUG:
urlpatterns.extend(urlpatterns_doc)

14
project/urls/back.py Normal file
View File

@ -0,0 +1,14 @@
from django.urls import path, include
app_name = 'back'
urlpatterns = [
path('gallery/', include(('gallery.urls', 'gallery'),
namespace='gallery')),
# path('account/', include('account.urls.web')),
# path('advertisement/', include('advertisement.urls.web')),
# path('collection/', include('collection.urls.web')),
# path('establishments/', include('establishment.urls.web')),
# path('news/', include('news.urls.web')),
# path('partner/', include('partner.urls.web')),
]

12
project/urls/mobile.py Normal file
View File

@ -0,0 +1,12 @@
from django.urls import path, include
app_name = 'mobile'
urlpatterns = [
# path('account/', include('account.urls.web')),
# path('advertisement/', include('advertisement.urls.web')),
# path('collection/', include('collection.urls.web')),
# path('establishments/', include('establishment.urls.web')),
# path('news/', include('news.urls.web')),
# path('partner/', include('partner.urls.web')),
]

View File

@ -24,4 +24,10 @@ urlpatterns = [
path('establishments/', include('establishment.urls.web')),
path('news/', include('news.urls.web')),
path('partner/', include('partner.urls.web')),
path('location/', include(('location.urls', 'location'),
namespace='location')),
path('main/', include(('main.urls', 'main'),
namespace='main')),
path('translation/', include(('translation.urls', 'translation'),
namespace='translation')),
]