Skip to content

Commit 2ede689

Browse files
committed
wip
1 parent edcbbe7 commit 2ede689

34 files changed

+1027
-19
lines changed

.github/workflows/tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ concurrency:
99

1010
jobs:
1111
test:
12-
runs-on: ubuntu-latest
12+
runs-on: self-hosted
1313
services:
1414
postgres:
1515
image: postgres
@@ -29,7 +29,7 @@ jobs:
2929
- name: Setup python
3030
uses: actions/setup-python@v4
3131
with:
32-
python-version: 3.12
32+
python-version: 3.13
3333
- name: Install poetry
3434
uses: abatilo/actions-poetry@v2
3535
with:

app/admin.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from django.contrib import admin
2+
3+
from app import models
4+
5+
6+
@admin.register(models.Address)
7+
class AddressAdmin(admin.ModelAdmin):
8+
list_display = ("id", "__str__")
9+
list_display_links = ("id", "__str__")
10+
search_fields = ("city", "country", "street", "zip_code")
11+
12+
13+
@admin.register(models.Person)
14+
class PersonAdmin(admin.ModelAdmin):
15+
list_display = ("id", "__str__", "email")
16+
list_display_links = ("id", "__str__")
17+
search_fields = ("email", "firstname", "lastname")

app/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class DummyAppConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "app"

app/management/__init__.py

Whitespace-only changes.

app/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import random
2+
from typing import Any
3+
4+
from django.contrib.contenttypes.models import ContentType
5+
from django.core.management import BaseCommand
6+
7+
from app.models import Person
8+
from django_features.custom_fields.models import CustomField
9+
from django_features.custom_fields.models import CustomValue
10+
11+
12+
class Command(BaseCommand):
13+
NUMBER_OF_CUSTOM_FIELDS = 100
14+
NUMBER_OF_OBJECTS = 1000
15+
16+
def _value_for_type(self, field_type: str) -> Any:
17+
match field_type:
18+
case "CHAR":
19+
return "custom char field"
20+
case "TEXT":
21+
return "custom text field\nsecond line"
22+
case "INTEGER":
23+
return 123456789
24+
case "DATE":
25+
return "2025-01-01"
26+
case "DATETIME":
27+
return "2025-01-01T00:00:00Z"
28+
case "BOOLEAN":
29+
return random.choice([True, False])
30+
return None
31+
32+
def handle(self, *args: Any, **options: Any) -> None:
33+
custom_fields = []
34+
custom_values = []
35+
objects = []
36+
37+
field_type = 0
38+
person_c = ContentType.objects.get_for_model(Person)
39+
print("Add objects")
40+
for i in range(self.NUMBER_OF_OBJECTS):
41+
objects.append(Person(firstname=f"Firstname {i}", lastname=f"Lastname {i}"))
42+
43+
print("Add custom fields")
44+
for i in range(self.NUMBER_OF_CUSTOM_FIELDS):
45+
custom_fields.append(
46+
CustomField(
47+
content_type=person_c,
48+
field_type=CustomField.TYPE_CHOICES[field_type][0],
49+
identifier=f"custom_field_{i}",
50+
label=f"Custom field {i}",
51+
)
52+
)
53+
field_type = (
54+
field_type + 1 if field_type < len(CustomField.TYPE_CHOICES) - 1 else 0
55+
)
56+
57+
print("Add custom values")
58+
for i in range(self.NUMBER_OF_OBJECTS):
59+
for c in range(self.NUMBER_OF_CUSTOM_FIELDS):
60+
field = custom_fields[c]
61+
custom_values.append(
62+
CustomValue(
63+
field=field,
64+
value={"value": self._value_for_type(field.field_type)},
65+
)
66+
)
67+
68+
print("Execute bulk create")
69+
CustomField.objects.bulk_create(custom_fields)
70+
CustomValue.objects.bulk_create(custom_values)
71+
Person.objects.bulk_create(objects)
72+
73+
print("Set many2many relations")
74+
for i in range(self.NUMBER_OF_OBJECTS):
75+
for c in range(self.NUMBER_OF_CUSTOM_FIELDS):
76+
field = custom_fields[c]
77+
objects[i].custom_values.add(CustomValue.objects.filter(field=field)[i])

app/migrations/0001_initial.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Generated by Django 4.2.23 on 2025-09-12 05:25
2+
3+
import django_extensions.db.fields
4+
from django.db import migrations
5+
from django.db import models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
initial = True
11+
12+
dependencies = []
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name="Person",
17+
fields=[
18+
(
19+
"id",
20+
models.BigAutoField(
21+
auto_created=True,
22+
primary_key=True,
23+
serialize=False,
24+
verbose_name="ID",
25+
),
26+
),
27+
(
28+
"created",
29+
django_extensions.db.fields.CreationDateTimeField(
30+
auto_now_add=True, verbose_name="created"
31+
),
32+
),
33+
(
34+
"modified",
35+
django_extensions.db.fields.ModificationDateTimeField(
36+
auto_now=True, verbose_name="modified"
37+
),
38+
),
39+
("firstname", models.CharField(verbose_name="firstname")),
40+
(
41+
"lastname",
42+
models.CharField(blank=True, null=True, verbose_name="lastname"),
43+
),
44+
(
45+
"email",
46+
models.EmailField(
47+
blank=True, max_length=254, null=True, verbose_name="email"
48+
),
49+
),
50+
],
51+
options={
52+
"verbose_name": "Person",
53+
"verbose_name_plural": "Persons",
54+
},
55+
),
56+
]

app/migrations/0002_initial.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 4.2.23 on 2025-09-12 05:25
2+
3+
from django.db import migrations
4+
from django.db import models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = [
12+
("app", "0001_initial"),
13+
("custom_fields", "0001_initial"),
14+
]
15+
16+
operations = [
17+
migrations.AddField(
18+
model_name="person",
19+
name="custom_values",
20+
field=models.ManyToManyField(
21+
blank=True,
22+
related_name="related_objects",
23+
to="custom_fields.customvalue",
24+
verbose_name="Benutzerdefinierte Werte",
25+
),
26+
),
27+
]
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# Generated by Django 4.2.23 on 2025-09-12 08:40
2+
3+
import django.db.models.deletion
4+
import django_extensions.db.fields
5+
from django.db import migrations
6+
from django.db import models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
("custom_fields", "0001_initial"),
13+
("contenttypes", "0002_remove_content_type_name"),
14+
("app", "0002_initial"),
15+
]
16+
17+
operations = [
18+
migrations.AlterField(
19+
model_name="person",
20+
name="custom_values",
21+
field=models.ManyToManyField(
22+
blank=True,
23+
to="custom_fields.customvalue",
24+
verbose_name="Benutzerdefinierte Werte",
25+
),
26+
),
27+
migrations.CreateModel(
28+
name="Address",
29+
fields=[
30+
(
31+
"id",
32+
models.BigAutoField(
33+
auto_created=True,
34+
primary_key=True,
35+
serialize=False,
36+
verbose_name="ID",
37+
),
38+
),
39+
(
40+
"created",
41+
django_extensions.db.fields.CreationDateTimeField(
42+
auto_now_add=True, verbose_name="created"
43+
),
44+
),
45+
(
46+
"modified",
47+
django_extensions.db.fields.ModificationDateTimeField(
48+
auto_now=True, verbose_name="modified"
49+
),
50+
),
51+
("street", models.CharField(blank=True, verbose_name="street")),
52+
("zip_code", models.CharField(blank=True, verbose_name="postal code")),
53+
("city", models.CharField(blank=True, verbose_name="city")),
54+
("country", models.CharField(blank=True, verbose_name="country")),
55+
("target_id", models.PositiveIntegerField(blank=True, null=True)),
56+
(
57+
"custom_values",
58+
models.ManyToManyField(
59+
blank=True,
60+
to="custom_fields.customvalue",
61+
verbose_name="Benutzerdefinierte Werte",
62+
),
63+
),
64+
(
65+
"target_type",
66+
models.ForeignKey(
67+
blank=True,
68+
null=True,
69+
on_delete=django.db.models.deletion.CASCADE,
70+
to="contenttypes.contenttype",
71+
),
72+
),
73+
],
74+
options={
75+
"verbose_name": "Address",
76+
"verbose_name_plural": "Addresses",
77+
},
78+
),
79+
]

app/migrations/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)