blob: 04449760f92445bd57ec047e8b8d68f046a52d03 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
"""Main DB models for Apache Bloodhound."""
import logging
from django.db import models
logger = logging.getLogger(__name__)
class Product(models.Model):
"""Product table."""
prefix = models.TextField(primary_key=True)
name = models.TextField()
description = models.TextField(blank=True, null=True)
owner = models.TextField(blank=True, null=True)
class Meta:
db_table = "bloodhound_product"
class ProductConfig(models.Model):
"""Possibly legacy table - keeping for now."""
product = models.ForeignKey(Product, on_delete=models.CASCADE)
section = models.TextField()
option = models.TextField()
value = models.TextField(blank=True, null=True)
class Meta:
db_table = "bloodhound_productconfig"
unique_together = (("product", "section", "option"),)
class ProductResourceMap(models.Model):
"""Possibly legacy model - keeping for now."""
product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
resource_type = models.TextField(blank=True, null=True)
resource_id = models.TextField(blank=True, null=True)
class Meta:
db_table = "bloodhound_productresourcemap"
class Component(models.Model):
"""Component table."""
name = models.TextField(primary_key=True)
owner = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
product = models.ForeignKey(
Product,
db_column="product",
on_delete=models.PROTECT,
)
class Meta:
db_table = "component"
unique_together = (("name", "product"),)
class Enum(models.Model):
"""Enum table."""
type = models.TextField(primary_key=True)
name = models.TextField()
value = models.TextField(blank=True, null=True)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
class Meta:
db_table = "enum"
unique_together = (("type", "name", "product"),)
class Milestone(models.Model):
"""Milestone table."""
name = models.TextField(primary_key=True)
due = models.BigIntegerField(blank=True, null=True)
completed = models.BigIntegerField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
product = models.ForeignKey(
Product,
db_column="product",
on_delete=models.PROTECT,
)
class Meta:
db_table = "milestone"
unique_together = (("name", "product"),)
class Version(models.Model):
"""Version table."""
name = models.TextField(primary_key=True)
time = models.BigIntegerField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
product = models.ForeignKey(
Product,
db_column="product",
on_delete=models.PROTECT,
)
class Meta:
db_table = "version"
unique_together = (("name", "product"),)
class Ticket(models.Model):
"""Ticket table."""
uid = models.AutoField(primary_key=True)
type = models.ForeignKey(
Enum,
on_delete=models.PROTECT,
db_column="type",
related_name="%(app_label)s_%(class)s_type_related",
blank=True,
null=True,
)
time = models.BigIntegerField(blank=True, null=True)
changetime = models.BigIntegerField(blank=True, null=True)
component = models.ForeignKey(
Component,
on_delete=models.PROTECT,
db_column="component",
blank=True,
null=True,
)
severity = models.TextField(blank=True, null=True)
priority = models.TextField(blank=True, null=True)
owner = models.TextField(blank=True, null=True)
reporter = models.TextField(blank=True, null=True)
cc = models.TextField(blank=True, null=True)
version = models.ForeignKey(
Version,
on_delete=models.PROTECT,
db_column="version",
blank=True,
null=True,
)
milestone = models.ForeignKey(
Milestone,
on_delete=models.PROTECT,
db_column="milestone",
blank=True,
null=True,
)
status = models.TextField(blank=True, null=True)
resolution = models.ForeignKey(
Enum,
on_delete=models.PROTECT,
db_column="resolution",
related_name="%(app_label)s_%(class)s_resolution_related",
blank=True,
null=True,
)
summary = models.TextField()
description = models.TextField(blank=True, null=True)
keywords = models.TextField(blank=True, null=True)
product = models.ForeignKey(Product, on_delete=models.PROTECT, db_column="product")
product_ticket_id = models.IntegerField(db_column="id", editable=False)
class Meta:
db_table = "ticket"
unique_together = (("product", "product_ticket_id"),)
def save(self, *args, **kwargs):
if self._state.adding:
# FIXME: deleting the latest tickets will allow reuse
# Consider:
# disallowing deletion
# switching to uuids
# recording last used on product model
product_tickets = Ticket.objects.filter(product=self.product)
if product_tickets.exists():
newest = product_tickets.latest("product_ticket_id")
new_id = 1 + newest.product_ticket_id
else:
new_id = 1
self.product_ticket_id = new_id
super().save(*args, **kwargs)
class TicketChange(models.Model):
"""TicketChange table."""
ticket = models.ForeignKey(
Ticket,
on_delete=models.PROTECT,
db_column="ticket",
related_name="%(app_label)s_%(class)s_ticket_related",
)
time = models.BigIntegerField(blank=True, null=True)
author = models.TextField(blank=True, null=True)
field = models.TextField()
oldvalue = models.TextField(blank=True, null=True)
newvalue = models.TextField(blank=True, null=True)
product = models.ForeignKey(
Product,
db_column="product",
on_delete=models.PROTECT,
)
class Meta:
db_table = "ticket_change"
unique_together = (("ticket", "time", "field", "product"),)
class TicketCustom(models.Model):
"""TicketCustom table."""
ticket = models.ForeignKey(Ticket, on_delete=models.PROTECT)
name = models.TextField()
value = models.TextField(blank=True, null=True)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
class Meta:
db_table = "ticket_custom"
unique_together = (("ticket", "name", "product"),)
class Report(models.Model):
"""Report table - potentially legacy."""
author = models.TextField(blank=True, null=True)
title = models.TextField(blank=True, null=True)
query = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
class Meta:
db_table = "report"
unique_together = (("id", "product"),)