You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
2.6 KiB
54 lines
2.6 KiB
from django.core.validators import RegexValidator |
|
from django.db import models |
|
from django.db.models import Q |
|
|
|
from .base import IdentifiedModel |
|
|
|
|
|
class SourceRecord(IdentifiedModel): |
|
class Format(models.TextChoices): |
|
BANK_CSV = "BANK_CSV", "Bank CSV" |
|
OUROCARD_TXT = "OUROCARD_TXT", "Ourocard TXT" |
|
|
|
transaction = models.ForeignKey("finance.Transaction", on_delete=models.PROTECT, related_name="source_records") |
|
document_hash = models.CharField(max_length=64, validators=[ |
|
RegexValidator(r"\A[0-9a-f]{64}\Z", "Use a lowercase SHA-256 hexadecimal digest.")]) |
|
source_format = models.CharField(max_length=16, choices=Format.choices) |
|
parser_version = models.CharField(max_length=128) |
|
item_locator = models.CharField(max_length=255) |
|
|
|
class Meta: |
|
constraints = [ |
|
models.CheckConstraint(condition=Q(source_format__in=["BANK_CSV", "OUROCARD_TXT"]), name="source_valid_format"), |
|
models.CheckConstraint(condition=Q(document_hash__regex=r"^[0-9a-f]{64}$"), name="source_valid_hash"), |
|
models.CheckConstraint(condition=Q(parser_version__regex=r"\S"), name="source_nonblank_parser"), |
|
models.CheckConstraint(condition=Q(item_locator__regex=r"\S"), name="source_nonblank_locator"), |
|
models.UniqueConstraint(fields=["document_hash", "item_locator"], name="source_document_item_unique"), |
|
] |
|
|
|
|
|
class AuditEvent(IdentifiedModel): |
|
class ActorKind(models.TextChoices): |
|
HUMAN = "HUMAN", "Human" |
|
APPLICATION = "APPLICATION", "Application" |
|
AGENT = "AGENT", "Agent" |
|
|
|
class Outcome(models.TextChoices): |
|
SUCCESS = "SUCCESS", "Success" |
|
FAILURE = "FAILURE", "Failure" |
|
|
|
actor_kind = models.CharField(max_length=16, choices=ActorKind.choices) |
|
actor_identifier = models.CharField(max_length=255) |
|
operation = models.CharField(max_length=128) |
|
target_id = models.UUIDField(null=True, blank=True) |
|
outcome = models.CharField(max_length=16, choices=Outcome.choices) |
|
changed_fields = models.JSONField(default=list, blank=True) |
|
error_code = models.CharField(max_length=128, blank=True) |
|
|
|
class Meta: |
|
constraints = [ |
|
models.CheckConstraint(condition=Q(actor_kind__in=["HUMAN", "APPLICATION", "AGENT"]), name="audit_valid_actor"), |
|
models.CheckConstraint(condition=Q(outcome__in=["SUCCESS", "FAILURE"]), name="audit_valid_outcome"), |
|
models.CheckConstraint(condition=Q(actor_identifier__regex=r"\S"), name="audit_nonblank_actor"), |
|
models.CheckConstraint(condition=Q(operation__regex=r"\S"), name="audit_nonblank_operation"), |
|
]
|
|
|