From 9dddfbd85c05dcdf2d3309da44a6ac3da42d66dd Mon Sep 17 00:00:00 2001 From: Sebastien Corbin Date: Fri, 28 Oct 2022 10:45:29 +0200 Subject: [PATCH] #594 Silk fails on constraint check queries --- .../0003_blind_unique_name_if_provided.py | 17 +++++++++++++++++ project/example_app/models.py | 9 +++++++++ .../templates/example_app/blind_form.html | 11 +++++++++++ project/example_app/urls.py | 1 + project/example_app/views.py | 8 ++++++++ project/tests/test_db.py | 9 +++++++-- silk/sql.py | 2 +- 7 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 project/example_app/migrations/0003_blind_unique_name_if_provided.py create mode 100644 project/example_app/templates/example_app/blind_form.html diff --git a/project/example_app/migrations/0003_blind_unique_name_if_provided.py b/project/example_app/migrations/0003_blind_unique_name_if_provided.py new file mode 100644 index 00000000..45b7c36d --- /dev/null +++ b/project/example_app/migrations/0003_blind_unique_name_if_provided.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.16 on 2022-10-28 08:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('example_app', '0002_alter_blind_photo'), + ] + + operations = [ + migrations.AddConstraint( + model_name='blind', + constraint=models.UniqueConstraint(condition=models.Q(('name', ''), _negated=True), fields=('name',), name='unique_name_if_provided'), + ), + ] diff --git a/project/example_app/models.py b/project/example_app/models.py index 7b1d911a..4cabe808 100644 --- a/project/example_app/models.py +++ b/project/example_app/models.py @@ -17,3 +17,12 @@ class Blind(Product): def __str__(self): return self.name + + class Meta: + constraints = [ + models.UniqueConstraint( + fields=["name"], + condition=~models.Q(name=""), + name="unique_name_if_provided", + ), + ] diff --git a/project/example_app/templates/example_app/blind_form.html b/project/example_app/templates/example_app/blind_form.html new file mode 100644 index 00000000..16c370cd --- /dev/null +++ b/project/example_app/templates/example_app/blind_form.html @@ -0,0 +1,11 @@ + + +

Example App

+

Use this app for testing and playing around with Silk. Displays a Blind creation form.

+
+ {% csrf_token %} + {{ form.as_p }} + +
+ + diff --git a/project/example_app/urls.py b/project/example_app/urls.py index 85886913..42d28db2 100644 --- a/project/example_app/urls.py +++ b/project/example_app/urls.py @@ -5,4 +5,5 @@ app_name = 'example_app' urlpatterns = [ path(route='', view=views.index, name='index'), + path(route='create', view=views.ExampleCreateView.as_view(), name='create'), ] diff --git a/project/example_app/views.py b/project/example_app/views.py index 0e29b8ce..03497a09 100644 --- a/project/example_app/views.py +++ b/project/example_app/views.py @@ -2,6 +2,8 @@ # Create your views here. from django.shortcuts import render +from django.urls import reverse_lazy +from django.views.generic import CreateView from example_app import models from silk.profiling.profiler import silk_profile @@ -15,3 +17,9 @@ def do_something_long(): with silk_profile(name='Why do this take so long?'): do_something_long() return render(request, 'example_app/index.html', {'blinds': models.Blind.objects.all()}) + + +class ExampleCreateView(CreateView): + model = models.Blind + fields = ['name'] + success_url = reverse_lazy('example_app:index') diff --git a/project/tests/test_db.py b/project/tests/test_db.py index 0a0e82e7..3157725d 100644 --- a/project/tests/test_db.py +++ b/project/tests/test_db.py @@ -21,15 +21,20 @@ def setUpClass(cls): SilkyConfig().SILKY_META = False def test_profile_request_to_db(self): - client = Client() DataCollector().configure(Request(reverse('example_app:index'))) with silk_profile(name='test_profile'): - resp = client.get(reverse('example_app:index')) + resp = self.client.get(reverse('example_app:index')) DataCollector().profiles.values() assert len(resp.context['blinds']) == 5 + def test_profile_request_to_db_with_constraints(self): + DataCollector().configure(Request(reverse('example_app:create'))) + + resp = self.client.post(reverse('example_app:create'), {'name': 'Foo'}) + self.assertEqual(resp.status_code, 302) + class TestAnalyzeQueries(TestCase): diff --git a/silk/sql.py b/silk/sql.py index 197a999d..27c05198 100644 --- a/silk/sql.py +++ b/silk/sql.py @@ -91,7 +91,7 @@ def execute_sql(self, *args, **kwargs): request = DataCollector().request if request: query_dict['request'] = request - if self.query.model.__module__ != 'silk.models': + if getattr(self.query.model, '__module__', '') != 'silk.models': query_dict['analysis'] = _explain_query(self.connection, q, params) DataCollector().register_query(query_dict) else: