Skip to content

Commit

Permalink
search-profiles: allow multiple kiez-radars per profile
Browse files Browse the repository at this point in the history
  • Loading branch information
vellip committed Feb 18, 2025
1 parent 3db626f commit e32c5ae
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 4.2.16 on 2025-02-17 16:00

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("meinberlin_kiezradar", "0003_searchprofile_plans_only"),
]

operations = [
migrations.RemoveField(
model_name="searchprofile",
name="kiezradar",
),
migrations.AddField(
model_name="searchprofile",
name="kiezradars",
field=models.ManyToManyField(
blank=True,
related_name="search_profiles",
to="meinberlin_kiezradar.kiezradar",
),
),
]
12 changes: 5 additions & 7 deletions meinberlin/apps/kiezradar/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,20 +95,18 @@ class SearchProfile(UserGeneratedContentModel):
disabled = models.BooleanField(default=False)
notification = models.BooleanField(default=False)
plans_only = models.BooleanField(default=False)
kiezradar = models.OneToOneField(
KiezRadar,
models.SET_NULL,
related_name="search_profile",
blank=True,
null=True,
)
query = models.ForeignKey(
KiezradarQuery,
models.SET_NULL,
related_name="search_profiles",
blank=True,
null=True,
)
kiezradars = models.ManyToManyField(
KiezRadar,
related_name="search_profiles",
blank=True,
)
status = models.ManyToManyField(
ProjectStatus,
related_name="search_profiles",
Expand Down
22 changes: 13 additions & 9 deletions meinberlin/apps/kiezradar/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def validate(self, data):
class SearchProfileSerializer(serializers.ModelSerializer):
"""Serializer for the SearchProfile model."""

kiezradar = (
kiezradars = (
serializers.PrimaryKeyRelatedField(
queryset=KiezRadar.objects.all(), required=False
),
Expand Down Expand Up @@ -82,16 +82,18 @@ class Meta:
"districts",
"project_types",
"topics",
"kiezradar",
"kiezradars",
]

read_only_fields = ["id", "creator", "number"]

def validate_kiezradar(self, instance):
def validate_kiezradars(self, objs):
user = self.context["request"].user
if not user.has_perm("meinberlin_kiezradar.change_kiezradar", instance):
raise serializers.ValidationError("Permission denied")
return instance

for obj in objs:
if not user.has_perm("meinberlin_kiezradar.change_kiezradar", obj):
raise serializers.ValidationError("Permission denied")
return objs

def create(self, validated_data):
# Pop one-to-many fields from validated_data
Expand Down Expand Up @@ -120,10 +122,12 @@ def update(self, instance, validated_data):

def to_representation(self, instance):
representation = super().to_representation(instance)
if instance.kiezradar:
representation["kiezradar"] = KiezRadarSerializer(instance.kiezradar).data
if instance.kiezradars:
representation["kiezradars"] = KiezRadarSerializer(
instance.kiezradars, many=True
).data
else:
representation["kiezradar"] = None
representation["kiezradars"] = None
representation["organisations"] = [
{"id": organisation.id, "name": organisation.name}
for organisation in instance.organisations.all()
Expand Down
34 changes: 21 additions & 13 deletions tests/kiezradar/test_api_search_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def setup_data(
return {
"districts": [district.id],
"query": query.id,
"kiezradar": kiezradar.id,
"kiezradars": [kiezradar.id],
"organisations": [organisation.id],
"topics": [topic.id],
"project_types": [project_type.id],
Expand All @@ -44,7 +44,7 @@ def test_anonymous_user_cant_create_search_profile(apiclient, setup_data):
"disabled": False,
"status": setup_data["project_status"],
"query": setup_data["query"],
"kiezradar": setup_data["kiezradar"],
"kiezradars": setup_data["kiezradars"],
"districts": setup_data["districts"],
"topics": setup_data["topics"],
"organisation": setup_data["organisations"],
Expand All @@ -71,7 +71,7 @@ def test_cant_create_search_profile_with_other_users_kiezradar(
"disabled": False,
"status": setup_data["project_status"],
"query": setup_data["query"],
"kiezradar": setup_data["kiezradar"],
"kiezradars": setup_data["kiezradars"],
"districts": setup_data["districts"],
"topics": setup_data["topics"],
"organisation": setup_data["organisations"],
Expand All @@ -87,8 +87,8 @@ def test_cant_create_search_profile_with_other_users_kiezradar(
@pytest.mark.django_db
def test_create_search_profile_with_kiezradar(apiclient, setup_data):
"""Test creating and updating a SearchProfile via the API."""
kiezradar_id = setup_data["kiezradar"]
kiezradar = KiezRadar.objects.get(pk=kiezradar_id)
kiezradar_ids = setup_data["kiezradars"]
kiezradar = KiezRadar.objects.get(pk=kiezradar_ids[0])
user = kiezradar.creator
apiclient.force_authenticate(user)

Expand All @@ -98,7 +98,7 @@ def test_create_search_profile_with_kiezradar(apiclient, setup_data):
"disabled": False,
"status": setup_data["project_status"],
"query": setup_data["query"],
"kiezradar": setup_data["kiezradar"],
"kiezradars": setup_data["kiezradars"],
"districts": setup_data["districts"],
"topics": setup_data["topics"],
"organisation": setup_data["organisations"],
Expand All @@ -117,15 +117,18 @@ def test_create_search_profile_with_kiezradar(apiclient, setup_data):
assert data["plans_only"] is False
assert data["disabled"] == payload["disabled"]
assert data["query"] == payload["query"]
assert data["kiezradar"] == payload["kiezradar"]
assert data["kiezradars"] == payload["kiezradars"]

# Check if the object was created in the database
search_profile = SearchProfile.objects.get(id=data["id"])
assert search_profile.name == payload["name"]
assert search_profile.description == payload["description"]
assert search_profile.disabled == payload["disabled"]
assert search_profile.query.id == payload["query"]
assert search_profile.kiezradar.id == payload["kiezradar"]
assert (
list(search_profile.kiezradars.values_list("id", flat=True))
== payload["kiezradars"]
)
assert (
list(search_profile.districts.values_list("id", flat=True))
== payload["districts"]
Expand All @@ -136,7 +139,7 @@ def test_create_search_profile_with_kiezradar(apiclient, setup_data):
list(search_profile.project_types.values_list("id", flat=True))
== payload["project_types"]
)
assert search_profile.kiezradar.creator == search_profile.creator
assert search_profile.kiezradars.first().creator == search_profile.creator


@pytest.mark.django_db
Expand Down Expand Up @@ -239,8 +242,10 @@ def test_update_search_profile(

query_id = setup_data.pop("query")
search_profile.query_id = query_id
kiezradar_id = setup_data.pop("kiezradar")
search_profile.kiezradar_id = kiezradar_id
kiezradars = setup_data.pop("kiezradars")

for id in kiezradars:
search_profile.kiezradars.add(id)
search_profile.save()

apiclient.force_authenticate(search_profile.creator)
Expand All @@ -253,7 +258,7 @@ def test_update_search_profile(
"description": "A description for the filters profile.",
"disabled": False,
"status": setup_data["project_status"],
"kiezradar": new_kiezradar.id,
"kiezradars": [new_kiezradar.id],
"query_text": "updated query",
"districts": setup_data["districts"],
"topics": setup_data["topics"],
Expand All @@ -272,7 +277,10 @@ def test_update_search_profile(
assert search_profile.description == payload["description"]
assert search_profile.disabled == payload["disabled"]
assert search_profile.query.text == payload["query_text"]
assert search_profile.kiezradar_id == payload["kiezradar"]
assert (
list(search_profile.kiezradars.values_list("id", flat=True))
== payload["kiezradars"]
)
assert (
list(search_profile.districts.values_list("id", flat=True))
== payload["districts"]
Expand Down
8 changes: 4 additions & 4 deletions tests/kiezradar/test_search_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def test_create_search_profile(

search_profile = search_profile_factory(creator=user)
assert search_profile.query is None
assert search_profile.kiezradar is None
assert search_profile.kiezradars.all().count() == 0
assert search_profile.topics.all().count() == 0
assert search_profile.districts.all().count() == 0
assert search_profile.project_types.all().count() == 0
Expand Down Expand Up @@ -61,9 +61,9 @@ def test_create_search_profile(
search_profile.query = query
search_profile.save()
assert search_profile.query == query
search_profile.kiezradar = kiezradar
search_profile.save()
assert search_profile.kiezradar == kiezradar

search_profile.kiezradars.add(kiezradar.id)
assert search_profile.kiezradars.first() == kiezradar
assert search_profile.creator == kiezradar.creator


Expand Down

0 comments on commit e32c5ae

Please sign in to comment.