Skip to content

Commit

Permalink
Add 'website' application for dynamic frontend fields
Browse files Browse the repository at this point in the history
  • Loading branch information
ldeluigi committed Mar 2, 2023
1 parent 5ce97a1 commit cdda8ba
Show file tree
Hide file tree
Showing 17 changed files with 117 additions and 3 deletions.
1 change: 1 addition & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ sleep 3\n\
python manage.py migrate --noinput\n\
python manage.py clean_jobs\n\
python manage.py export_variants\n\
python manage.py seed_website_properties\n\
gunicorn backend.wsgi:application --bind 0.0.0.0:8000\n' > entrypoint.prod.sh
EXPOSE 8000
ENTRYPOINT ["/bin/sh", "entrypoint.prod.sh"]
1 change: 1 addition & 0 deletions backend/backend/production_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
'django.contrib.messages',
'django.contrib.staticfiles',
'spellbook',
'website',
'django.contrib.admin',
'sortedm2m',
'rest_framework',
Expand Down
1 change: 1 addition & 0 deletions backend/backend/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
'django.contrib.messages',
'django.contrib.staticfiles',
'spellbook',
'website',
'django.contrib.admin',
'sortedm2m',
'rest_framework',
Expand Down
4 changes: 3 additions & 1 deletion backend/spellbook/urls.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from django.urls import include, path
from . import views
from rest_framework.routers import DefaultRouter
from . import views
from website.urls import router as website_router

router = DefaultRouter()
router.register(r'variants', views.VariantViewSet, basename='variants')
router.register(r'features', views.FeatureViewSet, basename='features')
router.register(r'combos', views.ComboViewSet, basename='combos')
router.register(r'cards', views.CardViewSet, basename='cards')
router.register(r'templates', views.TemplateViewSet, basename='templates')
router.registry.extend(website_router.registry)

urlpatterns = [
path('', include(router.urls))
Expand Down
3 changes: 1 addition & 2 deletions backend/spellbook/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from .models import Card, Feature, Combo, Template, Variant
from .serializers import CardDetailSerializer, FeatureSerializer, ComboDetailSerializer, TemplateSerializer, VariantSerializer
from rest_framework import viewsets
from rest_framework import filters
from rest_framework import viewsets, filters
from django_filters.rest_framework import DjangoFilterBackend


Expand Down
Empty file added backend/website/__init__.py
Empty file.
13 changes: 13 additions & 0 deletions backend/website/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from django.contrib import admin
from .models import WebsiteProperty


@admin.register(WebsiteProperty)
class WebsitePropertyAdmin(admin.ModelAdmin):
list_display = ('key', 'value')

def has_add_permission(self, request) -> bool:
return False

def has_delete_permission(self, request, obj=None) -> bool:
return False
Empty file.
Empty file.
23 changes: 23 additions & 0 deletions backend/website/management/commands/seed_website_properties.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from django.core.management.base import BaseCommand
from website.models import WebsiteProperty, PROPERTY_KEYS


class Command(BaseCommand):
help = 'Seed website properties'

def handle(self, *args, **options):
self.stdout.write('Seeding website properties...')
properties = set(PROPERTY_KEYS)
existing = set(WebsiteProperty.objects.values_list('key', flat=True))
missing = properties - existing
obsolete = existing - properties
if missing:
self.stdout.write(f'Creating missing properties: {", ".join(missing)}')
WebsiteProperty.objects.bulk_create([
WebsiteProperty(key=key)
for key in missing
])
if obsolete:
self.stdout.write(f'Deleting obsolete properties: {", ".join(obsolete)}')
WebsiteProperty.objects.filter(key__in=obsolete).delete()
self.stdout.write(self.style.SUCCESS('Website properties were seeded.'))
27 changes: 27 additions & 0 deletions backend/website/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 4.1.5 on 2023-03-02 15:25

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='WebsiteProperty',
fields=[
('key', models.CharField(editable=False, max_length=100, primary_key=True, serialize=False, unique=True)),
('description', models.TextField(blank=True)),
('value', models.CharField(blank=True, help_text='Comma-separated list of values', max_length=1000, validators=[django.core.validators.RegexValidator('^[^\\,]+(?:\\,[^\\,]+)*$')])),
],
options={
'verbose_name': 'Website Property',
'verbose_name_plural': 'Website Properties',
},
),
]
Empty file.
21 changes: 21 additions & 0 deletions backend/website/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from django.db import models
from django.core.validators import RegexValidator


PROPERTY_KEYS = [
'featured_combos_title',
'featured_set_codes',
]


class WebsiteProperty(models.Model):
key = models.CharField(max_length=100, unique=True, blank=False, primary_key=True, editable=False)
value = models.CharField(max_length=1000, blank=True, validators=[RegexValidator(r'^[^\,]+(?:\,[^\,]+)*$')], help_text='Comma-separated list of values')
description = models.TextField(blank=True)

def __str__(self):
return self.key.replace("_", " ").title()

class Meta:
verbose_name = 'Website Property'
verbose_name_plural = 'Website Properties'
8 changes: 8 additions & 0 deletions backend/website/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from rest_framework import serializers
from .models import WebsiteProperty


class WebsitePropertySerializer(serializers.ModelSerializer):
class Meta:
model = WebsiteProperty
fields = ['key', 'description', 'value']
Empty file added backend/website/tests.py
Empty file.
10 changes: 10 additions & 0 deletions backend/website/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.urls import include, path
from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'properties', views.WebsitePropertyViewSet, basename='properties')

urlpatterns = [
path('', include(router.urls))
]
8 changes: 8 additions & 0 deletions backend/website/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from rest_framework import viewsets
from .models import WebsiteProperty
from .serializers import WebsitePropertySerializer


class WebsitePropertyViewSet(viewsets.ReadOnlyModelViewSet):
queryset = WebsiteProperty.objects.all()
serializer_class = WebsitePropertySerializer

0 comments on commit cdda8ba

Please sign in to comment.