Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
91270ad
refactor: embeding
remigermain Feb 9, 2026
cbcc15e
feat(group): add groups modules
remigermain Feb 9, 2026
be896e8
refactor: duplicate models
remigermain Feb 10, 2026
68c1140
missins copy
remigermain Feb 10, 2026
63b8686
missing dupli
remigermain Feb 10, 2026
28f3ec8
feat: locations in people gorup
remigermain Feb 10, 2026
e16f4c8
missings locations
remigermain Feb 10, 2026
45784be
missing serialier
remigermain Feb 10, 2026
a745f08
fix missings tags
remigermain Feb 10, 2026
31013ae
linter
remigermain Feb 10, 2026
16a4f38
doc
remigermain Feb 10, 2026
8111e91
documents view
remigermain Feb 10, 2026
4b9f842
migrations
remigermain Feb 10, 2026
0389469
drf openapi
remigermain Feb 10, 2026
8c8560a
fix errors
remigermain Feb 10, 2026
2c94626
refactor: duplicate modules
remigermain Feb 10, 2026
568f51c
locales
remigermain Feb 10, 2026
992622b
linter
remigermain Feb 10, 2026
0356d11
fix duplicate
remigermain Feb 11, 2026
0731f72
fix filter
remigermain Feb 11, 2026
924d81c
Merge branch 'refactor--duplicate-models-design' of github.com:CyberC…
remigermain Feb 11, 2026
0861ab0
fix m2m
remigermain Feb 11, 2026
dba38f8
Merge branch 'refactor--duplicate-models-design' of github.com:CyberC…
remigermain Feb 11, 2026
b830706
fix embeding
remigermain Feb 11, 2026
cb6abe3
Merge branch 'feat(group)--add-group-modules' of github.com:CyberCRI/…
remigermain Feb 12, 2026
3aa4bcb
fix location tests
remigermain Feb 12, 2026
7a7698d
linter
remigermain Feb 12, 2026
d80689a
linter
remigermain Feb 12, 2026
c1d0551
i18n
remigermain Feb 12, 2026
7f445fc
fix locations tests
remigermain Feb 12, 2026
2a4fecc
i18n
remigermain Feb 12, 2026
00acba9
Merge branch 'main' of github.com:CyberCRI/projects-backend into feat…
remigermain Feb 18, 2026
c014043
fix admin
remigermain Feb 18, 2026
7f15dba
Merge branch 'main' of github.com:CyberCRI/projects-backend into feat…
remigermain Feb 20, 2026
2f95c80
change OneToOne to Fk
remigermain Feb 20, 2026
a6207f3
change loations projects
remigermain Feb 20, 2026
29443bb
feat: add serializers locations in create from admin pages
remigermain Feb 20, 2026
3334cdd
test: fix status code
remigermain Feb 20, 2026
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
12 changes: 11 additions & 1 deletion apps/accounts/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from services.keycloak.interface import KeycloakService

from .exports import UserResource
from .models import PeopleGroup, ProjectUser
from .models import PeopleGroup, PeopleGroupLocation, ProjectUser
from .utils import get_group_permissions


Expand Down Expand Up @@ -169,6 +169,16 @@ class PeopleGroupAdmin(TranslateObjectAdminMixin, admin.ModelAdmin):
list_filter = ("organization",)


@admin.register(PeopleGroupLocation)
class PeopleGroupLocationAdmin(admin.ModelAdmin):
list_display = ("title", "description", "type", "people_group")
list_display_links = (
list_display[0],
"people_group",
)
search_fields = ("title", "description", "type", "people_group__title")


@admin.register(Permission)
class PermissionAdmin(admin.ModelAdmin):
list_display = ("name", "codename", "content_type")
Expand Down
19 changes: 18 additions & 1 deletion apps/accounts/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@
from services.keycloak.factories import KeycloakAccountFactory
from services.keycloak.interface import KeycloakService

from .models import PeopleGroup, PrivacySettings, ProjectUser, UserScore
from .models import (
PeopleGroup,
PeopleGroupLocation,
PrivacySettings,
ProjectUser,
UserScore,
)

faker = Faker()

Expand Down Expand Up @@ -121,3 +127,14 @@ def create(cls, **kwargs):
def with_leader(self, create, extracted, **kwargs):
if create and extracted is True:
UserFactory(groups=[self.get_leaders()])


class PeopleGroupLocationFactory(factory.django.DjangoModelFactory):
title = factory.Faker("sentence")
description = factory.Faker("text")
lat = factory.Faker("latitude")
lng = factory.Faker("longitude")
type = PeopleGroupLocation.LocationType.ADDRESS.value

class Meta:
model = PeopleGroupLocation
85 changes: 85 additions & 0 deletions apps/accounts/migrations/0004_peoplegrouplocation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Generated by Django 5.2.11 on 2026-02-20 11:31

import apps.commons.mixins
import django.db.models.deletion
import services.translator.mixins
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("accounts", "0003_peoplegroup_tags"),
]

operations = [
migrations.CreateModel(
name="PeopleGroupLocation",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("title", models.CharField(blank=True, max_length=255)),
("description", models.TextField(blank=True)),
("lat", models.FloatField()),
("lng", models.FloatField()),
(
"type",
models.CharField(
choices=[
("team", "Team"),
("impact", "Impact"),
("address", "Address"),
],
default="team",
max_length=10,
),
),
(
"title_detected_language",
models.CharField(blank=True, max_length=10, null=True),
),
("title_en", models.CharField(blank=True, max_length=1020, null=True)),
("title_fr", models.CharField(blank=True, max_length=1020, null=True)),
("title_de", models.CharField(blank=True, max_length=1020, null=True)),
("title_nl", models.CharField(blank=True, max_length=1020, null=True)),
("title_et", models.CharField(blank=True, max_length=1020, null=True)),
("title_ca", models.CharField(blank=True, max_length=1020, null=True)),
("title_es", models.CharField(blank=True, max_length=1020, null=True)),
(
"description_detected_language",
models.CharField(blank=True, max_length=10, null=True),
),
("description_en", models.TextField(blank=True, null=True)),
("description_fr", models.TextField(blank=True, null=True)),
("description_de", models.TextField(blank=True, null=True)),
("description_nl", models.TextField(blank=True, null=True)),
("description_et", models.TextField(blank=True, null=True)),
("description_ca", models.TextField(blank=True, null=True)),
("description_es", models.TextField(blank=True, null=True)),
(
"people_group",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="locations",
to="accounts.peoplegroup",
),
),
],
options={
"abstract": False,
},
bases=(
apps.commons.mixins.OrganizationRelated,
services.translator.mixins.HasAutoTranslatedFields,
apps.commons.mixins.DuplicableModel,
models.Model,
),
),
]
15 changes: 14 additions & 1 deletion apps/accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,26 @@
from apps.commons.models import GroupData
from apps.newsfeed.models import Event, Instruction, News
from apps.organizations.models import Organization
from apps.projects.models import Project
from apps.projects.models import AbstractLocation, Project
from services.keycloak.exceptions import RemoteKeycloakAccountNotFound
from services.keycloak.interface import KeycloakService
from services.keycloak.models import KeycloakAccount
from services.translator.mixins import HasAutoTranslatedFields


class PeopleGroupLocation(OrganizationRelated, AbstractLocation):
"""base location for group"""

people_group = models.ForeignKey(
"accounts.PeopleGroup",
on_delete=models.CASCADE,
related_name="locations",
)

def get_related_organizations(self) -> list["Organization"]:
return [self.people_group.organization]


class PeopleGroup(
HasEmbedding,
HasRelatedModules,
Expand Down
Loading