Skip to content

Commit 2969be0

Browse files
authored
Merge pull request #1488 from rdmorganiser/2.4.0-fix-multisite-not-all-sites
2.4.0 fix multisite not all sites
2 parents 0583de9 + d1e4e3c commit 2969be0

33 files changed

Lines changed: 702 additions & 416 deletions

rdmo/core/managers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
class CurrentSiteQuerySetMixin:
88

99
def filter_current_site(self):
10-
return self.filter(models.Q(sites=None) | models.Q(sites=settings.SITE_ID))
10+
if settings.MULTISITE:
11+
return self.filter(sites=settings.SITE_ID)
12+
else:
13+
return self.filter(models.Q(sites=None) | models.Q(sites=settings.SITE_ID))
1114

1215

1316
class GroupsQuerySetMixin:
@@ -20,10 +23,7 @@ def filter_group(self, user):
2023
class AvailabilityQuerySetMixin:
2124

2225
def filter_availability(self, user):
23-
model = str(self.model._meta)
24-
permissions = PERMISSIONS[model]
25-
26-
if user.has_perms(permissions):
26+
if user.has_perms(PERMISSIONS[self.model._meta.label_lower]):
2727
return self
2828
else:
2929
return self.filter(available=True)

rdmo/management/managers.py

Whitespace-only changes.

rdmo/projects/handlers/sync_utils.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.db.models import ForeignKey, ManyToManyField, Model
55

66
from rdmo.projects.models import Project
7+
from rdmo.projects.utils import filter_tasks_or_views_for_project
78
from rdmo.tasks.models import Task
89
from rdmo.views.models import View
910

@@ -46,11 +47,11 @@ def sync_task_or_view_to_projects(instance):
4647
instance.projects.add(*to_add)
4748

4849

49-
def sync_tasks_or_views_on_a_project(project, model):
50+
def sync_tasks_or_views_on_a_project(project, task_or_view):
5051
"""Ensure the project is linked to exactly the correct instances of a model (View/Task)."""
51-
project_m2m_field = get_related_field_name_on_model_for_instance(Project, model)
52+
project_m2m_field = get_related_field_name_on_model_for_instance(Project, task_or_view)
5253

53-
desired_instances = model.objects.filter_for_project(project)
54+
desired_instances = filter_tasks_or_views_for_project(task_or_view, project)
5455
current_instances = getattr(project, project_m2m_field).all()
5556

5657
to_remove = current_instances.exclude(pk__in=desired_instances)

rdmo/projects/imports.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,7 @@ def process(self):
106106
if self.current_project is None:
107107
catalog_uri = get_uri(self.root.find('catalog'), self.ns_map)
108108

109-
available_catalogs = Catalog.objects.filter_current_site() \
110-
.filter_group(self.request.user) \
111-
.filter_availability(self.request.user) \
112-
.order_by('order')
109+
available_catalogs = Catalog.objects.filter_for_user(self.request.user)
113110

114111
try:
115112
self.catalog = available_catalogs.get(uri=catalog_uri)

rdmo/projects/managers.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,25 @@ def filter_groups(self, groups):
7272
return self.filter(memberships__in=memberships).distinct()
7373

7474
def filter_projects_for_task_or_view(self, instance):
75-
# if View/Task is not available it should not show for any project
76-
if not instance.available:
77-
return self.none()
78-
7975
# projects that have an unavailable catalog should be disregarded
8076
qs = self.filter(catalog__available=True)
8177

82-
# when instance.catalogs is empty it applies to all
78+
# when View/Task is not available it should not show for any project
79+
if not instance.available:
80+
return self.none()
81+
82+
# when View/Task has any catalogs it can be filtered for those
8383
if instance.catalogs.exists():
8484
qs = qs.filter(catalog__in=instance.catalogs.all())
8585

86-
# when instance.sites is empty it applies to all
86+
# when View/Task has any sites it can be filtered for those
8787
if instance.sites.exists():
8888
qs = qs.filter(site__in=instance.sites.all())
89+
elif settings.MULTISITE:
90+
# when View/Task has no sites in a multi-site, it should not appear at all
91+
return self.none()
8992

90-
# when instance.groups is empty it applies to all
93+
# when has any groups it can be filtered for those
9194
if instance.groups.exists():
9295
qs = qs.filter_groups(instance.groups.all())
9396

rdmo/projects/serializers/v1/__init__.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ class ProjectSerializer(serializers.ModelSerializer):
5353
class CatalogField(serializers.PrimaryKeyRelatedField):
5454

5555
def get_queryset(self):
56-
return Catalog.objects.filter_current_site() \
57-
.filter_group(self.context['request'].user) \
58-
.filter_availability(self.context['request'].user) \
59-
.order_by('-available', 'order')
56+
return Catalog.objects.filter_for_user(self.context['request'].user)
6057

6158
class ParentField(serializers.PrimaryKeyRelatedField):
6259

rdmo/projects/tests/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
from django.apps import apps
44

5+
from .helpers.project_catalog import clear_sites_from_other_catalogs # noqa: F401
6+
7+
8+
@pytest.fixture
9+
def enable_multisite(settings):
10+
assert not settings.MULTISITE # assert that the default is False first
11+
settings.MULTISITE = True
512

613
@pytest.fixture
714
def enable_project_views_sync(settings):
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import pytest
2+
3+
from rdmo.questions.models import Catalog
4+
5+
6+
@pytest.fixture
7+
def clear_sites_from_other_catalogs(settings):
8+
# arrange, remove sites from the other catalogs
9+
# for 'list': 'v1-projects:catalog-list'
10+
# in non-multisite, they should appear
11+
# however, in a multisite they should not appear
12+
other_catalogs = Catalog.objects.exclude(sites=settings.SITE_ID)
13+
assert set(other_catalogs.values_list('id',flat=True)) == {3,4}
14+
for catalog in other_catalogs:
15+
catalog.sites.clear()

0 commit comments

Comments
 (0)