Site features
This commit is contained in:
parent
3f5d56fb7a
commit
6cba003960
|
|
@ -6,3 +6,8 @@ from main import models
|
||||||
@admin.register(models.SiteSettings)
|
@admin.register(models.SiteSettings)
|
||||||
class SiteSettingsAdmin(admin.ModelAdmin):
|
class SiteSettingsAdmin(admin.ModelAdmin):
|
||||||
"""Site settings admin conf."""
|
"""Site settings admin conf."""
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.Feature)
|
||||||
|
class FeatureAdmin(admin.ModelAdmin):
|
||||||
|
"""Feature admin conf."""
|
||||||
|
|
|
||||||
49
apps/main/migrations/0002_auto_20190821_0830.py
Normal file
49
apps/main/migrations/0002_auto_20190821_0830.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -117,3 +117,47 @@ class SiteSettings(ProjectBaseMixin):
|
||||||
|
|
||||||
def __str__(self):
|
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')
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,30 @@ from rest_framework import serializers
|
||||||
from main import models
|
from main import models
|
||||||
|
|
||||||
|
|
||||||
|
class FeatureSerializer(serializers.ModelSerializer):
|
||||||
|
"""Feature serializer."""
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
|
||||||
|
model = models.Feature
|
||||||
|
fields = (
|
||||||
|
'id',
|
||||||
|
'slug',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class SiteSettingsSerializer(serializers.ModelSerializer):
|
class SiteSettingsSerializer(serializers.ModelSerializer):
|
||||||
"""Site settings serializer."""
|
"""Site settings serializer."""
|
||||||
|
|
||||||
|
published_features = FeatureSerializer(many=True, allow_null=None)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
||||||
model = models.SiteSettings
|
model = models.SiteSettings
|
||||||
fields = ('country_code',
|
fields = (
|
||||||
|
'country_code',
|
||||||
'pinterest_page_url',
|
'pinterest_page_url',
|
||||||
'twitter_page_url',
|
'twitter_page_url',
|
||||||
'facebook_page_url',
|
'facebook_page_url',
|
||||||
|
|
@ -18,4 +34,20 @@ class SiteSettingsSerializer(serializers.ModelSerializer):
|
||||||
'contact_email',
|
'contact_email',
|
||||||
'config',
|
'config',
|
||||||
'ad_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',
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,13 @@ app = 'main'
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('site-settings/<country_code>/', views.SiteSettingsView.as_view(),
|
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'),
|
||||||
]
|
]
|
||||||
|
|
@ -4,9 +4,46 @@ from main import models, serializers
|
||||||
|
|
||||||
|
|
||||||
class SiteSettingsView(generics.RetrieveAPIView):
|
class SiteSettingsView(generics.RetrieveAPIView):
|
||||||
"""Site settings View"""
|
"""Site settings View."""
|
||||||
|
|
||||||
lookup_field = 'country_code'
|
lookup_field = 'country_code'
|
||||||
permission_classes = (permissions.AllowAny,)
|
permission_classes = (permissions.AllowAny,)
|
||||||
queryset = models.SiteSettings.objects.all()
|
queryset = models.SiteSettings.objects.all()
|
||||||
serializer_class = serializers.SiteSettingsSerializer
|
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."""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user