Skip to content
Draft
78 changes: 0 additions & 78 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,6 @@ Bug fixes:
- Fixes AttributeError when overriding the init function of the CustomFieldBaseModelSerializer because of the params. (`TI-2994 <https://4teamwork.atlassian.net/browse/TI-2994>`_)


2025.5.12 (2025-10-27)
----------------------

No changes.


2025.5.11 (2025-10-27)
----------------------

No changes.


2025.5.10 (2025-10-27)
----------------------

Expand All @@ -51,18 +39,6 @@ Bug fixes:
- Array custom fields get annotated correctly.


2025.5.9 (2025-10-24)
---------------------

No changes.


2025.8.0 (2025-10-24)
---------------------

No changes.


2025.5.8 (2025-10-24)
---------------------

Expand All @@ -79,36 +55,6 @@ Bug fixes:
- Handle None values when setting custom values. (`master <https://4teamwork.atlassian.net/browse/master>`_)


2025.5.5 (2025-10-23)
---------------------

No changes.


2025.5.4 (2025-10-23)
---------------------

No changes.


2025.5.3 (2025-10-23)
---------------------

No changes.


2025.5.2 (2025-10-23)
---------------------

No changes.


2025.5.1 (2025-10-23)
---------------------

No changes.


2025.5.0 (2025-10-23)
---------------------

Expand All @@ -117,30 +63,6 @@ Other changes:
- Improve MappingSerializer and add option for more related fields. (`TI-2893 <https://4teamwork.atlassian.net/browse/TI-2893>`_)


2025.4.3 (2025-10-22)
---------------------

No changes.


2025.3.0 (2025-10-22)
---------------------

No changes.


2025.4.2 (2025-10-22)
---------------------

No changes.


2025.4.1 (2025-10-22)
---------------------

No changes.


2025.4.0 (2025-10-22)
---------------------

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ Add the `django_features.system_message.routers.system_message_router` to your `
path("api/", include(system_message_router.urls)),
```

#### Publishable Models

Set or override the `PUBLISHER` attribute in your settings to define if the application can publish content or not.

## Development

Installing dependencies, assuming you have poetry installed:
Expand Down
21 changes: 0 additions & 21 deletions app/tests/custom_fields/factories.py

This file was deleted.

4 changes: 2 additions & 2 deletions app/tests/custom_fields/test_custom_field_base_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from app.models import Person
from app.models import PersonType
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from app.tests.custom_fields.factories import CustomValueFactory
from app.tests.factories import PersonFactory
from app.tests.factories import PersonTypeFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.models import CustomField


Expand Down
8 changes: 4 additions & 4 deletions app/tests/custom_fields/test_custom_field_base_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from app.models import Person
from app.models import PersonType
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from app.tests.custom_fields.factories import CustomValueFactory
from app.tests.factories import PersonFactory
from app.tests.factories import PersonTypeFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.models import CustomField
from django_features.custom_fields.models import CustomValue

Expand All @@ -28,7 +28,7 @@ def test_custom_field_base_model_custom_field_type_model(self) -> None:
self.assertEqual(PersonType, Person.objects.get_type_model())

def test_custom_field_base_model_set_char_value(self) -> None:
CustomFieldFactory(
CustomFieldFactory( # type: ignore
identifier="char_value",
content_type=self.person_ct,
field_type=CustomField.FIELD_TYPES.CHAR,
Expand All @@ -54,7 +54,7 @@ def test_custom_field_base_model_set_char_value(self) -> None:
self.assertEqual("Char value", CustomValue.objects.first().value)

def test_custom_field_base_model_set_text_value(self) -> None:
CustomFieldFactory(
CustomFieldFactory( # type: ignore
identifier="text_value",
content_type=self.person_ct,
field_type=CustomField.FIELD_TYPES.TEXT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
from app.models import Person
from app.serializers.person import PersonSerializer
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from app.tests.custom_fields.factories import CustomValueFactory
from app.tests.factories import PersonFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.models import CustomField
from django_features.custom_fields.models import CustomValue

Expand Down
4 changes: 2 additions & 2 deletions app/tests/custom_fields/test_custom_field_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

from app.models import Person
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from app.tests.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.models import CustomField
from django_features.custom_fields.serializers import CustomFieldSerializer

Expand Down
2 changes: 1 addition & 1 deletion app/tests/custom_fields/test_custom_field_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from app.models import Address
from app.models import Person
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomFieldFactory


class CustomFieldViewSetTest(APITestCase):
Expand Down
4 changes: 2 additions & 2 deletions app/tests/system_message/test_system_message_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from pluck import pluck

from app.tests import APITestCase
from app.tests.system_message.factories import SystemMessageFactory
from app.tests.system_message.factories import SystemMessageTypeFactory
from django_features.system_message.factories import SystemMessageFactory
from django_features.system_message.factories import SystemMessageTypeFactory


class SystemInfoViewSetTest(APITestCase):
Expand Down
4 changes: 2 additions & 2 deletions app/tests/test_mapping_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
from app.models import Person
from app.serializers.person import PersonMappingSerializer
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from app.tests.custom_fields.factories import CustomValueFactory
from app.tests.factories import AddressFactory
from app.tests.factories import ElectionDistrictFactory
from app.tests.factories import PersonFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomValueFactory
from django_features.custom_fields.models import CustomField
from django_features.custom_fields.models import CustomValue

Expand Down
6 changes: 3 additions & 3 deletions app/tests/test_model_field_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from app.models import Address
from app.models import Person
from app.tests import APITestCase
from app.tests.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.factories import CustomFieldFactory
from django_features.custom_fields.models import CustomField
from django_features.settings.fields import ModelFieldMapping

Expand All @@ -13,12 +13,12 @@ class ModelFieldMappingTestCase(APITestCase):
def setUp(self) -> None:
self.person_ct = ContentType.objects.get_for_model(Person)
self.address_ct = ContentType.objects.get_for_model(Address)
CustomFieldFactory(
CustomFieldFactory( # type: ignore
identifier="person_custom_field",
content_type=self.person_ct,
field_type=CustomField.FIELD_TYPES.CHAR,
)
CustomFieldFactory(
CustomFieldFactory( # type: ignore
identifier="address_custom_field",
content_type=self.address_ct,
field_type=CustomField.FIELD_TYPES.CHAR,
Expand Down
1 change: 1 addition & 0 deletions changes/TI-2890.other
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add publishable models and querysets to custom fields and values. [TI-2890](https://4teamwork.atlassian.net/browse/TI-2890>)
75 changes: 75 additions & 0 deletions django_features/custom_fields/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from django.contrib.contenttypes.models import ContentType
from factory import lazy_attribute # type: ignore
from factory import SubFactory # type: ignore
from factory.django import DjangoModelFactory

from django_features.custom_fields import models


class CustomFieldFactory(DjangoModelFactory):
class Meta:
model = models.CustomField

@lazy_attribute
def content_type(self) -> ContentType | None:
try:
from app.models import Person

return ContentType.objects.get_for_model(Person)
except ModuleNotFoundError:
return None

field_type = models.CustomField.FIELD_TYPES.CHAR
identifier = "custom_field"
label_de = "Custom Field Label"


class CustomValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

field = SubFactory(CustomFieldFactory) # type: ignore
value = "custom value"


class CustomChoiceFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

label_de = "Red"
value = "red"


class CustomTextValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

value = "Custom text"


class CustomDateValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

value = "2019-01-01"


class CustomIntegerValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

value = 1


class CustomBooleanValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

value = True


class CustomArrayValueFactory(DjangoModelFactory):
class Meta:
model = models.CustomValue

value = [1, 2, 3]
Loading