diff --git a/TODO b/TODO index 6a81097..5dae3b0 100644 --- a/TODO +++ b/TODO @@ -1,24 +1,11 @@ Nastylovat: -- header nedrží - footer - lazyload načítat o něco dříve (neli zrušit alespoň mimo galerii) Naprogramovat: - tlačítko "načíst další aktuality" v komponentě News (možná přidat i novou stránku /aktuality -- přidat kalendář -- kotvičky - přidat v galerii zvětsovač na obrázky -- přidat backend -- přidat databázi - - kontakty - - clanky - - kalendar -- přidat api - přidat volání na api Naplánovat: - kurzy + cena: vyskakovací okno na rezervaci s jménem lekce? jak to vyřešit s kalendářem? (stránka /rezervace) -- změnit (logicky) pořadí komponent na hlavní stránce - -Čeká na Ondru: -- Důležité kontakty + obrázky jak se dostat nebo vzdálenosti od městské dopravy? přidat do googlu \ No newline at end of file diff --git a/services/backend/articles/2025/02/19/terkadavid.jpg b/services/backend/articles/2025/02/19/terkadavid.jpg new file mode 100644 index 0000000..5089136 Binary files /dev/null and b/services/backend/articles/2025/02/19/terkadavid.jpg differ diff --git a/services/backend/backend/settings.py b/services/backend/backend/settings.py index dfcfc92..1a8d008 100644 --- a/services/backend/backend/settings.py +++ b/services/backend/backend/settings.py @@ -46,11 +46,15 @@ DEBUG_TOOLBAR_PANELS = [ ] ALLOWED_HOSTS = [ - "0.0.0.0", "localhost", "127.0.0.1", + "localhost", ] INTERNAL_IPS = [ - "0.0.0.0", "localhost", "127.0.0.1", + "localhost", +] + +CORS_ALLOWED_ORIGINS = [ + "http://localhost:8000", ] # Application definition @@ -62,6 +66,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'tko.apps.TkoConfig', "debug_toolbar", 'rest_framework', ] diff --git a/services/backend/backend/urls.py b/services/backend/backend/urls.py index 2d5d449..2fd02fb 100644 --- a/services/backend/backend/urls.py +++ b/services/backend/backend/urls.py @@ -15,10 +15,14 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import include, path +from django.urls import path from debug_toolbar.toolbar import debug_toolbar_urls +from tko.views import ContactView, ArticleListView, EventListView urlpatterns = [ path('admin/', admin.site.urls), + path('create-contact/', ContactView.as_view(), name='create-contact'), + path('load-articles/', ArticleListView.as_view(), name='load-articles'), + path('load-events/', EventListView.as_view(), name='load-events'), ] + debug_toolbar_urls() diff --git a/services/backend/tko/admin.py b/services/backend/tko/admin.py index 0dd069e..e2f1465 100644 --- a/services/backend/tko/admin.py +++ b/services/backend/tko/admin.py @@ -1,19 +1,29 @@ from django.contrib import admin -# Register your models here. from . import models @admin.register(models.Contact) class ContactAdmin(admin.ModelAdmin): - fields = "__all__" + list_display = ['name', 'email', 'phone_number', 'content'] + + def has_add_permission(self, request, obj=None): + return False + + + def has_delete_permission(self, request, obj=None): + return False + + + def has_change_permission(self, request, obj=None): + return False @admin.register(models.Article) class ArticleAdmin(admin.ModelAdmin): - fields = "__all__" + list_display = ['title', 'date', 'author'] @admin.register(models.Event) class EventAdmin(admin.ModelAdmin): - fields = "__all__" + list_display = ['title', 'start_date', 'end_date', 'color'] diff --git a/services/backend/tko/migrations/0001_initial.py b/services/backend/tko/migrations/0001_initial.py new file mode 100644 index 0000000..5b6cba6 --- /dev/null +++ b/services/backend/tko/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# Generated by Django 5.1.5 on 2025-02-19 16:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('content', models.TextField()), + ('date', models.DateField()), + ('author', models.CharField(max_length=100)), + ('active_to', models.DateField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Contact', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('first_name', models.CharField(max_length=100)), + ('last_name', models.CharField(max_length=100)), + ('email', models.EmailField(max_length=254)), + ('phone_number', models.CharField(max_length=16)), + ('content', models.TextField()), + ], + ), + migrations.CreateModel( + name='Event', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100)), + ('start_date', models.DateTimeField()), + ('end_date', models.DateTimeField()), + ('color', models.CharField(max_length=100)), + ], + ), + ] diff --git a/services/backend/tko/migrations/0002_article_image.py b/services/backend/tko/migrations/0002_article_image.py new file mode 100644 index 0000000..b83ce6d --- /dev/null +++ b/services/backend/tko/migrations/0002_article_image.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.5 on 2025-02-19 16:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tko', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='article', + name='image', + field=models.FileField(null=True, upload_to='articles/%Y/%m/%d'), + ), + ] diff --git a/services/backend/tko/migrations/0003_rename_first_name_contact_name_and_more.py b/services/backend/tko/migrations/0003_rename_first_name_contact_name_and_more.py new file mode 100644 index 0000000..32752e6 --- /dev/null +++ b/services/backend/tko/migrations/0003_rename_first_name_contact_name_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.5 on 2025-02-19 18:33 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tko', '0002_article_image'), + ] + + operations = [ + migrations.RenameField( + model_name='contact', + old_name='first_name', + new_name='name', + ), + migrations.RemoveField( + model_name='contact', + name='last_name', + ), + ] diff --git a/services/backend/tko/models.py b/services/backend/tko/models.py index 1428951..95ea5fa 100644 --- a/services/backend/tko/models.py +++ b/services/backend/tko/models.py @@ -2,25 +2,33 @@ from django.db import models # Create your models here. class Contact(models.Model): - first_name = models.CharField(max_length=100) - last_name = models.CharField(max_length=100) + name = models.CharField(max_length=100) email = models.EmailField() phone_number = models.CharField(max_length=16) content = models.TextField() + def __str__(self): + return f"{self.name}, {self.email}, {self.phone_number}" + class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() - # image = models.ImageField(upload_to='articles/%Y/%m/%d') + image = models.FileField(upload_to='articles/%Y/%m/%d', null=True) date = models.DateField() author = models.CharField(max_length=100) active_to = models.DateField(null=True, blank=True) # do not show some invitation after this date + def __str__(self): + return self.title + class Event(models.Model): title = models.CharField(max_length=100) start_date = models.DateTimeField() end_date = models.DateTimeField() color = models.CharField(max_length=100) + + def __str__(self): + return self.title diff --git a/services/backend/tko/serializers.py b/services/backend/tko/serializers.py new file mode 100644 index 0000000..9fbb671 --- /dev/null +++ b/services/backend/tko/serializers.py @@ -0,0 +1,21 @@ +from rest_framework import serializers + +from tko.models import Contact, Article, Event + + +class ContactSerializer(serializers.ModelSerializer): + class Meta: + model = Contact + fields = '__all__' + + +class ArticleListSerializer(serializers.ModelSerializer): + class Meta: + model = Article + fields = '__all__' + + +class EventListSerializer(serializers.ModelSerializer): + class Meta: + model = Event + fields = '__all__' \ No newline at end of file diff --git a/services/backend/tko/views.py b/services/backend/tko/views.py index 91ea44a..c98a7ec 100644 --- a/services/backend/tko/views.py +++ b/services/backend/tko/views.py @@ -1,3 +1,22 @@ -from django.shortcuts import render +from rest_framework.generics import ListAPIView, CreateAPIView +from rest_framework import permissions -# Create your views here. +from tko.models import Article, Event +from tko.serializers import ArticleListSerializer, EventListSerializer, ContactSerializer + + +class ContactView(CreateAPIView): + serializer_class = ContactSerializer + permission_classes = [permissions.AllowAny] + + +class ArticleListView(ListAPIView): + queryset = Article.objects.all() + serializer_class = ArticleListSerializer + permission_classes = [permissions.AllowAny] + + +class EventListView(ListAPIView): + queryset = Event.objects.all() + serializer_class = EventListSerializer + permission_classes = [permissions.AllowAny] diff --git a/services/frontend/components/Calendar.vue b/services/frontend/components/Calendar.vue index 1ce66c1..107267f 100644 --- a/services/frontend/components/Calendar.vue +++ b/services/frontend/components/Calendar.vue @@ -17,6 +17,10 @@ \ No newline at end of file diff --git a/services/frontend/components/News.vue b/services/frontend/components/News.vue index 06fb0b5..3390728 100644 --- a/services/frontend/components/News.vue +++ b/services/frontend/components/News.vue @@ -44,6 +44,11 @@ \ No newline at end of file diff --git a/services/frontend/plugins/vuetify.ts b/services/frontend/plugins/vuetify.ts index 9247560..09a8019 100644 --- a/services/frontend/plugins/vuetify.ts +++ b/services/frontend/plugins/vuetify.ts @@ -66,6 +66,5 @@ export default defineNuxtPlugin((app) => { } }) - app.vueApp.use(vuetify) })