trackers/models.py (171 lines of code) (raw):

# 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"),)