diff --git a/app/members/migrations/0013_alter_membergroupownerpage_sort_by_titlea_and_more.py b/app/members/migrations/0013_alter_membergroupownerpage_sort_by_titlea_and_more.py new file mode 100644 index 0000000..02db5aa --- /dev/null +++ b/app/members/migrations/0013_alter_membergroupownerpage_sort_by_titlea_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2024-07-15 17:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0012_membergroupownerpage_view_all_text'), + ] + + operations = [ + migrations.AlterField( + model_name='membergroupownerpage', + name='sort_by_titlea', + field=models.CharField(default='Sort by Name Alphabetical'), + ), + migrations.AlterField( + model_name='membergroupownerpage', + name='sort_by_titlez', + field=models.CharField(default='Sort by Name Reverse Alphabetical'), + ), + ] diff --git a/app/news/templates/news/individual_news_page.html b/app/news/templates/news/individual_news_page.html index c91346e..796ecec 100644 --- a/app/news/templates/news/individual_news_page.html +++ b/app/news/templates/news/individual_news_page.html @@ -17,10 +17,7 @@
{{page.get_parent.specific.authors_posted_by_text}} {% for author in page.authors %} - {{author.value.title}} - {% if not forloop.last %} - , - {% endif %} + {{author.value.title}}{% if not forloop.last %}, {% endif %} {% endfor %} {{page.get_parent.specific.authors_posted_on_text}} {{ page.date }}
diff --git a/app/rfp/__init__.py b/app/rfp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/rfp/admin.py b/app/rfp/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/app/rfp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/app/rfp/apps.py b/app/rfp/apps.py new file mode 100644 index 0000000..94559f5 --- /dev/null +++ b/app/rfp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RfpConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'app.rfp' diff --git a/app/rfp/migrations/0001_initial.py b/app/rfp/migrations/0001_initial.py new file mode 100644 index 0000000..e934dc5 --- /dev/null +++ b/app/rfp/migrations/0001_initial.py @@ -0,0 +1,59 @@ +# Generated by Django 4.2.7 on 2024-07-15 20:55 + +from django.db import migrations, models +import django.db.models.deletion +import wagtail.blocks +import wagtail.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wagtailcore', '0089_log_entry_data_json_null_to_object'), + ] + + operations = [ + migrations.CreateModel( + name='IndividualRequestForProposalPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('posters', wagtail.fields.StreamField([('poster', wagtail.blocks.PageChooserBlock(page_type=['members.IndividualMemberPage']))], blank=True, null=True, use_json_field=True)), + ('intro', wagtail.fields.RichTextField(blank=True)), + ('article_body', wagtail.fields.StreamField([('text_block', wagtail.blocks.RichTextBlock(features=['h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'document-link', 'image', 'embed', 'code', 'blockquote']))], blank=True, null=True, use_json_field=True)), + ('role', models.CharField(blank=True)), + ('application_close_date', models.DateField(blank=True)), + ('project_duration', models.CharField(blank=True)), + ('work_location', models.CharField(blank=True)), + ('contract_type', models.CharField(blank=True)), + ('direct_contact', models.CharField(blank=True)), + ('submission_email', models.EmailField(blank=True, max_length=254)), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='RequestForProposalOwnerPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('posted_by_prefix_text', models.CharField(default='Posted by')), + ('terms_of_reference_title', models.CharField(default='Terms of Reference')), + ('role_title', models.CharField(default='Role:')), + ('application_close_title', models.CharField(default='Application Close Date:')), + ('project_duration_title', models.CharField(default='Duration of Project:')), + ('work_location_title', models.CharField(default='Work Location:')), + ('contract_type_title', models.CharField(default='Type of Contract:')), + ('direct_contact_title', models.CharField(default='Direct Contact:')), + ('cta_title', models.CharField(blank=True)), + ('submission_email_button', models.CharField(default='Submission Email')), + ('go_back_text', models.CharField(default='Go Back to Request for Proposals')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/app/rfp/migrations/0002_individualrequestforproposalpage_post_date_and_more.py b/app/rfp/migrations/0002_individualrequestforproposalpage_post_date_and_more.py new file mode 100644 index 0000000..3a19662 --- /dev/null +++ b/app/rfp/migrations/0002_individualrequestforproposalpage_post_date_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.7 on 2024-07-15 20:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('rfp', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='individualrequestforproposalpage', + name='post_date', + field=models.DateField(blank=True, null=True), + ), + migrations.AlterField( + model_name='individualrequestforproposalpage', + name='application_close_date', + field=models.DateField(blank=True, null=True), + ), + ] diff --git a/app/rfp/migrations/__init__.py b/app/rfp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/rfp/models.py b/app/rfp/models.py new file mode 100644 index 0000000..953a170 --- /dev/null +++ b/app/rfp/models.py @@ -0,0 +1,84 @@ +from django.db import models + +from wagtail.admin.panels import FieldPanel, MultiFieldPanel +from wagtail.fields import RichTextField, StreamField +from wagtail.blocks import CharBlock, StreamBlock, StructBlock, URLBlock, RichTextBlock, PageChooserBlock +from wagtail.models import Page + + +class RequestForProposalOwnerPage(Page): + subpage_types = [ + 'rfp.IndividualRequestForProposalPage' + ] + + max_count = 1 + + posted_by_prefix_text = models.CharField(default="Posted by") + + terms_of_reference_title = models.CharField(default="Terms of Reference") + role_title = models.CharField(default="Role:") + application_close_title = models.CharField(default="Application Close Date:") + project_duration_title = models.CharField(default="Duration of Project:") + work_location_title = models.CharField(default="Work Location:") + contract_type_title = models.CharField(default="Type of Contract:") + direct_contact_title = models.CharField(default="Direct Contact:") + cta_title = models.CharField(blank=True) + submission_email_button = models.CharField(default="Submission Email") + + go_back_text = models.CharField(default="Go Back to Request for Proposals") + + content_panels = Page.content_panels + [ + FieldPanel('posted_by_prefix_text'), + MultiFieldPanel([ + FieldPanel('terms_of_reference_title'), + FieldPanel('role_title'), + FieldPanel('application_close_title'), + FieldPanel('project_duration_title'), + FieldPanel('work_location_title'), + FieldPanel('contract_type_title'), + FieldPanel('direct_contact_title'), + FieldPanel('cta_title'), + FieldPanel('submission_email_button'), + ], heading="Sidebar"), + FieldPanel('go_back_text'), + ] + + +class IndividualRequestForProposalPage(Page): + parent_page_type = [ + 'rfp.RequestForProposalOwnerPage' + ] + + posters = StreamField([('poster', PageChooserBlock(page_type="members.IndividualMemberPage"))], use_json_field=True, null=True, blank=True) + post_date = models.DateField(blank=True, null=True) + + intro = RichTextField(blank=True) + article_body = StreamField([ + ('text_block', RichTextBlock(features=[ + 'h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'document-link', 'image', 'embed', 'code', 'blockquote' + ])) + ], use_json_field=True, null=True, blank=True) + + role = models.CharField(blank=True) + application_close_date = models.DateField(blank=True, null=True) + project_duration = models.CharField(blank=True) + work_location = models.CharField(blank=True) + contract_type = models.CharField(blank=True) + direct_contact = models.CharField(blank=True) + submission_email = models.EmailField(blank=True) + + content_panels = Page.content_panels + [ + FieldPanel('posters'), + FieldPanel('post_date'), + FieldPanel('intro'), + FieldPanel('article_body'), + MultiFieldPanel([ + FieldPanel('role'), + FieldPanel('application_close_date'), + FieldPanel('project_duration'), + FieldPanel('work_location'), + FieldPanel('contract_type'), + FieldPanel('direct_contact'), + FieldPanel('submission_email'), + ], heading="Sidebar"), + ] diff --git a/app/rfp/templates/rfp/components/SidebarSection.html b/app/rfp/templates/rfp/components/SidebarSection.html new file mode 100644 index 0000000..3490c2d --- /dev/null +++ b/app/rfp/templates/rfp/components/SidebarSection.html @@ -0,0 +1,11 @@ ++ {{ text }} +
++ {{page.get_parent.specific.posted_by_prefix_text}} + {% for poster in page.posters %} + {{poster.value.title}}{% if not forloop.last %}, {% endif %} + {% endfor %} + • {{ page.post_date }} +
++ {% include "ui/components/BaseLink.html" with linktext=page.get_parent.specific.go_back_text linkurl=page.get_parent.url %} +
++ {{page.get_parent.specific.posted_by_prefix_text}} + {% for poster in page.posters %} + {{poster.value.title}}{% if not forloop.last %}, {% endif %} + {% endfor %} +
++ {% include "ui/components/BaseLink.html" with linktext=page.get_parent.specific.go_back_text linkurl=page.get_parent.url %} +
+