From f361af2d15673be2a8c611c32315056cb3fe80e7 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 24 Mar 2020 14:53:20 +0100 Subject: [PATCH 1/5] misc: share query management template code (#20535) --- .../migrations/0006_auto_20200401_1025.py | 31 ++++++++++++++++ passerelle/apps/arcgis/models.py | 3 +- .../templates/arcgis/arcgis_detail.html | 25 ------------- .../migrations/0016_auto_20200406_1702.py | 36 +++++++++++++++++++ passerelle/apps/csvdatasource/models.py | 18 +++++++++- .../csvdatasource/csvdatasource_detail.html | 27 +------------- .../passerelle/manage/service_view.html | 25 +++++++++++++ 7 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 passerelle/apps/arcgis/migrations/0006_auto_20200401_1025.py create mode 100644 passerelle/apps/csvdatasource/migrations/0016_auto_20200406_1702.py diff --git a/passerelle/apps/arcgis/migrations/0006_auto_20200401_1025.py b/passerelle/apps/arcgis/migrations/0006_auto_20200401_1025.py new file mode 100644 index 00000000..181791b4 --- /dev/null +++ b/passerelle/apps/arcgis/migrations/0006_auto_20200401_1025.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-04-01 08:25 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('arcgis', '0005_auto_20200310_1517'), + ] + + operations = [ + migrations.AlterField( + model_name='arcgis', + name='client_certificate', + field=models.FileField(blank=True, null=True, upload_to='', verbose_name='TLS client certificate'), + ), + migrations.AlterField( + model_name='arcgis', + name='trusted_certificate_authorities', + field=models.FileField(blank=True, null=True, upload_to='', verbose_name='TLS trusted CAs'), + ), + migrations.AlterField( + model_name='query', + name='resource', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='queries', to='arcgis.ArcGIS', verbose_name='Resource'), + ), + ] diff --git a/passerelle/apps/arcgis/models.py b/passerelle/apps/arcgis/models.py index 053cbd57..01c64876 100644 --- a/passerelle/apps/arcgis/models.py +++ b/passerelle/apps/arcgis/models.py @@ -244,7 +244,7 @@ class ArcGIS(BaseResource, HTTPResource): def export_json(self): d = super(ArcGIS, self).export_json() - d['queries'] = [query.export_json() for query in self.query_set.all()] + d['queries'] = [query.export_json() for query in self.queries.all()] return d @classmethod @@ -290,6 +290,7 @@ def validate_where(format_string): class Query(models.Model): resource = models.ForeignKey( to=ArcGIS, + related_name='queries', verbose_name=_('Resource')) name = models.CharField( diff --git a/passerelle/apps/arcgis/templates/arcgis/arcgis_detail.html b/passerelle/apps/arcgis/templates/arcgis/arcgis_detail.html index c94121d3..18af32dc 100644 --- a/passerelle/apps/arcgis/templates/arcgis/arcgis_detail.html +++ b/passerelle/apps/arcgis/templates/arcgis/arcgis_detail.html @@ -14,28 +14,3 @@ {% endif %} {% endblock %} - -{% block extra-sections %} - {% if object|can_edit:request.user %} -
-

{% trans 'Queries' %}

-
- {% if object.query_set.exists %} - - {% else %} -

{% trans 'No query are defined.' %}

- {% endif %} -

- {% trans 'New Query' %} -

-
-
- {% endif %} -{% endblock %} diff --git a/passerelle/apps/csvdatasource/migrations/0016_auto_20200406_1702.py b/passerelle/apps/csvdatasource/migrations/0016_auto_20200406_1702.py new file mode 100644 index 00000000..b68f9b1e --- /dev/null +++ b/passerelle/apps/csvdatasource/migrations/0016_auto_20200406_1702.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-04-06 15:02 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('csvdatasource', '0015_query_slug_unicity'), + ] + + operations = [ + migrations.AlterField( + model_name='csvdatasource', + name='columns_keynames', + field=models.CharField(blank=True, default='id, text', help_text='ex: id,text,data1,data2', max_length=256, verbose_name='Column keynames'), + ), + migrations.AlterField( + model_name='csvdatasource', + name='csv_file', + field=models.FileField(help_text='Supported file formats: csv, ods, xls, xlsx', upload_to='csv', verbose_name='Spreadsheet file'), + ), + migrations.AlterField( + model_name='query', + name='resource', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='queries', to='csvdatasource.CsvDataSource'), + ), + migrations.AlterField( + model_name='query', + name='structure', + field=models.CharField(choices=[('array', 'Array'), ('dict', 'Dictionary'), ('keyed-distinct', 'Keyed Dictionary'), ('tuples', 'Tuples'), ('onerow', 'Single Row'), ('one', 'Single Value')], default='dict', help_text='Data structure used for the response', max_length=20, verbose_name='Structure'), + ), + ] diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py index a8d85467..6254735d 100644 --- a/passerelle/apps/csvdatasource/models.py +++ b/passerelle/apps/csvdatasource/models.py @@ -33,6 +33,7 @@ from django.utils.timezone import datetime, make_aware from django.conf import settings from django.db import models, transaction from django.core.exceptions import ValidationError +from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource @@ -61,7 +62,7 @@ def normalize(value): class Query(models.Model): - resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE) + resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE, related_name='queries') slug = models.SlugField(_('Name (slug)')) label = models.CharField(_('Label'), max_length=100) description = models.TextField(_('Description'), blank=True) @@ -119,6 +120,18 @@ class Query(models.Model): def import_json(cls, d): return cls(**d) + @property + def name(self): + return self.slug + + def delete_url(self): + return reverse('csv-delete-query', + kwargs={'connector_slug': self.resource.slug, 'pk': self.pk}) + + def edit_url(self): + return reverse('csv-edit-query', + kwargs={'connector_slug': self.resource.slug, 'pk': self.pk}) + class CsvDataSource(BaseResource): csv_file = models.FileField( @@ -470,6 +483,9 @@ class CsvDataSource(BaseResource): Query.objects.bulk_create(new) return instance + def create_query_url(self): + return reverse('csv-new-query', kwargs={'connector_slug': self.slug}) + class TableRow(models.Model): resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE) diff --git a/passerelle/apps/csvdatasource/templates/csvdatasource/csvdatasource_detail.html b/passerelle/apps/csvdatasource/templates/csvdatasource/csvdatasource_detail.html index e4660df0..8c348551 100644 --- a/passerelle/apps/csvdatasource/templates/csvdatasource/csvdatasource_detail.html +++ b/passerelle/apps/csvdatasource/templates/csvdatasource/csvdatasource_detail.html @@ -23,7 +23,7 @@ {% trans "Returning lines containing 'abc' in 'text' column (case insensitive):" %} {{ csvdatasource_data_url }}?q=abc -{% for query in object.query_set.all %} +{% for query in object.queries.all %}
  • {{ query.label }}: {% url 'generic-endpoint' connector='csvdatasource' slug=object.slug endpoint='query' rest=query.slug %}/ {% if query.description %}— {{ query.description }}{% endif %} @@ -31,28 +31,3 @@ {% endfor %} {% endblock %} - -{% block extra-sections %} - -{% if object|can_edit:request.user %} -
    -

    {% trans 'Queries' %}

    -
    -{% if object.query_set.count %} - -{% else %} -

    {% trans 'No query are defined.' %}

    -{% endif %} -

    -{% trans 'New Query' %} -

    -
    -
    -{% endif %} -{% endblock %} diff --git a/passerelle/templates/passerelle/manage/service_view.html b/passerelle/templates/passerelle/manage/service_view.html index caba98d3..136f2888 100644 --- a/passerelle/templates/passerelle/manage/service_view.html +++ b/passerelle/templates/passerelle/manage/service_view.html @@ -73,6 +73,31 @@ +{% block custom-queries %} + {% if object|can_edit:request.user and object.queries is not None %} +
    +

    {% trans 'Queries' %}

    +
    + {% if object.queries.exists %} + + {% else %} +

    {% trans 'No query are defined.' %}

    + {% endif %} +

    + {% trans 'New Query' %} +

    +
    +
    + {% endif %} +{% endblock %} + {% block extra-sections %} {% endblock %} -- 2.20.1