diff --git a/shiftregister/pages/admin.py b/shiftregister/pages/admin.py index 8fb8467..cff63be 100644 --- a/shiftregister/pages/admin.py +++ b/shiftregister/pages/admin.py @@ -23,6 +23,18 @@ def reimport(modeladmin, request, queryset): ) +def fetch_remote_content(modeladmin, request, queryset): + remote_pages = queryset.filter(kind=Page.REMOTE_CONTENT) + for page in remote_pages: + page.fetch_remote_content() + + modeladmin.message_user( + request, + f"{remote_pages.count()} Remote-Inhalte wurden aktualisiert.", + messages.SUCCESS, + ) + + @admin.register(Page) class PageAdmin(admin.ModelAdmin): fields = ( @@ -33,6 +45,8 @@ class PageAdmin(admin.ModelAdmin): "kind", "show_in_footer_nav", "show_in_main_nav", + "remote_url", + "import_error", ) list_display = ( "url", @@ -41,5 +55,7 @@ class PageAdmin(admin.ModelAdmin): "kind", "show_in_footer_nav", "show_in_main_nav", + "remote_url", + "import_error", ) - actions = (reimport,) + actions = (reimport, fetch_remote_content) diff --git a/shiftregister/pages/migrations/0004_page_import_error_page_remote_url_alter_page_kind.py b/shiftregister/pages/migrations/0004_page_import_error_page_remote_url_alter_page_kind.py new file mode 100644 index 0000000..b75b0c0 --- /dev/null +++ b/shiftregister/pages/migrations/0004_page_import_error_page_remote_url_alter_page_kind.py @@ -0,0 +1,36 @@ +# Generated by Django 5.0.4 on 2025-05-21 23:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pages", "0003_page_show_in_footer_nav_page_show_in_main_nav"), + ] + + operations = [ + migrations.AddField( + model_name="page", + name="import_error", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="page", + name="remote_url", + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name="page", + name="kind", + field=models.CharField( + choices=[ + ("redirect", "Redirect"), + ("regular", "Regular page"), + ("remote", "Remote content"), + ], + default="regular", + max_length=8, + ), + ), + ] diff --git a/shiftregister/pages/models.py b/shiftregister/pages/models.py index 0ad3417..9535ce4 100644 --- a/shiftregister/pages/models.py +++ b/shiftregister/pages/models.py @@ -1,3 +1,5 @@ +import requests +from bs4 import BeautifulSoup from django.db import models # Create your models here. @@ -6,9 +8,11 @@ from django.db import models class Page(models.Model): REDIRECT = "redirect" REGULAR = "regular" + REMOTE_CONTENT = "remote" KIND_CHOICES = [ (REDIRECT, "Redirect"), (REGULAR, "Regular page"), + (REMOTE_CONTENT, "Remote content"), ] url = models.fields.SlugField(unique=True) @@ -19,9 +23,32 @@ class Page(models.Model): show_in_footer_nav = models.BooleanField(default=True) show_in_main_nav = models.BooleanField(default=False) + # Fields for remote content + remote_url = models.URLField(blank=True, null=True) + import_error = models.BooleanField(default=False) + def __str__(self): - return ( - f"{self.get_kind_display()} {self.url}" + f" => {self.content}" - if self.kind == Page.REDIRECT - else "" - ) + if self.kind == Page.REDIRECT: + return f"{self.get_kind_display()} {self.url} => {self.content}" + elif self.kind == Page.REMOTE_CONTENT: + return f"{self.get_kind_display()} {self.url} from {self.remote_url}" + return f"{self.get_kind_display()} {self.url}" + + def fetch_remote_content(self): + if self.kind != self.REMOTE_CONTENT or not self.remote_url: + return + + try: + response = requests.get(self.remote_url) + response.raise_for_status() + + soup = BeautifulSoup(response.text, "html.parser") + body_content = soup.find("body") + + if body_content: + self.content = f"
Some test content
+ + + """ + mock_get.return_value = mock_response + + # Fetch content + self.remote_page.fetch_remote_content() + + # Verify the page was updated + self.remote_page.refresh_from_db() + self.assertIn("Some test content
", self.remote_page.content) + self.assertFalse(self.remote_page.import_error) + self.assertTrue(self.remote_page.content.startswith("