Handle cases where monetary field has no currency

This commit is contained in:
shamoon 2024-09-28 22:41:04 -07:00
parent bcd08a7eda
commit dba800b5ed
3 changed files with 28 additions and 4 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 5.1.1 on 2024-09-29 00:39 # Generated by Django 5.1.1 on 2024-09-29 05:16
import django.db.models.functions.text import django.db.models.functions.text
from django.db import migrations from django.db import migrations
@ -16,7 +16,17 @@ class Migration(migrations.Migration):
name="value_monetary_amount", name="value_monetary_amount",
field=models.GeneratedField( field=models.GeneratedField(
db_persist=True, db_persist=True,
expression=django.db.models.functions.text.Substr("value_monetary", 4), expression=models.Case(
models.When(
then=django.db.models.functions.text.Substr(
"value_monetary",
1,
),
value_monetary__regex="^\\d+",
),
default=django.db.models.functions.text.Substr("value_monetary", 4),
output_field=models.DecimalField(decimal_places=2, max_digits=125),
),
output_field=models.DecimalField(decimal_places=2, max_digits=125), output_field=models.DecimalField(decimal_places=2, max_digits=125),
), ),
), ),

View File

@ -22,6 +22,7 @@ from multiselectfield import MultiSelectField
if settings.AUDIT_LOG_ENABLED: if settings.AUDIT_LOG_ENABLED:
from auditlog.registry import auditlog from auditlog.registry import auditlog
from django.db.models import Case
from django.db.models.functions import Substr from django.db.models.functions import Substr
from django_softdelete.models import SoftDeleteModel from django_softdelete.models import SoftDeleteModel
@ -924,7 +925,16 @@ class CustomFieldInstance(models.Model):
value_monetary = models.CharField(null=True, max_length=128) value_monetary = models.CharField(null=True, max_length=128)
value_monetary_amount = models.GeneratedField( value_monetary_amount = models.GeneratedField(
expression=Substr("value_monetary", 4), expression=Case(
# If the value starts with a number and no currency symbol, use the whole string
models.When(
value_monetary__regex=r"^\d+",
then=Substr("value_monetary", 1),
),
# If the value starts with a 3-char currency symbol, use the rest of the string
default=Substr("value_monetary", 4),
output_field=models.DecimalField(decimal_places=2, max_digits=125),
),
output_field=models.DecimalField(decimal_places=2, max_digits=125), output_field=models.DecimalField(decimal_places=2, max_digits=125),
db_persist=True, db_persist=True,
) )

View File

@ -104,6 +104,7 @@ class TestCustomFieldsSearch(DirectoriesMixin, APITestCase):
self._create_document(monetary_field="USD100.00") self._create_document(monetary_field="USD100.00")
self._create_document(monetary_field="USD1.00") self._create_document(monetary_field="USD1.00")
self._create_document(monetary_field="EUR50.00") self._create_document(monetary_field="EUR50.00")
self._create_document(monetary_field="101.00")
# CustomField.FieldDataType.DOCUMENTLINK # CustomField.FieldDataType.DOCUMENTLINK
self._create_document(documentlink_field=None) self._create_document(documentlink_field=None)
@ -398,7 +399,10 @@ class TestCustomFieldsSearch(DirectoriesMixin, APITestCase):
["monetary_field", "gt", "99"], ["monetary_field", "gt", "99"],
lambda document: "monetary_field" in document lambda document: "monetary_field" in document
and document["monetary_field"] is not None and document["monetary_field"] is not None
and document["monetary_field"] == "USD100.00", and (
document["monetary_field"] == "USD100.00" # With currency symbol
or document["monetary_field"] == "101.00" # No currency symbol
),
) )
# ==========================================================# # ==========================================================#