Projet

Général

Profil

0001-misc-share-query-management-template-code-20535.patch

Valentin Deniaud, 06 avril 2020 18:28

Télécharger (10,9 ko)

Voir les différences:

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
passerelle/apps/arcgis/migrations/0006_auto_20200401_1025.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.18 on 2020-04-01 08:25
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6
import django.db.models.deletion
7

  
8

  
9
class Migration(migrations.Migration):
10

  
11
    dependencies = [
12
        ('arcgis', '0005_auto_20200310_1517'),
13
    ]
14

  
15
    operations = [
16
        migrations.AlterField(
17
            model_name='arcgis',
18
            name='client_certificate',
19
            field=models.FileField(blank=True, null=True, upload_to='', verbose_name='TLS client certificate'),
20
        ),
21
        migrations.AlterField(
22
            model_name='arcgis',
23
            name='trusted_certificate_authorities',
24
            field=models.FileField(blank=True, null=True, upload_to='', verbose_name='TLS trusted CAs'),
25
        ),
26
        migrations.AlterField(
27
            model_name='query',
28
            name='resource',
29
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='queries', to='arcgis.ArcGIS', verbose_name='Resource'),
30
        ),
31
    ]
passerelle/apps/arcgis/models.py
244 244

  
245 245
    def export_json(self):
246 246
        d = super(ArcGIS, self).export_json()
247
        d['queries'] = [query.export_json() for query in self.query_set.all()]
247
        d['queries'] = [query.export_json() for query in self.queries.all()]
248 248
        return d
249 249

  
250 250
    @classmethod
......
290 290
class Query(models.Model):
291 291
    resource = models.ForeignKey(
292 292
        to=ArcGIS,
293
        related_name='queries',
293 294
        verbose_name=_('Resource'))
294 295

  
295 296
    name = models.CharField(
passerelle/apps/arcgis/templates/arcgis/arcgis_detail.html
14 14
</ul>
15 15
{% endif %}
16 16
{% endblock %}
17

  
18
{% block extra-sections %}
19
  {% if object|can_edit:request.user %}
20
    <div id="queries" class="section">
21
      <h3>{% trans 'Queries' %}</h3>
22
      <div>
23
        {% if object.query_set.exists %}
24
          <ul class="objects-list single-links">
25
            {% for query in object.query_set.all %}
26
              <li>
27
               <a href="{{ query.edit_url }}">{{ query.name }}</a>
28
               <a rel="popup" class="delete" href="{{ query.delete_url }}">{% trans "delete query" %}</a>
29
              </li>
30
            {% endfor %}
31
          </ul>
32
        {% else %}
33
          <p>{% trans 'No query are defined.' %}</p>
34
        {% endif %}
35
        <p>
36
          <a class="icon-plus button" href="{{ object.create_query_url }}">{% trans 'New Query' %}</a>
37
        </p>
38
      </div>
39
    </div>
40
  {% endif %}
41
{% endblock %}
passerelle/apps/csvdatasource/migrations/0016_auto_20200406_1702.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.18 on 2020-04-06 15:02
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6
import django.db.models.deletion
7

  
8

  
9
class Migration(migrations.Migration):
10

  
11
    dependencies = [
12
        ('csvdatasource', '0015_query_slug_unicity'),
13
    ]
14

  
15
    operations = [
16
        migrations.AlterField(
17
            model_name='csvdatasource',
18
            name='columns_keynames',
19
            field=models.CharField(blank=True, default='id, text', help_text='ex: id,text,data1,data2', max_length=256, verbose_name='Column keynames'),
20
        ),
21
        migrations.AlterField(
22
            model_name='csvdatasource',
23
            name='csv_file',
24
            field=models.FileField(help_text='Supported file formats: csv, ods, xls, xlsx', upload_to='csv', verbose_name='Spreadsheet file'),
25
        ),
26
        migrations.AlterField(
27
            model_name='query',
28
            name='resource',
29
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='queries', to='csvdatasource.CsvDataSource'),
30
        ),
31
        migrations.AlterField(
32
            model_name='query',
33
            name='structure',
34
            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'),
35
        ),
36
    ]
passerelle/apps/csvdatasource/models.py
33 33
from django.conf import settings
34 34
from django.db import models, transaction
35 35
from django.core.exceptions import ValidationError
36
from django.urls import reverse
36 37
from django.utils.translation import ugettext_lazy as _
37 38

  
38 39
from passerelle.base.models import BaseResource
......
61 62

  
62 63

  
63 64
class Query(models.Model):
64
    resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE)
65
    resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE, related_name='queries')
65 66
    slug = models.SlugField(_('Name (slug)'))
66 67
    label = models.CharField(_('Label'), max_length=100)
67 68
    description = models.TextField(_('Description'), blank=True)
......
119 120
    def import_json(cls, d):
120 121
        return cls(**d)
121 122

  
123
    @property
124
    def name(self):
125
        return self.slug
126

  
127
    def delete_url(self):
128
        return reverse('csv-delete-query',
129
                       kwargs={'connector_slug': self.resource.slug, 'pk': self.pk})
130

  
131
    def edit_url(self):
132
        return reverse('csv-edit-query',
133
                       kwargs={'connector_slug': self.resource.slug, 'pk': self.pk})
134

  
122 135

  
123 136
class CsvDataSource(BaseResource):
124 137
    csv_file = models.FileField(
......
470 483
        Query.objects.bulk_create(new)
471 484
        return instance
472 485

  
486
    def create_query_url(self):
487
        return reverse('csv-new-query', kwargs={'connector_slug': self.slug})
488

  
473 489

  
474 490
class TableRow(models.Model):
475 491
    resource = models.ForeignKey('CsvDataSource', on_delete=models.CASCADE)
passerelle/apps/csvdatasource/templates/csvdatasource/csvdatasource_detail.html
23 23
  <span class="description">{% trans "Returning lines containing 'abc' in 'text' column (case insensitive):" %}</span>
24 24
  <a class="example-url" href="{{ csvdatasource_data_url }}?q=abc">{{ csvdatasource_data_url }}?q=abc</a>
25 25
</li>
26
{% for query in object.query_set.all %}
26
{% for query in object.queries.all %}
27 27
<li class="get-method"><span class="description">{{ query.label }}:</span>
28 28
  <a class="example-url" href="{% url 'generic-endpoint' connector='csvdatasource' slug=object.slug endpoint='query' rest=query.slug %}/">{% url 'generic-endpoint' connector='csvdatasource' slug=object.slug endpoint='query' rest=query.slug %}/</a>
29 29
   {% if query.description %}&mdash; {{ query.description }}{% endif %}
......
31 31
{% endfor %}
32 32
</ul>
33 33
{% endblock %}
34

  
35
{% block extra-sections %}
36

  
37
{% if object|can_edit:request.user %}
38
<div id="queries" class="section">
39
<h3>{% trans 'Queries' %}</h3>
40
<div>
41
{% if object.query_set.count %}
42
<ul class="objects-list single-links">
43
{% for query in object.query_set.all %}
44
  <li><a href="{% url 'csv-edit-query' connector_slug=object.slug pk=query.id %}">{{ query.slug }}</a>
45
      <a rel="popup" class="delete" href="{% url 'csv-delete-query' connector_slug=object.slug pk=query.id %}">{% trans "delete query" %}</a>
46
  </li>
47
{% endfor %}
48
</ul>
49
{% else %}
50
<p>{% trans 'No query are defined.' %}</p>
51
{% endif %}
52
<p>
53
<a class="icon-plus button" href="{% url 'csv-new-query' connector_slug=object.slug %}">{% trans 'New Query' %}</a>
54
</p>
55
</div>
56
</div>
57
{% endif %}
58
{% endblock %}
passerelle/templates/passerelle/manage/service_view.html
73 73
  </div>
74 74
</div>
75 75

  
76
{% block custom-queries %}
77
  {% if object|can_edit:request.user and object.queries is not None %}
78
    <div id="queries" class="section">
79
      <h3>{% trans 'Queries' %}</h3>
80
      <div>
81
        {% if object.queries.exists %}
82
          <ul class="objects-list single-links">
83
            {% for query in object.queries.all %}
84
              <li>
85
               <a href="{{ query.edit_url }}">{{ query.name }}</a>
86
               <a rel="popup" class="delete" href="{{ query.delete_url }}">{% trans "delete query" %}</a>
87
              </li>
88
            {% endfor %}
89
          </ul>
90
        {% else %}
91
          <p>{% trans 'No query are defined.' %}</p>
92
        {% endif %}
93
        <p>
94
          <a class="icon-plus button" href="{{ object.create_query_url }}">{% trans 'New Query' %}</a>
95
        </p>
96
      </div>
97
    </div>
98
  {% endif %}
99
{% endblock %}
100

  
76 101
{% block extra-sections %}
77 102
{% endblock %}
78 103

  
79
-