sector: add a sector_name column in CSV, for readability (#57021)
This commit is contained in:
parent
f0b5d2f2ac
commit
1d2d3e485a
|
@ -51,7 +51,7 @@ class Migration(migrations.Migration):
|
|||
'titles_in_first_line',
|
||||
models.BooleanField(
|
||||
default=True,
|
||||
help_text='If not, column titles are: street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name, …',
|
||||
help_text='If not, column titles are: street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name, …',
|
||||
verbose_name='First line defines column titles',
|
||||
),
|
||||
),
|
||||
|
@ -87,11 +87,13 @@ class Migration(migrations.Migration):
|
|||
),
|
||||
(
|
||||
'min_housenumber',
|
||||
models.PositiveIntegerField(default=0, verbose_name='Minimal house number'),
|
||||
models.PositiveIntegerField(default=0, verbose_name='Minimum house number (included)'),
|
||||
),
|
||||
(
|
||||
'max_housenumber',
|
||||
models.PositiveIntegerField(default=999999, verbose_name='Maximal house number'),
|
||||
models.PositiveIntegerField(
|
||||
default=999999, verbose_name='Maximum house number (included)'
|
||||
),
|
||||
),
|
||||
(
|
||||
'sector',
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 2.2.19 on 2021-10-15 11:38
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('sector', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sectorization',
|
||||
name='street_name',
|
||||
field=models.CharField(blank=True, max_length=150, verbose_name='Street Name'),
|
||||
),
|
||||
]
|
|
@ -43,7 +43,15 @@ PARITY_CHOICES = (
|
|||
(PARITY_EVEN, _('even')),
|
||||
)
|
||||
|
||||
CSV_TITLES = ['street_id', 'parity', 'min_housenumber', 'max_housenumber', 'sector_id', 'sector_name']
|
||||
CSV_TITLES = [
|
||||
'street_id',
|
||||
'street_name',
|
||||
'parity',
|
||||
'min_housenumber',
|
||||
'max_housenumber',
|
||||
'sector_id',
|
||||
'sector_name',
|
||||
]
|
||||
|
||||
MAX_HOUSENUMBER = 999_999
|
||||
|
||||
|
@ -194,6 +202,7 @@ class SectorResource(BaseResource):
|
|||
parity=parity,
|
||||
min_housenumber=min_housenumber,
|
||||
max_housenumber=max_housenumber,
|
||||
street_name=row['street_name'],
|
||||
)
|
||||
|
||||
@endpoint(
|
||||
|
@ -267,6 +276,7 @@ class SectorResource(BaseResource):
|
|||
writer.writerow(
|
||||
[
|
||||
sectorization.street_id,
|
||||
sectorization.street_name,
|
||||
parity.get(sectorization.parity, mix),
|
||||
sectorization.min_housenumber if (limits or sectorization.min_housenumber) else '',
|
||||
sectorization.max_housenumber
|
||||
|
@ -351,6 +361,7 @@ class Sector(models.Model):
|
|||
class Sectorization(models.Model):
|
||||
sector = models.ForeignKey(Sector, on_delete=models.CASCADE, verbose_name=_('Sector'))
|
||||
street_id = models.CharField(max_length=64, verbose_name=_('Street Identifier'))
|
||||
street_name = models.CharField(max_length=150, verbose_name=_('Street Name'), blank=True)
|
||||
parity = models.SmallIntegerField(
|
||||
choices=PARITY_CHOICES, default=PARITY_ALL, verbose_name=_('Parity of numbers')
|
||||
)
|
||||
|
@ -365,8 +376,12 @@ class Sectorization(models.Model):
|
|||
ordering = ['street_id', 'min_housenumber', 'parity']
|
||||
|
||||
def __str__(self):
|
||||
if self.street_name:
|
||||
street = '%s (%s)' % (self.street_id, self.street_name)
|
||||
else:
|
||||
street = self.street_id
|
||||
return '%s, parity:%s, min:%s, max:%s → %s' % (
|
||||
self.street_id,
|
||||
street,
|
||||
dict(PARITY_CHOICES).get(self.parity),
|
||||
self.min_housenumber,
|
||||
self.max_housenumber,
|
||||
|
|
|
@ -206,11 +206,11 @@ BAN = {
|
|||
"version": "draft",
|
||||
}
|
||||
|
||||
CSV = """street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,P,,,gs-moulin,Groupe Scolaire Moulin
|
||||
75114_1912,I,0,167,gs-zola,Groupe Scolaire Zola
|
||||
75114_1912,I,168,999999,ecole-hugo,École Hugo
|
||||
75114_1913,,,,ecole-pascal,École Pascal
|
||||
CSV = """street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,rue du Château,P,,,gs-moulin,Groupe Scolaire Moulin
|
||||
75114_1912,rue du Château,I,0,167,gs-zola,Groupe Scolaire Zola
|
||||
75114_1912,rue du Château,I,168,999999,ecole-hugo,École Hugo
|
||||
75114_1913,rue 1913,,,,ecole-pascal,École Pascal
|
||||
"""
|
||||
|
||||
|
||||
|
|
|
@ -47,8 +47,8 @@ data = """121;69981;DELANOUE;Eliot;H
|
|||
|
||||
data_bom = force_text(data, 'utf-8').encode('utf-8-sig')
|
||||
|
||||
SECTOR_CSV = """street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
38 75114_1912,P,,, gs-moulin, Groupe Scolaire Moulin"""
|
||||
SECTOR_CSV = """street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,rue du Château,P,,, gs-moulin, Groupe Scolaire Moulin"""
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
|
|
@ -34,43 +34,43 @@ from test_manager import login
|
|||
from passerelle.apps.sector.models import Sectorization, SectorResource
|
||||
from passerelle.base.models import AccessRight
|
||||
|
||||
CSV = """street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,P,,, gs-moulin, Groupe Scolaire Moulin
|
||||
75114_1912,I,0,999999,gs-zola,Groupe Scolaire Zola
|
||||
75114_1913,N,0,999999,ecole-hugo,École Hugo
|
||||
75114_1914,,,10,ecole-hugo, École Hugo
|
||||
CSV = """street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,rue du Château,P,,, gs-moulin, Groupe Scolaire Moulin
|
||||
75114_1912,rue du Château,I,0,999999,gs-zola,Groupe Scolaire Zola
|
||||
75114_1913,rue des Moulins ,N,0,999999,ecole-hugo,École Hugo
|
||||
75114_1914,rue du Vent,,,10,ecole-hugo, École Hugo
|
||||
|
||||
75114_1914,,11,, ecole-hugo2, École Hugo 2
|
||||
75114_1915,,,,ecole-hugo2 , École Hugo 2
|
||||
75114_1914,rue du Vent,,11,, ecole-hugo2, École Hugo 2
|
||||
75114_1915, ,,,,ecole-hugo2 , École Hugo 2
|
||||
"""
|
||||
|
||||
CSV_BOM = force_str(force_text(CSV, 'utf-8').encode('utf-8-sig'))
|
||||
|
||||
CSV_NO_FIRST_LINE = """75114_1912,P,,, gs-moulin, Groupe Scolaire Moulin
|
||||
75114_1912,I,0,999999,gs-zola,Groupe Scolaire Zola
|
||||
75114_1913,N,0,999999,ecole-hugo,École Hugo
|
||||
75114_1914,,,10,ecole-hugo, École Hugo
|
||||
CSV_NO_FIRST_LINE = """75114_1912,rue du Château,P,,, gs-moulin, Groupe Scolaire Moulin
|
||||
75114_1912,rue du Château,I,0,999999,gs-zola,Groupe Scolaire Zola
|
||||
75114_1913,,N,0,999999,ecole-hugo,École Hugo
|
||||
75114_1914,rue du Vent,,,10,ecole-hugo, École Hugo
|
||||
|
||||
75114_1914,,11,, ecole-hugo, École Hugo"""
|
||||
75114_1914,rue du Vent,,11,, ecole-hugo, École Hugo"""
|
||||
|
||||
CSV_REORDERED = """sector_id,sector_name,street_id,parity,min_housenumber,max_housenumber,foo,bar
|
||||
gs-moulin, Groupe Scolaire Moulin, 75114_1912,P,,,aaa,bbb
|
||||
gs-zola,Groupe Scolaire Zola,75114_1912,I,0,999999,xxx,yyy
|
||||
ecole-hugo,École Hugo,75114_1913,N,0,999999,000,1
|
||||
,,75114_1999,N,0,999999,,
|
||||
CSV_REORDERED = """sector_id,sector_name,street_id,parity,min_housenumber,max_housenumber,foo,street_name,bar
|
||||
gs-moulin, Groupe Scolaire Moulin, 75114_1912,P,,,aaa,rue du Château,bbb
|
||||
gs-zola,Groupe Scolaire Zola,75114_1912,I,0,999999,xxx,rue du Château,yyy
|
||||
ecole-hugo,École Hugo,75114_1913,N,0,999999,000,rue des Moulins,1
|
||||
,,75114_1999,N,0,999999,,avenue 999,
|
||||
"""
|
||||
|
||||
CSV_MISSING_COLUMN = """street_id,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,,,foo,
|
||||
,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
CSV_MISSING_COLUMN = """street_id,street_name,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,,,,foo,
|
||||
,,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
|
||||
CSV_MISSING_SECTOR = """street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,P,,, ,
|
||||
75114_1912,I,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
CSV_MISSING_SECTOR = """street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,rue du Château,P,,, ,
|
||||
75114_1912,rue du Château,I,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
|
||||
CSV_MISSING_STREET = """street_id,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,P,,,foo,
|
||||
,I,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
CSV_MISSING_STREET = """street_id,street_name,parity,min_housenumber,max_housenumber,sector_id,sector_name
|
||||
75114_1912,,P,,,foo,
|
||||
,,I,0,999999,gs-zola,Groupe Scolaire Zola"""
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
@ -89,6 +89,19 @@ def sector(db):
|
|||
def test_sector_creation(sector):
|
||||
assert '%s' % sector == 'title [test]'
|
||||
assert sector.sector_set.count() == 4
|
||||
rue1913 = Sectorization.objects.get(street_id='75114_1913')
|
||||
assert rue1913.street_name == 'rue des Moulins'
|
||||
assert (
|
||||
'%s' % rue1913
|
||||
== '75114_1913 (rue des Moulins), parity:all, min:0, max:999999 → title [test] > École Hugo [ecole-hugo]'
|
||||
)
|
||||
rue1915 = Sectorization.objects.get(street_id='75114_1915')
|
||||
assert rue1915.street_name == ''
|
||||
assert (
|
||||
'%s' % rue1915
|
||||
== '75114_1915, parity:all, min:0, max:999999 → title [test] > École Hugo 2 [ecole-hugo2]'
|
||||
)
|
||||
|
||||
hugo = sector.sector_set.get(slug='ecole-hugo')
|
||||
assert Sectorization.objects.filter(sector=hugo).count() == 2
|
||||
hugo2 = sector.sector_set.get(slug='gs-zola')
|
||||
|
@ -242,7 +255,7 @@ def test_sector_endpoint_export(app, sector):
|
|||
resp = app.get(url)
|
||||
assert resp.headers['content-type'] == 'text/csv'
|
||||
assert resp.text.startswith(
|
||||
'"street_id","parity","min_housenumber","max_housenumber","sector_id","sector_name"'
|
||||
'"street_id","street_name","parity","min_housenumber","max_housenumber","sector_id","sector_name"'
|
||||
)
|
||||
assert len(resp.text.splitlines()) == 7
|
||||
sector.titles_in_first_line = False
|
||||
|
|
Loading…
Reference in New Issue