From c69f50cbed401ec48a2aa532a6122d287b85d3b5 Mon Sep 17 00:00:00 2001
From: luminaryFlowers <71102109+luminaryFlowers@users.noreply.github.com>
Date: Mon, 27 May 2024 14:00:24 -0700
Subject: [PATCH] individual impact area page should be ready to go => impact
area <=> project connection is via the project page, and those projects will
show up automatically in impact area => other impact areas show up
automatically also
---
.../0011_individualimpactareapage.py | 46 +++++++
...lter_individualimpactareapage_use_cases.py | 20 +++
...alimpactareapage_external_icon_and_more.py | 25 ++++
app/impact_areas/models.py | 123 +++++++++++++++++-
.../impact_areas/components/UseCaseBox.html | 14 ++
.../individual_impact_area_page.html | 102 +++++++++++++++
app/impact_areas/views.py | 2 +-
app/news/models.py | 2 +-
.../programs/individual_program_page.html | 4 +-
...move_individualprojectpage_impact_areas.py | 17 +++
..._individualprojectpage_impact_area_list.py | 20 +++
app/projects/models.py | 14 +-
.../projects/individual_project_page.html | 2 +-
.../ui/components/PageHeaderWithBlur.html | 2 +-
.../ui/components/icon_svgs/LinkCaret.html | 2 +-
.../projects/ProjectPreviewBlockMapHub.html | 2 +-
.../projects/ProjectPreviewBlockNews.html | 11 +-
hot_osm/locale/en/LC_MESSAGES/django.po | 2 +-
hot_osm/locale/es/LC_MESSAGES/django.po | 2 +-
hot_osm/locale/fr/LC_MESSAGES/django.po | 2 +-
hot_osm/templates/base.html | 1 +
...ceholder_ia_icon.2e16d0ba.fill-200x200.png | Bin 0 -> 1173 bytes
.../placeholder_ia_icon.max-165x165.png | Bin 0 -> 5060 bytes
media/images/placeholder_ia_icon.original.png | Bin 0 -> 1173 bytes
media/original_images/placeholder_ia_icon.png | Bin 0 -> 1480 bytes
25 files changed, 390 insertions(+), 25 deletions(-)
create mode 100644 app/impact_areas/migrations/0011_individualimpactareapage.py
create mode 100644 app/impact_areas/migrations/0012_alter_individualimpactareapage_use_cases.py
create mode 100644 app/impact_areas/migrations/0013_individualimpactareapage_external_icon_and_more.py
create mode 100644 app/impact_areas/templates/impact_areas/components/UseCaseBox.html
create mode 100644 app/impact_areas/templates/impact_areas/individual_impact_area_page.html
create mode 100644 app/projects/migrations/0012_remove_individualprojectpage_impact_areas.py
create mode 100644 app/projects/migrations/0013_individualprojectpage_impact_area_list.py
create mode 100644 media/images/placeholder_ia_icon.2e16d0ba.fill-200x200.png
create mode 100644 media/images/placeholder_ia_icon.max-165x165.png
create mode 100644 media/images/placeholder_ia_icon.original.png
create mode 100644 media/original_images/placeholder_ia_icon.png
diff --git a/app/impact_areas/migrations/0011_individualimpactareapage.py b/app/impact_areas/migrations/0011_individualimpactareapage.py
new file mode 100644
index 0000000..146a6c3
--- /dev/null
+++ b/app/impact_areas/migrations/0011_individualimpactareapage.py
@@ -0,0 +1,46 @@
+# Generated by Django 4.2.7 on 2024-05-23 19:31
+
+from django.db import migrations, models
+import django.db.models.deletion
+import wagtail.blocks
+import wagtail.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('wagtailimages', '0025_alter_image_file_alter_rendition_file'),
+ ('wagtailcore', '0089_log_entry_data_json_null_to_object'),
+ ('impact_areas', '0010_alter_impactareaspage_impact_area_blocks'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='IndividualImpactAreaPage',
+ 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')),
+ ('header_text', wagtail.fields.RichTextField(blank=True)),
+ ('intro', wagtail.fields.RichTextField(blank=True)),
+ ('description', wagtail.fields.RichTextField(blank=True)),
+ ('use_cases_title', models.CharField(default='Use Cases')),
+ ('use_cases', wagtail.fields.StreamField([('blocks', wagtail.blocks.StructBlock([('description', wagtail.blocks.RichTextBlock()), ('link_text', wagtail.blocks.CharBlock()), ('link_url', wagtail.blocks.URLBlock(blank=True))]))], blank=True, null=True, use_json_field=True)),
+ ('projects_title', models.CharField(default='Projects')),
+ ('view_all_projects_text', models.CharField(default='View all projects')),
+ ('view_all_projects_link', models.URLField(blank=True)),
+ ('load_more_projects_text', models.CharField(blank=True)),
+ ('explore_impact_areas_text', models.CharField(default='Explore Other Impact Areas')),
+ ('red_dogear_box_title', models.CharField(blank=True)),
+ ('red_dogear_box_link_text', models.CharField(blank=True)),
+ ('red_dogear_box_link_url', models.URLField(blank=True)),
+ ('black_dogear_box_title', models.CharField(blank=True)),
+ ('black_dogear_box_link_text', models.CharField(blank=True)),
+ ('black_dogear_box_link_url', models.URLField(blank=True)),
+ ('header_image', models.ForeignKey(blank=True, help_text='Header image', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')),
+ ('intro_image', models.ForeignKey(blank=True, help_text='Intro image', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ bases=('wagtailcore.page',),
+ ),
+ ]
diff --git a/app/impact_areas/migrations/0012_alter_individualimpactareapage_use_cases.py b/app/impact_areas/migrations/0012_alter_individualimpactareapage_use_cases.py
new file mode 100644
index 0000000..afad594
--- /dev/null
+++ b/app/impact_areas/migrations/0012_alter_individualimpactareapage_use_cases.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.2.7 on 2024-05-23 20:38
+
+from django.db import migrations
+import wagtail.blocks
+import wagtail.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('impact_areas', '0011_individualimpactareapage'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='individualimpactareapage',
+ name='use_cases',
+ field=wagtail.fields.StreamField([('blocks', wagtail.blocks.StructBlock([('description', wagtail.blocks.RichTextBlock()), ('link_text', wagtail.blocks.CharBlock()), ('link_url', wagtail.blocks.URLBlock(blank=True, null=True))]))], blank=True, null=True, use_json_field=True),
+ ),
+ ]
diff --git a/app/impact_areas/migrations/0013_individualimpactareapage_external_icon_and_more.py b/app/impact_areas/migrations/0013_individualimpactareapage_external_icon_and_more.py
new file mode 100644
index 0000000..6586a7b
--- /dev/null
+++ b/app/impact_areas/migrations/0013_individualimpactareapage_external_icon_and_more.py
@@ -0,0 +1,25 @@
+# Generated by Django 4.2.7 on 2024-05-23 21:58
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('wagtailimages', '0025_alter_image_file_alter_rendition_file'),
+ ('impact_areas', '0012_alter_individualimpactareapage_use_cases'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='individualimpactareapage',
+ name='external_icon',
+ field=models.ForeignKey(blank=True, help_text='The icon representing this page which is shown for previews of this page on other pages.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image'),
+ ),
+ migrations.AlterField(
+ model_name='individualimpactareapage',
+ name='load_more_projects_text',
+ field=models.CharField(default='Load More Projects'),
+ ),
+ ]
diff --git a/app/impact_areas/models.py b/app/impact_areas/models.py
index 0aa0a50..c41e7eb 100644
--- a/app/impact_areas/models.py
+++ b/app/impact_areas/models.py
@@ -1,4 +1,6 @@
from django.db import models
+from django.db.models import Q
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from wagtail.models import Page
from wagtail.fields import RichTextField, StreamField
@@ -6,8 +8,125 @@
from wagtail.images.blocks import ImageChooserBlock
from wagtail.admin.panels import FieldPanel, MultiFieldPanel
+from app.projects.models import IndividualProjectPage
-class IndividualBlock(StructBlock):
+
+class UseCaseStructBlock(StructBlock):
+ description = RichTextBlock()
+ link_text = CharBlock()
+ link_url = URLBlock(blank=True, null=True)
+
+
+class UseCaseBlock(StreamBlock):
+ blocks = UseCaseStructBlock()
+
+
+class IndividualImpactAreaPage(Page):
+ def get_context(self, request, *args, **kwargs):
+ context = super().get_context(request, *args, **kwargs)
+
+ projects_list = IndividualProjectPage.objects.live().filter(
+ Q(impact_area_list__contains=[{'type': 'impact_area', 'value': context['page'].id}])
+ )
+ # print(IndividualProjectPage.objects.first().impact_area_list[0].value.id)
+ # print(context['page'].id)
+ # print(IndividualProjectPage.objects.first().impact_area_list.__contains__([{'value__id': context['page'].id}]))
+ # print(dir(IndividualProjectPage.objects.first().impact_area_list))
+ page = request.GET.get('page', 1)
+ paginator = Paginator(projects_list, 4)
+ try:
+ projects = paginator.page(page)
+ except PageNotAnInteger:
+ projects = paginator.page(1)
+ except EmptyPage:
+ projects = paginator.page(paginator.num_pages)
+
+ context['projects'] = projects
+ other_impact_areas = IndividualImpactAreaPage.objects.live()
+ context['other_impact_areas'] = other_impact_areas
+ return context
+
+ header_image = models.ForeignKey(
+ "wagtailimages.Image",
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ related_name="+",
+ help_text="Header image"
+ )
+ header_text = RichTextField(blank=True)
+
+ external_icon = models.ForeignKey(
+ "wagtailimages.Image",
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ related_name="+",
+ help_text="The icon representing this page which is shown for previews of this page on other pages."
+ )
+ intro_image = models.ForeignKey(
+ "wagtailimages.Image",
+ null=True,
+ blank=True,
+ on_delete=models.SET_NULL,
+ related_name="+",
+ help_text="Intro image"
+ )
+ intro = RichTextField(blank=True)
+ description = RichTextField(blank=True)
+
+ use_cases_title = models.CharField(default="Use Cases")
+ use_cases = StreamField(UseCaseBlock(), use_json_field=True, blank=True, null=True)
+
+ projects_title = models.CharField(default="Projects")
+ view_all_projects_text = models.CharField(default="View all projects")
+ view_all_projects_link = models.URLField(blank=True)
+ load_more_projects_text = models.CharField(default="Load More Projects")
+
+ explore_impact_areas_text = models.CharField(default="Explore Other Impact Areas")
+
+ red_dogear_box_title = models.CharField(blank=True)
+ red_dogear_box_link_text = models.CharField(blank=True)
+ red_dogear_box_link_url = models.URLField(blank=True)
+
+ black_dogear_box_title = models.CharField(blank=True)
+ black_dogear_box_link_text = models.CharField(blank=True)
+ black_dogear_box_link_url = models.URLField(blank=True)
+
+ content_panels = Page.content_panels + [
+ MultiFieldPanel([
+ FieldPanel('header_image'),
+ FieldPanel('header_text'),
+ ], heading="Header"),
+ MultiFieldPanel([
+ FieldPanel('external_icon'),
+ FieldPanel('intro_image'),
+ FieldPanel('intro'),
+ FieldPanel('description'),
+ ], heading="Body"),
+ MultiFieldPanel([
+ FieldPanel('use_cases_title'),
+ FieldPanel('use_cases'),
+ ], heading="Use Cases"),
+ MultiFieldPanel([
+ FieldPanel('projects_title'),
+ FieldPanel('view_all_projects_text'),
+ FieldPanel('view_all_projects_link'),
+ FieldPanel('load_more_projects_text'),
+ ], heading="Projects"),
+ FieldPanel('explore_impact_areas_text'),
+ MultiFieldPanel([
+ FieldPanel('red_dogear_box_title'),
+ FieldPanel('red_dogear_box_link_text'),
+ FieldPanel('red_dogear_box_link_url'),
+ FieldPanel('black_dogear_box_title'),
+ FieldPanel('black_dogear_box_link_text'),
+ FieldPanel('black_dogear_box_link_url'),
+ ], heading="Dogear Boxes"),
+ ]
+
+
+class ImpactAreaStructBlock(StructBlock):
image = ImageChooserBlock()
title = CharBlock()
description = RichTextBlock()
@@ -15,7 +134,7 @@ class IndividualBlock(StructBlock):
class ImpactAreaBlock(StreamBlock):
- impact_area_block = IndividualBlock()
+ impact_area_block = ImpactAreaStructBlock()
class ImpactAreasPage(Page):
diff --git a/app/impact_areas/templates/impact_areas/components/UseCaseBox.html b/app/impact_areas/templates/impact_areas/components/UseCaseBox.html
new file mode 100644
index 0000000..df78951
--- /dev/null
+++ b/app/impact_areas/templates/impact_areas/components/UseCaseBox.html
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/app/impact_areas/templates/impact_areas/individual_impact_area_page.html b/app/impact_areas/templates/impact_areas/individual_impact_area_page.html
new file mode 100644
index 0000000..7ee8749
--- /dev/null
+++ b/app/impact_areas/templates/impact_areas/individual_impact_area_page.html
@@ -0,0 +1,102 @@
+{% extends "base.html" %}
+{% load static %}
+{% load wagtailcore_tags %}
+{% load wagtailimages_tags %}
+{% load compress %}
+{% block body_class %}template-individualmappinghubpage{% endblock %}
+{% block extra_css %}
+ {% compress css %}
+ {% endcompress css %}
+{% endblock extra_css %}
+
+{% block content %}
+ {% include "ui/components/PageHeaderWithBlur.html" with title=page.title subtitle=page.header_text image=page.header_image full_length=True %}
+
+
+
+ {% comment %} MAIN BODY {% endcomment %}
+
+
+
+ {{ page.intro|safe }}
+
+ {{ page.description|safe }}
+
+ {% image page.intro_image original class="pb-8 lg:order-1" %}
+
+
+ {% comment %} USE CASES {% endcomment %}
+ {% include "ui/components/SectionHeadingWithUnderline.html" with title=page.use_cases_title %}
+
+ {% for case in page.use_cases %}
+ {% include "./components/UseCaseBox.html" with number=forloop.counter body=case.value.description linktext=case.value.link_text linkurl=case.value.link_url %}
+ {% endfor %}
+
+
+ {% comment %} PROJECTS {% endcomment %}
+
+
+
+ {% include "ui/components/SectionHeadingWithUnderline.html" with title=page.projects_title %}
+
+
+ {% include "ui/components/BaseLink.html" with linktext=page.view_all_projects_text linkurl=page.view_all_projects_link %}
+
+
+
+ {% for project in projects %}
+ {% include "ui/components/projects/ProjectPreviewBlockNews.html" with project=project showimage=True %}
+ {% endfor %}
+
+
+ {% if projects.has_next %}
+ {% comment %} {% endcomment %}
+
+
+ Load More Projects
+
+ {% include "ui/components/icon_svgs/LinkCaret.html" with class="rotate-90 text-hot-red" %}
+
+ {% endif %}
+
+
+
+ {% comment %} OTHER IMPACT AREAS {% endcomment %}
+
+
+ {{ page.explore_impact_areas_text }}
+
+
+
+
+
+ {% comment %} DOGEAR BOXES {% endcomment %}
+
+
+ {% include "ui/components/dogear_boxes/DogearRed.html" with title=page.red_dogear_box_title linktext=page.red_dogear_box_link_text linkurl=page.red_dogear_box_link_url %}
+
+
+ {% include "ui/components/dogear_boxes/DogearBlack.html" with title=page.black_dogear_box_title linktext=page.black_dogear_box_link_text linkurl=page.black_dogear_box_link_url %}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/app/impact_areas/views.py b/app/impact_areas/views.py
index 91ea44a..2a9edce 100644
--- a/app/impact_areas/views.py
+++ b/app/impact_areas/views.py
@@ -1,3 +1,3 @@
from django.shortcuts import render
-# Create your views here.
+from projects.models import IndividualProjectPage
diff --git a/app/news/models.py b/app/news/models.py
index 709390b..8bc6cb6 100644
--- a/app/news/models.py
+++ b/app/news/models.py
@@ -51,7 +51,7 @@ class IndividualNewsPage(Page):
article_body = StreamField([
('text_block', RichTextBlock(features=[
- 'h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'embed', 'code', 'blockquote'
+ 'h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'document-link', 'image', 'embed', 'code', 'blockquote'
]))
], use_json_field=True, null=True, blank=True)
diff --git a/app/programs/templates/programs/individual_program_page.html b/app/programs/templates/programs/individual_program_page.html
index 97d49a6..8902f0a 100644
--- a/app/programs/templates/programs/individual_program_page.html
+++ b/app/programs/templates/programs/individual_program_page.html
@@ -14,13 +14,13 @@
- {% image page.intro_image original class="pb-8" %}
-
+
{{ page.intro|safe }}
{{ page.description|safe }}
+ {% image page.intro_image original class="pb-8 lg:order-1" %}
diff --git a/app/projects/migrations/0012_remove_individualprojectpage_impact_areas.py b/app/projects/migrations/0012_remove_individualprojectpage_impact_areas.py
new file mode 100644
index 0000000..2c1e201
--- /dev/null
+++ b/app/projects/migrations/0012_remove_individualprojectpage_impact_areas.py
@@ -0,0 +1,17 @@
+# Generated by Django 4.2.7 on 2024-05-23 22:45
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('projects', '0011_alter_individualprojectpage_black_box_link_text_and_more'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='individualprojectpage',
+ name='impact_areas',
+ ),
+ ]
diff --git a/app/projects/migrations/0013_individualprojectpage_impact_area_list.py b/app/projects/migrations/0013_individualprojectpage_impact_area_list.py
new file mode 100644
index 0000000..a2222c1
--- /dev/null
+++ b/app/projects/migrations/0013_individualprojectpage_impact_area_list.py
@@ -0,0 +1,20 @@
+# Generated by Django 4.2.7 on 2024-05-23 22:46
+
+from django.db import migrations
+import wagtail.blocks
+import wagtail.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('projects', '0012_remove_individualprojectpage_impact_areas'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='individualprojectpage',
+ name='impact_area_list',
+ field=wagtail.fields.StreamField([('impact_area', wagtail.blocks.PageChooserBlock(page_type=['impact_areas.IndividualImpactAreaPage']))], blank=True, null=True, use_json_field=True),
+ ),
+ ]
diff --git a/app/projects/models.py b/app/projects/models.py
index 06e1bc3..183da20 100644
--- a/app/projects/models.py
+++ b/app/projects/models.py
@@ -29,7 +29,7 @@ class IndividualProjectPage(Page):
intro = RichTextField(blank=True)
description = StreamField([
('text_block', RichTextBlock(features=[
- 'h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'embed', 'code', 'blockquote'
+ 'h1', 'h2', 'h3', 'h4', 'bold', 'italic', 'link', 'ol', 'ul', 'hr', 'document-link', 'image', 'embed', 'code', 'blockquote'
]))
], use_json_field=True, null=True)
@@ -40,7 +40,7 @@ class IndividualProjectPage(Page):
# > SIDE BAR
impact_areas_title = models.CharField(default="Impact Areas")
- impact_areas = RichTextField(null=True, blank=True) # Will need to reference an impact area once impact areas are added
+ impact_area_list = StreamField([('impact_area', PageChooserBlock(page_type="impact_areas.IndividualImpactAreaPage"))], use_json_field=True, null=True, blank=True)
region_hub_title = models.CharField(default="Region Hub")
owner_region_hub = models.ForeignKey(
@@ -99,7 +99,7 @@ class IndividualProjectPage(Page):
], heading="Body"),
MultiFieldPanel([
FieldPanel('impact_areas_title'),
- FieldPanel('impact_areas'),
+ FieldPanel('impact_area_list'),
FieldPanel('region_hub_title'),
PageChooserPanel('owner_region_hub', 'mapping_hubs.IndividualMappingHubPage'),
FieldPanel('duration_title'),
@@ -112,10 +112,10 @@ class IndividualProjectPage(Page):
FieldPanel('contact'),
MultiFieldPanel([
FieldPanel('related_news_title'),
- FieldPanel('view_all_news_text'),
- FieldPanel('related_news'),
- FieldPanel('related_events_title'),
- FieldPanel('view_all_events_text'),
+ FieldPanel('view_all_news_text'),
+ FieldPanel('related_news'),
+ FieldPanel('related_events_title'),
+ FieldPanel('view_all_events_text'),
], heading="Related Pages"),
], heading="Sidebar"),
MultiFieldPanel([
diff --git a/app/projects/templates/projects/individual_project_page.html b/app/projects/templates/projects/individual_project_page.html
index 2a15dda..0bcc47c 100644
--- a/app/projects/templates/projects/individual_project_page.html
+++ b/app/projects/templates/projects/individual_project_page.html
@@ -62,7 +62,7 @@
{{ page.related_news_title }}
{% include "ui/components/BaseLink.html" with linkurl="#" linktext=page.view_all_news_text %}
-
+
{% with allnews=page.related_news %}
{% for news in allnews %}
{% include "ui/components/news/NewsPreviewBlockProjects.html" with news=news.value %}
diff --git a/app/ui/templates/ui/components/PageHeaderWithBlur.html b/app/ui/templates/ui/components/PageHeaderWithBlur.html
index 56c0bdb..3aa41e6 100644
--- a/app/ui/templates/ui/components/PageHeaderWithBlur.html
+++ b/app/ui/templates/ui/components/PageHeaderWithBlur.html
@@ -9,7 +9,7 @@
{% image image original as image_p %}
-
+
diff --git a/app/ui/templates/ui/components/icon_svgs/LinkCaret.html b/app/ui/templates/ui/components/icon_svgs/LinkCaret.html
index 780a4ad..afcd7cb 100644
--- a/app/ui/templates/ui/components/icon_svgs/LinkCaret.html
+++ b/app/ui/templates/ui/components/icon_svgs/LinkCaret.html
@@ -2,6 +2,6 @@
This takes on the current text colour.
{% endcomment %}
-
+
\ No newline at end of file
diff --git a/app/ui/templates/ui/components/projects/ProjectPreviewBlockMapHub.html b/app/ui/templates/ui/components/projects/ProjectPreviewBlockMapHub.html
index d19e8ee..ab76a6e 100644
--- a/app/ui/templates/ui/components/projects/ProjectPreviewBlockMapHub.html
+++ b/app/ui/templates/ui/components/projects/ProjectPreviewBlockMapHub.html
@@ -23,7 +23,7 @@
-
+
{{ project.title }}
diff --git a/app/ui/templates/ui/components/projects/ProjectPreviewBlockNews.html b/app/ui/templates/ui/components/projects/ProjectPreviewBlockNews.html
index b95b911..ce2cfbc 100644
--- a/app/ui/templates/ui/components/projects/ProjectPreviewBlockNews.html
+++ b/app/ui/templates/ui/components/projects/ProjectPreviewBlockNews.html
@@ -23,16 +23,17 @@
-
+
{{ project.title }}
-
- {% comment %} REPLACE THIS ONCE IMPACT AREAS ARE MADE {% endcomment %}
- Disasters & Climate Resilience
-
+ {% for area in project.impact_area_list %}
+
+ {{ area.value.title }}{% if not forloop.last %},{% endif %}
+
+ {% endfor %}
\ No newline at end of file
diff --git a/hot_osm/locale/en/LC_MESSAGES/django.po b/hot_osm/locale/en/LC_MESSAGES/django.po
index b92edde..2d6b726 100644
--- a/hot_osm/locale/en/LC_MESSAGES/django.po
+++ b/hot_osm/locale/en/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-05-21 21:14+0000\n"
+"POT-Creation-Date: 2024-05-23 19:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME
\n"
"Language-Team: LANGUAGE \n"
diff --git a/hot_osm/locale/es/LC_MESSAGES/django.po b/hot_osm/locale/es/LC_MESSAGES/django.po
index e757069..46bf7f9 100644
--- a/hot_osm/locale/es/LC_MESSAGES/django.po
+++ b/hot_osm/locale/es/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-05-21 21:14+0000\n"
+"POT-Creation-Date: 2024-05-23 19:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
diff --git a/hot_osm/locale/fr/LC_MESSAGES/django.po b/hot_osm/locale/fr/LC_MESSAGES/django.po
index e0c773b..6715543 100644
--- a/hot_osm/locale/fr/LC_MESSAGES/django.po
+++ b/hot_osm/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-05-21 21:14+0000\n"
+"POT-Creation-Date: 2024-05-23 19:32+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
diff --git a/hot_osm/templates/base.html b/hot_osm/templates/base.html
index e3a3ce2..181ba35 100644
--- a/hot_osm/templates/base.html
+++ b/hot_osm/templates/base.html
@@ -34,6 +34,7 @@
rel="stylesheet">
+
diff --git a/media/images/placeholder_ia_icon.2e16d0ba.fill-200x200.png b/media/images/placeholder_ia_icon.2e16d0ba.fill-200x200.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce9bf7c968e417cf936f97ca82cdd1e75a11ce20
GIT binary patch
literal 1173
zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>fhES%#WAGf*4w)`^KKgmum<=~
z`2YXuOYcT8H<|9)N1w_p@bA@)oON39scSzwP!|@Uqw)V=bN|mG4v^fp?SG~o&wswb
zTX2sM-}zhn%=GWfv9Nie;M}dp_0LX9u0C|njq~?zd&hb?REg%)6}Z&%J^K7@^QIY_
z3wAH-Tow_#EIRVzk2M^bCM+iGw(rflGi09_&t1C2A=~Xu#jGONhuan(&Nd9a?6~SW
z=X{L?D|GHn+IsD3--P`o%4RPWmMT|<^zAVWT##P~>o17=hYZ-@lrya!
=dOBk`Oq>^9b0|<$Suzg?7EpYH;K3CT|>C>RjWJ)
zQGrG$2Z23S_dMAd(EucJ8ie2cn)~F-jHW&ti5CKE4xkxgWd;xuSct?(03}Wl`tQkqF7KJ$
zJhAn+&@xZ4m+I&CFaD7Kx%v3h8|O-YDcPFc=$Db{`)?h~#i8A1ZQZ6k@88-BwX8=>
z@*~)5wzK`x)nRJNymzvUuS46WZ*7A~Ur%Ml#kAwenhMKIgZqwcy!lZ;;4-VLrot``
zrbXR88~)mSnZbF2F;+#aM%TSGPB!ICN5toiJkyu5ru@>IWS;-Oukk>XkAt1qq?$E5
z=Q%jE^*_;7F3xpe%`&jR^z-c6W(4|j#$#%u)um&lA=m$O(Iu`GG>@UMRuH&cZvS<*ou2m4@kt*)z4*}
HQ$iB}dW;C!
literal 0
HcmV?d00001
diff --git a/media/images/placeholder_ia_icon.max-165x165.png b/media/images/placeholder_ia_icon.max-165x165.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef5a780a412ad4851a566d5aedbd50d2f44ed4fe
GIT binary patch
literal 5060
zcmb7|_ct33pvBGDrLkA-Sp=A^@oE!SM&m3OzadeVWA{owP7zPCV#M#NpNj^)@{SAW!Kt1|Op-!s4
z!EjF1OHwy)%goCn!&jWYlc1$I8ui=<^@eW(4
zn7B~|T^CC=U(=3^Y_}b<$O6N^gEzw>mpSY_K;$2sS!nQw!aw~S>P~XW!UQHYOGk~R
z*e&R3J1EcSi1+b&IPR7q&z6%bY7q|i(<^|_9UoSo6)poU4JpvDKeyCJ3*Qu{vOZ+;
zlqowOc`KO!OM$RM@(*~w5G4EcCe>H+kNQR_mK5m@{I#x>;Pu-Pw}>*e^iOkB+dI;>
zsyuFU4&TVdJ%_
zQSGm`m4_1jiIwGDNWQ4oL8N_+z&4L7buYrdz}Bf%tzZxhfr()4(Ru5Wj5N{%Bbz8E
zIFFb8=z1;^w?J_vZlE4-+h?>{3(II!EI_l(npBF%6
z54JJwe9*X{_3OS^S>tT07{f1Gw9ZygX{>PQ;RLj=P1qcv4O+dvIVqRk*~^)Pbjp0^
zraK)Z;iKY%>HF>ledT`mm5=$d1$SPS@QB^P5dTl`_GE7Z;bUE25PK&!IQ(t$3`!4T
z9;X-hQzgc+B>;`y>JUkEthOHPi6xh6M`7%he1Fd06)>0E)acl)9MVS3UAUJMGGqN1
z%Q}zAc#lFZpX$@wC?NK3A0AWmYRD+<m^FG
zhVaciE*KEyC|c|>{p2O_ogTle6{PtTrNfgM)8k+GRc7b+t^CI)n75C*S5V;>l|Ze+
zr?b4cCr9=#xR|KGS+%fmoEhQ
zaxN2Q#uEBACktH>7A|shr4Hr!O-8iE+$t_ACFG;Eos-_7_6N8J53xeLqpWLO@H^#$
z^EKgc?hFhZSuO02xaaeEsUV5f_oqeOqeRNFas25=Qly7qU*3m+>NS>6qbnDcu13Fr
zHI8_mH$4^K!X}pIOO8fYb#6M$$Q#WGf&A*RyYK0`#(moq2iSnqSr+MmZ{C#*3~MK<
zeu}tFETs#y1)ejHwk`aSobeSto+7pJs6JU}T6K%IVI>gA9K?xH{irY%%9e>_RF7Mc
ziPVF9jmco*Oh>RS0UQfJ(`+`$SeLmNDwnpsJC^F7x84!_sSsR39?{Xhs43{
zgTEbMrt`_spT~?N=sWcUb0<>|ZIc?bnu-Y*>`9t*Rh{n5+@vmFjC9laxrrffMQ_^B
z@JKzl_5P8`6GPQ9?f`LG9~R#fv(g%Sx@6CQYL~slgnD|!O~fr#)e$3XY-98iJkHaJ
zGTuX7)EPuXSDW=eX2{E=a1~{46Y)V`F6j+5Us`g@aVzk7{M_ScO+^zC5odsKPee^{hy*G;sww$3x)jC?3&!`Ex@A=X+9*{#
zuG7S^uS8a<^z^@Mwid^%b?N{{KI^o?J^=j`p*(T=^X)fV9xKIT4I$sMKB4*P-SzNH
zhLG4!qba_vrzI*P&PiNsiFaxbWQ7H3eMdUB4hzkG9
z-}9Nihl7U+n`nRFK3Q_(>P{0v!%!_kz&FKN={LTeH|H2d?_4hAG
z*o<2fgpeD!KQCUSVLa-l{1TqtlfK97^X+0C{Jd>43YD^TW(8elpakZ==gs;e|9yY|
zwVIu>JO5eu?!EgHJJjo7$|qU6hoMveJ}x!w#B$}$Wf~=J=(n0Z=F|VWQm1NR?k-qFB7?oxKx*`PqD-fcWL5Kg(pQ{_2Xy(yHdr2cEsXg2nQ9
zZ6AeLk%MzwOU~+KhyCHgpvbR0BFk3KzmoLMqigJO@A2HU(v>w3Y>KM(4MnsOAah
z!xo>pDA00TRff9;LbY0^kb9HM=(njgkkp}Xm|~BARa?;j9>RH_fBP{($QIlK9O0~PjZuad~7`b0}e4|Ni3BA_YMSPCD^(eg$Hp4$W
zmTQwW?xcG~MJJ;>)xY?{PFXp7!Zmoz>`^0q>qSc3otV)eh^17Ko(gDD#f}?{B3+
zYFakqi@l8HZ7HDAtCo{vr1W}^}nwV7v)gU
zXVpMlR2%&;>ba)oRlceW?HdQ^
ztFvT&oJB_?M7$f{j7loUfH6C`G2elWV|-oVi|?|4)jK5R7=Zx4+um*bdc2hz$b|ig
zXs0k$gVEQ(s=E}gs~~?D^n*$kU4E>ZCfWl*1e!n9({(`Ltgd0
zO0Dw}YFv9b{F*frf2;`e`(y0echt0Xk;rH_B0QvaK`S?L?y*a_OW$w{OVw;bg^5QL
zn1c-3lLsDzgny!cFw=LI)?febNbGEl74$9a{YfCFpayOmnU#lH1)P+sJ#ze1Q;Bgp
z8+gay%35A~@__vOUsbECg9c
zgHSxng(-`5eTOd;Cv-ik*Y1r&iQNQ2QV(tbf`yVfu-zn%m+&vjNe=wDPMoFmvNMxO
zQYvZ)F!~21AE-$bz%kLq%qQBG6h8<0ucsdXX3Gv!Q3F;Ah0RL_@n27qWNvyZjC?km
zCdaHA3XgJDLXdt8L|X5~QYCf5=k6~8otOeJl85(I8Btycqkn!5kdX*w>~A8#d$tU$Sqk58chuT
zToD%RE`~|&O~!>;OZ!c;t>jV>zS|XLYTXljD}m=dFymB2C{3n4THwcI_(xXznY@5b
zQ(i(wm6K2r3)#3twR^tr8-nZgi*lz17Yp`T)Fr8r`x@on&8dV67hx*a
zwlVYBqb%qJ#-Q5>v+}v!{(a!kTm39&s4Ih0@QLElUbCbglOgg$x&hh3`rHQmu~pA^
zoKSR;3{>Un{Bz9uYylxH&2J~an1V0fw)jN8yw1fjD1vP?V98+j+hOSOMVLeSPQN?#
z-tvnjwYtQ0iO&Fcrz(DIYEEAZ@S5D)m`*&kmRh>KYBfrBT^F5{M@9W
z4NOPrqyx1%RwSw;y&5Cl+e}MGx?5ApyyX33p0uk
zP~*4RvYV6c(lg~a<%5as8!vuGi$6M0p1W|F>lOdr7*)h*6(Ui?DeCdO^;4hWcJag;
z585GP5Amjqx>3%qCQIbt1ZqE{1Fx!rJt?f8
z>DwVw>3;DwZ(=BJ$8(rS@=4@8A>UJh?r8*KZ>V&wnf9pk`#l|fhES%#WAGf*4w)`^KKgmum<=~
z`2YXuOYcT8H<|9)N1w_p@bA@)oON39scSzwP!|@Uqw)V=bN|mG4v^fp?SG~o&wswb
zTX2sM-}zhn%=GWfv9Nie;M}dp_0LX9u0C|njq~?zd&hb?REg%)6}Z&%J^K7@^QIY_
z3wAH-Tow_#EIRVzk2M^bCM+iGw(rflGi09_&t1C2A=~Xu#jGONhuan(&Nd9a?6~SW
z=X{L?D|GHn+IsD3--P`o%4RPWmMT|<^zAVWT##P~>o17=hYZ-@lrya!=dOBk`Oq>^9b0|<$Suzg?7EpYH;K3CT|>C>RjWJ)
zQGrG$2Z23S_dMAd(EucJ8ie2cn)~F-jHW&ti5CKE4xkxgWd;xuSct?(03}Wl`tQkqF7KJ$
zJhAn+&@xZ4m+I&CFaD7Kx%v3h8|O-YDcPFc=$Db{`)?h~#i8A1ZQZ6k@88-BwX8=>
z@*~)5wzK`x)nRJNymzvUuS46WZ*7A~Ur%Ml#kAwenhMKIgZqwcy!lZ;;4-VLrot``
zrbXR88~)mSnZbF2F;+#aM%TSGPB!ICN5toiJkyu5ru@>IWS;-Oukk>XkAt1qq?$E5
z=Q%jE^*_;7F3xpe%`&jR^z-c6W(4|j#$#%u)um&lA=m$O(Iu`GG>@UMRuH&cZvS<*ou2m4@kt*)z4*}
HQ$iB}dW;C!
literal 0
HcmV?d00001
diff --git a/media/original_images/placeholder_ia_icon.png b/media/original_images/placeholder_ia_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..c32326b69b187638438bd1741dd2799563574c65
GIT binary patch
literal 1480
zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k8A#4*i(3Pv7>k44ofy`glX(f`u%tWsIx;Y9
z?C1WI$O`1M1^9%x0%;&vn!fWqkYXwc@(cdY@N~O@7m&wU;1OBOz`%DHgc*g8ub||Bou{>r}YcpW}9Y;Z;QmDJ#;I&KrJRyg4MsY{!#FlS-^RB2KJKtuj1(<$kmVQ~l}oR}-79
zF8&P={}CmS$sfEuO3(erqx1XNP4v82tJ?BJ7v&{nEDe7WVEbXZ-j~-;SE%G^sJ>vh
z8<6aFL^ax%b?c@z&)+ZlY;JNgeCiG@)fWzPL*9CCo5hv2)U4R{=>6KsK|-e_<1(I^
z8~ZS4?KN9`zFF;$rzZOs{+ajB81Sz6ddeqxO?HseqSx|9`)4Lf1-yP;DCeTL%3;N~
zXKo9t$_#-@ZuMGC<6jhWr8>#DL*|>I?~1>-d@Y|%o^rJy*EhtH(R|j+qcW$D964Ni
zru~a&UUsqV$ySl9paA8f8^?_{esW0Bt=(2;dPjA8NY=Vd7t1&Jy!iTgc~m*4-+?EO
zX5~e#2Z{NoJo8W8&F!_Q<_!CyQ{8Wa-w2oAnayy#Va0yc4mTkKCDppb35NA*Cm01&
zyjUvTSY`@2&J%Q8<}x9@=Gj$wg{BH+7<#PZ@wuG!O#8q7IE%`;$u^uuaUXbon>}T`
zb3w4hNqy1;!H2wWc3=7ZptVoML^_gbW5^1-qkFt<{n=jESOu+I%Cf!Tn#rEl%9WcA
ziam{4-I%TWH=r-Pxx@X+I)BEzrytm!#b&UqI(Nf>{mlOMN^z;iRi?^lVE5!P$
zyj8lcv%e828-0f(LRD|K=rp6H&)$n0=BTxA%G9DXr(?lD13s_q?2LMtNuNo&ADK
zA2vI#+WA_?s9rLVd)~(q_pgN+%k?UbNn6W(N^jcZ%<|C1f+?h1K7Y?VFVav$E5|
z@N<@TN-S?|D7yJ}aRtXDcJsR6tB(vkHWs{AsSMZ66*70+HGjwAmlA9XH*D{IXE9e_
zY)8Ze%l28T=QN*qB)R`s?oU{O#Y@7Vp>>z3oB4
zrhOKFM5kW6=loLBbnYXTB%iWX*1wwIe?kr$Pjoz}j
zXhX3Dr~ab3*JQN01Ur|>oXsn?=-{8E*t$aWqU6LG+w#6gS;*wbrF64iG<&hzUiQfZ
z4x>TjM5N7-x{r