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:
David Moreau Simard 2018-09-03 19:34:33 -04:00
parent 6a1dd890f0
commit fa2ebaf911
No known key found for this signature in database
GPG Key ID: 33A07694CBB71ECC
8 changed files with 131 additions and 131 deletions

View File

@ -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'),
),
]

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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())

View File

@ -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())

View File

@ -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'),

View File

@ -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):