From b5c50ff730b58f34e1b2633d768c589374d8a6d0 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 09:55:45 +0300 Subject: [PATCH 1/8] fixed serializers --- apps/collection/serializers/common.py | 21 ++++++++++++++++++--- apps/collection/urls/common.py | 4 ++-- apps/gallery/serializers.py | 1 + apps/news/serializers/common.py | 4 +++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/apps/collection/serializers/common.py b/apps/collection/serializers/common.py index 26c66f0c..a4ffc70a 100644 --- a/apps/collection/serializers/common.py +++ b/apps/collection/serializers/common.py @@ -1,20 +1,35 @@ from rest_framework import serializers from collection import models +from gallery import models as gallery_models class CollectionSerializer(serializers.ModelSerializer): """Collection serializer""" - image = serializers.URLField(source='image.get_image_url') + filters = serializers.JSONField(required=True) + selectors = serializers.JSONField(required=True) + targets = serializers.JSONField(required=True) + block_size = serializers.JSONField(required=True) + image = serializers.PrimaryKeyRelatedField( + queryset=gallery_models.Image.objects.all(), required=True) + is_publish = serializers.BooleanField(required=True) + on_top = serializers.BooleanField(required=True) class Meta: model = models.Collection fields = [ 'id', 'name', - 'block_size', + 'start', + 'end', 'image', - 'on_top' + 'is_publish', + 'on_top', + 'filters', + 'selectors', + 'targets', + 'country', + 'block_size', ] diff --git a/apps/collection/urls/common.py b/apps/collection/urls/common.py index a1d98efc..eab4a277 100644 --- a/apps/collection/urls/common.py +++ b/apps/collection/urls/common.py @@ -8,8 +8,8 @@ app_name = 'collection' urlpatterns = [ path('list/', views.CollectionListView.as_view(), name='collections_list'), - # path('create/', views.CollectionCreateView.as_view(), - # name='collection_create'), + path('create/', views.CollectionCreateView.as_view(), + name='collection_create'), # path('/', views.CollectionRetrieveView.as_view(), # name='collection_retrieve'), # path('/delete/', views.CollectionDestroyView.as_view(), diff --git a/apps/gallery/serializers.py b/apps/gallery/serializers.py index da4f03f8..a3176b79 100644 --- a/apps/gallery/serializers.py +++ b/apps/gallery/serializers.py @@ -10,5 +10,6 @@ class ImageSerializer(serializers.ModelSerializer): """Meta class""" model = models.Image fields = ( + 'id', 'image', ) diff --git a/apps/news/serializers/common.py b/apps/news/serializers/common.py index de99cc81..45ba5945 100644 --- a/apps/news/serializers/common.py +++ b/apps/news/serializers/common.py @@ -1,5 +1,6 @@ from rest_framework import serializers +from gallery import models as gallery_models from location.models import Address from location.serializers import AddressSerializer from news import models @@ -51,7 +52,8 @@ class NewsCreateUpdateSerializer(NewsSerializer): title = serializers.JSONField() subtitle = serializers.JSONField() description = serializers.JSONField() - image = serializers.ImageField(required=True) + image = serializers.PrimaryKeyRelatedField( + queryset=gallery_models.Image.objects.all(), required=True,) news_type = serializers.PrimaryKeyRelatedField( queryset=models.NewsType.objects.all(), write_only=True) address = serializers.PrimaryKeyRelatedField( From 262e98b9e13627e9a1d353dcd3f642f34cc512a2 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Wed, 28 Aug 2019 10:15:17 +0300 Subject: [PATCH 2/8] add awards --- apps/establishment/admin.py | 16 ++++- apps/establishment/models.py | 2 + apps/main/admin.py | 12 ++++ apps/main/migrations/0007_award_awardtype.py | 35 +++++++++++ .../migrations/0008_merge_20190827_1433.py | 14 +++++ .../migrations/0009_remove_award_title.py | 17 +++++ apps/main/migrations/0010_award_title.py | 19 ++++++ apps/main/models.py | 29 ++++++++- apps/main/serializers.py | 12 ++++ apps/main/urls.py | 2 + apps/main/views.py | 14 +++++ apps/news/models.py | 6 ++ apps/products/__init__.py | 0 apps/products/admin.py | 3 + apps/products/apps.py | 8 +++ apps/products/migrations/__init__.py | 0 apps/products/models.py | 63 +++++++++++++++++++ apps/products/serializers/__init__.py | 0 apps/products/serializers/common.py | 1 + apps/products/serializers/mobile.py | 0 apps/products/serializers/web.py | 0 apps/products/tests.py | 3 + apps/products/urls/__init__.py | 0 apps/products/urls/common.py | 0 apps/products/urls/mobile.py | 0 apps/products/urls/web.py | 0 apps/products/views/__init__.py | 0 apps/products/views/common.py | 0 apps/products/views/mobile.py | 0 apps/products/views/views.py | 1 + apps/products/views/web.py | 0 31 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 apps/main/migrations/0007_award_awardtype.py create mode 100644 apps/main/migrations/0008_merge_20190827_1433.py create mode 100644 apps/main/migrations/0009_remove_award_title.py create mode 100644 apps/main/migrations/0010_award_title.py create mode 100644 apps/products/__init__.py create mode 100644 apps/products/admin.py create mode 100644 apps/products/apps.py create mode 100644 apps/products/migrations/__init__.py create mode 100644 apps/products/models.py create mode 100644 apps/products/serializers/__init__.py create mode 100644 apps/products/serializers/common.py create mode 100644 apps/products/serializers/mobile.py create mode 100644 apps/products/serializers/web.py create mode 100644 apps/products/tests.py create mode 100644 apps/products/urls/__init__.py create mode 100644 apps/products/urls/common.py create mode 100644 apps/products/urls/mobile.py create mode 100644 apps/products/urls/web.py create mode 100644 apps/products/views/__init__.py create mode 100644 apps/products/views/common.py create mode 100644 apps/products/views/mobile.py create mode 100644 apps/products/views/views.py create mode 100644 apps/products/views/web.py diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 0562fb8e..297386c8 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -1,4 +1,18 @@ """Establishment admin conf.""" from django.contrib import admin +from establishment import models -# Register your models here. + +@admin.register(models.EstablishmentType) +class EstablishmentTypeAdmin(admin.ModelAdmin): + """EstablishmentType admin.""" + + +@admin.register(models.EstablishmentSubType) +class EstablishmentSubTypeAdmin(admin.ModelAdmin): + """EstablishmentSubType admin.""" + + +@admin.register(models.Establishment) +class EstablishmentAdmin(admin.ModelAdmin): + """Establishment admin.""" diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 67a6b6ce..26a3a87d 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -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() diff --git a/apps/main/admin.py b/apps/main/admin.py index ab34c8dc..1666511d 100644 --- a/apps/main/admin.py +++ b/apps/main/admin.py @@ -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__'] diff --git a/apps/main/migrations/0007_award_awardtype.py b/apps/main/migrations/0007_award_awardtype.py new file mode 100644 index 00000000..130549f2 --- /dev/null +++ b/apps/main/migrations/0007_award_awardtype.py @@ -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')), + ], + ), + ] diff --git a/apps/main/migrations/0008_merge_20190827_1433.py b/apps/main/migrations/0008_merge_20190827_1433.py new file mode 100644 index 00000000..aea59504 --- /dev/null +++ b/apps/main/migrations/0008_merge_20190827_1433.py @@ -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 = [ + ] diff --git a/apps/main/migrations/0009_remove_award_title.py b/apps/main/migrations/0009_remove_award_title.py new file mode 100644 index 00000000..b0c50bc9 --- /dev/null +++ b/apps/main/migrations/0009_remove_award_title.py @@ -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', + ), + ] diff --git a/apps/main/migrations/0010_award_title.py b/apps/main/migrations/0010_award_title.py new file mode 100644 index 00000000..d09784a9 --- /dev/null +++ b/apps/main/migrations/0010_award_title.py @@ -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'), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 5b41d75b..47e41397 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -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,29 @@ 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) diff --git a/apps/main/serializers.py b/apps/main/serializers.py index 372e1b68..73ec941b 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -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', + ] \ No newline at end of file diff --git a/apps/main/urls.py b/apps/main/urls.py index 10379c3a..d9c441b6 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -17,4 +17,6 @@ urlpatterns = [ # name='site-features-lc'), # path('site-features//', views.SiteFeaturesRUDView.as_view(), # name='site-features-rud'), + path('awards/', views.AwardView.as_view(), name='awards_list', ), + path('awards//', views.AwardRetrieveView.as_view(), name='awards_retrieve', ), ] \ No newline at end of file diff --git a/apps/main/views.py b/apps/main/views.py index 4e32aadc..e91a7148 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -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.RetrieveUpdateDestroyAPIView): + """Award retrieve view.""" + serializer_class = serializers.AwardSerializer + queryset = models.Award.objects.all() + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) diff --git a/apps/news/models.py b/apps/news/models.py index 28983fdf..9228f86f 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -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) diff --git a/apps/products/__init__.py b/apps/products/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/admin.py b/apps/products/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/products/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/products/apps.py b/apps/products/apps.py new file mode 100644 index 00000000..17d75292 --- /dev/null +++ b/apps/products/apps.py @@ -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') diff --git a/apps/products/migrations/__init__.py b/apps/products/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/models.py b/apps/products/models.py new file mode 100644 index 00000000..3c0e6ee8 --- /dev/null +++ b/apps/products/models.py @@ -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') diff --git a/apps/products/serializers/__init__.py b/apps/products/serializers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/serializers/common.py b/apps/products/serializers/common.py new file mode 100644 index 00000000..236cd38b --- /dev/null +++ b/apps/products/serializers/common.py @@ -0,0 +1 @@ +from rest_framework import serializers diff --git a/apps/products/serializers/mobile.py b/apps/products/serializers/mobile.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/serializers/web.py b/apps/products/serializers/web.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/tests.py b/apps/products/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/products/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/products/urls/__init__.py b/apps/products/urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/urls/common.py b/apps/products/urls/common.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/urls/mobile.py b/apps/products/urls/mobile.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/urls/web.py b/apps/products/urls/web.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/views/__init__.py b/apps/products/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/views/common.py b/apps/products/views/common.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/views/mobile.py b/apps/products/views/mobile.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/products/views/views.py b/apps/products/views/views.py new file mode 100644 index 00000000..60f00ef0 --- /dev/null +++ b/apps/products/views/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/apps/products/views/web.py b/apps/products/views/web.py new file mode 100644 index 00000000..e69de29b From 253da87a99ad7bb8d3a648480efd969987fb3430 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Wed, 28 Aug 2019 11:35:38 +0300 Subject: [PATCH 3/8] URL refactoring --- apps/account/urls/common.py | 4 ++-- apps/advertisement/urls/web.py | 2 +- apps/collection/urls/common.py | 35 +++------------------------------- apps/establishment/admin.py | 8 ++++++++ apps/gallery/urls.py | 3 +-- apps/location/urls.py | 26 ++++++++----------------- apps/main/models.py | 3 +++ apps/main/urls.py | 18 ++++------------- apps/main/views.py | 2 +- apps/news/urls/web.py | 9 +++------ apps/news/views/common.py | 30 +++++++++-------------------- apps/partner/urls/common.py | 3 +-- apps/translation/urls.py | 11 ++++------- apps/translation/views.py | 13 ++++++------- project/urls/__init__.py | 23 ++++++---------------- project/urls/back.py | 14 ++++++++++++++ project/urls/mobile.py | 12 ++++++++++++ project/urls/web.py | 6 ++++++ 18 files changed, 92 insertions(+), 130 deletions(-) create mode 100644 project/urls/back.py create mode 100644 project/urls/mobile.py diff --git a/apps/account/urls/common.py b/apps/account/urls/common.py index 49819503..4d55f2fa 100644 --- a/apps/account/urls/common.py +++ b/apps/account/urls/common.py @@ -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'), + ] diff --git a/apps/advertisement/urls/web.py b/apps/advertisement/urls/web.py index a2974e9a..f7550015 100644 --- a/apps/advertisement/urls/web.py +++ b/apps/advertisement/urls/web.py @@ -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') ] diff --git a/apps/collection/urls/common.py b/apps/collection/urls/common.py index a1d98efc..f3633b6b 100644 --- a/apps/collection/urls/common.py +++ b/apps/collection/urls/common.py @@ -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('/', views.CollectionRetrieveView.as_view(), - # name='collection_retrieve'), - # path('/delete/', views.CollectionDestroyView.as_view(), - # name='collection_destroy'), - # path('/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//', views.CollectionItemRetrieveView.as_view(), - # name='collection_items_retrieve'), - # path('collection_items//delete/', views.CollectionDestroyView.as_view(), - # name='collection_items_destroy'), - # path('collection_items//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//', views.GuideRetrieveView.as_view(), - # name='guide_retrieve'), - # path('guides//delete/', views.GuideDestroyView.as_view(), - # name='guide_destroy'), - # path('guides//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'), ] diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 297386c8..7ac20493 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -1,6 +1,8 @@ """Establishment admin conf.""" from django.contrib import admin from establishment import models +from django.contrib.contenttypes.admin import GenericTabularInline +from main.models import Award @admin.register(models.EstablishmentType) @@ -13,6 +15,12 @@ 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, ] diff --git a/apps/gallery/urls.py b/apps/gallery/urls.py index b7fda0ca..53d1c097 100644 --- a/apps/gallery/urls.py +++ b/apps/gallery/urls.py @@ -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') ] diff --git a/apps/location/urls.py b/apps/location/urls.py index 5f90c1b8..0630db93 100644 --- a/apps/location/urls.py +++ b/apps/location/urls.py @@ -6,25 +6,15 @@ from location import views app_name = 'location' urlpatterns = [ - path('country/', views.CountryListView.as_view(), name='country-list'), - path('country//', views.CountryRetrieveView.as_view(), - name='country-retrieve'), + path('addresses/', views.AddressListView.as_view(), name='address-list'), + path('addresses//', 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//', views.RegionRetrieveView.as_view(), name='region_retrieve'), - path('region//delete/', views.RegionDestroyView.as_view(), name='region_destroy'), - path('region//update/', views.RegionUpdateView.as_view(), name='region_update'), + path('cities/', views.CityListView.as_view(), name='city-list'), + path('cities//', 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//', views.CityRetrieveView.as_view(), name='city_retrieve'), - path('city//delete/', views.CityDestroyView.as_view(), name='city_destroy'), - path('city//update/', views.CityUpdateView.as_view(), name='city_update'), + path('countries/', views.CountryListView.as_view(), name='country-list'), + path('countries//', 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//', views.AddressRetrieveView.as_view(), name='address_retrieve'), - path('address//delete/', views.AddressDestroyView.as_view(), name='address_destroy'), - path('address//update/', views.AddressUpdateView.as_view(), name='address_update'), + path('regions/', views.RegionListView.as_view(), name='region-list'), + path('regions//', views.RegionRetrieveView.as_view(), name='region-retrieve'), ] diff --git a/apps/main/models.py b/apps/main/models.py index acfe0773..6608feb9 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -209,3 +209,6 @@ class AwardType(models.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 diff --git a/apps/main/urls.py b/apps/main/urls.py index d9c441b6..6d8cd1e4 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -5,18 +5,8 @@ from main import views app = 'main' urlpatterns = [ - path('determine-site/', views.DetermineSiteView.as_view(), - name='determine-site'), - path('site-settings//', views.SiteSettingsView.as_view(), - name='site-settings', ), - # path('features/', views.FeaturesLCView.as_view(), - # name='features-lc'), - # path('features//', views.FeaturesRUDView.as_view(), - # name='features-rud'), - # path('site-features/', views.SiteFeaturesLCView.as_view(), - # name='site-features-lc'), - # path('site-features//', views.SiteFeaturesRUDView.as_view(), - # name='site-features-rud'), - path('awards/', views.AwardView.as_view(), name='awards_list', ), - path('awards//', views.AwardRetrieveView.as_view(), name='awards_retrieve', ), + path('determine-site/', views.DetermineSiteView.as_view(), name='determine-site'), + path('site-settings//', views.SiteSettingsView.as_view(), name='site-settings'), + path('awards/', views.AwardView.as_view(), name='awards_list'), + path('awards//', views.AwardRetrieveView.as_view(), name='awards_retrieve'), ] \ No newline at end of file diff --git a/apps/main/views.py b/apps/main/views.py index e91a7148..b13b7f64 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -69,7 +69,7 @@ class AwardView(generics.ListAPIView): permission_classes = (permissions.AllowAny, ) -class AwardRetrieveView(generics.RetrieveUpdateDestroyAPIView): +class AwardRetrieveView(generics.RetrieveAPIView): """Award retrieve view.""" serializer_class = serializers.AwardSerializer queryset = models.Award.objects.all() diff --git a/apps/news/urls/web.py b/apps/news/urls/web.py index 04203f1a..1dbcc0fe 100644 --- a/apps/news/urls/web.py +++ b/apps/news/urls/web.py @@ -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('/', common.NewsDetail.as_view(), name='news_detail'), - path('/update/', common.NewsUpdate.as_view(), name='news_update'), - path('/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('/', common.NewsDetailView.as_view(), name='rud'), + path('type/', common.NewsTypeListView.as_view(), name='type'), ] diff --git a/apps/news/views/common.py b/apps/news/views/common.py index 4b9c6796..7e706ddb 100644 --- a/apps/news/views/common.py +++ b/apps/news/views/common.py @@ -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, ) diff --git a/apps/partner/urls/common.py b/apps/partner/urls/common.py index e93fe916..9cd10817 100644 --- a/apps/partner/urls/common.py +++ b/apps/partner/urls/common.py @@ -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') ] diff --git a/apps/translation/urls.py b/apps/translation/urls.py index 507ce165..94df1daa 100644 --- a/apps/translation/urls.py +++ b/apps/translation/urls.py @@ -5,12 +5,9 @@ from translation import views app_name = 'translation' urlpatterns = [ - path('languages/', views.LanguageListCreateView.as_view(), - name='languages'), - path('languages//', views.LanguageRetrieveUpdateDestroyView.as_view(), - name='language'), - path('site/', views.SiteInterfaceDictionaryView.as_view(), - name='site-interface'), - path('site//', views.SiteInterfaceDictionaryRUDView.as_view(), + path('languages/', views.LanguageListView.as_view(), name='languages'), + path('languages//', views.LanguageRetrieveView.as_view(), name='language'), + path('site/', views.SiteInterfaceDictionaryView.as_view(), name='site-interface'), + path('site//', views.SiteInterfaceDictionaryRetrieveView.as_view(), name='site-interface-rud'), ] diff --git a/apps/translation/views.py b/apps/translation/views.py index 01b8ce1d..974e6ff5 100644 --- a/apps/translation/views.py +++ b/apps/translation/views.py @@ -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,) diff --git a/project/urls/__init__.py b/project/urls/__init__.py index 5355ca31..eb9b623e 100644 --- a/project/urls/__init__.py +++ b/project/urls/__init__.py @@ -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) diff --git a/project/urls/back.py b/project/urls/back.py new file mode 100644 index 00000000..af823cd2 --- /dev/null +++ b/project/urls/back.py @@ -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')), +] \ No newline at end of file diff --git a/project/urls/mobile.py b/project/urls/mobile.py new file mode 100644 index 00000000..c007e260 --- /dev/null +++ b/project/urls/mobile.py @@ -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')), +] \ No newline at end of file diff --git a/project/urls/web.py b/project/urls/web.py index 7f4a20c7..6b80b3db 100644 --- a/project/urls/web.py +++ b/project/urls/web.py @@ -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')), ] From e22a54114b1325fe50c6b6addb5b880d4bbdbcf7 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 12:22:13 +0300 Subject: [PATCH 4/8] refactored collection app --- apps/collection/serializers/common.py | 23 ++++++++---- apps/collection/urls/common.py | 6 ++++ apps/collection/views/common.py | 52 ++++----------------------- 3 files changed, 28 insertions(+), 53 deletions(-) diff --git a/apps/collection/serializers/common.py b/apps/collection/serializers/common.py index a4ffc70a..da689009 100644 --- a/apps/collection/serializers/common.py +++ b/apps/collection/serializers/common.py @@ -2,18 +2,25 @@ from rest_framework import serializers from collection import models from gallery import models as gallery_models +from location import models as location_models class CollectionSerializer(serializers.ModelSerializer): """Collection serializer""" - filters = serializers.JSONField(required=True) - selectors = serializers.JSONField(required=True) - targets = serializers.JSONField(required=True) - block_size = serializers.JSONField(required=True) + block_size = serializers.JSONField() image = serializers.PrimaryKeyRelatedField( - queryset=gallery_models.Image.objects.all(), required=True) - is_publish = serializers.BooleanField(required=True) - on_top = serializers.BooleanField(required=True) + queryset=gallery_models.Image.objects.all()) + is_publish = serializers.BooleanField() + on_top = serializers.BooleanField() + + start = serializers.DateTimeField(write_only=True) + end = serializers.DateTimeField(write_only=True) + filters = serializers.JSONField(write_only=True) + selectors = serializers.JSONField(write_only=True) + targets = serializers.JSONField(write_only=True) + country = serializers.PrimaryKeyRelatedField( + queryset=location_models.Country.objects.all(), + write_only=True) class Meta: model = models.Collection @@ -38,6 +45,7 @@ class CollectionItemSerializer(serializers.ModelSerializer): class Meta: model = models.CollectionItem fields = [ + 'id', 'collection', 'item_type', 'item_ids' @@ -49,6 +57,7 @@ class GuideSerializer(serializers.ModelSerializer): class Meta: model = models.Guide fields = [ + 'id', 'name', 'start', 'end', diff --git a/apps/collection/urls/common.py b/apps/collection/urls/common.py index f3633b6b..4396bff4 100644 --- a/apps/collection/urls/common.py +++ b/apps/collection/urls/common.py @@ -7,6 +7,12 @@ app_name = 'collection' urlpatterns = [ path('', views.CollectionListView.as_view(), name='list'), + path('/', views.CollectionRetrieveView.as_view(), name='detail'), + path('items/', views.CollectionItemListView.as_view(), name='collection-items-list'), + path('items//', views.CollectionItemRetrieveView.as_view(), + name='collection-items-detail'), + path('guides/', views.GuideListView.as_view(), name='guides-list'), + path('guides//', views.GuideRetrieveView.as_view(), name='guides-detail'), ] diff --git a/apps/collection/views/common.py b/apps/collection/views/common.py index 02047b88..af7c4849 100644 --- a/apps/collection/views/common.py +++ b/apps/collection/views/common.py @@ -25,6 +25,7 @@ class GuideViewMixin(generics.GenericAPIView): # Views +# Collections class CollectionListView(CollectionViewMixin, generics.ListAPIView): """List Collection view""" pagination_class = None @@ -40,24 +41,11 @@ class CollectionListView(CollectionViewMixin, generics.ListAPIView): class CollectionRetrieveView(CollectionViewMixin, generics.RetrieveAPIView): """Retrieve Collection view""" + permission_classes = (permissions.AllowAny,) serializer_class = serializers.CollectionSerializer -class CollectionCreateView(CollectionViewMixin, generics.CreateAPIView): - """Create Collection view""" - serializer_class = serializers.CollectionSerializer - - -class CollectionDestroyView(CollectionViewMixin, generics.DestroyAPIView): - """Destroy Collection view""" - serializer_class = serializers.CollectionSerializer - - -class CollectionUpdateView(CollectionViewMixin, generics.UpdateAPIView): - """Update Collection view""" - serializer = serializers.CollectionSerializer - - +# CollectionItem class CollectionItemListView(CollectionItemViewMixin, generics.ListAPIView): """List CollectionItem view""" permission_classes = (permissions.AllowAny,) @@ -66,24 +54,11 @@ class CollectionItemListView(CollectionItemViewMixin, generics.ListAPIView): class CollectionItemRetrieveView(CollectionItemViewMixin, generics.RetrieveAPIView): """Retrieve CollectionItem view""" + permission_classes = (permissions.AllowAny,) serializer_class = serializers.CollectionItemSerializer -class CollectionItemCreateView(CollectionItemViewMixin, generics.CreateAPIView): - """Create CollectionItem view""" - serializer_class = serializers.CollectionItemSerializer - - -class CollectionItemDestroyView(CollectionItemViewMixin, generics.DestroyAPIView): - """Destroy CollectionItem view""" - serializer_class = serializers.CollectionItemSerializer - - -class CollectionItemUpdateView(CollectionItemViewMixin, generics.UpdateAPIView): - """Update CollectionItem view""" - serializer = serializers.CollectionItemSerializer - - +# Guide class GuideListView(GuideViewMixin, generics.ListAPIView): """List Guide view""" permission_classes = (permissions.AllowAny,) @@ -92,20 +67,5 @@ class GuideListView(GuideViewMixin, generics.ListAPIView): class GuideRetrieveView(GuideViewMixin, generics.RetrieveAPIView): """Retrieve Guide view""" + permission_classes = (permissions.AllowAny,) serializer_class = serializers.GuideSerializer - - -class GuideCreateView(GuideViewMixin, generics.CreateAPIView): - """Create Guide view""" - serializer_class = serializers.GuideSerializer - - -class GuideDestroyView(GuideViewMixin, generics.DestroyAPIView): - """Destroy Guide view""" - serializer_class = serializers.GuideSerializer - - -class GuideUpdateView(GuideViewMixin, generics.UpdateAPIView): - """Update Guide view""" - serializer = serializers.GuideSerializer - From 0db7b52df72f3086cf0e1678f2f8980a60698e0a Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 12:54:17 +0300 Subject: [PATCH 5/8] refactored remember flag in login --- apps/utils/views.py | 14 ++++++++++++-- project/settings/base.py | 6 ++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/utils/views.py b/apps/utils/views.py index b8c8e9f5..f413e3cc 100644 --- a/apps/utils/views.py +++ b/apps/utils/views.py @@ -12,6 +12,8 @@ from rest_framework_simplejwt import tokens class JWTGenericViewMixin(generics.GenericAPIView): """JWT view mixin""" + JWT_SETTINGS = settings.SIMPLE_JWT + ACCESS_TOKEN_HTTP_ONLY = False ACCESS_TOKEN_SECURE = False @@ -38,18 +40,26 @@ class JWTGenericViewMixin(generics.GenericAPIView): """ COOKIES = list() + # Set max_age for tokens + if permanent: + access_token_max_age = self.JWT_SETTINGS.get('ACCESS_TOKEN_LIFETIME_SECONDS') + refresh_token_max_age = self.JWT_SETTINGS.get('REFRESH_TOKEN_LIFETIME_SECONDS') + else: + access_token_max_age = settings.COOKIES_MAX_AGE + refresh_token_max_age = settings.COOKIES_MAX_AGE + # Write to cookie access and refresh token with secure flag if access_token and refresh_token: _access_token = self.COOKIE(key='access_token', value=access_token, http_only=self.ACCESS_TOKEN_HTTP_ONLY, secure=self.ACCESS_TOKEN_SECURE, - max_age=None if permanent else settings.COOKIES_MAX_AGE) + max_age=access_token_max_age) _refresh_token = self.COOKIE(key='refresh_token', value=refresh_token, http_only=self.REFRESH_TOKEN_HTTP_ONLY, secure=self.REFRESH_TOKEN_SECURE, - max_age=None if permanent else settings.COOKIES_MAX_AGE) + max_age=refresh_token_max_age) COOKIES.extend((_access_token, _refresh_token)) return COOKIES diff --git a/project/settings/base.py b/project/settings/base.py index 8305b637..71a440ea 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -333,8 +333,10 @@ GEOIP_PATH = os.path.join(PROJECT_ROOT, 'geoip_db') # JWT SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), + 'ACCESS_TOKEN_LIFETIME': timedelta(hours=6), + 'ACCESS_TOKEN_LIFETIME_SECONDS': 21600, # 6 hours in seconds + 'REFRESH_TOKEN_LIFETIME': timedelta(days=30), + 'REFRESH_TOKEN_LIFETIME_SECONDS': 2592000, # 30 days in seconds 'ROTATE_REFRESH_TOKENS': True, 'BLACKLIST_AFTER_ROTATION': True, From de0a1d635884feab677835e035be2fad5aa0b514 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 12:58:33 +0300 Subject: [PATCH 6/8] changed jwt login view (changed status code if user not found) --- apps/utils/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/utils/exceptions.py b/apps/utils/exceptions.py index 9d384030..16eb12fc 100644 --- a/apps/utils/exceptions.py +++ b/apps/utils/exceptions.py @@ -24,7 +24,7 @@ class ServiceError(ProjectBaseException): class UserNotFoundError(ProjectBaseException): """The exception should be thrown when the user cannot get""" - status_code = status.HTTP_400_BAD_REQUEST + status_code = status.HTTP_401_UNAUTHORIZED default_detail = _('User not found') From 6d95349a5291147f9f615f735940998db1548c6f Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 13:14:57 +0300 Subject: [PATCH 7/8] refactored logout endpoint --- apps/authorization/serializers/common.py | 16 +++++++--------- apps/authorization/urls/common.py | 21 ++++++--------------- apps/authorization/views/common.py | 4 ++-- 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/apps/authorization/serializers/common.py b/apps/authorization/serializers/common.py index bb3a9541..2a38ca09 100644 --- a/apps/authorization/serializers/common.py +++ b/apps/authorization/serializers/common.py @@ -1,20 +1,18 @@ """Common serializer for application authorization""" +from django.conf import settings +from django.contrib.auth import authenticate from django.contrib.auth import password_validation as password_validators +from django.db.models import Q from rest_framework import serializers from rest_framework import validators as rest_validators -from django.contrib.auth import authenticate -from django.db.models import Q -from django.conf import settings +# JWT +from rest_framework_simplejwt import tokens from account import models as account_models from authorization.models import Application, BlacklistedAccessToken from utils import exceptions as utils_exceptions from utils import methods as utils_methods -# JWT -from rest_framework_simplejwt import tokens - - JWT_SETTINGS = settings.SIMPLE_JWT @@ -202,8 +200,8 @@ class LogoutSerializer(serializers.ModelSerializer): def validate(self, attrs): """Override validated data""" request = self.context.get('request') - token = request._request.headers.get('Authorization') \ - .split(' ')[::-1][0] + token = request.headers.get('Authorization') \ + .split(' ')[::-1][0] access_token = tokens.AccessToken(token) # Prepare validated data attrs['user'] = request.user diff --git a/apps/authorization/urls/common.py b/apps/authorization/urls/common.py index 1f748ad6..9567088a 100644 --- a/apps/authorization/urls/common.py +++ b/apps/authorization/urls/common.py @@ -23,27 +23,18 @@ urlpatterns_social_django = [ urlpatterns_oauth2 = [ path('oauth2/signup/facebook/', views.OAuth2SignUpView.as_view(), name='oauth2-signup-facebook'), - # for admin sign in page - path('oauth2/token/', drf_social_oauth2_views .TokenView.as_view(), - name="token"), + # for sign up via facebook + path('oauth2/token/', drf_social_oauth2_views .TokenView.as_view(), name="token"), ] urlpatterns_jwt = [ - path('signup/', views.SignUpView.as_view(), - name='signup'), - # sign in - path('login/', views.LoginByUsernameOrEmailView.as_view(), - name='login'), - # refresh token - path('refresh-token/', views.RefreshTokenView.as_view(), - name="refresh-token"), - # logout - path('logout/', views.LogoutView.as_view(), - name="logout"), + path('signup/', views.SignUpView.as_view(), name='signup'), + path('login/', views.LoginByUsernameOrEmailView.as_view(), name='login'), + path('refresh-token/', views.RefreshTokenView.as_view(), name="refresh-token"), + path('logout/', views.LogoutView.as_view(), name="logout"), ] urlpatterns = urlpatterns_jwt + \ urlpatterns_oauth2 + \ urlpatterns_social_django # for social oauth2 - diff --git a/apps/authorization/views/common.py b/apps/authorization/views/common.py index 8b324bdd..a587c66c 100644 --- a/apps/authorization/views/common.py +++ b/apps/authorization/views/common.py @@ -210,9 +210,9 @@ class LogoutView(JWTGenericViewMixin): """Logout user""" serializer_class = serializers.LogoutSerializer - def create(self, request, *args, **kwargs): + def post(self, request, *args, **kwargs): """Override create method""" serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() - return Response(status=status.HTTP_200_OK) + return Response(status=status.HTTP_204_NO_CONTENT) From 4c448efc968479e0fbe594cbcc19e7409bf4b640 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 28 Aug 2019 13:41:33 +0300 Subject: [PATCH 8/8] added field image_url to news list and collection list --- apps/collection/serializers/common.py | 15 +++++++++++++-- apps/news/serializers/common.py | 8 ++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/collection/serializers/common.py b/apps/collection/serializers/common.py index da689009..073e554a 100644 --- a/apps/collection/serializers/common.py +++ b/apps/collection/serializers/common.py @@ -7,12 +7,15 @@ from location import models as location_models class CollectionSerializer(serializers.ModelSerializer): """Collection serializer""" + # RESPONSE + image_url = serializers.SerializerMethodField() + + # COMMON block_size = serializers.JSONField() - image = serializers.PrimaryKeyRelatedField( - queryset=gallery_models.Image.objects.all()) is_publish = serializers.BooleanField() on_top = serializers.BooleanField() + # REQUEST start = serializers.DateTimeField(write_only=True) end = serializers.DateTimeField(write_only=True) filters = serializers.JSONField(write_only=True) @@ -21,6 +24,9 @@ class CollectionSerializer(serializers.ModelSerializer): country = serializers.PrimaryKeyRelatedField( queryset=location_models.Country.objects.all(), write_only=True) + image = serializers.PrimaryKeyRelatedField( + queryset=gallery_models.Image.objects.all(), + write_only=True) class Meta: model = models.Collection @@ -30,6 +36,7 @@ class CollectionSerializer(serializers.ModelSerializer): 'start', 'end', 'image', + 'image_url', 'is_publish', 'on_top', 'filters', @@ -39,6 +46,10 @@ class CollectionSerializer(serializers.ModelSerializer): 'block_size', ] + def get_image_url(self, obj): + """Return absolute image URL""" + return obj.image.get_full_image_url(request=self.context.get('request')) + class CollectionItemSerializer(serializers.ModelSerializer): """CollectionItem serializer""" diff --git a/apps/news/serializers/common.py b/apps/news/serializers/common.py index 45ba5945..94313268 100644 --- a/apps/news/serializers/common.py +++ b/apps/news/serializers/common.py @@ -27,7 +27,7 @@ class NewsLocalizationMixinSerializer(serializers.ModelSerializer): class NewsSerializer(NewsLocalizationMixinSerializer): """News serializer.""" address = AddressSerializer() - image = serializers.URLField(source='image.get_image_url') + image_url = serializers.SerializerMethodField() class Meta: model = models.News @@ -39,13 +39,17 @@ class NewsSerializer(NewsLocalizationMixinSerializer): 'playlist', 'address', 'is_highlighted', - 'image', + 'image_url', # Localized fields 'title_trans', 'subtitle_trans', 'description_trans', ] + def get_image_url(self, obj): + """Return absolute image URL""" + return obj.image.get_full_image_url(request=self.context.get('request')) + class NewsCreateUpdateSerializer(NewsSerializer): """News update serializer."""