diff --git a/.gitignore b/.gitignore index 61cdb80..431a750 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .env __pycache__ -*.pyc \ No newline at end of file +*.pyc \ No newline at end of file diff --git a/innovedus_cms/base/__init__.py b/innovedus_cms/base/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/innovedus_cms/base/admin.py b/innovedus_cms/base/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/innovedus_cms/base/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/innovedus_cms/base/apps.py b/innovedus_cms/base/apps.py new file mode 100644 index 0000000..05011e8 --- /dev/null +++ b/innovedus_cms/base/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BaseConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'base' diff --git a/innovedus_cms/base/migrations/0001_initial.py b/innovedus_cms/base/migrations/0001_initial.py new file mode 100644 index 0000000..a81d612 --- /dev/null +++ b/innovedus_cms/base/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 5.2.7 on 2025-10-15 03:30 + +import django.db.models.deletion +import uuid +import wagtail.fields +import wagtail.models.preview +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0095_groupsitepermission'), + ] + + operations = [ + migrations.CreateModel( + name='NavigationSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('linkedin_url', models.URLField(blank=True, verbose_name='LinkedIn URL')), + ('github_url', models.URLField(blank=True, verbose_name='GitHub URL')), + ('mastodon_url', models.URLField(blank=True, verbose_name='Mastodon URL')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='FooterText', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('translation_key', models.UUIDField(default=uuid.uuid4, editable=False)), + ('live', models.BooleanField(default=True, editable=False, verbose_name='live')), + ('has_unpublished_changes', models.BooleanField(default=False, editable=False, verbose_name='has unpublished changes')), + ('first_published_at', models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='first published at')), + ('last_published_at', models.DateTimeField(editable=False, null=True, verbose_name='last published at')), + ('go_live_at', models.DateTimeField(blank=True, null=True, verbose_name='go live date/time')), + ('expire_at', models.DateTimeField(blank=True, null=True, verbose_name='expiry date/time')), + ('expired', models.BooleanField(default=False, editable=False, verbose_name='expired')), + ('body', wagtail.fields.RichTextField()), + ('latest_revision', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.revision', verbose_name='latest revision')), + ('live_revision', models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailcore.revision', verbose_name='live revision')), + ('locale', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='wagtailcore.locale', verbose_name='locale')), + ], + options={ + 'verbose_name_plural': 'Footer Text', + 'abstract': False, + 'unique_together': {('translation_key', 'locale')}, + }, + bases=(wagtail.models.preview.PreviewableMixin, models.Model), + ), + ] diff --git a/innovedus_cms/base/migrations/0002_remove_navigationsettings_github_url_and_more.py b/innovedus_cms/base/migrations/0002_remove_navigationsettings_github_url_and_more.py new file mode 100644 index 0000000..5c2df52 --- /dev/null +++ b/innovedus_cms/base/migrations/0002_remove_navigationsettings_github_url_and_more.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.7 on 2025-10-15 06:17 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='navigationsettings', + name='github_url', + ), + migrations.RemoveField( + model_name='navigationsettings', + name='mastodon_url', + ), + migrations.AddField( + model_name='navigationsettings', + name='facebook_url', + field=models.URLField(blank=True, verbose_name='Facebook URL'), + ), + migrations.AddField( + model_name='navigationsettings', + name='instagram_url', + field=models.URLField(blank=True, verbose_name='Instagram URL'), + ), + migrations.AddField( + model_name='navigationsettings', + name='thread_url', + field=models.URLField(blank=True, verbose_name='Thread URL'), + ), + ] diff --git a/innovedus_cms/base/migrations/0003_socialmediasettings.py b/innovedus_cms/base/migrations/0003_socialmediasettings.py new file mode 100644 index 0000000..ea4f694 --- /dev/null +++ b/innovedus_cms/base/migrations/0003_socialmediasettings.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.7 on 2025-10-15 06:48 + +import wagtail.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0002_remove_navigationsettings_github_url_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='SocialMediaSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('links', wagtail.fields.StreamField([('link', 2)], block_lookup={0: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('twitter', 'Twitter'), ('instagram', 'Instagram'), ('linkedin', 'LinkedIn'), ('youtube', 'YouTube')]}), 1: ('wagtail.blocks.URLBlock', (), {}), 2: ('wagtail.blocks.StructBlock', [[('platform', 0), ('url', 1)]], {})})), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/innovedus_cms/base/migrations/0004_alter_navigationsettings_options_and_more.py b/innovedus_cms/base/migrations/0004_alter_navigationsettings_options_and_more.py new file mode 100644 index 0000000..8bc5815 --- /dev/null +++ b/innovedus_cms/base/migrations/0004_alter_navigationsettings_options_and_more.py @@ -0,0 +1,44 @@ +# Generated by Django 5.2.7 on 2025-10-15 08:49 + +import wagtail.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('base', '0003_socialmediasettings'), + ] + + operations = [ + migrations.AlterModelOptions( + name='navigationsettings', + options={'verbose_name': 'Footer Navigation'}, + ), + migrations.RemoveField( + model_name='navigationsettings', + name='facebook_url', + ), + migrations.RemoveField( + model_name='navigationsettings', + name='instagram_url', + ), + migrations.RemoveField( + model_name='navigationsettings', + name='linkedin_url', + ), + migrations.RemoveField( + model_name='navigationsettings', + name='thread_url', + ), + migrations.AddField( + model_name='navigationsettings', + name='footer_links', + field=wagtail.fields.StreamField([('section', 5)], blank=True, block_lookup={0: ('wagtail.blocks.CharBlock', (), {'required': False}), 1: ('wagtail.blocks.CharBlock', (), {}), 2: ('wagtail.blocks.URLBlock', (), {}), 3: ('wagtail.blocks.StructBlock', [[('label', 1), ('url', 2)]], {}), 4: ('wagtail.blocks.ListBlock', (3,), {}), 5: ('wagtail.blocks.StructBlock', [[('title', 0), ('links', 4)]], {})}, null=True), + ), + migrations.AlterField( + model_name='socialmediasettings', + name='links', + field=wagtail.fields.StreamField([('link', 2)], block_lookup={0: ('wagtail.blocks.ChoiceBlock', [], {'choices': [('facebook', 'Facebook'), ('twitter', 'Twitter'), ('instagram', 'Instagram'), ('thread', 'Thread'), ('linkedin', 'LinkedIn'), ('youtube', 'YouTube')]}), 1: ('wagtail.blocks.URLBlock', (), {}), 2: ('wagtail.blocks.StructBlock', [[('platform', 0), ('url', 1)]], {})}), + ), + ] diff --git a/innovedus_cms/base/migrations/__init__.py b/innovedus_cms/base/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/innovedus_cms/base/models.py b/innovedus_cms/base/models.py new file mode 100644 index 0000000..47e1f04 --- /dev/null +++ b/innovedus_cms/base/models.py @@ -0,0 +1,100 @@ +from django.db import models +from wagtail.admin.panels import ( + FieldPanel, + MultiFieldPanel, + + # import PublishingPanel: + PublishingPanel, +) + +# import RichTextField: +from wagtail.fields import RichTextField + +# import DraftStateMixin, PreviewableMixin, RevisionMixin, TranslatableMixin: +from wagtail.models import ( + DraftStateMixin, + PreviewableMixin, + RevisionMixin, + TranslatableMixin, +) + +from wagtail.contrib.settings.models import ( + BaseGenericSetting, + register_setting, +) + +from wagtail.snippets.models import register_snippet +from wagtail.fields import StreamField +from wagtail import blocks + +@register_setting +class NavigationSettings(BaseGenericSetting): + footer_links = StreamField([ + ("section", blocks.StructBlock([ + ("title", blocks.CharBlock(required=False)), + ("links", blocks.ListBlock(blocks.StructBlock([ + ("label", blocks.CharBlock()), + ("url", blocks.URLBlock()) + ]))), + ])) + ], use_json_field=True, blank=True, null=True) + + panels = [ + FieldPanel("footer_links"), + ] + + class Meta: + verbose_name = "Footer Navigation" + +class SocialLinkBlock(blocks.StructBlock): + SOCIAL_MEDIA_CHOICES = [ + ("facebook", "Facebook"), + ("twitter", "Twitter"), + ("instagram", "Instagram"), + ("thread", "Thread"), + ("linkedin", "LinkedIn"), + ("youtube", "YouTube"), + ] + + platform = blocks.ChoiceBlock(choices=SOCIAL_MEDIA_CHOICES) + url = blocks.URLBlock() + + class Meta: + icon = "link" + label = "Social Link" + +@register_setting +class SocialMediaSettings(BaseGenericSetting): + links = StreamField([ + ("link", SocialLinkBlock()), + ], use_json_field=True) + + panels = [FieldPanel("links")] + +@register_snippet +class FooterText( + DraftStateMixin, + RevisionMixin, + PreviewableMixin, + TranslatableMixin, + models.Model, +): + + body = RichTextField() + + panels = [ + FieldPanel("body"), + PublishingPanel(), + ] + + def __str__(self): + return "Footer text" + + def get_preview_template(self, request, mode_name): + return "base.html" + + def get_preview_context(self, request, mode_name): + return {"footer_text": self.body} + + class Meta(TranslatableMixin.Meta): + verbose_name_plural = "Footer Text" \ No newline at end of file diff --git a/innovedus_cms/base/templates/base/includes/footer_text.html b/innovedus_cms/base/templates/base/includes/footer_text.html new file mode 100644 index 0000000..2dec019 --- /dev/null +++ b/innovedus_cms/base/templates/base/includes/footer_text.html @@ -0,0 +1,5 @@ +{% load wagtailcore_tags %} + +