Skip to content

Commit a3a84df

Browse files
committed
Merge branch 'develop' of github.com:betagouv/recommandations-collaboratives into develop
2 parents 3292cd0 + e241f51 commit a3a84df

15 files changed

Lines changed: 116 additions & 89 deletions

File tree

recoco/apps/communication/api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
from django.core.mail import send_mail as django_send_mail
2323
from django.utils import timezone
2424

25-
from recoco.utils import build_absolute_url, get_site_config_or_503
25+
from recoco.apps.home.models import SiteConfiguration
26+
from recoco.utils import build_absolute_url
2627

2728
from .brevo import Brevo
2829
from .models import EmailTemplate, TransactionRecord
@@ -57,7 +58,7 @@ def get_site_params():
5758
params["site_name"] = current_site.name
5859
params["site_domain"] = current_site.domain
5960

60-
site_config = get_site_config_or_503(current_site)
61+
site_config = SiteConfiguration.objects.get(site=current_site)
6162
params["legal_address"] = site_config.legal_address or ""
6263
params["legal_owner"] = site_config.legal_owner or ""
6364
params["description"] = site_config.description or ""

recoco/apps/communication/digests.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from django.urls import reverse
1919

2020
from recoco import utils, verbs
21+
from recoco.apps.home.models import SiteConfiguration
2122
from recoco.apps.projects import models as projects_models
2223
from recoco.apps.reminders.api import (
2324
get_due_new_recommendations_reminder_for_project,
@@ -292,30 +293,31 @@ def make_site_digest(site):
292293
"name": site.name,
293294
}
294295

295-
siteconf = utils.get_site_config_or_503(site)
296+
site_config = SiteConfiguration.objects.get(site=site)
297+
296298
data.update(
297299
{
298-
"description": siteconf.description or "",
299-
"sender_name": siteconf.sender_name or "",
300-
"sender_email": siteconf.sender_email or "",
301-
"legal_address": siteconf.legal_address or "",
302-
"main_topic": siteconf.main_topic or "",
303-
"legal_owner": siteconf.legal_owner or "",
300+
"description": site_config.description or "",
301+
"sender_name": site_config.sender_name or "",
302+
"sender_email": site_config.sender_email or "",
303+
"legal_address": site_config.legal_address or "",
304+
"main_topic": site_config.main_topic or "",
305+
"legal_owner": site_config.legal_owner or "",
304306
}
305307
)
306308

307-
if siteconf.email_logo:
308-
data["site_logo"] = utils.build_absolute_url(siteconf.email_logo.url)
309+
if site_config.email_logo:
310+
data["site_logo"] = utils.build_absolute_url(site_config.email_logo.url)
309311

310312
return data
311313

312314

313315
def make_project_survey_digest_for_site(user, project, site):
314316
"""Return survey information as a dict for a given project on a given site"""
315317

316-
siteconf = utils.get_site_config_or_503(site)
318+
site_config = SiteConfiguration.objects.get(site=site)
317319

318-
if not siteconf.project_survey:
320+
if not site_config.project_survey:
319321
return {"name": None, "url": None}
320322

321323
project_survey_url = utils.build_absolute_url(
@@ -324,7 +326,7 @@ def make_project_survey_digest_for_site(user, project, site):
324326
site=site,
325327
)
326328

327-
data = {"name": siteconf.project_survey.name, "url": project_survey_url}
329+
data = {"name": site_config.project_survey.name, "url": project_survey_url}
328330

329331
return data
330332

recoco/apps/communication/tests/test_digests.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import test # noqa
1515
from django.contrib.auth import models as auth
1616
from django.contrib.sites.shortcuts import get_current_site
17-
from django.core.exceptions import ImproperlyConfigured
1817
from freezegun import freeze_time
1918
from model_bakery import baker
2019
from model_bakery.recipe import Recipe
@@ -150,14 +149,6 @@ def test_send_digests_for_new_reco_empty(client, request, make_project):
150149
assert membership.member.notifications.unsent().count() == 0
151150

152151

153-
@pytest.mark.django_db
154-
def test_make_site_digest_without_siteconfiguration(client, request):
155-
site = get_current_site(request)
156-
157-
with pytest.raises(ImproperlyConfigured):
158-
digests.make_site_digest(site)
159-
160-
161152
@pytest.mark.django_db
162153
def test_make_site_digest_with_siteconfiguration(client, request):
163154
site = get_current_site(request)

recoco/apps/crm/views.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666
from recoco.apps.tasks.models import Task
6767
from recoco.utils import (
6868
get_group_for_site,
69-
get_site_config_or_503,
7069
has_perm,
7170
has_perm_or_403,
7271
make_group_name_for_site,
@@ -783,7 +782,7 @@ def project_details(request, project_id):
783782

784783
project = get_object_or_404(Project.all_on_site, pk=project_id)
785784

786-
site_config = get_site_config_or_503(request.site)
785+
site_config = request.site_config
787786

788787
site_origin = project.project_sites.get(is_origin=True)
789788

@@ -871,7 +870,7 @@ def project_toggle_annotation(request, project_id=None):
871870

872871
project = get_object_or_404(Project.on_site, pk=project_id)
873872

874-
site_config = get_site_config_or_503(request.site)
873+
site_config = request.site_config
875874

876875
form = forms.ProjectAnnotationForm(request.POST)
877876
if form.is_valid():
@@ -1078,7 +1077,7 @@ def crm_list_recommendation_without_resources(request):
10781077

10791078

10801079
def make_low_reach_project_query(request):
1081-
site_config = get_site_config_or_503(request.site)
1080+
site_config = request.site_config
10821081

10831082
return (
10841083
Project.on_site.filter(

recoco/apps/home/middlewares.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from django.core.exceptions import ImproperlyConfigured
2+
from django.http import HttpRequest
3+
4+
from recoco.apps.home.models import SiteConfiguration
5+
6+
7+
class CurrentSiteConfigurationMiddleware:
8+
def __init__(self, get_response):
9+
self.get_response = get_response
10+
11+
def __call__(self, request: HttpRequest):
12+
if not hasattr(request, "site"):
13+
raise ImproperlyConfigured(
14+
"The request object does not have a 'site' attribute. "
15+
"Ensure that the site middleware is applied before this middleware."
16+
)
17+
18+
# TODO: use SiteConfiguration.objects.get() instead of filter().first()
19+
# Because the site configuration should be unique per site and always exist.
20+
request.site_config = (
21+
SiteConfiguration.objects.filter(site=request.site)
22+
.prefetch_related("onboarding_questions", "crm_available_tags")
23+
.select_related("project_survey")
24+
.first()
25+
)
26+
27+
return self.get_response(request)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from unittest.mock import Mock
2+
3+
import pytest
4+
from django.core.exceptions import ImproperlyConfigured
5+
from model_bakery import baker
6+
7+
from recoco.apps.home.middlewares import CurrentSiteConfigurationMiddleware
8+
from recoco.apps.home.models import SiteConfiguration
9+
10+
11+
@pytest.fixture
12+
def get_response_mock():
13+
return Mock()
14+
15+
16+
@pytest.fixture
17+
def middleware(get_response_mock):
18+
return CurrentSiteConfigurationMiddleware(get_response=get_response_mock)
19+
20+
21+
@pytest.fixture
22+
def request_mock():
23+
return Mock()
24+
25+
26+
@pytest.mark.django_db
27+
class TestCurrentSiteConfigurationMiddleware:
28+
def test_raises_error_if_request_has_no_site_attribute(
29+
self, middleware, request_mock
30+
):
31+
delattr(request_mock, "site") # Ensure the 'site' attribute is missing
32+
33+
with pytest.raises(
34+
ImproperlyConfigured,
35+
match="The request object does not have a 'site' attribute",
36+
):
37+
middleware(request_mock)
38+
39+
def test_sets_site_config_on_request(self, middleware, request_mock, current_site):
40+
site_config = baker.make(SiteConfiguration, site=current_site)
41+
42+
request_mock.site = current_site
43+
middleware(request_mock)
44+
45+
assert request_mock.site_config == site_config

recoco/apps/onboarding/views.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from recoco.apps.survey import models as survey_models
3232
from recoco.apps.survey.forms import AnswerForm
3333
from recoco.utils import (
34-
get_site_config_or_503,
3534
is_switchtender_or_403,
3635
)
3736

@@ -98,7 +97,7 @@ def form_invalid(self, form):
9897

9998
def onboarding_signup(request):
10099
"""Return the onboarding signup page and process onboarding signup submission"""
101-
site_config = get_site_config_or_503(request.site)
100+
site_config = request.site_config
102101

103102
if request.user.is_authenticated:
104103
return redirect(reverse("onboarding-project"))
@@ -153,7 +152,7 @@ def onboarding_signup(request):
153152
@login_required
154153
def onboarding_project(request):
155154
"""Return the onboarding page and process onboarding submission"""
156-
site_config = get_site_config_or_503(request.site)
155+
site_config = request.site_config
157156

158157
form = forms.OnboardingProject(request.POST or None)
159158

@@ -216,7 +215,7 @@ def onboarding_project(request):
216215
@login_required
217216
def onboarding_summary(request, project_id=None):
218217
"""Resume project from onboarding"""
219-
site_config = get_site_config_or_503(request.site)
218+
site_config = request.site_config
220219

221220
project = get_object_or_404(projects.Project, sites=request.site, pk=project_id)
222221

@@ -249,7 +248,7 @@ def onboarding_summary(request, project_id=None):
249248

250249
def prefill_project_set_user(request):
251250
"""Create a new project for someone else - step 1 create user"""
252-
site_config = get_site_config_or_503(request.site)
251+
site_config = request.site_config
253252

254253
is_switchtender_or_403(request.user)
255254

@@ -267,7 +266,7 @@ def prefill_project_set_user(request):
267266

268267
def prefill_project_submit(request):
269268
"""Create a new project for someone else - step 2 create project"""
270-
site_config = get_site_config_or_503(request.site)
269+
site_config = request.site_config
271270

272271
is_switchtender_or_403(request.user)
273272

recoco/apps/projects/views/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
from recoco.utils import (
3535
check_if_advisor,
3636
get_group_for_site,
37-
get_site_config_or_503,
3837
has_perm_or_403,
3938
is_staff_for_site,
4039
)
@@ -79,7 +78,7 @@ def mark_general_notifications_as_seen(user):
7978
def project_moderation_list(request):
8079
is_project_moderator_or_403(request.user, request.site)
8180

82-
site_config = get_site_config_or_503(request.site)
81+
site_config = request.site_config
8382

8483
draft_projects = models.Project.on_site.filter(
8584
project_sites__status="DRAFT", project_sites__site=request.site, deleted=None
@@ -422,7 +421,7 @@ def project_list_for_staff(request):
422421
):
423422
raise PermissionDenied("Vous n'avez pas le droit d'accéder à ceci.")
424423

425-
site_config = get_site_config_or_503(request.site)
424+
site_config = request.site_config
426425

427426
mark_general_notifications_as_seen(request.user)
428427

recoco/apps/projects/views/detail.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,7 @@
2828
from recoco.apps.projects.views.notes import create_public_note
2929
from recoco.apps.survey import models as survey_models
3030
from recoco.apps.tasks import models as tasks_models
31-
from recoco.utils import (
32-
get_site_config_or_503,
33-
has_perm,
34-
has_perm_or_403,
35-
is_staff_for_site,
36-
require_htmx,
37-
)
31+
from recoco.utils import has_perm, has_perm_or_403, is_staff_for_site, require_htmx
3832

3933
from .. import models, signals
4034
from ..forms import (
@@ -73,7 +67,7 @@ def project_overview(request, project_id=None):
7367
pk=project_id,
7468
)
7569

76-
site_config = get_site_config_or_503(request.site)
70+
site_config = request.site_config
7771

7872
is_regional_actor = is_regional_actor_for_project(
7973
request.site, project, request.user, allow_national=True
@@ -184,13 +178,14 @@ def project_knowledge(request, project_id=None):
184178
request.user, "view_surveys", project
185179
)
186180

187-
site_config = get_site_config_or_503(request.site)
181+
site_config = request.site_config
182+
188183
session, created = survey_models.Session.objects.get_or_create(
189184
project=project, survey=site_config.project_survey
190185
)
191186

192187
sorted_sessions = sorted(
193-
project.survey_session.all(),
188+
project.survey_session.select_related("survey__site"),
194189
key=lambda session: session.survey.site != request.site,
195190
)
196191

recoco/apps/projects/views/export.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@
1717

1818
from recoco.apps.crm import models as crm_models
1919
from recoco.apps.tasks import models as task_models
20-
from recoco.utils import (
21-
build_absolute_url,
22-
get_group_for_site,
23-
get_site_config_or_503,
24-
is_switchtender_or_403,
25-
)
20+
from recoco.utils import build_absolute_url, get_group_for_site, is_switchtender_or_403
2621

2722
from .. import models
2823
from ..utils import (
@@ -84,8 +79,10 @@ def project_list_export_csv(request):
8479
"exclude_stats",
8580
"origin_site",
8681
]
87-
site_config = get_site_config_or_503(request.site)
88-
tags_for_site = site_config.crm_available_tags.values_list("name", flat=True)
82+
83+
site_config = request.site_config
84+
85+
tags_for_site = [tag.name for tag in site_config.crm_available_tags.all()]
8986
for tag in tags_for_site:
9087
columns.append(tag)
9188

0 commit comments

Comments
 (0)