Source code for fairdm.core.measurement.apps

"""App configuration for the measurement app."""

from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _

#: Mirrors the message `Measurement.clean()` raises.
BASE_MEASUREMENT_ERROR = _(
    "Cannot create base Measurement instances directly. Please use a specific "
    "measurement type subclass."
)


[docs] def block_base_measurement_creation(sender, instance, **kwargs): """Refuse to save a bare ``Measurement`` row, by any route. ``Measurement.objects.create()`` and a bare ``Measurement().save()`` reach the database without calling ``clean()``. This is connected with ``sender=Measurement`` because a subclass instance sends its own class on save, so it never fires for a registered measurement type. ``pre_save`` also covers fixture loading. Args: sender: The model class being saved. instance: The instance being saved. **kwargs: Additional signal arguments. Raises: ValidationError: Always, since a bare ``Measurement`` cannot be saved. """ from django.core.exceptions import ValidationError raise ValidationError(BASE_MEASUREMENT_ERROR)
[docs] class FairDMMeasurementConfig(AppConfig): """Configuration for the ``fairdm.core.measurement`` app.""" name = "fairdm.core.measurement" label = "measurement" verbose_name = _("Measurement") verbose_name_plural = _("Measurements")
[docs] def ready(self): """Connect the guard that blocks saving a bare ``Measurement``.""" from django.db.models.signals import pre_save from .models import Measurement pre_save.connect(block_base_measurement_creation, sender=Measurement)