Model: rename reports to labels
labels will be a better word for representing how playbooks will be grouped together. Change-Id: Ibe78d65947061a3a3d43509ee8151a73b300fc82
This commit is contained in:
parent
6a1dd890f0
commit
fa2ebaf911
|
@ -1,4 +1,4 @@
|
|||
# Generated by Django 2.0.6 on 2018-06-21 03:30
|
||||
# Generated by Django 2.1.1 on 2018-09-03 23:33
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
@ -11,7 +11,7 @@ class Migration(migrations.Migration):
|
|||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Report',
|
||||
name='Label',
|
||||
fields=[
|
||||
('id', models.BigAutoField(editable=False, primary_key=True, serialize=False)),
|
||||
('created', models.DateTimeField(auto_now_add=True)),
|
||||
|
@ -20,12 +20,12 @@ class Migration(migrations.Migration):
|
|||
('description', models.BinaryField(max_length=4294967295)),
|
||||
],
|
||||
options={
|
||||
'db_table': 'reports',
|
||||
'db_table': 'labels',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='playbook',
|
||||
name='reports',
|
||||
field=models.ManyToManyField(to='api.Report'),
|
||||
name='labels',
|
||||
field=models.ManyToManyField(to='api.Label'),
|
||||
),
|
||||
]
|
|
@ -77,26 +77,26 @@ class File(Base):
|
|||
return '<File %s:%s>' % (self.id, self.path)
|
||||
|
||||
|
||||
class Report(Base):
|
||||
class Label(Base):
|
||||
"""
|
||||
A report is a generic container meant to group or correlate different
|
||||
A label is a generic container meant to group or correlate different
|
||||
playbooks. It could be a single playbook run. It could be a "group" of
|
||||
playbooks. It could be nested and have several groups of playbooks, etc.
|
||||
playbooks.
|
||||
It could represent phases or dynamic logical grouping and tagging of
|
||||
playbook runs.
|
||||
You could have a report named "failures" and make it so failed playbooks
|
||||
You could have a label named "failures" and make it so failed playbooks
|
||||
are added to this report, for example.
|
||||
The main purpose of this is to make the reports customizable by the user.
|
||||
The main purpose of this is to make the labels customizable by the user.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
db_table = 'reports'
|
||||
db_table = 'labels'
|
||||
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.BinaryField(max_length=(2 ** 32) - 1)
|
||||
|
||||
def __str__(self):
|
||||
return '<Report %s: %s>' % (self.id, self.name)
|
||||
return '<Label %s: %s>' % (self.id, self.name)
|
||||
|
||||
|
||||
class Playbook(Duration):
|
||||
|
@ -114,7 +114,7 @@ class Playbook(Duration):
|
|||
parameters = models.BinaryField(max_length=(2 ** 32) - 1)
|
||||
file = models.ForeignKey(File, on_delete=models.CASCADE, related_name='playbooks')
|
||||
files = models.ManyToManyField(File)
|
||||
reports = models.ManyToManyField(Report)
|
||||
labels = models.ManyToManyField(Label)
|
||||
|
||||
def __str__(self):
|
||||
return '<Playbook %s>' % self.id
|
||||
|
|
|
@ -138,14 +138,14 @@ class ResultSerializer(serializers.ModelSerializer):
|
|||
content = CompressedObjectField(default=zlib.compress(json.dumps({}).encode('utf8')))
|
||||
|
||||
|
||||
class ReportSerializer(serializers.ModelSerializer):
|
||||
class LabelSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = models.Report
|
||||
model = models.Label
|
||||
fields = '__all__'
|
||||
|
||||
description = CompressedTextField(
|
||||
default=zlib.compress(json.dumps("").encode('utf8')),
|
||||
help_text='A textual description of the report'
|
||||
help_text='A textual description of the label'
|
||||
)
|
||||
|
||||
|
||||
|
@ -157,23 +157,23 @@ class PlaybookSerializer(DurationSerializer):
|
|||
parameters = CompressedObjectField(default=zlib.compress(json.dumps({}).encode('utf8')))
|
||||
file = FileSerializer()
|
||||
files = FileSerializer(many=True, default=[])
|
||||
reports = ReportSerializer(many=True, default=[])
|
||||
labels = LabelSerializer(many=True, default=[])
|
||||
|
||||
def create(self, validated_data):
|
||||
# Create the file for the playbook
|
||||
file_dict = validated_data.pop('file')
|
||||
validated_data['file'] = models.File.objects.create(**file_dict)
|
||||
|
||||
# Create the playbook without the file and report references for now
|
||||
# Create the playbook without the file and label references for now
|
||||
files = validated_data.pop('files')
|
||||
reports = validated_data.pop('reports')
|
||||
labels = validated_data.pop('labels')
|
||||
playbook = models.Playbook.objects.create(**validated_data)
|
||||
|
||||
# Add the files and the reports in
|
||||
# Add the files and the labels in
|
||||
for file in files:
|
||||
playbook.files.add(models.File.objects.create(**file))
|
||||
for report in reports:
|
||||
playbook.reports.add(models.Report.objects.create(**report))
|
||||
for label in labels:
|
||||
playbook.labels.add(models.Label.objects.create(**label))
|
||||
|
||||
return playbook
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ RESULT_CONTENTS = {
|
|||
'msg': 'something happened'
|
||||
}]
|
||||
}
|
||||
REPORT_DESCRIPTION = 'report description'
|
||||
LABEL_DESCRIPTION = 'label description'
|
||||
TASK_TAGS = ['always', 'never']
|
||||
|
||||
|
||||
|
@ -57,12 +57,12 @@ class FileFactory(factory.DjangoModelFactory):
|
|||
content = factory.SubFactory(FileContentFactory)
|
||||
|
||||
|
||||
class ReportFactory(factory.DjangoModelFactory):
|
||||
class LabelFactory(factory.DjangoModelFactory):
|
||||
class Meta:
|
||||
model = models.Report
|
||||
model = models.Label
|
||||
|
||||
name = 'test report'
|
||||
description = utils.compressed_str(REPORT_DESCRIPTION)
|
||||
name = 'test label'
|
||||
description = utils.compressed_str(LABEL_DESCRIPTION)
|
||||
|
||||
|
||||
class PlaybookFactory(factory.DjangoModelFactory):
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
# Copyright (c) 2018 Red Hat, Inc.
|
||||
#
|
||||
# This file is part of ARA Records Ansible.
|
||||
#
|
||||
# ARA is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# ARA is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with ARA. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from rest_framework.test import APITestCase
|
||||
|
||||
from ara.api import models, serializers
|
||||
from ara.api.tests import factories
|
||||
from ara.api.tests import utils
|
||||
|
||||
|
||||
class LabelTestCase(APITestCase):
|
||||
def test_label_factory(self):
|
||||
label = factories.LabelFactory(name='factory')
|
||||
self.assertEqual(label.name, 'factory')
|
||||
|
||||
def test_label_serializer(self):
|
||||
serializer = serializers.LabelSerializer(data={
|
||||
'name': 'serializer',
|
||||
})
|
||||
serializer.is_valid()
|
||||
label = serializer.save()
|
||||
label.refresh_from_db()
|
||||
self.assertEqual(label.name, 'serializer')
|
||||
|
||||
def test_label_serializer_compress_description(self):
|
||||
serializer = serializers.LabelSerializer(data={
|
||||
'name': 'compress',
|
||||
'description': factories.LABEL_DESCRIPTION
|
||||
})
|
||||
serializer.is_valid()
|
||||
label = serializer.save()
|
||||
label.refresh_from_db()
|
||||
self.assertEqual(label.description, utils.compressed_str(factories.LABEL_DESCRIPTION))
|
||||
|
||||
def test_label_serializer_decompress_description(self):
|
||||
label = factories.LabelFactory(
|
||||
description=utils.compressed_str(factories.LABEL_DESCRIPTION)
|
||||
)
|
||||
serializer = serializers.LabelSerializer(instance=label)
|
||||
self.assertEqual(serializer.data['description'], factories.LABEL_DESCRIPTION)
|
||||
|
||||
def test_create_label(self):
|
||||
self.assertEqual(0, models.Label.objects.count())
|
||||
request = self.client.post('/api/v1/labels', {
|
||||
'name': 'compress',
|
||||
'description': factories.LABEL_DESCRIPTION
|
||||
})
|
||||
self.assertEqual(201, request.status_code)
|
||||
self.assertEqual(1, models.Label.objects.count())
|
||||
|
||||
def test_get_no_labels(self):
|
||||
request = self.client.get('/api/v1/labels')
|
||||
self.assertEqual(0, len(request.data['results']))
|
||||
|
||||
def test_get_labels(self):
|
||||
label = factories.LabelFactory()
|
||||
request = self.client.get('/api/v1/labels')
|
||||
self.assertEqual(1, len(request.data['results']))
|
||||
self.assertEqual(label.name, request.data['results'][0]['name'])
|
||||
|
||||
def test_get_label(self):
|
||||
label = factories.LabelFactory()
|
||||
request = self.client.get('/api/v1/labels/%s' % label.id)
|
||||
self.assertEqual(label.name, request.data['name'])
|
||||
|
||||
def test_partial_update_label(self):
|
||||
label = factories.LabelFactory()
|
||||
self.assertNotEqual('updated', label.name)
|
||||
request = self.client.patch('/api/v1/labels/%s' % label.id, {
|
||||
'name': 'updated'
|
||||
})
|
||||
self.assertEqual(200, request.status_code)
|
||||
label_updated = models.Label.objects.get(id=label.id)
|
||||
self.assertEqual('updated', label_updated.name)
|
||||
|
||||
def test_delete_label(self):
|
||||
label = factories.LabelFactory()
|
||||
self.assertEqual(1, models.Label.objects.all().count())
|
||||
request = self.client.delete('/api/v1/labels/%s' % label.id)
|
||||
self.assertEqual(204, request.status_code)
|
||||
self.assertEqual(0, models.Label.objects.all().count())
|
|
@ -1,95 +0,0 @@
|
|||
# Copyright (c) 2018 Red Hat, Inc.
|
||||
#
|
||||
# This file is part of ARA Records Ansible.
|
||||
#
|
||||
# ARA is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# ARA is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with ARA. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from rest_framework.test import APITestCase
|
||||
|
||||
from ara.api import models, serializers
|
||||
from ara.api.tests import factories
|
||||
from ara.api.tests import utils
|
||||
|
||||
|
||||
class ReportTestCase(APITestCase):
|
||||
def test_report_factory(self):
|
||||
report = factories.ReportFactory(name='factory')
|
||||
self.assertEqual(report.name, 'factory')
|
||||
|
||||
def test_report_serializer(self):
|
||||
serializer = serializers.ReportSerializer(data={
|
||||
'name': 'serializer',
|
||||
})
|
||||
serializer.is_valid()
|
||||
report = serializer.save()
|
||||
report.refresh_from_db()
|
||||
self.assertEqual(report.name, 'serializer')
|
||||
|
||||
def test_report_serializer_compress_description(self):
|
||||
serializer = serializers.ReportSerializer(data={
|
||||
'name': 'compress',
|
||||
'description': factories.REPORT_DESCRIPTION
|
||||
})
|
||||
serializer.is_valid()
|
||||
report = serializer.save()
|
||||
report.refresh_from_db()
|
||||
self.assertEqual(report.description, utils.compressed_str(factories.REPORT_DESCRIPTION))
|
||||
|
||||
def test_report_serializer_decompress_description(self):
|
||||
report = factories.ReportFactory(
|
||||
description=utils.compressed_str(factories.REPORT_DESCRIPTION)
|
||||
)
|
||||
serializer = serializers.ReportSerializer(instance=report)
|
||||
self.assertEqual(serializer.data['description'], factories.REPORT_DESCRIPTION)
|
||||
|
||||
def test_create_report(self):
|
||||
self.assertEqual(0, models.Report.objects.count())
|
||||
request = self.client.post('/api/v1/reports', {
|
||||
'name': 'compress',
|
||||
'description': factories.REPORT_DESCRIPTION
|
||||
})
|
||||
self.assertEqual(201, request.status_code)
|
||||
self.assertEqual(1, models.Report.objects.count())
|
||||
|
||||
def test_get_no_reports(self):
|
||||
request = self.client.get('/api/v1/reports')
|
||||
self.assertEqual(0, len(request.data['results']))
|
||||
|
||||
def test_get_reports(self):
|
||||
report = factories.ReportFactory()
|
||||
request = self.client.get('/api/v1/reports')
|
||||
self.assertEqual(1, len(request.data['results']))
|
||||
self.assertEqual(report.name, request.data['results'][0]['name'])
|
||||
|
||||
def test_get_report(self):
|
||||
report = factories.ReportFactory()
|
||||
request = self.client.get('/api/v1/reports/%s' % report.id)
|
||||
self.assertEqual(report.name, request.data['name'])
|
||||
|
||||
def test_partial_update_report(self):
|
||||
report = factories.ReportFactory()
|
||||
self.assertNotEqual('updated', report.name)
|
||||
request = self.client.patch('/api/v1/reports/%s' % report.id, {
|
||||
'name': 'updated'
|
||||
})
|
||||
self.assertEqual(200, request.status_code)
|
||||
report_updated = models.Report.objects.get(id=report.id)
|
||||
self.assertEqual('updated', report_updated.name)
|
||||
|
||||
def test_delete_report(self):
|
||||
report = factories.ReportFactory()
|
||||
self.assertEqual(1, models.Report.objects.all().count())
|
||||
request = self.client.delete('/api/v1/reports/%s' % report.id)
|
||||
self.assertEqual(204, request.status_code)
|
||||
self.assertEqual(0, models.Report.objects.all().count())
|
|
@ -21,8 +21,8 @@ from ara.api import views
|
|||
|
||||
urlpatterns = [
|
||||
url(r'^/$', views.api_root),
|
||||
url(r'^/reports$', views.ReportList.as_view(), name='report-list'),
|
||||
url(r'^/reports/(?P<pk>[0-9]+)$', views.ReportDetail.as_view(), name='report-detail'),
|
||||
url(r'^/labels$', views.LabelList.as_view(), name='label-list'),
|
||||
url(r'^/labels/(?P<pk>[0-9]+)$', views.LabelDetail.as_view(), name='label-detail'),
|
||||
url(r'^/playbooks$', views.PlaybookList.as_view(), name='playbook-list'),
|
||||
url(r'^/playbooks/(?P<pk>[0-9]+)$', views.PlaybookDetail.as_view(), name='playbook-detail'),
|
||||
url(r'^/playbooks/(?P<pk>[0-9]+)/files$', views.PlaybookFilesDetail.as_view(), name='playbook-file-detail'),
|
||||
|
|
|
@ -26,7 +26,7 @@ from rest_framework import generics, status
|
|||
@api_view(['GET'])
|
||||
def api_root(request, format=None):
|
||||
return Response({
|
||||
'reports': reverse('report-list', request=request, format=format),
|
||||
'labels': reverse('label-list', request=request, format=format),
|
||||
'playbooks': reverse('playbook-list', request=request, format=format),
|
||||
'plays': reverse('play-list', request=request, format=format),
|
||||
'tasks': reverse('task-list', request=request, format=format),
|
||||
|
@ -36,14 +36,14 @@ def api_root(request, format=None):
|
|||
})
|
||||
|
||||
|
||||
class ReportList(generics.ListCreateAPIView):
|
||||
queryset = models.Report.objects.all()
|
||||
serializer_class = serializers.ReportSerializer
|
||||
class LabelList(generics.ListCreateAPIView):
|
||||
queryset = models.Label.objects.all()
|
||||
serializer_class = serializers.LabelSerializer
|
||||
|
||||
|
||||
class ReportDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||
queryset = models.Report.objects.all()
|
||||
serializer_class = serializers.ReportSerializer
|
||||
class LabelDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||
queryset = models.Label.objects.all()
|
||||
serializer_class = serializers.LabelSerializer
|
||||
|
||||
|
||||
class PlaybookList(generics.ListCreateAPIView):
|
||||
|
|
Loading…
Reference in New Issue