Skip to content

Commit 335a72b

Browse files
committed
feat: reassign number
1 parent fe89f9a commit 335a72b

20 files changed

+248
-15
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,4 @@ jobs:
5656

5757
- name: Run tests
5858
# For example, using `pytest`
59-
run: uv run pytest test
59+
run: uv run pytest tests

README.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,9 @@ ____________
2727

2828
3. Run `python manage.py migrate` to create the enumeration models.
2929

30+
31+
32+
Development
33+
____________
34+
35+
DJANGO_SETTINGS_MODULE=enumeration.tests.settings django-admin makemigrations

pytest.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[pytest]
2-
DJANGO_SETTINGS_MODULE = test.settings
3-
pythonpath = . src
2+
DJANGO_SETTINGS_MODULE = enumeration.tests.settings
3+
pythonpath = src
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Generated by Django 4.2.17 on 2024-12-09 04:14
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("enumeration", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="counter",
15+
name="id",
16+
field=models.BigAutoField(
17+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
18+
),
19+
),
20+
migrations.AlterField(
21+
model_name="gap",
22+
name="id",
23+
field=models.BigAutoField(
24+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
25+
),
26+
),
27+
migrations.AlterField(
28+
model_name="sequence",
29+
name="id",
30+
field=models.BigAutoField(
31+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
32+
),
33+
),
34+
]

src/enumeration/mixins.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from django.db import models
2+
from typing import Dict, TYPE_CHECKING
3+
from enumeration.manager import get_number, format_number, ResetPeriod, truncate_date
4+
5+
if TYPE_CHECKING:
6+
from enumeration.models import Sequence
7+
8+
9+
class EnumeratedModelMixin(models.Model):
10+
sequence = models.ForeignKey(
11+
"enumeration.Sequence", null=True, on_delete=models.PROTECT
12+
)
13+
14+
number = models.CharField(max_length=255, null=True, blank=True, db_index=True)
15+
position = models.PositiveIntegerField(null=True)
16+
counter = models.ForeignKey(
17+
"enumeration.Counter", null=True, on_delete=models.PROTECT
18+
)
19+
20+
def get_sequence(self) -> "Sequence":
21+
raise NotImplementedError
22+
23+
def get_enumeration_context(self) -> Dict:
24+
return {}
25+
26+
def assign_number(self):
27+
if self.number:
28+
raise RuntimeError("Number present")
29+
30+
if not self.sequence:
31+
self.sequence = self.get_sequence()
32+
33+
self.number, self.position, self.counter_id = get_number(
34+
sequence=self.sequence, **self.get_enumeration_context()
35+
)
36+
37+
def reassign_number(self):
38+
assert self.sequence and self.position and self.counter
39+
ctx = self.get_enumeration_context()
40+
41+
# Sequecne never resets
42+
if self.sequence.reset_period == ResetPeriod.NEVER:
43+
# And correct counter
44+
if self.counter.period is None:
45+
self.number = format_number(
46+
self.sequence.format,
47+
position=self.position,
48+
**ctx,
49+
)
50+
return
51+
# sequnce resets
52+
else:
53+
# and correct counter period
54+
if self.counter.period == truncate_date(
55+
self.sequence.reset_period, ctx["date"]
56+
):
57+
self.number = format_number(
58+
self.sequence.format,
59+
position=self.position,
60+
**ctx,
61+
)
62+
return
63+
64+
# get new number
65+
self.number, self.position, self.counter_id = get_number(
66+
sequence=self.sequence, **ctx
67+
)
68+
69+
class Meta:
70+
abstract = True

src/enumeration/models.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from django.core.exceptions import ValidationError
22
from django.db import models
3-
43
from enumeration.const import ResetPeriod
54
from enumeration.validators import validate_format
65

@@ -43,12 +42,3 @@ class Gap(models.Model):
4342
position = models.PositiveIntegerField()
4443

4544
unique_together = ("counter", "position")
46-
47-
48-
# class EnumeratedDocumentMixin(models.Model):
49-
# sequence = models.ForeignKey(Sequence)
50-
# position = models.PositiveIntegerField(null=True)
51-
# number = models.CharField(max_length=255, null=True, blank=True)
52-
#
53-
# class Meta:
54-
# abstract = True
File renamed without changes.

src/enumeration/tests/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 TestConfig(AppConfig):
5+
name = "enumeration.tests"
6+
label = "enumeration_tests"
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Generated by Django 4.2.17 on 2024-12-09 04:14
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = [
12+
("enumeration", "0002_alter_counter_id_alter_gap_id_alter_sequence_id"),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name="Document",
18+
fields=[
19+
(
20+
"id",
21+
models.BigAutoField(
22+
auto_created=True,
23+
primary_key=True,
24+
serialize=False,
25+
verbose_name="ID",
26+
),
27+
),
28+
(
29+
"number",
30+
models.CharField(
31+
blank=True, db_index=True, max_length=255, null=True
32+
),
33+
),
34+
("position", models.PositiveIntegerField(null=True)),
35+
("date", models.DateField()),
36+
(
37+
"counter",
38+
models.ForeignKey(
39+
null=True,
40+
on_delete=django.db.models.deletion.PROTECT,
41+
to="enumeration.counter",
42+
),
43+
),
44+
(
45+
"sequence",
46+
models.ForeignKey(
47+
null=True,
48+
on_delete=django.db.models.deletion.PROTECT,
49+
to="enumeration.sequence",
50+
),
51+
),
52+
],
53+
options={
54+
"abstract": False,
55+
},
56+
),
57+
]

src/enumeration/tests/migrations/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)