text: from django.core.validators import MaxValueValidator
  from django.db import models
  from django.utils.translation import ugettext_lazy as _
  
  from main.models import SettingModel
  from main.validators import validate_pdf_or_doc
  from studies.models import Study
  
  
  class Registration(models.Model):
      order = models.PositiveIntegerField(unique=True)
      description = models.CharField(max_length=200)
      needs_details = models.BooleanField(default=False)
      requires_review = models.BooleanField(default=False)
  
      class Meta:
          ordering = ['order']
  
      def __str__(self):
          return self.description
  
  
  class Observation(SettingModel):
      # This is used internally to provide backwards compatibility with the old
      # version of this model. All old fields are still used if this is 1.
      version = models.PositiveIntegerField(
          'INTERNAL - Describes which version of the observation model is used',
          default=2)
  
      details_who = models.TextField(
          _('Beschrijf <b>wie</b> er wordt geobserveerd.'),
          help_text=_(
              'Maak duidelijk voor de commissie wie er wordt geobserveerd en wat er precies van de deelnemer wordt'
              ' geobserveerd. Bijvoorbeeld: De leraar zal geobserveerd worden. De observatie moet de interactie '
              'tussen leraar en leerling in kaart brengen.'),
          blank=True,
      )
  
      details_why = models.TextField(
          _('Beschrijf <b>waarom</b> er wordt geobserveerd.'),
          help_text=_(
              'Wat is het doel van de observatie? Bijvoorbeeld: Het doel van de observatie is inzicht te krijgen '
              'in hoe de leerkracht omgaat met de uitleg van de nieuwe lesmethode. Doet h/zij dat op de gewenste '
              'manier en in begrijpelijke taal?'),
          blank=True,
      )
  
      details_frequency = models.TextField(
          _(
              'Beschrijf <b>hoe vaak en hoe lang</b> de deelnemer wordt geobserveerd.'),
          help_text=_('Bijvoorbeeld: De leraar zal 5 lessen van 45 minuten '
                      'worden geobserveerd.'),
          blank=True,
      )
  
      is_anonymous = models.BooleanField(
          _('Wordt er anoniem geobserveerd?'),
          help_text=_(
              'Zoals zou kunnen voorkomen op fora en de onderzoeker ook een account heeft.'),
          default=False,
      )
  
      is_anonymous_details = models.TextField(
          _('Licht toe'),
          blank=True,
      )
  
      is_in_target_group = models.BooleanField(
          _('Doet de onderzoeker zich voor als behorende tot de doelgroep?'),
          default=False,
      )
  
      is_in_target_group_details = models.TextField(
          _('Licht toe'),
          blank=True,
      )
  
      is_nonpublic_space = models.BooleanField(
          _('Wordt er geobserveerd in een niet-openbare ruimte?'),
          help_text=_('Bijvoorbeeld er wordt geobserveerd bij iemand thuis, \
  tijdens een hypotheekgesprek, tijdens politieverhoren of een forum waar \
  een account voor moet worden aangemaakt.'),
          default=False,
      )
  
      is_nonpublic_space_details = models.TextField(
          _('Licht toe'),
          blank=True,
      )
  
      has_advanced_consent = models.BooleanField(
          _('Vindt informed consent van tevoren plaats?'),
          default=True,
      )
  
      has_advanced_consent_details = models.TextField(
          _(
              'Leg uit waarom informed consent niet van te voren plaatsvindt en '
              'geef ook op welke wijze dit achteraf verzorgd wordt.'
          ),
          blank=True,
      )
  
      needs_approval = models.BooleanField(
          _('Heeft u toestemming nodig van een (samenwerkende) instantie \
  om deze observatie te mogen uitvoeren?'),
          default=False,
      )
  
      approval_institution = models.CharField(
          _('Welke instantie?'),
          max_length=200,
          blank=True,
      )
  
      approval_document = models.FileField(
          _('Upload hier het toestemmingsdocument (in .pdf of .doc(x)-formaat)'),
          blank=True,
          validators=[validate_pdf_or_doc],
      )
  
      registrations = models.ManyToManyField(
          Registration,
          verbose_name=_('Hoe wordt het gedrag geregistreerd?'))
      registrations_details = models.CharField(
          _('Namelijk'),
          max_length=200,
          blank=True)
  
      # Legacy, only used in v1
      days = models.PositiveIntegerField(
          _('Op hoeveel dagen wordt er geobserveerd (per deelnemer)?'),
          blank=True,
          null=True)
      mean_hours = models.DecimalField(
          _('Hoeveel uur wordt er gemiddeld per dag geobserveerd?'),
          max_digits=4,
          decimal_places=2,
          validators=[MaxValueValidator(24)],
          blank=True,
          null=True)
  
      # References
      study = models.OneToOneField(
          Study,
          on_delete=models.CASCADE)
  