Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
28 changes: 28 additions & 0 deletions apps/accounts/migrations/0005_alter_peoplegrouplocation_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 5.2.12 on 2026-03-24 13:43

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("accounts", "0004_peoplegrouplocation"),
]

operations = [
migrations.AlterField(
model_name="peoplegrouplocation",
name="type",
field=models.CharField(
choices=[
("team", "Team"),
("impact", "Impact"),
("address", "Address"),
("news", "News"),
("event", "Event"),
],
default="team",
max_length=10,
),
),
]
7 changes: 7 additions & 0 deletions apps/accounts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,13 @@ class Meta:
modules_keys = ("members", "subgroups")


@auto_translated
class PeopleGroupExtraLightSerializer(PeopleGroupLightSerializer):
class Meta(PeopleGroupLightSerializer.Meta):
fields = ("id", "slug", "name", "roles")
modules_keys = ()


@auto_translated
class PeopleGroupHierarchySerializer(
ModulesSerializers,
Expand Down
39 changes: 37 additions & 2 deletions apps/accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
from apps.files.models import Image
from apps.files.views import ImageStorageView
from apps.modules.group import PeopleGroupModules
from apps.newsfeed.serializers import EventSerializer, NewsSerializer
from apps.organizations.models import Organization
from apps.organizations.permissions import HasOrganizationPermission
from apps.projects.serializers import LocationSerializer, ProjectLightSerializer
Expand Down Expand Up @@ -866,20 +867,54 @@ def similars(self, request, *args, **kwargs):
@action(
detail=True,
methods=["GET"],
url_path="projects-locations",
url_path="all-locations",
permission_classes=[ReadOnly],
)
def locations(self, request, *args, **kwargs):
group = self.get_object()
modules_manager = group.get_related_module()
modules = modules_manager(group, request.user)
queryset = modules.projects_locations()
queryset = modules.locations()

return Response(
LocationSerializer(queryset, many=True, context={"request": request}).data,
status=status.HTTP_200_OK,
)

@extend_schema(responses=NewsSerializer(many=True))
@action(
detail=True,
methods=["GET"],
url_path="news",
permission_classes=[ReadOnly],
)
def news(self, request, *args, **kwargs):
group = self.get_object()
modules_manager = group.get_related_module()
modules = modules_manager(group, request.user)
queryset = modules.news()

queryset_page = self.paginate_queryset(queryset)
data = NewsSerializer(queryset_page, many=True, context={"request": request})
return self.get_paginated_response(data.data)

@extend_schema(responses=NewsSerializer(many=True))
@action(
detail=True,
methods=["GET"],
url_path="event",
permission_classes=[ReadOnly],
)
def event(self, request, *args, **kwargs):
group = self.get_object()
modules_manager = group.get_related_module()
modules = modules_manager(group, request.user)
queryset = modules.event()

queryset_page = self.paginate_queryset(queryset)
data = EventSerializer(queryset_page, many=True, context={"request": request})
return self.get_paginated_response(data.data)


class PeopleGroupLocationViewSet(
NestedOrganizationViewMixins,
Expand Down
4 changes: 2 additions & 2 deletions apps/commons/management/commands/seed_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,9 @@ def handle(self, *args, **options):
people_groups,
k=random.randint(1, 3), # nosec B311
),
event_date=date,
start_date=date,
)
EventFactory(organization=organization, event_date=date)
EventFactory(organization=organization, start_date=date)
date += timezone.timedelta(days=5)
init_newsfeed()
self.stdout.write(self.style.SUCCESS("Newsfeed items created."))
Expand Down
2 changes: 1 addition & 1 deletion apps/commons/tests/test_process_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,7 @@ def test_create_event(self):
"organization": self.organization.code,
"title": faker.sentence(),
"content": text,
"event_date": datetime.date.today().isoformat(),
"start_date": datetime.date.today().isoformat(),
"people_groups": [self.people_group.id],
}

Expand Down
25 changes: 22 additions & 3 deletions apps/modules/group.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from django.db.models import Case, Prefetch, Q, QuerySet, Value, When

from apps.accounts.models import PeopleGroup, ProjectUser
from apps.accounts.models import PeopleGroup, PeopleGroupLocation, ProjectUser
from apps.files.models import PeopleGroupImage
from apps.modules.base import AbstractModules, register_module
from apps.newsfeed.models import Event, EventLocation, NewsLocation
from apps.projects.models import Location, Project
from apps.skills.models import Skill
from services.crisalid.models import Document, DocumentTypeCentralized
Expand Down Expand Up @@ -71,12 +72,30 @@ def subgroups(self) -> QuerySet[PeopleGroup]:
pk__in=self.user.get_people_group_queryset()
)

def projects_locations(self) -> QuerySet[Location]:
return Location.objects.filter(project__in=self.featured_projects())
def locations(self) -> QuerySet[Location]:
qs_project = Location.objects.filter(project__in=self.featured_projects())
qs_news = NewsLocation.objects.filter(news__in=self.news())
qs_group = PeopleGroupLocation.objects.filter(people_group__in=self.subgroups())
qs_location = PeopleGroupLocation.objects.filter(people_group=self.instance)
qs_event = EventLocation.objects.filter(event__in=self.event())

return (
qs_group.union(qs_project)
.union(qs_news)
.union(qs_location)
.union(qs_event)
.values("lat", "lng", "id", "type", "title", "description")
)

def gallery(self):
return PeopleGroupImage.objects.filter(people_group=self.instance)

def news(self):
return self.user.get_news_queryset().filter(people_groups=self.instance)

def event(self) -> QuerySet[Event]:
return self.user.get_event_queryset().filter(people_groups=self.instance)

def _documents(self, documents_type: DocumentTypeCentralized) -> QuerySet[Document]:
members_qs = self.members()
return Document.objects.filter(
Expand Down
34 changes: 32 additions & 2 deletions apps/newsfeed/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@
from apps.organizations.factories import OrganizationFactory
from apps.projects.factories import ProjectFactory

from .models import Event, Instruction, News, Newsfeed
from .models import (
Event,
EventLocation,
Instruction,
News,
Newsfeed,
NewsLocation,
)


class NewsfeedProjectFactory(factory.django.DjangoModelFactory):
Expand Down Expand Up @@ -77,7 +84,8 @@ class EventFactory(factory.django.DjangoModelFactory):
) # Subfactory seems to not trigger `create()`
title = factory.Faker("sentence")
content = factory.Faker("text")
event_date = timezone.localtime(timezone.now())
start_date = timezone.localtime(timezone.now())
end_date = start_date
visible_by_all = False

class Meta:
Expand All @@ -87,3 +95,25 @@ class Meta:
def people_groups(self, create, extracted, **kwargs):
if create and extracted:
self.people_groups.add(*extracted)


class EventLocationFactory(factory.django.DjangoModelFactory):
title = factory.Faker("sentence")
description = factory.Faker("text")
lat = factory.Faker("latitude")
lng = factory.Faker("longitude")
type = EventLocation.LocationType.EVENT.value

class Meta:
model = EventLocation


class NewsLocationFactory(factory.django.DjangoModelFactory):
title = factory.Faker("sentence")
description = factory.Faker("text")
lat = factory.Faker("latitude")
lng = factory.Faker("longitude")
type = EventLocation.LocationType.NEWS.value

class Meta:
model = NewsLocation
12 changes: 10 additions & 2 deletions apps/newsfeed/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@


class EventFilter(filters.FilterSet):
from_date = filters.DateTimeFilter(field_name="event_date", lookup_expr="gte")
to_date = filters.DateTimeFilter(field_name="event_date", lookup_expr="lte")
from_date = filters.CharFilter(method="range_filter_from", label="form_date")
to_date = filters.CharFilter(method="range_filter_to", label="to_date")

class Meta:
model = Event
fields = ["from_date", "to_date"]

def range_filter_from(self, queryset, name, value):
# filter by end_date (to catch event current running (start_date before value but end_date after))
return queryset.filter(end_date__gte=value)

def range_filter_to(self, queryset, name, value):
# same above but with start_date
return queryset.filter(start_date__lte=value)


class InstructionFilter(filters.FilterSet):
from_date = filters.DateTimeFilter(field_name="publication_date", lookup_expr="gte")
Expand Down
Loading
Loading