# -*- coding: utf-8 -*-
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from tcms.core.models.base import UrlMixin
[docs]
class Classification(models.Model, UrlMixin):
name = models.CharField(unique=True, max_length=64)
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
[docs]
class Product(models.Model, UrlMixin):
name = models.CharField(unique=True, max_length=255)
classification = models.ForeignKey(Classification, on_delete=models.CASCADE)
description = models.TextField(blank=True)
def __str__(self):
return self.name
[docs]
def save(
self, force_insert=False, force_update=False, using=None, update_fields=None
):
super().save(
force_insert=force_insert,
force_update=force_update,
using=using,
update_fields=update_fields,
)
self.category.get_or_create(name="--default--")
version, _ = self.version.get_or_create(value="unspecified")
version.build.get_or_create(name="unspecified")
class Meta:
ordering = ["name"]
[docs]
class Priority(models.Model, UrlMixin):
value = models.CharField(unique=True, max_length=64)
is_active = models.BooleanField(default=True)
class Meta:
ordering = ["value"]
verbose_name_plural = _("Priorities")
def __str__(self):
return self.value
[docs]
class Component(models.Model, UrlMixin):
name = models.CharField(max_length=64)
product = models.ForeignKey(
Product, related_name="component", on_delete=models.CASCADE
)
initial_owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name="initial_owner",
null=True,
on_delete=models.CASCADE,
)
initial_qa_contact = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name="initial_qa_contact",
blank=True,
null=True,
on_delete=models.CASCADE,
)
description = models.TextField()
class Meta:
ordering = ["name"]
unique_together = ("product", "name")
def __str__(self):
return self.name
[docs]
class Version(models.Model, UrlMixin):
value = models.CharField(max_length=192)
product = models.ForeignKey(
Product, related_name="version", on_delete=models.CASCADE
)
class Meta:
ordering = ["value"]
unique_together = ("product", "value")
def __str__(self):
return self.value
[docs]
def save(
self, force_insert=False, force_update=False, using=None, update_fields=None
):
super().save(
force_insert=force_insert,
force_update=force_update,
using=using,
update_fields=update_fields,
)
self.build.get_or_create(name="unspecified")
[docs]
class Build(models.Model):
name = models.CharField(max_length=255)
version = models.ForeignKey(Version, related_name="build", on_delete=models.CASCADE)
is_active = models.BooleanField(default=True)
class Meta:
ordering = ["name"]
unique_together = ("version", "name")
verbose_name = _("Build")
verbose_name_plural = _("Builds")
def __str__(self):
return self.name
[docs]
class Tag(models.Model, UrlMixin):
name = models.CharField(max_length=255)
class Meta:
ordering = ["name"]
verbose_name = _("Tag")
verbose_name_plural = _("Tags")
def __str__(self):
return self.name
[docs]
@classmethod
def get_or_create(cls, user, tag_name):
"""
Helper method used to check if @user is allowed
to automatically create new Tag in the database!
If they are not, e.g. in environment where users
are forced to use pre-existing tags created by admin,
then it will raise a DoesNotExist exception.
"""
if user.has_perm("management.add_tag"):
return cls.objects.get_or_create(name=tag_name)
return cls.objects.get(name=tag_name), False