Site features

This commit is contained in:
evgeniy-st 2019-08-21 11:37:22 +03:00
parent 3f5d56fb7a
commit 6cba003960
6 changed files with 187 additions and 12 deletions

View File

@ -6,3 +6,8 @@ from main import models
@admin.register(models.SiteSettings)
class SiteSettingsAdmin(admin.ModelAdmin):
"""Site settings admin conf."""
@admin.register(models.Feature)
class FeatureAdmin(admin.ModelAdmin):
"""Feature admin conf."""

View File

@ -0,0 +1,49 @@
# Generated by Django 2.2.4 on 2019-08-21 08:30
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('main', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Feature',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('slug', models.CharField(max_length=255, unique=True)),
],
options={
'verbose_name': 'Feature',
'verbose_name_plural': 'Features',
},
),
migrations.CreateModel(
name='SiteFeature',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('published', models.BooleanField(default=False, verbose_name='Published')),
('feature', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.Feature')),
('site_settings', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.SiteSettings')),
],
options={
'verbose_name': 'Site feature',
'verbose_name_plural': 'Site features',
'unique_together': {('site_settings', 'feature')},
},
),
migrations.AddField(
model_name='feature',
name='site_settings',
field=models.ManyToManyField(through='main.SiteFeature', to='main.SiteSettings'),
),
]

View File

@ -116,4 +116,48 @@ class SiteSettings(ProjectBaseMixin):
verbose_name_plural = _('Site settings')
def __str__(self):
return f'Site: "{self.country_code}"'
return f'Site: "{self.country_code}"'
@property
def published_features(self):
return self.feature_set.filter(sitefeature__site_settings=self,
sitefeature__published=True)
class Feature(ProjectBaseMixin):
"""Feature model."""
slug = models.CharField(max_length=255, unique=True)
site_settings = models.ManyToManyField(SiteSettings, through='SiteFeature')
class Meta:
"""Meta class."""
verbose_name = _('Feature')
verbose_name_plural = _('Features')
def __str__(self):
return f'{self.slug}'
class SiteFeatureQuerySet(models.QuerySet):
"""Extended queryset for SiteFeature model."""
def published(self, switcher=True):
return self.filter(published=switcher)
class SiteFeature(ProjectBaseMixin):
"""SiteFeature model."""
site_settings = models.ForeignKey(SiteSettings, on_delete=models.CASCADE)
feature = models.ForeignKey(Feature, on_delete=models.PROTECT)
published = models.BooleanField(default=False, verbose_name=_('Published'))
objects = SiteFeatureQuerySet.as_manager()
class Meta:
"""Meta class."""
verbose_name = _('Site feature')
verbose_name_plural = _('Site features')
unique_together = ('site_settings', 'feature')

View File

@ -3,19 +3,51 @@ from rest_framework import serializers
from main import models
class FeatureSerializer(serializers.ModelSerializer):
"""Feature serializer."""
class Meta:
"""Meta class."""
model = models.Feature
fields = (
'id',
'slug',
)
class SiteSettingsSerializer(serializers.ModelSerializer):
"""Site settings serializer."""
published_features = FeatureSerializer(many=True, allow_null=None)
class Meta:
"""Meta class."""
model = models.SiteSettings
fields = ('country_code',
'pinterest_page_url',
'twitter_page_url',
'facebook_page_url',
'instagram_page_url',
'contact_email',
'config',
'ad_config',
)
fields = (
'country_code',
'pinterest_page_url',
'twitter_page_url',
'facebook_page_url',
'instagram_page_url',
'contact_email',
'config',
'ad_config',
'published_features',
)
class SiteFeatureSerializer(serializers.ModelSerializer):
"""Site feature serializer."""
class Meta:
"""Meta class."""
model = models.SiteFeature
fields = (
'id',
'published',
'site_settings',
'feature',
)

View File

@ -6,5 +6,13 @@ app = 'main'
urlpatterns = [
path('site-settings/<country_code>/', views.SiteSettingsView.as_view(),
name='site-settings',)
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'),
]

View File

@ -4,9 +4,46 @@ from main import models, serializers
class SiteSettingsView(generics.RetrieveAPIView):
"""Site settings View"""
"""Site settings View."""
lookup_field = 'country_code'
permission_classes = (permissions.AllowAny,)
queryset = models.SiteSettings.objects.all()
serializer_class = serializers.SiteSettingsSerializer
class FeatureViewMixin:
"""Feature view mixin."""
queryset = models.Feature.objects.all()
serializer_class = serializers.FeatureSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class FeaturesLCView(FeatureViewMixin, generics.ListCreateAPIView):
"""Site features LC View."""
pagination_class = None
class FeaturesRUDView(FeatureViewMixin, generics.RetrieveUpdateDestroyAPIView):
"""Site features RUD View."""
class SiteFeaturesViewMixin:
"""Site feature view mixin."""
queryset = models.SiteFeature.objects.all()
serializer_class = serializers.SiteFeatureSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class SiteFeaturesLCView(SiteFeaturesViewMixin, generics.ListCreateAPIView):
"""Site features LC."""
pagination_class = None
class SiteFeaturesRUDView(SiteFeaturesViewMixin,
generics.RetrieveUpdateDestroyAPIView):
"""Site features RUD."""