Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ init-certs:
init-playwright:
npx playwright install --with-deps

.PHONY: init-db
init-db:
# TODO: executer dans le conteneur docker directement
psql -d "$(DB_URL)" -f scripts/sql/create_databases.sql
psql -d "$(DB_URL)" -f scripts/sql/create_extensions.sql

.PHONY: init-dev
init-dev:
# git
Expand All @@ -45,8 +51,7 @@ init-dev:
cp .env.template .env
cp ./dags/.env.template ./dags/.env
# prepare django
psql -d "$(DB_URL)" -f scripts/sql/create_databases.sql
psql -d "$(DB_URL)" -f scripts/sql/create_extensions.sql
make init-db
make migrate
make createcachetable
make createsuperuser
Expand Down
3 changes: 3 additions & 0 deletions jinja2/qfdmo/carte.html
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
data-search-form-visible
data-search-solution-form-map-container-id-value="{{ map_container_id }}"
>
<div class=" qf-hidden">
{{ displayed_acteur_form }}
</div>
<input type="hidden" name="map_container_id" value="{{ map_container_id }}">
<section class="map-grid qf-relative">
<header
Expand Down
2 changes: 1 addition & 1 deletion jinja2/qfdmo/carte/results.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
>
{% for acteur in acteurs %}
<script type="application/json" data-map-target="acteur">
{{ acteur.json_acteur_for_display(direction=form.initial.direction, action_list=form.initial.action_list, carte=carte, carte_config=carte_config, sous_categorie_id=form.initial.sc_id) | safe }}
{{ acteur.json_acteur_for_display(direction=form.initial.direction, action_list=form.initial.action_list, carte=carte, carte_config=carte_config, sous_categorie_id=form.initial.sc_id, displayed_acteur_form=displayed_acteur_form) | safe }}
</script>
{% endfor %}
</div>
Expand Down
47 changes: 31 additions & 16 deletions qfdmd/models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import logging
from urllib.parse import urlencode

import sites_faciles
from django.contrib.gis.db import models
from django.db.models import CheckConstraint, Q
from django.db.models.functions import Now
from django.http import QueryDict
from django.template.loader import render_to_string
from django.urls.base import reverse
from django.utils.functional import cached_property
Expand Down Expand Up @@ -327,17 +327,27 @@ def get_etats_descriptions(self) -> tuple[str, str] | None:
@property
def carte_settings(self):
# TODO : gérer plusieurs catégories ici
sous_categorie = self.sous_categories.filter(afficher_carte=True).first()
if not sous_categorie:
return {}

return {
"direction": "jai",
"first_dir": "jai",
"limit": 25,
"sc_id": sous_categorie.id,
"sous_categorie_objet": sous_categorie.libelle,
}
sous_categories = self.sous_categories.filter(afficher_carte=True).all()
settings_querydict = QueryDict(mutable=True)

if not sous_categories:
return settings_querydict

settings_querydict.update(
{
"direction": "jai",
"first_dir": "jai",
"limit": 25,
"sc_id": sous_categories.first().id,
"sous_categorie_objet": sous_categories.first().libelle,
}
)

settings_querydict.setlist(
"sous_categories", sous_categories.values_list("id", flat=True)
)

return settings_querydict

@cached_property
def en_savoir_plus(self):
Expand Down Expand Up @@ -450,16 +460,21 @@ def get_url_carte(self, actions=None, map_container_id=None):
carte_settings = self.produit.carte_settings
if actions:
carte_settings.update(
action_list=actions,
action_displayed=actions,
{
"action_list": actions,
"action_displayed": actions,
}
)

if map_container_id:
carte_settings.update(
map_container_id=map_container_id,
{
"map_container_id": map_container_id,
}
)

params = urlencode(carte_settings)
params = carte_settings.urlencode()
logger.info(f"{params=}")
url = reverse("qfdmd:carte", args=[self.slug])
return f"{url}?{params}"

Expand Down
19 changes: 13 additions & 6 deletions qfdmo/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from dsfr.forms import DsfrBaseForm
from typing_extensions import deprecated

from qfdmo.fields import GroupeActionChoiceField
from qfdmo.geo_api import epcis_from, formatted_epcis_as_list_of_tuple
Expand All @@ -26,6 +27,16 @@
)


class DisplayedActeursForm(forms.Form):
sous_categories = forms.ModelMultipleChoiceField(
required=False,
initial=SousCategorieObjet.objects.none(),
queryset=SousCategorieObjet.objects.filter(afficher=True),
widget=forms.MultipleHiddenInput,
)


@deprecated("This form will be dropped soon in favor of DisplayedActeursForm")
class AddressesForm(forms.Form):
def load_choices(self, request: HttpRequest, **kwargs) -> None:
if address_placeholder := request.GET.get("address_placeholder"):
Expand Down Expand Up @@ -502,9 +513,7 @@ def load_choices(self):
action_displayed = forms.MultipleChoiceField(
widget=DSFRCheckboxSelectMultiple(
attrs={
"class": (
"fr-checkbox qf-inline-grid qf-grid-cols-4 qf-gap-4" " qf-m-1w"
),
"class": ("fr-checkbox qf-inline-grid qf-grid-cols-4 qf-gap-4 qf-m-1w"),
},
),
choices=[],
Expand All @@ -530,9 +539,7 @@ def load_choices(self):
action_list = forms.MultipleChoiceField(
widget=DSFRCheckboxSelectMultiple(
attrs={
"class": (
"fr-checkbox qf-inline-grid qf-grid-cols-4 qf-gap-4" " qf-m-1w"
),
"class": ("fr-checkbox qf-inline-grid qf-grid-cols-4 qf-gap-4 qf-m-1w"),
},
),
choices=[],
Expand Down
18 changes: 12 additions & 6 deletions qfdmo/models/acteur.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import string
import uuid
from copy import deepcopy
from typing import Any, List, cast
from typing import Any, cast
from urllib.parse import urlencode

import opening_hours
Expand Down Expand Up @@ -1103,16 +1103,16 @@ def get_absolute_url(self):
return reverse("qfdmo:acteur-detail", args=[self.uuid])

def acteur_actions(
self, direction=None, actions_codes=None, sous_categorie_id=None
self, direction=None, actions_codes=None, sous_categorie_ids=None
):
pss = self.proposition_services.all()
# Cast needed because of the cache
cached_action_instances = cast(
List[Action], cache.get_or_set("_action_instances", get_action_instances)
list[Action], cache.get_or_set("_action_instances", get_action_instances)
)

if sous_categorie_id:
pss = pss.filter(sous_categories__id__in=[sous_categorie_id])
if sous_categorie_ids:
pss = pss.filter(sous_categories__id__in=sous_categorie_ids)
if direction:
pss = pss.filter(action__directions__code__in=[direction])
if actions_codes:
Expand Down Expand Up @@ -1166,14 +1166,20 @@ def json_acteur_for_display(
carte: bool = False,
carte_config: CarteConfig = None,
sous_categorie_id: str | None = None,
displayed_acteur_form=None,
) -> str:
# TODO: refacto jinja: once the shared/results.html template
# will be migrated to django template, this method should
# live in a template_tags instead.
sous_categorie_ids = [sous_categorie_id]

if sous_categories := displayed_acteur_form.cleaned_data.get("sous_categories"):
sous_categorie_ids = sous_categories.values_list("id", flat=True)

actions = self.acteur_actions(
direction=direction,
actions_codes=action_list,
sous_categorie_id=sous_categorie_id,
sous_categorie_ids=sous_categorie_ids,
)

def sort_actions_by_action_principale_and_order(a):
Expand Down
7 changes: 5 additions & 2 deletions qfdmo/views/adresses.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,9 +444,9 @@ def _compile_acteurs_queryset(
if self.get_data_from_request_or_bounded_form("bonus"):
filters &= Q(labels__bonus=True)

if sous_categorie_id := self.get_data_from_request_or_bounded_form("sc_id", 0):
if sous_categorie_ids := self.get_sous_categories():
filters &= Q(
proposition_services__sous_categories__id=sous_categorie_id,
proposition_services__sous_categories__id__in=sous_categorie_ids,
)

actions_filters = Q()
Expand All @@ -472,6 +472,9 @@ def _compile_acteurs_queryset(

return filters, excludes

def get_sous_categories(self):
return [self.get_data_from_request_or_bounded_form("sc_id", 0)]

def get_cached_groupe_action_with_displayed_actions(self, action_displayed):
# Cast needed because of the cache
cached_groupe_action_instances = cast(
Expand Down
29 changes: 27 additions & 2 deletions qfdmo/views/carte.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.utils.functional import cached_property
from django.views.generic import DetailView

from qfdmo.forms import CarteForm
from qfdmo.forms import CarteForm, DisplayedActeursForm
from qfdmo.models import CarteConfig
from qfdmo.views.adresses import SearchActeursView

Expand All @@ -16,7 +16,11 @@
template_name = "qfdmo/carte.html"
form_class = CarteForm

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def get_initial(self, *args, **kwargs):

initial = super().get_initial(*args, **kwargs)
action_displayed = self._set_action_displayed()
grouped_action_choices = self._get_grouped_action_choices(action_displayed)
Expand All @@ -33,13 +37,34 @@
return initial

def get_context_data(self, **kwargs):
logger.info("get_context_data 🪏")
logger.info(f"{self.request.GET=}")
self.displayed_acteur_form = DisplayedActeursForm(self.request.GET)
if not self.displayed_acteur_form.is_valid():
logger.error(f"Form is valid {self.displayed_acteur_form=}")

context = super().get_context_data(**kwargs)
context.update(is_carte=True, map_container_id="carte")
context.update(
is_carte=True,
map_container_id="carte",
displayed_acteur_form=self.displayed_acteur_form,
)

return context

def _get_selected_action_ids(self):
return [a.id for a in self._get_selected_action()]

def get_sous_categories(self):
logger.info("get_sous_categories 💣")
if sous_categories := self.displayed_acteur_form.cleaned_data.get(
"sous_categories"
):
logger.info(f"{sous_categories=}")
return sous_categories.values_list("pk", flat=True)

return []


class ProductCarteView(CarteSearchActeursView):
def get_context_data(self, **kwargs):
Expand Down
6 changes: 3 additions & 3 deletions templates/snippets/share_and_embed.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ <h2 class="qf-text-lg">
{% endif %}

<ul
class="max-md:qf-flex-row qf-p-0 qf-m-0 qf-flex qf-gap-x-2w qf-gap-y-1w md:qf-gap-y-3w
class="max-md:qf-flex-col qf-p-0 qf-m-0 qf-flex qf-gap-x-2w qf-gap-y-1w md:qf-gap-y-3w
qf-leading-[3]
qf-flex-wrap qf-items-center qf-justify-center "
>
<li class="max-md:qf-flex-1 qf-list-none qf-p-0">
<li class="max-md:qf-flex-1 max-sm:qf-w-full qf-list-none qf-p-0">
{% include "modals/share.html" with button_extra_classes="qf-w-full qf-justify-center fr-btn--secondary fr-btn--icon-left fr-icon fr-icon-share-line" %}
</li>
<li class="max-md:qf-flex-1 qf-list-none qf-p-0">
<li class="max-md:qf-flex-1 max-sm:qf-w-full qf-list-none qf-p-0">
{% include "modals/embed.html" with button_extra_classes="qf-w-full qf-justify-center fr-btn--tertiary fr-btn--icon-left fr-icon fr-icon-code-s-slash-line" %}
</li>
</ul>
Expand Down