This is an automated email from the ASF dual-hosted git repository. gjm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/bloodhound-core.git
commit 31087bbed0e4fd6d598b07c6d9519168b5cdaa48 Author: Gary Martin <[email protected]> AuthorDate: Mon Mar 14 13:09:16 2022 +0000 Beginning of integrating ticketchange model --- .gitignore | 1 + trackers/api/serializers.py | 36 +++++++++++++++++++++++++++++++++++- trackers/api/urls.py | 1 + trackers/api/views.py | 10 ++++++++++ trackers/models.py | 15 ++++++++++++--- 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e0db8ba..fd75ab4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ db.sqlite3 tags *.log +.hypothesis/ diff --git a/trackers/api/serializers.py b/trackers/api/serializers.py index c8e58cd..703c7b0 100644 --- a/trackers/api/serializers.py +++ b/trackers/api/serializers.py @@ -2,7 +2,14 @@ from django.contrib.auth.models import User, Group from django.shortcuts import get_object_or_404 from rest_framework import serializers from rest_framework.reverse import reverse -from ..models import Component, Milestone, Product, Ticket, Version +from ..models import ( + Component, + Milestone, + Product, + Ticket, + TicketChange, + Version, +) from functools import partial @@ -12,6 +19,8 @@ def get_self_url(obj, context, obj_type): } if obj_type == 'ticket': keywords['product_ticket_id'] = obj.product_ticket_id + elif obj_type == 'ticketchange': + keywords['time'] = obj.time else: keywords['name'] = obj.name @@ -55,6 +64,17 @@ class GroupSerializer(serializers.HyperlinkedModelSerializer): fields = ('url', 'name') +class TicketChangeSerializer(ProductChildSerializer): + url = serializers.SerializerMethodField() + + class Meta: + model = TicketChange + fields = ('url', 'time', 'author', 'field', 'oldvalue', 'newvalue') + + def get_url(self, obj): + return get_self_url(obj, self.context, 'ticketchange') + + class TicketSerializer(ProductChildSerializer): url = serializers.SerializerMethodField() @@ -66,6 +86,15 @@ class TicketSerializer(ProductChildSerializer): 'product_ticket_id', 'summary', 'description', + 'time', + 'changetime', + 'reporter', + 'owner', + 'cc', + 'status', + 'severity', + 'priority', + 'keywords', ) extra_kwargs = { 'product_ticket_id': {'required': False}, @@ -152,6 +181,10 @@ class ProductSerializer(serializers.HyperlinkedModelSerializer): view_name='product-versions-list', ) + ticketchanges_url = ProductHyperlinkedModelSerializer( + view_name='product-ticketchanges-list', + ) + class Meta: model = Product fields = ( @@ -164,4 +197,5 @@ class ProductSerializer(serializers.HyperlinkedModelSerializer): 'components_url', 'milestones_url', 'versions_url', + 'ticketchanges_url', ) diff --git a/trackers/api/urls.py b/trackers/api/urls.py index 403ea05..6b5eaa4 100644 --- a/trackers/api/urls.py +++ b/trackers/api/urls.py @@ -31,6 +31,7 @@ products_router.register('tickets', views.TicketViewSet, basename='product-ticke products_router.register('components', views.ComponentViewSet, basename='product-components') products_router.register('milestones', views.MilestoneViewSet, basename='product-milestones') products_router.register('versions', views.VersionViewSet, basename='product-versions') +products_router.register('ticketchanges', views.TicketChangeViewSet, basename='product-ticketchanges') urlpatterns = [ path('', include(router.urls)), diff --git a/trackers/api/views.py b/trackers/api/views.py index 91ceabd..d7f31c9 100644 --- a/trackers/api/views.py +++ b/trackers/api/views.py @@ -49,6 +49,16 @@ class ProductViewSet(viewsets.ModelViewSet): lookup_field = 'prefix' +class TicketChangeViewSet(viewsets.ModelViewSet): + queryset = models.TicketChange.objects.all() + serializer_class = serializers.TicketChangeSerializer + lookup_field = 'time' + + def get_queryset(self, *args, **kwargs): + prefix = self.kwargs['product_prefix'] + return models.TicketChange.objects.filter(product=prefix) + + class TicketViewSet(viewsets.ModelViewSet): queryset = models.Ticket.objects.all() serializer_class = serializers.TicketSerializer diff --git a/trackers/models.py b/trackers/models.py index 5c6592d..373235a 100644 --- a/trackers/models.py +++ b/trackers/models.py @@ -188,13 +188,22 @@ class Ticket(models.Model): class TicketChange(models.Model): - ticket = models.ForeignKey(Ticket, on_delete=models.PROTECT) - time = models.BigIntegerField() + 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, on_delete=models.PROTECT) + product = models.ForeignKey( + Product, + db_column="product", + on_delete=models.PROTECT, + ) class Meta: db_table = 'ticket_change'
