Source code for validation.models

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 28 11:09:02 2019

@author: Paolo Cozzi <cozzi@ibba.cnr.it>
"""

from django.db import models
from django.contrib.postgres.fields import ArrayField, JSONField
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

from uid.models import Animal, Sample, Submission


[docs]class ValidationResult(models.Model): submission = models.ForeignKey( Submission, on_delete=models.CASCADE) # limit choices for contenttypes # https://axiacore.com/blog/how-use-genericforeignkey-django-531/ name_limit = models.Q(app_label='uid', model='animal') | \ models.Q(app_label='uid', model='sample') # Below the mandatory fields for generic relation # https://simpleisbetterthancomplex.com/tutorial/2016/10/13/how-to-use-generic-relations.html content_type = models.ForeignKey( ContentType, on_delete=models.CASCADE, limit_choices_to=name_limit) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') status = models.CharField( max_length=255, blank=False, null=True) messages = ArrayField( models.TextField(max_length=255, blank=True), default=list, blank=True ) class Meta: unique_together = ('content_type', 'object_id') def __str__(self): return "(%s - %s:%s) %s" % ( self.submission, self.content_type, self.object_id, self.status)
[docs]class ValidationSummary(models.Model): submission = models.ForeignKey( Submission, on_delete=models.CASCADE) all_count = models.PositiveIntegerField( default=0, help_text="number of all samples or animals in a submission") validation_known_count = models.PositiveIntegerField(default=0) issues_count = models.PositiveIntegerField( default=0, help_text="number of samples or animals with issues in validation") pass_count = models.PositiveIntegerField(default=0) warning_count = models.PositiveIntegerField(default=0) error_count = models.PositiveIntegerField(default=0) # HINT: even if it's like a ENUM object, changing this at this moment means # changing a lot of things. This will remain a char field, for the moment type = models.CharField(max_length=6, blank=True, null=True) messages = ArrayField( JSONField(default=dict), default=list ) class Meta: unique_together = (("submission", "type"),) verbose_name_plural = "validation summaries" def __str__(self): return "Summary for %s, type: %s, all:%s, pass:%s" % ( self.submission, self.type, self.all_count, self.pass_count)
[docs] def get_unknown_count(self): """Returns number of samples or animals with unknown validation""" return self.all_count - self.validation_known_count
[docs] def reset_all_count(self): """Set all_count column according to Animal/Sample objects""" if self.type == "animal": self.all_count = Animal.objects.filter( submission=self.submission).count() elif self.type == "sample": self.all_count = Sample.objects.filter( submission=self.submission).count() else: raise Exception("Unknown type '%s'" % (self.type)) self.save()
[docs] def reset(self): """Sets all counts and other counters to 0""" self.pass_count = 0 self.warning_count = 0 self.error_count = 0 self.issues_count = 0 self.validation_known_count = 0 self.messages = list() self.save() # reset also all counts self.reset_all_count()