diff --git a/backend/api/main/serializers.py b/backend/api/main/serializers.py index 32d006b..996a895 100644 --- a/backend/api/main/serializers.py +++ b/backend/api/main/serializers.py @@ -1,9 +1,13 @@ from rest_framework import serializers -from sitemanagement.models import FAQ +from sitemanagement.models import FAQ, News class FAQMainSerializer(serializers.ModelSerializer): class Meta: model = FAQ fields = "__all__" - \ No newline at end of file + +class NewsMainSerializer(serializers.ModelSerializer): + class Meta: + model = News + fields= "__all__" \ No newline at end of file diff --git a/backend/api/main/views.py b/backend/api/main/views.py index 30aafb6..9c41b37 100644 --- a/backend/api/main/views.py +++ b/backend/api/main/views.py @@ -3,8 +3,8 @@ from rest_framework.views import APIView from rest_framework.response import Response from api.utils.decorators import handle_exceptions -from api.main.serializers import FAQMainSerializer -from sitemanagement.models import FAQ +from api.main.serializers import FAQMainSerializer, NewsMainSerializer +from sitemanagement.models import FAQ, News class FAQView(APIView): @handle_exceptions @@ -16,4 +16,15 @@ class FAQView(APIView): 'faqs': FAQMainSerializer(faqs, many=True).data } + return Response(data, status=status.HTTP_200_OK) +class NewsView(APIView): + @handle_exceptions + def get(self, request): + + news = News.objects.all() + + data = { + 'news': NewsMainSerializer(news, many=True).data + } + return Response(data, status=status.HTTP_200_OK) \ No newline at end of file diff --git a/backend/api/urls.py b/backend/api/urls.py index a19a301..1affeba 100644 --- a/backend/api/urls.py +++ b/backend/api/urls.py @@ -1,7 +1,8 @@ from django.urls import path -from api.main.views import FAQView +from api.main.views import FAQView, NewsView urlpatterns = [ path("v1/faq/", FAQView.as_view(), name='faqMain'), + path("v1/news/", NewsView.as_view(), name="newsmain") ] \ No newline at end of file diff --git a/backend/base/urls.py b/backend/base/urls.py index 9666b6b..69a1cc9 100644 --- a/backend/base/urls.py +++ b/backend/base/urls.py @@ -1,7 +1,9 @@ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('api.urls')), -] +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/backend/sitemanagement/migrations/0006_news_filename_news_path.py b/backend/sitemanagement/migrations/0006_news_filename_news_path.py new file mode 100644 index 0000000..3c5e060 --- /dev/null +++ b/backend/sitemanagement/migrations/0006_news_filename_news_path.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.1 on 2025-05-16 07:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sitemanagement', '0005_news_created_at_alter_news_slug'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='filename', + field=models.CharField(blank=True, max_length=255), + ), + migrations.AddField( + model_name='news', + name='path', + field=models.CharField(blank=True, max_length=255), + ), + ] diff --git a/backend/sitemanagement/migrations/0007_alter_news_slug_alter_news_titleimage.py b/backend/sitemanagement/migrations/0007_alter_news_slug_alter_news_titleimage.py new file mode 100644 index 0000000..f1b3caa --- /dev/null +++ b/backend/sitemanagement/migrations/0007_alter_news_slug_alter_news_titleimage.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.1 on 2025-05-16 08:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sitemanagement', '0006_news_filename_news_path'), + ] + + operations = [ + migrations.AlterField( + model_name='news', + name='slug', + field=models.SlugField(blank=True, editable=False, max_length=255, null=True), + ), + migrations.AlterField( + model_name='news', + name='titleImage', + field=models.ImageField(upload_to='news/images/', verbose_name='Главная картинка'), + ), + ] diff --git a/backend/sitemanagement/models.py b/backend/sitemanagement/models.py index 2aeeba6..4412f75 100644 --- a/backend/sitemanagement/models.py +++ b/backend/sitemanagement/models.py @@ -20,11 +20,14 @@ class FAQ (models.Model): class News(models.Model): - titleImage = models.ImageField(verbose_name="Главная картинка") + titleImage = models.ImageField(upload_to='uploads/news/images/', verbose_name="Главная картинка") title = models.CharField(max_length=100, verbose_name="Заголовок") content = models.TextField(max_length=1000, verbose_name="Контент статьи") - slug = models.SlugField(null=True, blank=True, editable=False) + slug = models.SlugField(max_length=255, null=True, blank=True, editable=False) created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True) + filename = models.CharField(max_length=255, blank=True) + path = models.CharField(max_length=255, blank=True) + class Meta: verbose_name = 'Новость' verbose_name_plural = 'Новости' @@ -34,17 +37,20 @@ class News(models.Model): return self.title def save(self, *args, **kwargs): - super().save(*args, **kwargs) #сохраняем изображение - - # генерируем путь к файлу если удалось его сохранить - if self.titleImage: - self.filename = os.path.basename(self.titleImage.name) - self.path = f'{settings.BASE_URL}{settings.MEDIA_URL}{self.titleImage.name}' - super().save(*args, **kwargs) # записываем путь и имя файла в базу + if not self.pk: # Только при первом сохранении + super().save(*args, **kwargs) # сохраняем изображение + + # генерируем путь к файлу если удалось его сохранить + if self.titleImage: + self.filename = os.path.basename(self.titleImage.name) + self.path = f'{settings.BASE_URL}{settings.MEDIA_URL}{self.titleImage.name}' + super().save(*args, **kwargs) # записываем путь и имя файла в базу + else: + self.filename = '' + self.path = '' else: - self.filename = '' - self.path = '' - + super().save(*args, **kwargs) + @receiver(pre_save, sender=News) def generate_slug(sender, instance, **kwargs): if not instance.slug: diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index c2ec58b..077a18c 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -7,10 +7,12 @@ import { data } from '@/app/staticData' import { routes } from '@/app/staticData' import Button from '@/components/ui/Button' import News from '@/components/News' -import { getFAQs } from '@/lib/fetchFAQ' +import { getFAQs } from '@/lib/main/fetchFAQ' +import { getNews } from '@/lib/main/fetchNews' export default async function Home() { const faqs = await getFAQs() + const news = await getNews() return (