diff --git a/OneCprogsite/OneCprogsite/__pycache__/settings.cpython-310.pyc b/OneCprogsite/OneCprogsite/__pycache__/settings.cpython-310.pyc index 1089903..b93c66d 100644 Binary files a/OneCprogsite/OneCprogsite/__pycache__/settings.cpython-310.pyc and b/OneCprogsite/OneCprogsite/__pycache__/settings.cpython-310.pyc differ diff --git a/OneCprogsite/OneCprogsite/settings.py b/OneCprogsite/OneCprogsite/settings.py index b2bd6d9..65ac19e 100644 --- a/OneCprogsite/OneCprogsite/settings.py +++ b/OneCprogsite/OneCprogsite/settings.py @@ -40,6 +40,8 @@ INSTALLED_APPS = [ 'programmer.apps.ProgrammerConfig', 'django_bootstrap5', 'django_extensions', + 'django.contrib.sites', + 'django.contrib.sitemaps', ] MIDDLEWARE = [ diff --git a/OneCprogsite/programmer/__pycache__/models.cpython-310.pyc b/OneCprogsite/programmer/__pycache__/models.cpython-310.pyc index cbbb6fa..f6d816b 100644 Binary files a/OneCprogsite/programmer/__pycache__/models.cpython-310.pyc and b/OneCprogsite/programmer/__pycache__/models.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/__pycache__/sitemaps.cpython-310.pyc b/OneCprogsite/programmer/__pycache__/sitemaps.cpython-310.pyc new file mode 100644 index 0000000..46831ac Binary files /dev/null and b/OneCprogsite/programmer/__pycache__/sitemaps.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/__pycache__/urls.cpython-310.pyc b/OneCprogsite/programmer/__pycache__/urls.cpython-310.pyc index a20925c..b007e84 100644 Binary files a/OneCprogsite/programmer/__pycache__/urls.cpython-310.pyc and b/OneCprogsite/programmer/__pycache__/urls.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc b/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc index 40fbb99..8ad2d2d 100644 Binary files a/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc and b/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/management/__init__.py b/OneCprogsite/programmer/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/OneCprogsite/programmer/management/__pycache__/__init__.cpython-310.pyc b/OneCprogsite/programmer/management/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..fb39175 Binary files /dev/null and b/OneCprogsite/programmer/management/__pycache__/__init__.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/management/commands/__init__.py b/OneCprogsite/programmer/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/OneCprogsite/programmer/management/commands/__pycache__/__init__.cpython-310.pyc b/OneCprogsite/programmer/management/commands/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000..5b2a135 Binary files /dev/null and b/OneCprogsite/programmer/management/commands/__pycache__/__init__.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/management/commands/__pycache__/test_sitemap.cpython-310.pyc b/OneCprogsite/programmer/management/commands/__pycache__/test_sitemap.cpython-310.pyc new file mode 100644 index 0000000..f541224 Binary files /dev/null and b/OneCprogsite/programmer/management/commands/__pycache__/test_sitemap.cpython-310.pyc differ diff --git a/OneCprogsite/programmer/management/commands/test_sitemap.py b/OneCprogsite/programmer/management/commands/test_sitemap.py new file mode 100644 index 0000000..338d65d --- /dev/null +++ b/OneCprogsite/programmer/management/commands/test_sitemap.py @@ -0,0 +1,27 @@ +from django.core.management.base import BaseCommand +from django.contrib.sitemaps import Sitemap +from django.urls import reverse +from programmer.models import Home, Solution, Competence, Recall + + +class Command(BaseCommand): + help = 'Test sitemap generation' + + def handle(self, *args, **options): + from programmer.sitemaps import sitemaps + + self.stdout.write('Testing sitemap generation...') + + for name, sitemap in sitemaps.items(): + self.stdout.write(f'\n{name}:') + items = sitemap().items() + self.stdout.write(f' Items found: {len(items)}') + + for item in items[:3]: # Показываем первые 3 элемента + try: + url = sitemap().location(item) + self.stdout.write(f' - {url}') + except Exception as e: + self.stdout.write(f' - Error: {e}') + + self.stdout.write('\nSitemap test completed!') diff --git a/OneCprogsite/programmer/models.py b/OneCprogsite/programmer/models.py index 5cd7369..065b6aa 100644 --- a/OneCprogsite/programmer/models.py +++ b/OneCprogsite/programmer/models.py @@ -1,6 +1,9 @@ from django.db import models from django.urls import reverse from django.utils import timezone +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from django.core.cache import cache class Recall(models.Model): @@ -125,3 +128,12 @@ class Visitor(models.Model): indexes = [ models.Index(fields=['ip_address']), ] + + +@receiver([post_save, post_delete], sender=Home) +@receiver([post_save, post_delete], sender=Solution) +@receiver([post_save, post_delete], sender=Competence) +@receiver([post_save, post_delete], sender=Recall) +def clear_sitemap_cache(sender, **kwargs): + """Очищаем кэш sitemap при изменении контента""" + cache.delete('sitemap_cache') diff --git a/OneCprogsite/programmer/sitemaps.py b/OneCprogsite/programmer/sitemaps.py new file mode 100644 index 0000000..e71f587 --- /dev/null +++ b/OneCprogsite/programmer/sitemaps.py @@ -0,0 +1,64 @@ +from django.contrib.sitemaps import Sitemap +from django.urls import reverse +from .models import Home, Solution, Competence, Recall + +class StaticViewSitemap(Sitemap): + priority = 1.0 + changefreq = 'monthly' + + def items(self): + return ['home', 'about', 'solution', 'ability', 'recall'] + + def location(self, item): + return reverse(item) + +class HomeSitemap(Sitemap): + changefreq = 'weekly' + priority = 1.0 + + def items(self): + return Home.objects.filter(is_published=True) + + def lastmod(self, obj): + return obj.time_update + + # УБИРАЕМ метод location - используем default + # Django автоматически сгенерирует правильные URL + +class SolutionSitemap(Sitemap): + changefreq = 'weekly' + priority = 0.9 + + def items(self): + return Solution.objects.filter(is_published=True) + + def lastmod(self, obj): + return obj.time_update + +class CompetenceSitemap(Sitemap): + changefreq = 'monthly' + priority = 0.8 + + def items(self): + return Competence.objects.filter(is_published=True) + + def lastmod(self, obj): + return obj.time_update + +class RecallSitemap(Sitemap): + changefreq = 'monthly' + priority = 0.7 + + def items(self): + return Recall.objects.filter(is_published=True) + + def lastmod(self, obj): + return obj.time_update + +# Упрощаем sitemaps - убираем HomeSitemap если он дублирует главную +sitemaps = { + 'static': StaticViewSitemap, + 'solutions': SolutionSitemap, + 'competence': CompetenceSitemap, + 'recall': RecallSitemap, +} \ No newline at end of file diff --git a/OneCprogsite/programmer/templates/programmer/about.html b/OneCprogsite/programmer/templates/programmer/about.html index dde749e..696fa6d 100644 --- a/OneCprogsite/programmer/templates/programmer/about.html +++ b/OneCprogsite/programmer/templates/programmer/about.html @@ -118,4 +118,37 @@ + + {% endblock %} \ No newline at end of file diff --git a/OneCprogsite/programmer/templates/programmer/base.html b/OneCprogsite/programmer/templates/programmer/base.html index 09665ea..6477bc2 100644 --- a/OneCprogsite/programmer/templates/programmer/base.html +++ b/OneCprogsite/programmer/templates/programmer/base.html @@ -5,6 +5,28 @@