Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added metrics_app/__init__.py
Empty file.
6 changes: 6 additions & 0 deletions metrics_app/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.contrib import admin

from metrics_app import models

# Register your models here.
admin.site.register(models.Metric)
6 changes: 6 additions & 0 deletions metrics_app/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class MetricsAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'metrics_app'
32 changes: 32 additions & 0 deletions metrics_app/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 4.2.17 on 2025-05-27 16:29

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Metric',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('modified', models.DateTimeField(auto_now=True, help_text='The date/time this resource was created.')),
('created', models.DateTimeField(auto_now_add=True, help_text='The date/time this resource was created.')),
('service', models.CharField(max_length=32)),
('payload', models.JSONField(default=dict)),
('created_by', models.ForeignKey(default=None, editable=False, help_text='The user who created this resource.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_created+', to=settings.AUTH_USER_MODEL)),
('modified_by', models.ForeignKey(default=None, editable=False, help_text='The user who last modified this resource.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_modified+', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
]
Empty file.
7 changes: 7 additions & 0 deletions metrics_app/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from ansible_base.lib.abstract_models import CommonModel
from django.db import models

# Create your models here.
class Metric(CommonModel):
service = models.CharField(max_length=32)
payload = models.JSONField(default=dict)
11 changes: 11 additions & 0 deletions metrics_app/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from rest_framework.serializers import ModelSerializer

from ansible_base.lib.serializers.common import NamedCommonModelSerializer
from ansible_base.rbac.api.related import RelatedAccessMixin
from metrics_app import models


class MetricsSerializer(RelatedAccessMixin, NamedCommonModelSerializer):
class Meta:
model = models.Metric
fields = '__all__'
3 changes: 3 additions & 0 deletions metrics_app/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
13 changes: 13 additions & 0 deletions metrics_app/tests/test_metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import pytest
from metrics_app.models import Metric

@pytest.mark.django_db
def test_create_metric_default_payload():
result = Metric.objects.create()
result.save()
assert result.payload == dict()

@pytest.mark.django_db
def test_modifying_metric_updates_modified_time():
# TODO: Implement this test
raise NotImplementedError()
27 changes: 27 additions & 0 deletions metrics_app/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import logging
from rest_framework.viewsets import ModelViewSet

from ansible_base.lib.utils.response import get_fully_qualified_url
from ansible_base.lib.utils.views.ansible_base import AnsibleBaseView
from ansible_base.rbac import permission_registry
from ansible_base.rbac.policies import visible_users
from metrics_app import models, serializers

logger = logging.getLogger(__name__)


class MetricsAppViewSet(ModelViewSet, AnsibleBaseView):
prefetch_related = ()
select_related = ()

def apply_optimizations(self, qs):
if self.prefetch_related:
qs = qs.prefetch_related(*self.prefetch_related)
if self.select_related:
qs = qs.select_related(*self.select_related)
return qs

class MetricsViewSet(MetricsAppViewSet):
serializer_class = serializers.MetricsSerializer
prefetch_related = ('created_by', 'modified_by', 'resource', 'resource__content_type')
queryset = models.Metric.objects.all()
1 change: 1 addition & 0 deletions test_app/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
'ansible_base.activitystream',
'ansible_base.help_text_check',
'ansible_base.feature_flags',
'metrics_app',
]

MIDDLEWARE = [
Expand Down
2 changes: 2 additions & 0 deletions test_app/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
from ansible_base.oauth2_provider import views as oauth2_provider_views
from ansible_base.rbac.api import views as rbac_views
from test_app import views
from metrics_app import views as metrics_app_views

router = AssociationResourceRouter()
# using an intentionally unpredictable basename
router.register(r'encrypted_models', views.EncryptionModelViewSet, basename='encryption_test_model')
router.register(r'metrics', metrics_app_views.MetricsViewSet, basename='metrics')

# intentionally not registering ResourceMigrationTestModel to test lack of URLs

Expand Down
2 changes: 2 additions & 0 deletions test_app/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from ansible_base.lib.dynamic_config.dynamic_urls import api_urls, api_version_urls, root_urls
from ansible_base.resource_registry.urls import urlpatterns as resource_api_urls
from test_app import views
from metrics_app import views as metrics_app_views
from test_app.router import router as test_app_router

urlpatterns = [
Expand All @@ -22,6 +23,7 @@
path('api/v1/', include(resource_api_urls)),
path('api/v1/', views.api_root),
path('api/v1/timeout_view/', views.timeout_view, name='test-timeout-view'),
path('api/v1/metrics/', metrics_app_views.MetricsViewSet.as_view({'get': 'list'}), name='metrics'),
path('login/', include('rest_framework.urls')),
path("__debug__/", include("debug_toolbar.urls")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Loading