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 @@ +
+

+ {{ number }}. +

+
+ {{ body }} +
+ +

+ {{ linktext }} + {% include "ui/components/icon_svgs/LinkCaret.html" %} +

+
+
\ 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 %} + + {% endif %} +

+
+ + {% comment %} OTHER IMPACT AREAS {% endcomment %} +
+

+ {{ page.explore_impact_areas_text }} +

+
+ {% for area in other_impact_areas %} + {% if area != page %} + +
+ {% image area.external_icon fill-200x200 class="px-10" %} +

+ {{ area.title }} +

+
+
+ {% endif %} + {% endfor %} +
+
+ + + {% 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##Po17=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 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 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