├── .gitignore ├── img ├── bg.gif ├── asc.gif ├── desc.gif ├── help.png ├── home.png ├── refresh.png ├── help-gris.png ├── ld_habite.png ├── communes_voisines.png └── export-to-csv-icon-13.jpg ├── sql ├── labels_statuts_fantoir.sql ├── infos_dept.sql ├── date_cache_dept.sql ├── numeros_osm_par_fantoir.sql ├── positions_OSM_as_GeoJSON.sql ├── fin_etape_cadastre_com.sql ├── rel_id_OSM_from_GeoJSON.sql ├── name_and_positions_OSM_as_GeoJSON.sql ├── fantoir_errone.sql ├── infos_commune_insee.sql ├── numeros_deja_dans_OSM.sql ├── insee_from_coords.sql ├── voies_OSM_non_rapprochees_insee.sql ├── way_id_OSM_from_GeoJSON.sql ├── fantoir_annule.sql ├── avancement_par_departement.sql ├── voie_insee.sql ├── commune_parente.sql ├── maj_population_2017.sql ├── cantons_sans_AC.sql ├── inspect_numeros.sql ├── listing_fantoir.sql ├── voies_seules_rapprochees_insee.sql ├── voisins_insee.sql ├── numeros_hors_osm_par_fantoir.sql ├── bilan_dept.sql ├── places_rapprochees_insee.sql ├── places_non_rapprochees_insee.sql ├── voies_seules_non_rapprochees_insee.sql ├── voies_recentes_manquantes.sql ├── create_table.sql ├── top_adresses_manquantes.sql ├── voies_adresses_non_rapprochees_insee.sql ├── voies_adresses_rapprochees_insee.sql └── voies_recentes_manquantes_dept.sql ├── css ├── tablesorter │ ├── images │ │ ├── first.png │ │ ├── last.png │ │ ├── next.png │ │ ├── prev.png │ │ ├── ice-asc.gif │ │ ├── ice-desc.gif │ │ ├── loading.gif │ │ ├── black-asc.gif │ │ ├── black-desc.gif │ │ ├── dropbox-asc.png │ │ ├── green-asc.gif │ │ ├── green-desc.gif │ │ ├── white-asc.gif │ │ ├── white-desc.gif │ │ ├── dropbox-desc.png │ │ ├── green-header.gif │ │ ├── ice-unsorted.gif │ │ ├── metro-loading.gif │ │ ├── black-unsorted.gif │ │ ├── dragtable-handle.png │ │ ├── green-unsorted.gif │ │ ├── metro-black-asc.png │ │ ├── metro-black-desc.png │ │ ├── metro-unsorted.png │ │ ├── metro-white-asc.png │ │ ├── metro-white-desc.png │ │ ├── white-unsorted.gif │ │ ├── dropbox-asc-hovered.png │ │ ├── dropbox-desc-hovered.png │ │ ├── bootstrap-black-unsorted.png │ │ ├── bootstrap-white-unsorted.png │ │ └── dragtable-handle.svg │ ├── jquery.tablesorter.pager.min.css │ ├── widget.grouping.min.css │ ├── dragtable.mod.min.css │ ├── highlights.min.css │ ├── theme.jui.min.css │ ├── filter.formatter.min.css │ ├── theme.dark.min.css │ ├── theme.blackice.min.css │ ├── theme.default.min.css │ ├── theme.blue.min.css │ ├── theme.bootstrap_2.min.css │ ├── theme.bootstrap.min.css │ ├── theme.bootstrap_3.min.css │ └── theme.metro-dark.min.css ├── style.css ├── style_liste_brute_fantoir.css ├── tablesorter.css ├── menu.css ├── style_voies_recentes_manquantes.css ├── style_top_adresses_manquantes.css ├── style_stats_dept.css ├── style_fantoir_annule.css └── style_fantoir_errone.css ├── helpers.py ├── db.py ├── refresh.sh ├── README.md ├── labels_statut_fantoir.py ├── labels_statut_numero.py ├── refresh.py ├── LICENCE ├── osm_state.py ├── js └── tablesorter │ ├── parsers │ ├── parser-huge-numbers.min.js │ ├── parser-image.min.js │ ├── parser-leading-zeros.min.js │ ├── parser-date.min.js │ ├── parser-date-iso8601.min.js │ ├── parser-date-month.min.js │ ├── parser-feet-inch-fraction.min.js │ ├── parser-duration.min.js │ ├── parser-date-two-digit-year.min.js │ ├── parser-date-weekday.min.js │ ├── parser-globalize.min.js │ ├── parser-roman.min.js │ ├── parser-ignore-articles.min.js │ ├── parser-metric.min.js │ ├── parser-date-extract.min.js │ ├── parser-named-numbers.min.js │ ├── parser-file-type.min.js │ ├── parser-date-range.min.js │ └── parser-network.min.js │ ├── widgets │ ├── widget-filter-type-insideRange.min.js │ ├── widget-repeatheaders.min.js │ ├── widget-currentSort.min.js │ ├── widget-formatter.min.js │ ├── widget-saveSort.min.js │ ├── widget-columns.min.js │ ├── widget-vertical-group.min.js │ ├── widget-staticRow.min.js │ ├── widget-toggle.min.js │ ├── widget-storage.min.js │ ├── widget-reflow.min.js │ ├── widget-headerTitles.min.js │ ├── widget-mark.min.js │ ├── widget-view.min.js │ ├── widget-chart.min.js │ ├── widget-cssStickyHeaders.min.js │ ├── widget-print.min.js │ ├── widget-filter-formatter-select2.min.js │ ├── widget-alignChar.min.js │ ├── widget-sortTbodies.min.js │ ├── widget-uitheme.min.js │ └── widget-sort2Hash.min.js │ └── extras │ └── jquery.metadata.min.js ├── opensearch.xml ├── cantons_sans_AC.py ├── fantoir_errone.py ├── fantoir_annule.py ├── maj_population_2017_bilan.py ├── includes ├── footer.html └── menu.html ├── listing_fantoir.py ├── voies_recentes_manquantes.py ├── statut_fantoir.py ├── insee_from_coords.py ├── statut_numero.py ├── requete_inspect_numeros.py ├── josm.html ├── anomalies_fantoir.py ├── voies_recentes_manquantes_dept.py ├── liens.html ├── requete_par_dept.py ├── stats_dept.py └── liste_brute_fantoir.html /.gitignore: -------------------------------------------------------------------------------- 1 | bilan_isere.txt 2 | -------------------------------------------------------------------------------- /img/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/bg.gif -------------------------------------------------------------------------------- /img/asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/asc.gif -------------------------------------------------------------------------------- /img/desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/desc.gif -------------------------------------------------------------------------------- /img/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/help.png -------------------------------------------------------------------------------- /img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/home.png -------------------------------------------------------------------------------- /img/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/refresh.png -------------------------------------------------------------------------------- /sql/labels_statuts_fantoir.sql: -------------------------------------------------------------------------------- 1 | SELECT * 2 | FROM labels_statuts_fantoir 3 | ORDER BY 1; -------------------------------------------------------------------------------- /img/help-gris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/help-gris.png -------------------------------------------------------------------------------- /img/ld_habite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/ld_habite.png -------------------------------------------------------------------------------- /sql/infos_dept.sql: -------------------------------------------------------------------------------- 1 | SELECT dep, 2 | libelle 3 | FROM cog_departement 4 | WHERE dep = '__dept__'; 5 | -------------------------------------------------------------------------------- /img/communes_voisines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/communes_voisines.png -------------------------------------------------------------------------------- /img/export-to-csv-icon-13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/img/export-to-csv-icon-13.jpg -------------------------------------------------------------------------------- /css/tablesorter/images/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/first.png -------------------------------------------------------------------------------- /css/tablesorter/images/last.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/last.png -------------------------------------------------------------------------------- /css/tablesorter/images/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/next.png -------------------------------------------------------------------------------- /css/tablesorter/images/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/prev.png -------------------------------------------------------------------------------- /css/tablesorter/images/ice-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/ice-asc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/ice-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/ice-desc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/loading.gif -------------------------------------------------------------------------------- /css/tablesorter/images/black-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/black-asc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/black-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/black-desc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/dropbox-asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/dropbox-asc.png -------------------------------------------------------------------------------- /css/tablesorter/images/green-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/green-asc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/green-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/green-desc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/white-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/white-asc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/white-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/white-desc.gif -------------------------------------------------------------------------------- /css/tablesorter/images/dropbox-desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/dropbox-desc.png -------------------------------------------------------------------------------- /css/tablesorter/images/green-header.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/green-header.gif -------------------------------------------------------------------------------- /css/tablesorter/images/ice-unsorted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/ice-unsorted.gif -------------------------------------------------------------------------------- /css/tablesorter/images/metro-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-loading.gif -------------------------------------------------------------------------------- /css/tablesorter/images/black-unsorted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/black-unsorted.gif -------------------------------------------------------------------------------- /css/tablesorter/images/dragtable-handle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/dragtable-handle.png -------------------------------------------------------------------------------- /css/tablesorter/images/green-unsorted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/green-unsorted.gif -------------------------------------------------------------------------------- /css/tablesorter/images/metro-black-asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-black-asc.png -------------------------------------------------------------------------------- /css/tablesorter/images/metro-black-desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-black-desc.png -------------------------------------------------------------------------------- /css/tablesorter/images/metro-unsorted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-unsorted.png -------------------------------------------------------------------------------- /css/tablesorter/images/metro-white-asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-white-asc.png -------------------------------------------------------------------------------- /css/tablesorter/images/metro-white-desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/metro-white-desc.png -------------------------------------------------------------------------------- /css/tablesorter/images/white-unsorted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/white-unsorted.gif -------------------------------------------------------------------------------- /sql/date_cache_dept.sql: -------------------------------------------------------------------------------- 1 | SELECT timestamp_debut,etape,date_fin 2 | FROM batch 3 | WHERE etape = '__etape__' AND 4 | dept = '__dept__'; 5 | -------------------------------------------------------------------------------- /sql/numeros_osm_par_fantoir.sql: -------------------------------------------------------------------------------- 1 | SELECT numero,voie_osm 2 | FROM cumul_adresses c 3 | WHERE source = 'OSM' AND 4 | fantoir = '__fantoir__'; -------------------------------------------------------------------------------- /css/tablesorter/images/dropbox-asc-hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/dropbox-asc-hovered.png -------------------------------------------------------------------------------- /css/tablesorter/images/dropbox-desc-hovered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/dropbox-desc-hovered.png -------------------------------------------------------------------------------- /css/tablesorter/images/bootstrap-black-unsorted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/bootstrap-black-unsorted.png -------------------------------------------------------------------------------- /css/tablesorter/images/bootstrap-white-unsorted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osm-fr/osm-vs-fantoir/HEAD/css/tablesorter/images/bootstrap-white-unsorted.png -------------------------------------------------------------------------------- /sql/positions_OSM_as_GeoJSON.sql: -------------------------------------------------------------------------------- 1 | SELECT DISTINCT ST_AsGeoJSON(geometrie) 2 | FROM cumul_adresses 3 | WHERE insee_com = '__com__' AND 4 | fantoir = '__fantoir__'; 5 | -------------------------------------------------------------------------------- /sql/fin_etape_cadastre_com.sql: -------------------------------------------------------------------------------- 1 | SELECT etape, 2 | source, 3 | date_fin 4 | FROM batch 5 | WHERE etape = '__etape__' AND 6 | cadastre_com = '__cadastre_com__' 7 | ORDER BY source; 8 | -------------------------------------------------------------------------------- /sql/rel_id_OSM_from_GeoJSON.sql: -------------------------------------------------------------------------------- 1 | WITH pos 2 | AS 3 | (__positions__) 4 | SELECT DISTINCT r.rel_id 5 | FROM planet_osm_rels r 6 | JOIN pos 7 | ON pos.geom_position && r.way 8 | WHERE member_role = 'house' AND 9 | name = '__name__'; -------------------------------------------------------------------------------- /sql/name_and_positions_OSM_as_GeoJSON.sql: -------------------------------------------------------------------------------- 1 | SELECT DISTINCT COALESCE(voie_osm,voie_autre), 2 | ST_AsGeoJSON(ST_Buffer(geometrie,0.0001)) 3 | FROM cumul_adresses 4 | WHERE insee_com = '__com__' AND 5 | fantoir = '__fantoir__'; 6 | -------------------------------------------------------------------------------- /helpers.py: -------------------------------------------------------------------------------- 1 | 2 | def get_code_dept_from_insee(code_insee): 3 | code_dept = code_insee[0:2] 4 | if code_dept == '97': 5 | code_dept = code_insee[0:3] 6 | return code_dept 7 | 8 | def escape_quotes(s): 9 | return s.replace('\'','\'\'') 10 | -------------------------------------------------------------------------------- /db.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import psycopg2 4 | import psycopg2.extras 5 | 6 | bano = psycopg2.connect(os.environ.get("BANO_PG", "dbname='cadastre' user='cadastre'")) 7 | bano_cache = psycopg2.connect(os.environ.get("BANO_PG_CACHE", "dbname='osm' user='cadastre'")) 8 | psycopg2.extras.register_hstore(bano_cache) 9 | -------------------------------------------------------------------------------- /refresh.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | source /data/work/vdct/bano_venv37/bin/activate 4 | 5 | SCRIPT_DIR=/data/project/bano_prod 6 | cd $SCRIPT_DIR 7 | 8 | source config 9 | 10 | pip install -qqe . 11 | 12 | bano process_commune BAN --code_insee ${1} 13 | bano process_commune OSM --code_insee ${1} 14 | bano process_commune_lieux-dits --code_insee ${1} -------------------------------------------------------------------------------- /sql/fantoir_errone.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | f 3 | AS 4 | (SELECT fantoir 5 | FROM cumul_voies 6 | WHERE fantoir != '' 7 | EXCEPT 8 | SELECT fantoir10 9 | FROM fantoir_voie) 10 | SELECT v.fantoir, 11 | v.voie_osm, 12 | ST_X(v.geometrie), 13 | ST_Y(v.geometrie) 14 | FROM cumul_voies v 15 | JOIN f 16 | USING (fantoir) 17 | ORDER BY 1 18 | 19 | -------------------------------------------------------------------------------- /sql/infos_commune_insee.sql: -------------------------------------------------------------------------------- 1 | SELECT name, 2 | ST_X(p), 3 | ST_Y(p) 4 | FROM (SELECT name, 5 | ST_Transform(ST_Centroid(way),4326) p, 6 | admin_level 7 | FROM planet_osm_polygon 8 | WHERE boundary='administrative' AND 9 | admin_level in (8,9) AND 10 | "ref:INSEE" = '__com__' 11 | ORDER BY admin_level)a; 12 | -------------------------------------------------------------------------------- /sql/numeros_deja_dans_OSM.sql: -------------------------------------------------------------------------------- 1 | SELECT ABS(p.osm_id) 2 | FROM planet_osm___type_geom__ p 3 | JOIN planet_osm_polygon pl 4 | ON pl.way && p.way AND 5 | ST_Intersects(pl.way, p.way) 6 | WHERE pl."ref:INSEE" = '__insee__' AND 7 | p."addr:housenumber" IN (__numeros_OSM__) AND 8 | p."addr:street" = '__name__' AND 9 | p.osm_id __signe__ 0; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | osm-vs-fantoir 2 | ============== 3 | 4 | Code utilisé à https://bano.openstreetmap.fr/pifometre/ 5 | 6 | Confrontation des données FANTOIR et du contenu OSM+Cadastre+BAL utilisé dans BANO 7 | 8 | Visualisation sous forme de listes. 9 | 10 | Ce projet nécessite une base PostgreSQL avec le contenu BANO pour fonctionner. Cf https://github.com/osm-fr/bano 11 | -------------------------------------------------------------------------------- /labels_statut_fantoir.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | 8 | import db 9 | 10 | 11 | cgitb.enable() 12 | print ("Content-Type: application/json") 13 | print ("") 14 | 15 | with db.bano.cursor() as cur: 16 | cur.execute("SELECT id_statut,label_statut FROM labels_statuts_fantoir ORDER BY tri;") 17 | print(json.JSONEncoder().encode(cur.fetchall())) 18 | -------------------------------------------------------------------------------- /labels_statut_numero.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | 8 | import db 9 | 10 | 11 | cgitb.enable() 12 | print ("Content-Type: application/json") 13 | print ("") 14 | 15 | with db.bano.cursor() as cur: 16 | cur.execute("SELECT id_statut,label_statut FROM labels_statuts_numero ORDER BY tri;") 17 | print(json.JSONEncoder().encode(cur.fetchall())) 18 | -------------------------------------------------------------------------------- /sql/insee_from_coords.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | s 3 | AS 4 | (SELECT insee_com, 5 | CASE typecom 6 | WHEN 'ARM' THEN 1 7 | WHEN 'COM' THEN 2 8 | ELSE 3 9 | END sort_order 10 | FROM polygones_insee_geo 11 | JOIN cog_commune c 12 | ON (com = insee_com) 13 | WHERE ST_Contains(geometrie,ST_SetSRID(ST_Point(__lon__,__lat__),4326)) 14 | UNION ALL 15 | SELECT '404',99) 16 | SELECT insee_com 17 | FROM s 18 | ORDER BY sort_order 19 | LIMIT 1; -------------------------------------------------------------------------------- /css/tablesorter/jquery.tablesorter.pager.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-pager{padding:5px}td.tablesorter-pager{background-color:#e6eeee;margin:0}.tablesorter-pager img{vertical-align:middle;margin-right:2px;cursor:pointer}.tablesorter-pager .pagedisplay{padding:0 5px 0 5px;width:auto;white-space:nowrap;text-align:center}.tablesorter-pager select{margin:0;padding:0}.tablesorter-pager.disabled{display:none}.tablesorter-pager .disabled{opacity:.5;cursor:default} -------------------------------------------------------------------------------- /refresh.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import subprocess 5 | import cgi 6 | import cgitb 7 | 8 | from pathlib import Path 9 | 10 | cgitb.enable() 11 | params = cgi.FieldStorage() 12 | insee_com = params['insee'].value 13 | print ("Content-Type: application/json\n") 14 | 15 | try: 16 | subprocess.run([f"{(Path(__file__).resolve().parent / 'refresh.sh')}", insee_com]) 17 | statut = '1' 18 | except : 19 | statut = '0' 20 | 21 | print(statut) 22 | -------------------------------------------------------------------------------- /css/tablesorter/images/dragtable-handle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /sql/voies_OSM_non_rapprochees_insee.sql: -------------------------------------------------------------------------------- 1 | SELECT '--'::text AS Fantoir, 2 | '--'::text AS voie_fantoir, 3 | '--'::text AS date_creation, 4 | c.voie_osm, 5 | ST_X(c.geometrie), 6 | ST_Y(c.geometrie), 7 | 0::integer AS statut 8 | FROM cumul_voies c 9 | JOIN polygones_insee p 10 | ON ST_Contains(p.geometrie,ST_Transform(ST_SetSRID(c.geometrie,4326),3857)) 11 | WHERE c.insee_com = '__com__' AND 12 | p.insee_com = '__com__' AND 13 | c.fantoir = '' 14 | ORDER BY 1; 15 | -------------------------------------------------------------------------------- /sql/way_id_OSM_from_GeoJSON.sql: -------------------------------------------------------------------------------- 1 | WITH pos 2 | AS 3 | (__positions__), 4 | ext 5 | AS 6 | (SELECT ST_Extent(geom_position) AS ext 7 | FROM pos) 8 | SELECT l.osm_id 9 | FROM planet_osm_line l 10 | JOIN ext 11 | ON ext.ext && l.way 12 | WHERE highway != '' AND 13 | (name = '__name__' OR 14 | "ref:FR:FANTOIR" = '__fantoir__') 15 | UNION 16 | SELECT l.osm_id 17 | FROM planet_osm_polygon l 18 | JOIN ext 19 | ON ext.ext && l.way 20 | WHERE highway != '' AND 21 | (name = '__name__' OR 22 | "ref:FR:FANTOIR" = '__fantoir__'); -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2014 Vincent de Château-Thierry (vdct@laposte.net) 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /osm_state.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import time 5 | import calendar 6 | import cgitb 7 | 8 | def main(): 9 | print ("Content-Type: text/plain") 10 | print ("") 11 | 12 | with open('/data/download/state.txt') as f: 13 | full = f.read() 14 | s = full.split('\n')[2].split('timestamp=')[1] 15 | st = time.localtime(calendar.timegm(time.strptime(s,'%Y-%m-%dT%H\:%M\:%SZ'))) 16 | print(time.strftime('%d/%m/%Y %H:%M:%S',st)) 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-huge-numbers.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: hugeNumbers - updated 3/1/2016 (v2.25.5) */ 4 | !function(){"use strict";jQuery.tablesorter.addParser({id:"hugeNumbers",is:function(){return!1},format:function(e){return e.replace(/\B(?=(\d{12})+(?!\d))/g,",")},type:"text"})}();return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-image.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: image - new 7/17/2014 (v2.17.5) */ 4 | !function(i){"use strict";i.tablesorter.addParser({id:"image",is:function(){return!1},format:function(t,r,e){return i(e).find("img").attr(r.config.imgAttr||"alt")||t},parsed:!0,type:"text"})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /opensearch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pifomètre BANO 4 | Connaître le rapprochement des voies entre OSM et FANTOIR grâce à code INSEE de la commune. 5 | /favicon.ico 6 | fr 7 | UTF-8 8 | 9 | false 10 | -------------------------------------------------------------------------------- /cantons_sans_AC.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano_cache.cursor() as cur: 15 | cur.execute(fq.read()) 16 | 17 | return cur.fetchall() 18 | 19 | data = get_data('cantons_sans_AC') 20 | 21 | print("Content-Type: application/json\n") 22 | 23 | print(json.JSONEncoder().encode(data)) -------------------------------------------------------------------------------- /sql/fantoir_annule.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | f 3 | AS 4 | (SELECT fantoir10, 5 | CASE caractere_annul 6 | WHEN 'O' THEN 'sans transfert' 7 | WHEN 'Q' THEN 'avec transfert' 8 | END transfert, 9 | to_char(to_date(date_annul,'YYYYDDD'),'YYYY-MM-DD') date_annul 10 | FROM fantoir_voie 11 | where date_annul!='0000000') 12 | SELECT v.fantoir, 13 | v.voie_osm, 14 | ST_X(v.geometrie), 15 | ST_Y(v.geometrie), 16 | date_annul 17 | FROM cumul_voies v 18 | JOIN f 19 | ON v.fantoir=f.fantoir10 20 | ORDER BY 1 21 | 22 | -------------------------------------------------------------------------------- /fantoir_errone.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano.cursor() as cur: 15 | cur.execute(fq.read()) 16 | 17 | return cur.fetchall() 18 | 19 | data = get_data('fantoir_errone') 20 | delta = 0.0008 21 | 22 | print("Content-Type: application/json\n") 23 | 24 | print(json.JSONEncoder().encode(data)) -------------------------------------------------------------------------------- /fantoir_annule.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano.cursor() as cur: 15 | cur.execute(fq.read()) 16 | 17 | return cur.fetchall() 18 | 19 | data = get_data('fantoir_annule') 20 | delta = 0.0008 21 | 22 | print("Content-Type: application/json\n") 23 | 24 | print(json.JSONEncoder().encode(data)) 25 | -------------------------------------------------------------------------------- /maj_population_2017_bilan.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano_cache.cursor() as cur: 15 | cur.execute(fq.read()) 16 | 17 | return cur.fetchall() 18 | 19 | data = get_data('avancement_par_departement') 20 | 21 | print("Content-Type: application/json\n") 22 | 23 | print(json.JSONEncoder().encode(data)) -------------------------------------------------------------------------------- /includes/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 16 | Données OpenStreetMap : © les Contributeurs d'OpenStreetMap (Licence ODbL) 17 | - Données FANTOIR 04/2023 : © Ministère de l'Économie et des Finances (DGFiP) (Licence LO/OL) 18 | 19 | -------------------------------------------------------------------------------- /css/tablesorter/widget.grouping.min.css: -------------------------------------------------------------------------------- 1 | tr.group-header td{background:#eee}.group-name{text-transform:uppercase;font-weight:700}.group-count{color:#999}.group-hidden{display:none!important}.group-header,.group-header td{user-select:none;-moz-user-select:none}tr.group-header td i{display:inline-block;width:0;height:0;border-top:4px solid transparent;border-bottom:4px solid #888;border-right:4px solid #888;border-left:4px solid transparent;margin-right:7px;user-select:none;-moz-user-select:none}tr.group-header.collapsed td i{border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #888;border-right:0;margin-right:10px} -------------------------------------------------------------------------------- /listing_fantoir.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | 8 | from requete_fantoir import get_data_from_bano, get_data_from_bano_cache 9 | 10 | cgitb.enable() 11 | print ("Content-Type: application/json\n\n") 12 | 13 | params = cgi.FieldStorage() 14 | insee_com = params['insee'].value 15 | 16 | infos_commune = get_data_from_bano_cache('infos_commune_insee',insee_com) 17 | if infos_commune: 18 | nom_commune = infos_commune[0][0] 19 | else: 20 | nom_commune = [] 21 | 22 | print(json.JSONEncoder().encode([[nom_commune],get_data_from_bano('listing_fantoir',insee_com)])) -------------------------------------------------------------------------------- /sql/avancement_par_departement.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | dep 3 | as 4 | (SELECT dep, 5 | count(distinct com) nb_com 6 | FROM cog_commune 7 | GROUP BY 1), 8 | pop2017 9 | AS 10 | (SELECT dep, 11 | count(distinct insee_com) nb_com_ok 12 | FROM population_insee p 13 | JOIN infos_communes i 14 | USING (insee_com,population) 15 | GROUP BY dep) 16 | SELECT cog.libelle, 17 | dep.*, 18 | coalesce(nb_com_ok,0), 19 | coalesce((100*nb_com_ok::numeric/nb_com)::float(1),0) AS pct 20 | FROM dep 21 | JOIN cog_departement cog 22 | USING (dep) 23 | LEFT OUTER JOIN pop2017 24 | USING (dep) 25 | WHERE dep IS NOT NULL 26 | ORDER BY pct DESC,1; -------------------------------------------------------------------------------- /sql/voie_insee.sql: -------------------------------------------------------------------------------- 1 | SELECT f.code_insee||f.id_voie||f.cle_rivoli fantoir, 2 | nature_voie||' '||libelle_voie voie, 3 | coalesce(j.voie_osm,'--') 4 | FROM fantoir_voie f 5 | LEFT OUTER JOIN (SELECT DISTINCT fantoir, 6 | voie_osm 7 | FROM cumul_adresses 8 | WHERE insee_com = '__com__' AND 9 | source in ('OSM','CADASTRE') AND 10 | voie_osm IS NOT NULL AND 11 | voie_osm != '') j 12 | ON f.code_insee||f.id_voie||f.cle_rivoli = j.fantoir 13 | WHERE f.code_insee = '__com__' AND 14 | f.type_voie = '1' AND 15 | f.date_annul = '0000000' AND 16 | j.voie_osm IS __null__clause__ 17 | ORDER BY 3,2,1; 18 | -------------------------------------------------------------------------------- /voies_recentes_manquantes.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano.cursor() as cur: 15 | cur.execute(fq.read()) 16 | 17 | return cur.fetchall() 18 | 19 | data = get_data('voies_recentes_manquantes') 20 | a = json.JSONEncoder().encode(data) 21 | f = open('./json/voies_recentes_manquantes.json','w') 22 | f.write(a) 23 | f.close() 24 | -------------------------------------------------------------------------------- /statut_fantoir.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | import sys 8 | 9 | import db 10 | 11 | cgitb.enable() 12 | print("Content-Type: application/json\n") 13 | 14 | params = cgi.FieldStorage() 15 | insee_com = params['insee'].value 16 | statut = params['statut'].value 17 | fantoir = params['fantoir'].value 18 | 19 | try: 20 | with db.bano.cursor() as cur: 21 | cur.execute(f"INSERT INTO statut_fantoir VALUES ('{fantoir}',{statut},(SELECT EXTRACT(epoch from now())::integer),'{insee_com}');COMMIT;") 22 | except: 23 | statut = -1 24 | 25 | print(json.JSONEncoder().encode(statut)) 26 | -------------------------------------------------------------------------------- /sql/commune_parente.sql: -------------------------------------------------------------------------------- 1 | 2 | SELECT cp.com, 3 | cp.libelle 4 | FROM cog_commune cd 5 | JOIN cog_commune cp 6 | ON cd.comparent = cp.com 7 | WHERE cd.com = '__com__' AND 8 | cp.com != cd.com AND 9 | cd.typecom = 'COMD' AND 10 | cp.typecom = 'COM' 11 | UNION 12 | SELECT p8.insee_com, 13 | p8.nom 14 | FROM polygones_insee p9 15 | LEFT JOIN cog_commune 16 | ON p9.insee_com = com 17 | JOIN polygones_insee p8 18 | ON ST_Contains(p8.geometrie,p9.geometrie) 19 | WHERE p9.insee_com = '__com__' AND 20 | p9.admin_level = 9 AND 21 | p8.admin_level = 8 AND 22 | typecom IS NULL; -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-leading-zeros.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: leading zeros - updated 4/2/2017 (v2.28.6) */ 4 | !function(){"use strict";var i=jQuery.tablesorter;i.addParser({id:"leadingZeros",is:function(){return!1},format:function(e,t){var r=(e||"").replace(i.regex.nondigit,""),n=i.formatFloat(r,t),a=n.toString();return isNaN(n)||n!=r||r.length===a.length||(n-=1e-10*(e.length-a.length)),n},type:"number"})}();return jQuery;})); 5 | -------------------------------------------------------------------------------- /sql/maj_population_2017.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | r 3 | AS 4 | (SELECT DISTINCT (s.rel_id * -1) AS rel_id, 5 | i.insee_com, 6 | i.name, 7 | p.population, 8 | RANK() OVER(PARTITION BY i.insee_com ORDER BY s.admin_level) rang 9 | FROM infos_communes i 10 | JOIN population_insee p 11 | USING (insee_com) 12 | JOIN planet_osm_communes_statut s 13 | ON (i.insee_com = s."ref:INSEE") 14 | WHERE i.dep = '__dept__' AND 15 | s.boundary = 'administrative' AND 16 | s.admin_level in (8,9) AND 17 | i.population != p.population) 18 | SELECT rel_id, 19 | insee_com, 20 | name, 21 | population 22 | FROM r 23 | WHERE rang = 1 24 | ORDER BY 2 -------------------------------------------------------------------------------- /insee_from_coords.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(lon,lat): 13 | dbconn = db.bano_cache 14 | 15 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/insee_from_coords.sql'),'r') as fq: 16 | with dbconn.cursor() as cur: 17 | cur.execute(fq.read().replace('__lon__',lon).replace('__lat__',lat)) 18 | 19 | return cur.fetchone() 20 | 21 | params = cgi.FieldStorage() 22 | lon = params['lon'].value 23 | lat = params['lat'].value 24 | 25 | print("Content-Type: application/json\n") 26 | print(json.JSONEncoder().encode(get_data(lon,lat))) 27 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | body{ 2 | font-family: 'Arial', sans serif; 3 | margin: 0; 4 | } 5 | 6 | #barre-jaune { 7 | position: fixed; 8 | z-index: 3; 9 | top: 30px; 10 | height: 30px; 11 | width: 100%; 12 | padding: 4px 10px 4px 57px; 13 | background-color: #faff99; 14 | font-family: 'Arial', sans serif; 15 | font-size: 0.9em; 16 | font-weight: bold; 17 | text-transform: uppercase; 18 | } 19 | 20 | #barre-jaune span { 21 | vertical-align: middle; 22 | } 23 | 24 | #barre-jaune form { 25 | display: inline; 26 | } 27 | 28 | #barre-jaune form input { 29 | height:22px; 30 | vertical-align: middle; 31 | line-height: 1em; 32 | } 33 | 34 | #barre-jaune input[type="text"] { 35 | border: 1px solid #777; 36 | border-radius: 3px; 37 | } -------------------------------------------------------------------------------- /statut_numero.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | import sys 8 | 9 | import db 10 | 11 | cgitb.enable() 12 | print("Content-Type: application/json\n") 13 | 14 | params = cgi.FieldStorage() 15 | insee_com = params['insee'].value 16 | statut = params['statut'].value 17 | fantoir = params['fantoir'].value 18 | numero = params['numero'].value 19 | source = params['source'].value 20 | 21 | try: 22 | with db.bano.cursor() as cur: 23 | cur.execute(f"INSERT INTO statut_numero VALUES ('{numero}','{fantoir}','{source}',{statut},(SELECT EXTRACT(epoch from now())::integer),'{insee_com}');COMMIT;") 24 | except: 25 | statut = -1 26 | 27 | print(json.JSONEncoder().encode(statut)) 28 | -------------------------------------------------------------------------------- /sql/cantons_sans_AC.sql: -------------------------------------------------------------------------------- 1 | with 2 | c 3 | as 4 | (select rel_id * -1 rel_id,"ref:INSEE" from planet_osm_communes_statut where boundary = 'political' and political_division = 'canton' 5 | except 6 | select rel_id * -1,"ref:INSEE" from planet_osm_communes_statut where boundary = 'political' and member_role = 'admin_centre'), 7 | com 8 | AS 9 | (SELECT distinct osm_id,"ref:INSEE",name from planet_osm_communes_statut where admin_level = 8 and osm_type = 0), 10 | u 11 | as 12 | --(SELECT *,'​http://127.0.0.1:8111/load_object?new_layer=true&relation_members=true&objects=r'||rel_id||',n'||osm_id as url 13 | (SELECT * 14 | FROM c JOIN cog_canton ccan 15 | ON "ref:INSEE" = ccan.can 16 | JOIN com 17 | ON ccan.burcentral = com."ref:INSEE") 18 | select dep,libelle,name,rel_id,osm_id 19 | from u 20 | order by 1,2 -------------------------------------------------------------------------------- /css/style_liste_brute_fantoir.css: -------------------------------------------------------------------------------- 1 | #bandeau{ 2 | top:60px; 3 | width:100%; 4 | height:70px; 5 | z-index:3; 6 | position:fixed; 7 | background-color:white; 8 | border-bottom: 1px solid black; 9 | } 10 | .titre_commune{ 11 | margin: 10px 30px; 12 | } 13 | #reponse{ 14 | position:absolute; 15 | top:150px 16 | } 17 | #pied_de_page{ 18 | position:relative; 19 | width:100%; 20 | height:30px; 21 | z-index:3; 22 | } 23 | #credits{ 24 | background:darkgrey; 25 | position:fixed; 26 | bottom:0px; 27 | width:100%; 28 | overflow:visible; 29 | z-index:4; 30 | text-align: justify; 31 | } 32 | table.tablesorter tbody td.rapproche{ 33 | color:white; 34 | font-weight:bold; 35 | background:#009900; 36 | } 37 | table.tablesorter tbody td.qualifie{ 38 | color:white; 39 | font-weight:bold; 40 | background:#555555; 41 | } -------------------------------------------------------------------------------- /requete_inspect_numeros.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type,insee,fantoir): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano.cursor() as cur: 15 | cur.execute(fq.read().replace('__com__',insee).replace('__fantoir__',fantoir)) 16 | 17 | return cur.fetchall() 18 | 19 | params = cgi.FieldStorage() 20 | # insee = '95219' 21 | # fantoir = '952191024B' 22 | # dept = '92' 23 | insee = params['insee'].value 24 | fantoir = params['fantoir'].value 25 | requete = 'inspect_numeros' 26 | 27 | print("Content-Type: application/json\n") 28 | print(json.JSONEncoder().encode(get_data(requete,insee,fantoir))) 29 | -------------------------------------------------------------------------------- /sql/inspect_numeros.sql: -------------------------------------------------------------------------------- 1 | SELECT c.source, 2 | c.numero, 3 | c.voie_osm, 4 | c.voie_autre, 5 | COALESCE(s.id_statut,0), 6 | cog.libelle, 7 | c.insee_com, 8 | ST_X(geometrie), 9 | ST_Y(geometrie) 10 | FROM cumul_adresses c 11 | JOIN cog_commune cog 12 | ON insee_com = com 13 | LEFT OUTER JOIN (SELECT numero,fantoir,source,id_statut 14 | FROM (SELECT *,rank() OVER (PARTITION BY numero,fantoir,source ORDER BY timestamp_statut DESC) rang 15 | FROM statut_numero 16 | WHERE insee_com = '__com__' AND 17 | fantoir = '__fantoir__')r 18 | WHERE rang = 1) s 19 | USING (numero,fantoir,source) 20 | WHERE c.insee_com = '__com__' AND 21 | c.fantoir = '__fantoir__' AND 22 | c.source = 'BAN' 23 | ORDER BY numero; -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-filter-type-insideRange.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: filter, insideRange filter type - updated 12/10/2015 (v2.25.0) */ 4 | !function(){"use strict";function f(t){return isNaN(t)?t:parseFloat(t)}var t=jQuery.tablesorter,o=/\d+/,p=/\s+-\s+/;t.filter.types.insideRange=function(t,e){if(!e.anyMatch&&o.test(e.iFilter)&&p.test(e.iExact)){var r,i,n,a,s=e.index,l=e.$cells[s],u=e.iExact.split(p),c=t.parsers[e.index]&&t.parsers[e.index].format;return u&&u.length<2||"function"!=typeof c?null:(n=f(c(u[0],t.table,l,s)),(a=f(c(u[1],t.table,l,s)))',a=0;a"+n.trim(r.$headers.eq(a).html())+"";t.repeatHeaders=s+""}for(i=t&&t.rowsToSkip||4,r.$table.find("tr.repeated-header").remove(),d=(o=r.$tbodies.find("tr")).length,a=i;a 2 | 3 | 4 | Correspondance entre FANTOIR et voies OSM depuis JOSM 5 | 6 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /css/tablesorter.css: -------------------------------------------------------------------------------- 1 | /* tables */ 2 | table.tablesorter { 3 | font-family:arial; 4 | background-color: #CDCDCD; 5 | margin:10px 0pt 15px; 6 | font-size: 8pt; 7 | width: 100%; 8 | text-align: left; 9 | } 10 | table.tablesorter thead tr th, table.tablesorter tfoot tr th { 11 | background-color: #e6EEEE; 12 | border: 1px solid #FFF; 13 | font-size: 8pt; 14 | padding: 4px; 15 | padding-right: 18px; 16 | } 17 | table.tablesorter thead tr .header { 18 | background-image: url(../img/bg.gif); 19 | background-repeat: no-repeat; 20 | background-position: center right; 21 | cursor: pointer; 22 | } 23 | table.tablesorter tbody td { 24 | color: #3D3D3D; 25 | padding: 4px; 26 | background-color: #FFF; 27 | vertical-align: top; 28 | } 29 | table.tablesorter tbody tr.odd td { 30 | background-color:#F0F0F6; 31 | } 32 | table.tablesorter thead tr .headerSortUp { 33 | background-image: url(../img/asc.gif); 34 | } 35 | table.tablesorter thead tr .headerSortDown { 36 | background-image: url(../img/desc.gif); 37 | } 38 | table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { 39 | background-color: #8dbdd8; 40 | } 41 | 42 | -------------------------------------------------------------------------------- /sql/numeros_hors_osm_par_fantoir.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | qualif_adresse 3 | AS 4 | (SELECT TRANSLATE(UPPER(numero),' ','') AS numero,fantoir,insee_com 5 | FROM (SELECT *,rank() OVER (PARTITION BY numero,fantoir ORDER BY timestamp_statut DESC) rang 6 | FROM statut_numero 7 | WHERE fantoir = '__fantoir__')r 8 | WHERE rang = 1), 9 | diff 10 | AS 11 | ((SELECT TRANSLATE(UPPER(numero),' ','') AS uppernum,fantoir,insee_com FROM cumul_adresses WHERE insee_com = '__com__' AND fantoir = '__fantoir__' AND source = 'BAN' 12 | EXCEPT 13 | SELECT TRANSLATE(UPPER(numero),' ','') AS uppernum,fantoir,insee_com FROM cumul_adresses WHERE insee_com = '__com__' AND fantoir = '__fantoir__' AND source = 'OSM') 14 | EXCEPT 15 | SELECT numero,fantoir,insee_com FROM qualif_adresse) 16 | SELECT ST_X(c.geometrie), 17 | ST_Y(c.geometrie), 18 | c.numero, 19 | diff.fantoir, 20 | COALESCE(c.voie_osm,c.voie_autre) 21 | FROM cumul_adresses c 22 | JOIN diff 23 | USING (fantoir,insee_com) 24 | WHERE source = 'BAN' AND 25 | TRANSLATE(UPPER(numero),' ','') = uppernum 26 | ORDER BY NULLIF(regexp_replace(numero, '\D', '', 'g'), '')::int; -------------------------------------------------------------------------------- /js/tablesorter/extras/jquery.metadata.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | !function($){$.extend({metadata:{defaults:{type:"class",name:"metadata",cre:/(\{.*\})/,single:"metadata"},setType:function(t,e){this.defaults.type=t,this.defaults.name=e},get:function(elem,opts){var data,m,e,attr,settings=$.extend({},this.defaults,opts);if(settings.single.length||(settings.single="metadata"),data=$.data(elem,settings.single),data)return data;if(data="{}","class"===settings.type)m=settings.cre.exec(elem.className),m&&(data=m[1]);else if("elem"===settings.type){if(!elem.getElementsByTagName)return;e=elem.getElementsByTagName(settings.name),e.length&&(data=$.trim(e[0].innerHTML))}else void 0!==elem.getAttribute&&(attr=elem.getAttribute(settings.name),attr&&(data=attr));return data.indexOf("{")<0&&(data="{"+data+"}"),data=eval("("+data+")"),$.data(elem,settings.single,data),data}}}),$.fn.metadata=function(t){return $.metadata.get(this[0],t)}}(jQuery);return jQuery;})); 4 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-feet-inch-fraction.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: distance */ 4 | !function(a){"use strict";var n=a.tablesorter;n.symbolRegex=/[\u215b\u215c\u215d\u215e\u00bc\u00bd\u00be]/g,n.processFractions=function(t,e){if(t){var r,s=0;t=a.trim(t.replace(/\"/,"")),/\s/.test(t)&&(s=n.formatFloat(t.split(" ")[0],e),t=a.trim(t.substring(t.indexOf(" "),t.length))),/\//g.test(t)?(r=t.split("/"),t=s+parseInt(r[0],10)/parseInt(r[1]||1,10)):n.symbolRegex.test(t)&&(t=s+t.replace(n.symbolRegex,function(t){return{"⅛":".125","⅜":".375","⅝":".625","⅞":".875","¼":".25","½":".5","¾":".75"}[t]}))}return t||0},a.tablesorter.addParser({id:"distance",is:function(){return!1},format:function(t,e){if(""===t)return"";var r=/^\s*\S*(\s+\S+)?\s*\'/.test(t)?t.split(/\'/):[0,t],s=n.processFractions(r[0],e),a=n.processFractions(r[1],e);return/[\'\"]/.test(t)?parseFloat(s)+(parseFloat(a)/12||0):parseFloat(s)+parseFloat(a)},type:"numeric"})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /sql/bilan_dept.sql: -------------------------------------------------------------------------------- 1 | WITH v AS (SELECT insee_com,count(distinct fantoir) voies_rapprochees FROM cumul_voies WHERE insee_com like '38___' GROUP BY insee_com), 2 | a AS (SELECT insee_com,count(distinct fantoir) voies_avec_adresses_rapprochees FROM cumul_adresses WHERE insee_com like '38___' GROUP BY insee_com), 3 | t AS (SELECT code_insee,count(*) voies_fantoir FROM fantoir_voie WHERE code_insee like '38___' AND type_voie in ('1','2') GROUP BY code_insee) 4 | --tl AS (SELECT code_insee,count(*) voies_fantoir FROM fantoir_voie WHERE code_insee like '38___' AND type_voie in ('1','2','3') GROUP BY code_insee) 5 | SELECT v.insee_com "Code INSEE",c.nom "Commune",a.voies_avec_adresses_rapprochees "Voies avec adresses rapprochées",v.voies_rapprochees "Toutes voies rapprochées",t.voies_fantoir "Voies FANTOIR",((a.voies_avec_adresses_rapprochees*100/t.voies_fantoir))::integer "Pourcentage de rapprochement" 6 | --tl.voies_fantoir "Voies et lieux-dits FANTOIR" 7 | FROM v 8 | JOIN communes c 9 | ON v.insee_com = c.insee 10 | JOIN a 11 | ON v.insee_com = a.insee_com 12 | JOIN t 13 | ON v.insee_com = t.code_insee 14 | --JOIN tl 15 | --ON v.insee_com = tl.code_insee 16 | ORDER BY 6 17 | --ORDER BY (voies_rapprochees / t.voies_fantoir) desc -------------------------------------------------------------------------------- /anomalies_fantoir.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | # import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data_from_pg(conn,data_type,substitutions): 13 | with conn.cursor() as cur: 14 | with open(f"sql/{data_type}.sql",'r') as fq: 15 | str_query = fq.read() 16 | for s in substitutions: 17 | str_query = str_query.replace(s[0],s[1]) 18 | # print(str_query) 19 | cur.execute(str_query) 20 | return cur.fetchall() 21 | 22 | params = cgi.FieldStorage() 23 | dept = params['dept'].value 24 | # dept = '29' 25 | 26 | data = get_data_from_pg(db.bano_cache,'anomalies_fantoir',[['__dept__',dept]]) 27 | # data = get_data_from_pg(db.bano_cache,'anomalies_fantoir_point',[['__dept__',dept]]) 28 | # data_ligne = get_data(db.bano_cache,'anomalies_fantoir_ligne',[[dept,'__dept__']]) 29 | # data_polygone = get_data(db.bano_cache,'anomalies_fantoir_polygone',[[dept,'__dept__']]) 30 | # data_relation = get_data(db.bano_cache,'anomalies_fantoir_relation',[[dept,'__dept__']]) 31 | 32 | print("Content-Type: application/json\n") 33 | 34 | print(json.JSONEncoder().encode(data)) -------------------------------------------------------------------------------- /voies_recentes_manquantes_dept.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type,dept): 13 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 14 | with db.bano.cursor() as cur: 15 | cur.execute(fq.read().replace('__dept__',dept)) 16 | 17 | return cur.fetchall() 18 | 19 | def format_csv(fetch): 20 | return ('Département;Code INSEE;Commune;FANTOIR;Voie;Date de création;lon;lat\n'+'\n'.join([f'{c[0]};{c[1]};"{c[2]}";{c[4]};{c[3]};{c[7]};{c[5]};{c[6]}' for c in fetch])) 21 | 22 | params = cgi.FieldStorage() 23 | dept = params['dept'].value 24 | format = params.getvalue('format','json') 25 | 26 | if format == 'json': 27 | print("Content-Type: application/json\n") 28 | print(json.JSONEncoder().encode(get_data('voies_recentes_manquantes_dept',dept))) 29 | 30 | if format == 'csv': 31 | print(f'Content-Type: text/csv\nContent-Disposition: Attachment; filename="Dept {dept} - voies recentes manquantes.csv"\n') 32 | print(format_csv(get_data('voies_recentes_manquantes_dept',dept))) 33 | -------------------------------------------------------------------------------- /sql/places_rapprochees_insee.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | s 3 | AS 4 | (SELECT fantoir, 5 | id_statut 6 | FROM (SELECT *, 7 | rank() OVER (PARTITION BY fantoir ORDER BY timestamp_statut DESC) rang 8 | FROM statut_fantoir 9 | WHERE insee_com = '__com__')r 10 | WHERE rang = 1), 11 | c 12 | AS 13 | (SELECT *, 14 | CASE ld_osm 15 | WHEN 'city' THEN 1 16 | WHEN 'town' THEN 2 17 | WHEN 'suburb' THEN 3 18 | WHEN 'village' THEN 4 19 | WHEN 'quarter' THEN 5 20 | WHEN 'neighbourhood' THEN 6 21 | WHEN 'hamlet' THEN 7 22 | WHEN 'isolated_dwelling' THEN 8 23 | WHEN 'locality' THEN 99 24 | ELSE 98 25 | END tri 26 | FROM cumul_places 27 | WHERE insee_com ='__com__' AND 28 | fantoir IS NOT NULL AND 29 | source = 'OSM') 30 | SELECT c.fantoir, 31 | to_char(to_date(f.date_creation,'YYYYDDD'),'YYYY-MM-DD'), 32 | c.libelle_fantoir, 33 | CASE 34 | WHEN c.ld_osm IS NOT NULL THEN c.ld_osm||' : '||c.libelle_osm 35 | ELSE c.libelle_osm 36 | END, 37 | st_x(c.geometrie), 38 | st_y(c.geometrie), 39 | COALESCE(s.id_statut,0), 40 | c.ld_bati, 41 | CASE f.date_annul 42 | WHEN '0000000' THEN '1' 43 | ELSE -1 44 | END AS fantoir_annule 45 | FROM c 46 | JOIN fantoir_voie f 47 | ON c.fantoir = f.fantoir10 48 | LEFT OUTER JOIN s 49 | ON c.fantoir = s.fantoir 50 | ORDER BY tri,2; 51 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-duration.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: duration & countdown - updated 2/7/2015 (v2.19.0) */ 4 | !function(e){"use strict";e.tablesorter.addParser({id:"duration",is:function(){return!1},format:function(e,r){var t,n,s=r.config,i="",o="",a=s.durationLength||4,u=new Array(a+1).join("0"),d=(s.durationLabels||"(?:years|year|y),(?:days|day|d),(?:hours|hour|h),(?:minutes|minute|min|m),(?:seconds|second|sec|s)").split(/\s*,\s*/),c=d.length;if(!s.durationRegex){for(t=0;t> Saving last sort: "+t.sortList+v.benchmark(a))):(e.addClass("hasSaveSort"),n="",v.storage&&(n=g(t),l&&console.log('saveSort >> Last sort loaded: "'+n+'"'+v.benchmark(a)),e.bind("saveSortReset",function(t){t.stopPropagation(),v.storage(s,"tablesorter-savesort","")})),r&&n&&0 2 | 3 | 4 | 5 | Outils autour de BANO pour contribuer à OSM 6 | 7 | 8 |

Outils autour de BANO pour contribuer à OSM

9 | BANO sur le wiki OSM 10 |

11 | Le Rapprochement OSM/FANTOIR V2 permet de visualiser sous forme de liste les voies rapprochées et non rapprochées 12 |

13 | Liste des codes FANTOIR erronés V2 14 |

15 | Stats des rapprochements V2 16 |

17 | Voies non rapprochées avec un maximum d'adresses 18 |

19 | Voies recentes manquantes V2 20 |

21 | Mise à jour des données de population par commune 22 |

23 | Liste des cantons sans chef-lieu / rôle admin_centre 24 |

25 | le code source sur GitHub 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /sql/voies_seules_non_rapprochees_insee.sql: -------------------------------------------------------------------------------- 1 | SELECT f.fantoir10, 2 | to_char(to_date(f.date_creation,'YYYYDDD'),'YYYY-MM-DD'), 3 | f.nature_voie||' '||f.libelle_voie voie, 4 | '--', 5 | st_x(g.geometrie), 6 | st_y(g.geometrie), 7 | COALESCE(s.id_statut,0), 8 | 0::integer, -- adresses a proposer 9 | CASE f.date_annul 10 | WHEN '0000000' THEN '1' 11 | ELSE -1 12 | END AS fantoir_annule, 13 | f.caractere_annul 14 | FROM fantoir_voie f 15 | LEFT OUTER JOIN (SELECT fantoir 16 | FROM cumul_adresses 17 | WHERE insee_com = '__com__' AND 18 | source in ('OSM','BAN') 19 | UNION 20 | SELECT fantoir 21 | FROM cumul_voies 22 | WHERE insee_com = '__com__' AND 23 | source = 'OSM') o 24 | ON f.fantoir10 = o.fantoir 25 | LEFT OUTER JOIN (SELECT libelle, 26 | ST_Transform(ST_SetSRID(ST_Centroid(ST_Collect(ST_Centroid(geometrie))),900913),4326) geometrie 27 | FROM parcelles_noms 28 | WHERE insee_com = '__com__' 29 | GROUP BY 1)g 30 | ON f.nature_voie||' '||f.libelle_voie = g.libelle 31 | LEFT OUTER JOIN (SELECT fantoir,id_statut 32 | FROM (SELECT *,rank() OVER (PARTITION BY fantoir ORDER BY timestamp_statut DESC) rang 33 | FROM statut_fantoir 34 | WHERE insee_com = '__com__')r 35 | WHERE rang = 1) s 36 | ON f.fantoir10 = s.fantoir 37 | WHERE f.code_insee = '__com__' AND 38 | f.type_voie in ('1','2') AND 39 | f.date_annul = '0000000' AND 40 | o.fantoir IS NULL 41 | ORDER BY 2; 42 | -------------------------------------------------------------------------------- /requete_par_dept.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import os.path 7 | import sys 8 | import json 9 | 10 | import db 11 | 12 | def get_data(data_type,dept,cache_db): 13 | if cache_db: 14 | dbconn = db.bano_cache 15 | else: 16 | dbconn = db.bano 17 | with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),'sql/{:s}.sql'.format(data_type)),'r') as fq: 18 | with dbconn.cursor() as cur: 19 | cur.execute(fq.read().replace('__dept__',dept)) 20 | 21 | return cur.fetchall() 22 | 23 | def format_csv(fetch): 24 | return ('Département;Code INSEE;Commune;FANTOIR;Voie;Adresses à intégrer;lon;lat\n'+'\n'.join([f'{c[0]};{c[1]};"{c[2]}";{c[4]};{c[3]};{c[7]};{c[5]};{c[6]}' for c in fetch])) 25 | 26 | cache = True 27 | params = cgi.FieldStorage() 28 | dept = params['dept'].value 29 | requete = params['requete'].value 30 | format = params.getvalue('format','json') 31 | 32 | if 'cache' in params: 33 | cache = not(params['cache'].value.lower() == 'false') 34 | 35 | if format == 'json': 36 | print("Content-Type: application/json\n") 37 | print(json.JSONEncoder().encode([get_data('infos_dept',dept,True),get_data(requete,dept,cache)])) 38 | 39 | if format == 'csv': 40 | print(f'Content-Type: text/csv\nContent-Disposition: Attachment; filename="Dept {dept} - top adresses manquantes.csv"\n') 41 | print(format_csv(get_data(requete,dept,cache))) 42 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-ignore-articles.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: ignoreArticles - updated 9/15/2014 (v2.17.8) */ 4 | !function(o){"use strict";var g=o.tablesorter;g.ignoreArticles={en:"the, a, an",de:"der, die, das, des, dem, den, ein, eine, einer, eines, einem, einen",nl:"de, het, de, een",es:"el, la, lo, los, las, un, una, unos, unas",pt:"o, a, os, as, um, uma, uns, umas",fr:"le, la, l'_, les, un, une, des",it:"il, lo, la, l'_, i, gli, le, un', uno, una, un",hu:"a, az, egy"},g.addParser({id:"ignoreArticles",is:function(){return!1},format:function(e,r,s,a){var n,i,t,l=r.config,d=e||"";return l.headers&&l.headers[a]&&l.headers[a].ignoreArticlesRegex||(l.headers||(l.headers={}),l.headers[a]||(l.headers[a]={}),t=g.getData(l.$headers.eq(a),g.getColumnData(r,l.headers,a),"ignoreArticles"),n=(g.ignoreArticles[t]||"the, a, an")+"",l.headers[a].ignoreArticlesRegex=new RegExp("^("+o.trim(n.split(/\s*\,\s*/).join("\\s|")+"\\s").replace("_\\s","")+")","i"),i=g.getData(l.$headers.eq(a),g.getColumnData(r,l.headers,a),"ignoreArticlesExcept"),l.headers[a].ignoreArticlesRegex2=""!==i?new RegExp("^("+i.replace(/\s/g,"\\s")+")","i"):""),!(n=l.headers[a].ignoreArticlesRegex).test(d)||(i=l.headers[a].ignoreArticlesRegex2)&&i.test(d)?d:d.replace(n,"")},type:"text"})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-columns.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: columns - updated 5/24/2017 (v2.28.11) */ 4 | !function(b){"use strict";var v=b.tablesorter||{};v.addWidget({id:"columns",priority:65,options:{columns:["primary","secondary","tertiary"]},format:function(e,r,o){var t,s,n,i,a,d,l,c,h=r.$table,f=r.$tbodies,m=r.sortList,y=m.length,u=o&&o.columns||["primary","secondary","tertiary"],p=u.length-1;for(l=u.join(" "),s=0;s> Using",g?u:"cookies"),m.parseJSON&&(n=g?m.parseJSON(y[u][t]||"null")||{}:(a=O.cookie.split(/[;\s|=]/),0!==(s=m.inArray(t,a)+1)&&m.parseJSON(a[s]||"null")||{})),void 0===r||!y.JSON||!JSON.hasOwnProperty("stringify"))return n&&n[f]?n[f][_]:"";n[f]||(n[f]={}),n[f][_]=r,g?y[u][t]=JSON.stringify(n):((i=new Date).setTime(i.getTime()+31536e6),O.cookie=t+"="+JSON.stringify(n).replace(/\"/g,'"')+"; expires="+i.toGMTString()+"; path=/")}}(jQuery,window,document);return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-metric.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: metric */ 4 | !function(h){"use strict";var f={"Y|Yotta|yotta":[1e24,Math.pow(1024,8)],"Z|Zetta|zetta":[1e21,Math.pow(1024,7)],"E|Exa|exa":[1e18,Math.pow(1024,6)],"P|Peta|peta":[1e15,Math.pow(1024,5)],"T|Tera|tera":[1e12,Math.pow(1024,4)],"G|Giga|giga":[1e9,Math.pow(1024,3)],"M|Mega|mega":[1e6,Math.pow(1024,2)],"k|Kilo|kilo":[1e3,1024],"h|hecto":[100,100],"da|deka":[10,10],"d|deci":[.1,.1],"c|centi":[.01,.01],"m|milli":[.001,.001],"µ|micro":[1e-6,1e-6],"n|nano":[1e-9,1e-9],"p|pico":[1e-12,1e-12],"f|femto":[1e-15,1e-15],"a|atto":[1e-18,1e-18],"z|zepto":[1e-21,1e-21],"y|yocto":[1e-24,1e-24]},l=/^[b|bit|byte|o|octet]/i;h.tablesorter.addParser({id:"metric",is:function(){return!1},format:function(e,t,a,o){var r,i,c,n,m="m|meter",p=h.tablesorter.formatFloat(e.replace(/[^\w,. \-()]/g,""),t),d=t.config.$headerIndexed[o],s=d.data("metric");if(s||(r=(d.attr("data-metric-name")||m).split("|"),c=d.attr("data-metric-name-full")||"",n=d.attr("data-metric-name-abbr")||"",s=[c||r[1]||r[0].substring(1),n||r[0]],i=l.test(s.join("")),s[2]=new RegExp("(\\d+)(\\s+)?([Zz]etta|[Ee]xa|[Pp]eta|[Tt]era|[Gg]iga|[Mm]ega|kilo|hecto|deka|deci|centi|milli|micro|nano|pico|femto|atto|zepto|yocto)("+((""===c?"":c+"|"+n)||(i?s[0].toLowerCase()+"|"+s[0].toUpperCase():s[0])+"|"+(i?s[1].toLowerCase()+"|"+s[1].toUpperCase():s[1]))+")"),s[3]=new RegExp("(\\d+)(\\s+)?(Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|p|f|a|z|y)("+(n||(i?s[1].toLowerCase()+"|"+s[1].toUpperCase():s[1]))+")"),d.data("metric",s)),r=e.match(s[2])||e.match(s[3]))for(m in f)if(r[3].match(m))return i=l.test(r[4])?1:0,p*f[m][i];return p},type:"numeric"})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-date-extract.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: Extract out date - updated 10/26/2014 (v2.18.0) */ 4 | !function(e){"use strict";var a=/[A-Z]{3,10}\.?\s+\d{1,2},?\s+(?:\d{4})(?:\s+\d{1,2}:\d{2}(?::\d{2})?(?:\s+[AP]M)?)?/i,n=/(\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/i,i=/(\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/i,s=/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,d=/(\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/i,c=/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/; 5 | /*! extract US Long Date */e.tablesorter.addParser({id:"extractUSLongDate",is:function(){return!1},format:function(e){var t,r=e?e.match(a):e;return r&&(t=new Date(r[0]))instanceof Date&&isFinite(t)?t.getTime():e},type:"numeric"}), 6 | /*! extract MMDDYYYY */ 7 | e.tablesorter.addParser({id:"extractMMDDYYYY",is:function(){return!1},format:function(e){var t,r=e?e.replace(/\s+/g," ").replace(/[\-.,]/g,"/").match(n):e;return r&&(t=new Date(r[0]))instanceof Date&&isFinite(t)?t.getTime():e},type:"numeric"}), 8 | /*! extract DDMMYYYY */ 9 | e.tablesorter.addParser({id:"extractDDMMYYYY",is:function(){return!1},format:function(e){var t,r=e?e.replace(/\s+/g," ").replace(/[\-.,]/g,"/").match(i):e;return r&&(t=new Date(r[0].replace(s,"$2/$1/$3")))instanceof Date&&isFinite(t)?t.getTime():e},type:"numeric"}), 10 | /*! extract YYYYMMDD */ 11 | e.tablesorter.addParser({id:"extractYYYYMMDD",is:function(){return!1},format:function(e){var t,r=e?e.replace(/\s+/g," ").replace(/[\-.,]/g,"/").match(d):e;return r&&(t=new Date(r[0].replace(c,"$2/$3/$1")))instanceof Date&&isFinite(t)?t.getTime():e},type:"numeric"})}(jQuery);return jQuery;})); 12 | -------------------------------------------------------------------------------- /stats_dept.py: -------------------------------------------------------------------------------- 1 | #!./venv37/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import cgi 5 | import cgitb 6 | import json 7 | import sys 8 | 9 | import db 10 | 11 | def get_data_by_dept(data_type,dept): 12 | with open('sql/{:s}.sql'.format(data_type),'r') as fq: 13 | with db.bano.cursor() as cur: 14 | cur.execute(fq.read().replace('__dept__',f"{dept}")) 15 | return cur.fetchall() 16 | 17 | def get_data_by_dept_like(data_type,dept): 18 | with open('sql/{:s}.sql'.format(data_type),'r') as fq: 19 | with db.bano.cursor() as cur: 20 | cur.execute(fq.read().replace('__dept__',f"{dept}")) 21 | return cur.fetchall() 22 | 23 | def format_csv(fetch): 24 | return ('Code INSEE\tCommune\tPct certif BAN\tVoies avec adresses rapprochées (a)\tToutes voies rapprochées (b)...\t...dont voies rapprochées sur lieux-dits FANTOIR\tVoies FANTOIR (c)\tVoies et lieux-dits FANTOIR (d)\tVoies avec adresses voies FANTOIR (a/c) en %\tVoies rapprochées voies FANTOIR (b/c) en %\tVoies rapprochées voies et lieux-dits FANTOIR (b/d) en %\tAdresses OSM\tAdresses BAN\tAdresses BAN sans voie rapprochées\tAdresse BAN avec voie rapprochée en %\tIndice 2020\n'+'\n'.join([f'{c[0]}\t{c[1]}\t"{c[2]}"\t{c[3]}\t{c[4]}\t{c[5]}\t{c[6]}\t{c[7]}\t{c[8]}\t{c[9]}\t{c[10]}\t{c[11]}\t{c[12]}\t{c[13]}\t{c[14]}\t{c[15]}' for c in fetch])) 25 | 26 | cgitb.enable() 27 | params = cgi.FieldStorage() 28 | dept = params['dept'].value 29 | format = params.getvalue('format','json') 30 | 31 | if format == 'json': 32 | print("Content-Type: application/json\n") 33 | print(json.JSONEncoder().encode([get_data_by_dept('infos_dept',dept),get_data_by_dept_like('stats_dept',dept)])) 34 | 35 | if format == 'csv': 36 | print(f'Content-Type: text/csv\nContent-Disposition: Attachment; filename="Dept {dept} - statistiques BANO par commune.csv"\n') 37 | print(format_csv(get_data_by_dept_like('stats_dept',dept))) 38 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-named-numbers.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: namedNumbers - updated 10/26/2014 (v2.18.0) */ 4 | !function(d){"use strict";var g,v,c={negative:["negative","minus"],numbers:{zero:0,one:1,two:2,three:3,four:4,five:5,six:6,seven:7,eight:8,nine:9,ten:10,eleven:11,twelve:12,thirteen:13,fourteen:14,fifteen:15,sixteen:16,seventeen:17,eighteen:18,nineteen:19,twenty:20,thirty:30,forty:40,fourty:40,fifty:50,sixty:60,seventy:70,eighty:80,ninety:90},hundred:"hundred",powers:{thousand:1e3,million:1e6,billion:1e9,trillion:1e12,quadrillion:1e15,quintillion:1e18,sextillion:1e21,septillion:1e24,octillion:1e27,nonillion:1e30,decillion:1e33,undecillion:1e36,duodecillion:1e39,tredecillion:1e42,quattuordecillion:1e45,quindecillion:1e48,sexdecillion:1e51,septendecillion:1e54,octodecillion:1e57,novemdecillion:1e60,vigintillion:1e63,unvigintillion:1e66,duovigintillion:1e69,trevigintillion:1e72,quattuorvigintillion:1e75,quinvigintillion:1e78,sexvigintillion:1e81,septenvigintillion:1e84,octovigintillion:1e87,novemvigintillion:1e90,trigintillion:1e93,untrigintillion:1e96,duotrigintillion:1e99,googl:1e100}},f=new RegExp("("+c.negative.join("|")+")");d.tablesorter.addParser({id:"namedNumbers",is:function(){return!1},format:function(e,i){v=g=0;var n,t,l,o,r,u,s=(e||"").split(/[\s-]+/),a=s.length;for(n=0;n 2 | 29 |

39 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-file-type.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: filetype - updated 11/10/2015 (v2.24.4) */ 4 | !function(c){"use strict";c.tablesorter.fileTypes={separator:"|",equivalents:{"3D Image":"3dm|3ds|dwg|max|obj",Audio:"aif|aac|ape|flac|la|m4a|mid|midi|mp2|mp3|ogg|ra|raw|rm|wav|wma",Compressed:"7z|bin|cab|cbr|gz|gzip|iso|lha|lz|rar|tar|tgz|zip|zipx|zoo",Database:"csv|dat|db|dbf|json|ldb|mdb|myd|pdb|sql|tsv|wdb|wmdb|xlr|xls|xlsx|xml",Development:"asm|c|class|cls|cpp|cc|cs|cxx|cbp|cs|dba|fla|h|java|lua|pl|py|pyc|pyo|sh|sln|r|rb|vb",Document:"doc|docx|odt|ott|pages|pdf|rtf|tex|wpd|wps|wrd|wri",Executable:"apk|app|com|exe|gadget|lnk|msi",Fonts:"eot|fnt|fon|otf|ttf|woff",Icons:"ani|cur|icns|ico",Images:"bmp|gif|jpg|jpeg|jpe|jp2|pic|png|psd|tga|tif|tiff|wmf|webp",Presentation:"pps|ppt",Published:"chp|epub|lit|pub|ppp|fm|mobi",Script:"as|bat|cgi|cmd|jar|js|lua|scpt|scptd|sh|vbs|vb|wsf",Styles:"css|less|sass",Text:"info|log|md|markdown|nfo|tex|text|txt",Vectors:"awg|ai|eps|cdr|ps|svg",Video:"asf|avi|flv|m4v|mkv|mov|mp4|mpe|mpeg|mpg|ogg|rm|rv|swf|vob|wmv",Web:"asp|aspx|cer|cfm|htm|html|php|url|xhtml"}},c.tablesorter.addParser({id:"filetype",is:function(){return!1},format:function(t,e){var s,a=e.config.widgetOptions,p=a.group_separator||"-",r=t.lastIndexOf("."),i=c.tablesorter.fileTypes.separator,o=c.tablesorter.fileTypes.matching,n=c.tablesorter.fileTypes.equivalents;if(o||(s=[],c.each(n,function(t,e){s.push(e)}),o=c.tablesorter.fileTypes.matching=i+s.join(i)+i),0<=r&&(s=i+t.substring(r+1,t.length)+i,0<=o.indexOf(s)))for(r in n)if(0<=(i+n[r]+i).indexOf(s))return r+("/"!==p.toString().charAt(0)?a.group_separator:"-")+t;return t},type:"text"}),c.tablesorter.addParser({id:"file-extension",is:function(){return!1},format:function(t){var e,s=t.split(".");return s.length?(e=s.pop(),s.unshift(e),s.join(".")):t},type:"text"})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /css/tablesorter/highlights.min.css: -------------------------------------------------------------------------------- 1 | table.focus-highlight td:before,table.hover-highlight td:before{background:#fff}.focus-highlight .odd td:before,.focus-highlight .odd th:before,.hover-highlight .odd td:before,.hover-highlight .odd th:before{background:#ebf2fa}.focus-highlight .even td:before,.focus-highlight .even th:before,.hover-highlight .even td:before,.hover-highlight .even th:before{background-color:#fff}.focus-highlight td:focus::before,.focus-highlight th:focus::before{background-color:#add8e6}.focus-highlight td:focus::after,.focus-highlight th:focus::after{background-color:#add8e6}.focus-highlight .even td:focus,.focus-highlight .even th:focus,.focus-highlight .odd td:focus,.focus-highlight .odd th:focus,.focus-highlight td:focus,.focus-highlight th:focus{background-color:#d9d9d9;color:#333}table.hover-highlight tbody>tr.even:hover>td,table.hover-highlight tbody>tr.odd:hover>td,table.hover-highlight tbody>tr:hover>td{background-color:#ffa}.hover-highlight tbody tr td:hover::after,.hover-highlight tbody tr th:hover::after{background-color:#ffa}.focus-highlight td:focus::after,.focus-highlight th:focus::after,.hover-highlight td:hover::after,.hover-highlight th:hover::after{content:'';position:absolute;width:100%;height:999em;left:0;top:-555em;z-index:-1}.focus-highlight td:focus::before,.focus-highlight th:focus::before{content:'';position:absolute;width:999em;height:100%;left:-555em;top:0;z-index:-2}.focus-highlight,.hover-highlight{overflow:hidden}.focus-highlight td,.focus-highlight th,.hover-highlight td,.hover-highlight th{position:relative;outline:0}table.focus-highlight,table.focus-highlight tbody tr.even>td,table.focus-highlight tbody tr.even>th,table.focus-highlight tbody tr.odd>td,table.focus-highlight tbody tr.odd>th,table.focus-highlight tbody>tr>td,table.hover-highlight,table.hover-highlight tbody tr.even>td,table.hover-highlight tbody tr.even>th,table.hover-highlight tbody tr.odd>td,table.hover-highlight tbody tr.odd>th,table.hover-highlight tbody>tr>td{background:0 0}table.focus-highlight td:before,table.hover-highlight td:before{content:'';position:absolute;width:100%;height:100%;left:0;top:0;z-index:-3} -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-reflow.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | !function(u){"use strict";var h=u.tablesorter,w={init:function(e,t,l){var o,r=l.reflow_dataAttrib,a=l.reflow_headerAttrib,s=[];t.$table.addClass(l.reflow_className).off("refresh.tsreflow updateComplete.tsreflow2").on("refresh.tsreflow updateComplete.tsreflow2",function(){w.init(e,t,l)}),t.$headers.each(function(){o=u(this),s.push(u.trim(o.attr(a)||o.text()))}),t.$tbodies.children().each(function(){u(this).children().each(function(e){u(this).attr(r,s[e])})})},init2:function(e,t,l){var o,r,a,s,i,n,f=t.columns,c=l.reflow2_headerAttrib,d=[];for(t.$table.addClass(l.reflow2_className).off("refresh.tsreflow2 updateComplete.tsreflow2").on("refresh.tsreflow2 updateComplete.tsreflow2",function(){w.init2(e,t,l)}),a=0;a'+d[e][a]+""),a--}),h.processTbody(e,r,!1)})},remove:function(e,t,l){t.$table.removeClass(l.reflow_className)},remove2:function(e,t,l){t.$table.removeClass(l.reflow2_className)}};h.addWidget({id:"reflow",options:{reflow_className:"ui-table-reflow",reflow_headerAttrib:"data-name",reflow_dataAttrib:"data-title"},init:function(e,t,l,o){w.init(e,l,o)},remove:function(e,t,l){w.remove(e,t,l)}}),h.addWidget({id:"reflow2",options:{reflow2_className:"ui-table-reflow",reflow2_classIgnore:"ui-table-reflow-ignore",reflow2_headerAttrib:"data-name",reflow2_labelClass:"ui-table-cell-label",reflow2_labelTop:"ui-table-cell-label-top"},init:function(e,t,l,o){w.init2(e,l,o)},remove:function(e,t,l){w.remove2(e,t,l)}})}(jQuery);return jQuery;})); 4 | -------------------------------------------------------------------------------- /sql/create_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE statut_fantoir ( 2 | fantoir character varying(10), 3 | id_statut integer, 4 | timestamp_statut double precision, 5 | insee_com character(5)); 6 | 7 | CREATE INDEX idx_statut_fantoir_insee ON statut_fantoir(insee_com); 8 | CREATE INDEX idx_statut_fantoir_fantoir ON statut_fantoir(fantoir); 9 | 10 | CREATE TABLE labels_statuts_fantoir( 11 | id_statut integer primary key, 12 | tri integer default 0, 13 | label_statut character varying(200) 14 | ); 15 | 16 | INSERT INTO labels_statuts_fantoir (id_statut,tri,label_statut) 17 | VALUES (0,0,'Ok'), 18 | (1,1,'Erreur d''orthographe'), 19 | (2,2,'Divergence d''orthographe'), 20 | (3,3,'Nom différent'), 21 | (4,4,'Type de voie différent'), 22 | (5,5,'Voie doublon et type de voie différent'), 23 | (6,6,'Voie doublon avec orthographe différente'), 24 | (7,8,'Répétition du type de voie'), 25 | (8,9,'Nom introuvable sur le terrain'), 26 | (9,10,'Ancien nom supprimé sur le terrain'), 27 | (10,99,'Erreurs combinées'), 28 | (11,15,'Adresses hors périmètre'), 29 | (12,12,'Voie détruite'), 30 | (13,13,'Voie incorporée à une autre'), 31 | (14,14,'Voie inexistante'), 32 | (15,7,'Voie doublon (même type et même nom)'), 33 | (16,11,'Nom tronqué'), 34 | (17,16,'Erreur de commune'), 35 | (18,17,'FANTOIR annulé non remplacé'), 36 | (19,18,'Point cardinal superflu'), 37 | (20,19,'Voie en projet'); 38 | 39 | CREATE TABLE statut_numero ( 40 | numero text, 41 | fantoir character (10), 42 | source text, 43 | id_statut integer, 44 | timestamp_statut double precision, 45 | insee_com character(5)); 46 | CREATE INDEX idx_statut_numero_fantoir ON statut_numero(fantoir,numero); 47 | 48 | CREATE TABLE labels_statuts_numero( 49 | id_statut integer primary key, 50 | tri integer default 0, 51 | label_statut character varying(200) 52 | ); 53 | TRUNCATE labels_statuts_numero; 54 | INSERT INTO labels_statuts_numero (id_statut,tri,label_statut) 55 | VALUES (0,0,'Ok'), 56 | (1,1,'Adresse fictive en 5xxx'), 57 | (2,2,'Adresse fictive en 9xxx'), 58 | (3,3,'Adresse invisible sur le terrain'), 59 | (4,4,'Emplacement sur une autre voie'), 60 | (5,5,'Adresse en dehors de la commune'), 61 | (6,6,'Adresse doublon'); 62 | -------------------------------------------------------------------------------- /sql/top_adresses_manquantes.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | -- Fantoir -- 3 | fantoir 4 | AS 5 | (SELECT insee_com, 6 | c.fantoir 7 | FROM cumul_adresses c 8 | -- JOIN fantoir_voie f 9 | -- ON c.fantoir = fantoir10 10 | WHERE voie_autre IS NOT NULL AND 11 | c.fantoir IS NOT NULL AND 12 | -- f.type_voie in ('1','2') AND 13 | c.dept = '__dept__' 14 | EXCEPT 15 | (SELECT insee_com, 16 | fantoir 17 | FROM cumul_voies 18 | WHERE dept = '__dept__' 19 | UNION 20 | SELECT insee_com, 21 | fantoir 22 | FROM cumul_adresses 23 | WHERE voie_osm IS NOT NULL AND 24 | dept = '__dept__' 25 | UNION 26 | SELECT insee_com, 27 | fantoir 28 | FROM cumul_places 29 | WHERE libelle_osm IS NOT NULL AND 30 | dept = '__dept__')), 31 | -- Voies avec max adresses --------------- 32 | max 33 | AS 34 | (SELECT c.insee_com, 35 | c.fantoir, 36 | c.voie_autre, 37 | count(*) a_proposer 38 | FROM cumul_adresses c 39 | JOIN fantoir 40 | USING (fantoir) 41 | WHERE c.voie_autre IS NOT NULL 42 | GROUP BY 1,2,3 43 | ORDER BY 4 DESC 44 | LIMIT 200), 45 | -- statut FANTOIR --------------------- 46 | statut 47 | AS 48 | (SELECT s.*, 49 | RANK() OVER(PARTITION BY s.fantoir ORDER BY timestamp_statut DESC,id_statut DESC) rang 50 | FROM statut_fantoir s 51 | JOIN max 52 | USING (fantoir)), 53 | latest_statut 54 | AS 55 | (SELECT fantoir 56 | FROM statut 57 | WHERE rang = 1 AND 58 | id_statut != 0), 59 | -- Géometrie des voies du Cadastre ---- 60 | -- 1 point adresse arbitraire --------- 61 | geom 62 | AS 63 | (SELECT DISTINCT c.fantoir, 64 | FIRST_VALUE(geometrie) OVER(PARTITION BY c.fantoir) geometrie 65 | FROM cumul_adresses c 66 | JOIN max 67 | USING (fantoir)) 68 | -- Assemblage ------------------------- 69 | SELECT cog.dep, 70 | cog.com, 71 | cog.libelle, 72 | max.voie_autre, 73 | max.fantoir, 74 | st_x(geom.geometrie), 75 | st_y(geom.geometrie), 76 | max.a_proposer 77 | FROM max 78 | JOIN cog_commune cog 79 | ON insee_com = com 80 | JOIN geom 81 | USING (fantoir) 82 | LEFT OUTER JOIN latest_statut l 83 | ON max.fantoir = l.fantoir 84 | WHERE l.fantoir IS NULL AND 85 | cog.dep = '__dept__' 86 | ORDER BY a_proposer DESC 87 | LIMIT 200; 88 | -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-headerTitles.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: headerTitles - updated 11/10/2015 (v2.24.4) */ 4 | !function(d){"use strict";var n=d.tablesorter;n.addWidget({id:"headerTitles",options:{headerTitle_useAria:!1,headerTitle_tooltip:"",headerTitle_cur_text:[" sort: A - Z"," sort: Z - A","ly unsorted"],headerTitle_cur_numeric:[" sort: 0 - 9"," sort: 9 - 0","ly unsorted"],headerTitle_nxt_text:[" sort: A - Z"," sort: Z - A","remove sort"],headerTitle_nxt_numeric:[" sort: 0 - 9"," sort: 9 - 0","remove sort"],headerTitle_output_sorted:"current{current}; activate to {next}",headerTitle_output_unsorted:"current{current}; activate to {next} ",headerTitle_output_nosort:"No sort available",headerTitle_type:[],headerTitle_callback:null},init:function(e,t,r,a){r.$table.on("refreshHeaderTitle",function(){t.format(e,r,a)}),d.isArray(a.headerTitle_tooltip)?r.$headers.each(function(){d(this).addClass(a.headerTitle_tooltip[this.column]||"")}):""!==a.headerTitle_tooltip&&r.$headers.addClass(a.headerTitle_tooltip)},format:function(e,s,i){var l;s.$headers.each(function(){var t=d(this),e=parseInt(t.attr("data-column"),10),r=i.headerTitle_type[e]||s.parsers[e].type||"text",a=t.hasClass(n.css.sortAsc)?0:t.hasClass(n.css.sortDesc)?1:2,o=s.sortVars[e].order[(s.sortVars[e].count+1)%(s.sortReset?3:2)];l=i.headerTitle_useAria?t.attr("aria-label")||i.headerTitle_output_nosort||"":(l=(i.headerTitle_prefix||"")+(t.hasClass("sorter-false")?i.headerTitle_output_nosort:0<=n.isValueInArray(e,s.sortList)?i.headerTitle_output_sorted:i.headerTitle_output_unsorted)).replace(/\{(current|next|name)\}/gi,function(e){return{"{name}":t.text(),"{current}":i["headerTitle_cur_"+r][a]||"","{next}":i["headerTitle_nxt_"+r][o]||""}[e.toLowerCase()]}),t.attr("title",d.isFunction(i.headerTitle_callback)?i.headerTitle_callback(t,l):l)})},remove:function(e,t,r){t.$headers.attr("title",""),t.$table.off("refreshHeaderTitle"),d.isArray(r.headerTitle_tooltip)?t.$headers.each(function(){d(this).removeClass(r.headerTitle_tooltip[this.column]||"")}):""!==r.headerTitle_tooltip&&t.$headers.removeClass(r.headerTitle_tooltip)}})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /sql/voies_adresses_non_rapprochees_insee.sql: -------------------------------------------------------------------------------- 1 | WITH 2 | qualif_adresse 3 | AS 4 | (SELECT TRANSLATE(UPPER(numero),' ','') AS uppernumero, 5 | fantoir, 6 | id_statut 7 | FROM (SELECT *,rank() OVER (PARTITION BY numero,fantoir ORDER BY timestamp_statut DESC) rang 8 | FROM statut_numero 9 | WHERE insee_com = '__com__')r 10 | WHERE rang = 1), 11 | diff_numero_fantoir 12 | AS 13 | (SELECT uppernumero, 14 | fantoir 15 | FROM (SELECT TRANSLATE(UPPER(numero),' ','') AS uppernumero, 16 | fantoir 17 | FROM cumul_adresses 18 | WHERE insee_com = '__com__' AND 19 | source = 'BAN') c 20 | LEFT OUTER JOIN qualif_adresse q 21 | USING (uppernumero,fantoir) 22 | WHERE COALESCE(q.id_statut,0) = 0 23 | EXCEPT 24 | SELECT TRANSLATE(UPPER(numero),' ','') AS numero, 25 | fantoir 26 | FROM cumul_adresses 27 | WHERE insee_com = '__com__' AND 28 | source = 'OSM'), 29 | fantoir_numeros_manquants 30 | AS 31 | (SELECT DISTINCT fantoir,count(*) AS a_proposer FROM diff_numero_fantoir GROUP BY 1) 32 | SELECT fantoir10, 33 | to_char(to_date(f.date_creation,'YYYYDDD'),'YYYY-MM-DD'), 34 | nature_voie||' '||libelle_voie voie, 35 | j.voie_autre, 36 | st_x(g.geometrie), 37 | st_y(g.geometrie), 38 | COALESCE(s.id_statut,0), 39 | COALESCE(fm.a_proposer,0), 40 | CASE f.date_annul 41 | WHEN '0000000' THEN '1' 42 | ELSE -1 43 | END AS fantoir_annule, 44 | f.caractere_annul 45 | FROM fantoir_voie f 46 | JOIN (SELECT fantoir,voie_autre 47 | FROM cumul_adresses 48 | WHERE insee_com = '__com__' AND 49 | source = 'BAN' AND 50 | COALESCE(voie_osm,'') = '' 51 | EXCEPT 52 | SELECT fantoir,voie_autre 53 | FROM cumul_adresses 54 | WHERE insee_com = '__com__' AND 55 | source = 'OSM') j 56 | ON f.fantoir10 = j.fantoir 57 | JOIN (SELECT DISTINCT fantoir, 58 | FIRST_VALUE(geometrie) OVER(PARTITION BY fantoir) geometrie 59 | FROM cumul_adresses 60 | WHERE insee_com = '__com__' AND 61 | source = 'BAN') g 62 | ON g.fantoir = j.fantoir 63 | LEFT OUTER JOIN fantoir_numeros_manquants fm 64 | ON f.fantoir10 = fm.fantoir 65 | LEFT OUTER JOIN (SELECT fantoir,id_statut 66 | FROM (SELECT *,rank() OVER (PARTITION BY fantoir ORDER BY timestamp_statut DESC) rang 67 | FROM statut_fantoir 68 | WHERE insee_com = '__com__')r 69 | WHERE rang = 1) s 70 | ON j.fantoir = s.fantoir 71 | WHERE f.code_insee = '__com__' AND 72 | f.type_voie in ('1','2','B') AND 73 | f.date_annul = '0000000' 74 | ORDER BY 2; 75 | -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-mark.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: mark.js - updated 9/23/2016 (v2.27.7) */ 4 | !function(c){"use strict";var d=c.tablesorter;d.mark={init:function(r){if("function"==typeof c.fn.mark){var e,n=r.widgetOptions.mark_tsUpdate;r.$table.on("filterEnd.tsmark pagerComplete.tsmark"+(n?" "+n:""),function(e,t){d.mark.update(r,e.type===n?t:"")}),e="(?:<|=|>|\\||\"|\\'|\\s+(?:&&|-|"+(d.language.and||"and")+"|"+(d.language.or||"or")+"|"+(d.language.to||"to")+")\\s+)",d.mark.regex.filter=new RegExp(e,"gim")}else console.warn('Widget-mark not initialized: missing "jquery.mark.js"')},regex:{mark:/^mark_(.+)$/,pure:/^\/((?:\\\/|[^\/])+)\/([mig]{0,3})?$/},checkRegex:function(e){if(e instanceof RegExp){var t="".match(e);return null===t||t.length<5}return!1},cleanMatches:function(e){for(var t=[],r=e&&e.length||0;r--;)""!==e[r]&&(t[t.length]=e[r]);return t},ignoreColumns:function(e){for(var t=e.widgetOptions,r=e.columns,n=[];r--;)(t.mark_tsIgnore[r]||c(e.$headerIndexed[r]).hasClass("mark-ignore"))&&(n[n.length]=":nth-child("+(r+1)+")");return n.length?":not("+n.join(",")+")":""},update:function(o,e){var l={},g=o.widgetOptions,m=d.mark.regex,s=o.$table.find("tbody tr").unmark().not("."+(o.widgetOptions.filter_filteredRow||"filtered"));e=e||c.tablesorter.getFilters(o.$table),c.each(o.widgetOptions,function(e,t){var r=e.match(m.mark);r&&void 0!==r[1]&&(l[r[1]]=t)}),c.each(e,function(e,t){if(t&&!c(o.$headerIndexed[e]).hasClass("mark-ignore")&&!g.mark_tsIgnore[e]){var r=null,n=t,a=!1,i=e===o.columns?d.mark.ignoreColumns(o):":nth-child("+(e+1)+")";if(m.pure.test(t)){".*"===(n=m.pure.exec(t))[1]&&(n[1]="");try{r=new RegExp(n[1],"gim"),n=new RegExp(n[1],n[2])}catch(e){n=null}return void(d.mark.checkRegex(r)&&s.children(i).markRegExp(n,l))}n=0===t.indexOf("~")?(a=!0,t.replace(/~/g,"").split("")):(-1",{href:"#","class":i,"data-view-type":e,title:t.title});a.append(r("",{"class":t.icon})),n.append(a)}),n.find("."+o.view_switcher_class).on("click",function(e){if(e.preventDefault(),r(this).hasClass("active"))return!1;n.find("."+o.view_switcher_class).removeClass("active"),r(this).addClass("active"),o.view_layout=r(this).attr("data-view-type"),!0===o.view_layouts[o.view_layout].raw?(c.remove(t,o),c.buildToolBar(t,o)):(!1===l&&c.hideTable(t,o),c.buildView(t,o))})},removeToolBar:function(e,t){r(t.view_toolbar).empty(),c.removeCaption(e,t)},buildView:function(e,t){c.removeView(e,t);var a=t.view_layouts[t.view_layout],o=r(a.container,{"class":t.view_layout});n.getColumnText(e.$table,0,function(e){var l=a.tmpl;r.each(r(e.$row).find("td"),function(e,t){var i={},a="{col"+e+"}";r.each(t.attributes,function(e,t){i[t.nodeName]=t.nodeValue});var o=r(t).html(),n=r("").append(r("",i).append(o));l=l.replace(new RegExp(a,"g"),n.html()),a="{col"+e+":raw}",l=l.replace(new RegExp(a,"g"),r(t).text())});var i=r(l);r.each(e.$row[0].attributes,function(e,t){"class"===t.nodeName?i.attr(t.nodeName,i.attr(t.nodeName)+" "+t.nodeValue):i.attr(t.nodeName,t.nodeValue)}),o.append(i)}),r(t.view_container).append(o),e.$table.triggerHandler("viewComplete")},removeView:function(e,t){r(t.view_container).empty()},hideTable:function(e){i=e.$table.css("position"),a=e.$table.css("bottom"),o=e.$table.css("left"),e.$table.css({position:"absolute",top:"-10000px",left:"-10000px"}),l=!0},init:function(e,t){!1!==t.view_layout&&void 0!==t.view_layouts[t.view_layout]&&(!1===l&&c.hideTable(e,t),e.$table.on("tablesorter-ready",function(){c.buildToolBar(e,t),c.buildView(e,t)}))},remove:function(e,t){c.removeToolBar(e,t),c.removeView(e,t),e.$table.css({position:i,top:a,left:o}),l=!1}};n.addWidget({id:"view",options:{view_toolbar:"#ts-view-toolbar",view_container:"#ts-view",view_caption:"#ts-view-caption",view_switcher_class:"ts-view-switcher",view_layout:!1,view_layouts:{}},init:function(e,t,i,a){c.init(i,a)},remove:function(e,t,i){c.remove(t,i)}})}(jQuery);return jQuery;})); 4 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-date-range.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: date ranges -updated 11/22/2015 (v2.24.6) */ 4 | !function(e){"use strict";var u,f=e.tablesorter,i=/(\d{1,2}[-\s]\d{1,2}[-\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,d=/(\d{1,2}[-\s]\d{1,2}[-\s]\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,o=/(\d{1,2})[-\s](\d{1,2})[-\s](\d{4})/,c=/(\d{4}[-\s]\d{1,2}[-\s]\d{1,2}(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?)/gi,g=/(\d{4})[-\s](\d{1,2})[-\s](\d{1,2})/,l=/(\d{1,2}\s+\w+\s+\d{4}(\s+\d{1,2}:\d{2}(:\d{2})?(\s\w+)?)?)/g,p=/(\d{1,2})\s+(\w+)\s+(\d{4})/; 5 | /*! date-range MMDDYYYY */e.tablesorter.addParser({id:"date-range-mdy",is:function(){return!1},format:function(e){var t,r,a,n,s=[];if(n=(r=e.replace(/\s+/g," ").replace(/[\/\-.,]/g,"-").match(i))&&r.length){for(a=0;a").append(t.$table.clone()),o=s.basicStyle+"table { width: 100%; }."+(p.css.filterRow||"tablesorter-filter-row")+", ."+(e.filter_filteredRow||"filtered")+" { display: none; }."+(p.css.header||"tablesorter-header")+" { background-image: none !important; }@media print { .print_widget_hidden { display: none; } }";r.find("["+e.print_dataAttrib+"]").each(function(){(i=a(this)).text(i.attr(e.print_dataAttrib))}),n="data-"+(e.lazyload_data_attribute||"original"),r.find("img["+n+"]").each(function(){(i=a(this)).attr("src",i.attr(n))}),/^f/i.test(e.print_rows)?o+="tbody tr:not(."+(e.filter_filteredRow||"filtered")+") { display: table-row !important; }":/^a/i.test(e.print_rows)?o+="tbody tr { display: table-row !important; }":/^[.#:\[]/.test(e.print_rows)&&(o+="tbody tr"+e.print_rows+" { display: table-row !important; }"),/s/i.test(e.print_columns)&&t.selector&&p.hasWidget(t.table,"columnSelector")?o+=e.columnSelector_mediaquery&&t.selector.auto?"":t.selector.$style.text():/a/i.test(e.print_columns)&&(o+="td, th { display: table-cell !important; }"),o+=e.print_extraCSS,a.isFunction(e.print_callback)?e.print_callback(t,r,o):s.printOutput(t,r.html(),o)},printOutput:function(t,e,i){var n=t.widgetOptions,r=p.language,o=window.open("",n.print_title,s.popupStyle),a=n.print_title||t.$table.find("caption").text()||t.$table[0].id||document.title||"table",l=n.print_now?"":'";return o.document.write(""+a+""+(n.print_styleSheet?'':"")+""+l+e+""),o.document.close(),n.print_now&&setTimeout(function(){o.print(),o.close()},10),!0},remove:function(t){t.$table.off(s.event)}};p.language.button_close="Close",p.language.button_print="Print",p.addWidget({id:"print",options:{print_title:"",print_dataAttrib:"data-name",print_rows:"filtered",print_columns:"selected",print_extraCSS:"",print_styleSheet:"",print_now:!0,print_callback:null},init:function(t,e,i){s.init(i)},remove:function(t,e){s.remove(e)}})}(jQuery);return jQuery;})); 4 | -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-filter-formatter-select2.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: filter, select2 formatter function - updated 12/1/2019 (v2.31.2) */ 4 | !function(g){"use strict";var h=g.tablesorter||{};h.filterFormatter=h.filterFormatter||{},h.filterFormatter.select2=function(i,c,e){function t(){a=[],l=h.filter.getOptionSource(s.$table[0],c,f)||[],g.each(l,function(e,t){a.push({id:""+t.parsed,text:t.text})}),n.data=a}var l,a,n=g.extend({cellText:"",match:!0,value:"",multiple:!0,width:"100%"},e),s=i.addClass("select2col"+c).closest("table")[0].config,d=s.widgetOptions,r=g('').appendTo(i).bind("change"+s.namespace+"filter",function(){var e=v(this.value);s.$table.find(".select2col"+c+" .select2").select2("val",e),$()}),o=s.$headerIndexed[c],f=o.hasClass(d.filter_onlyAvail),p=n.match?"":"^",u=n.match?"":"$",b=d.filter_ignoreCase?"i":"",v=function(e){return e.replace(/^\/\(\^?/,"").replace(/\$\|\^/g,"|").replace(/\$?\)\/i?$/g,"").replace(/\\/g,"").split("|")},$=function(){var e=!1,t=s.$table.find(".select2col"+c+" .select2").select2("val")||n.value||"";g.isArray(t)&&(e=!0,t=t.join("\0"));var l=t.replace(/[-[\]{}()*+?.,/\\^$|#]/g,"\\$&");e&&(t=t.split("\0"),l=l.split("\0")),h.isEmptyObject(i.find(".select2").data())||(r.val(g.isArray(l)&&l.length&&""!==l.join("")?"/("+p+(l||[]).join(u+"|"+p)+u+")/"+b:"").trigger("search"),i.find(".select2").select2("val",t),s.widgetOptions.$sticky&&s.widgetOptions.$sticky.find(".select2col"+c+" .select2").select2("val",t))};return o.toggleClass("filter-match",n.match),n.cellText&&i.prepend(""),n.ajax&&!g.isEmptyObject(n.ajax)||n.data||(t(),s.$table.bind("filterEnd",function(){t(),s.$table.find(".select2col"+c).add(s.widgetOptions.$sticky&&s.widgetOptions.$sticky.find(".select2col"+c)).find(".select2").select2(n)})),g('').val(n.value).appendTo(i).select2(n).bind("change",function(){$()}),s.$table.bind("filterFomatterUpdate",function(){var e=v(s.$table.data("lastSearch")[c]||"");(i=s.$table.find(".select2col"+c)).find(".select2").select2("val",e),$(),h.filter.formatterUpdated(i,c)}),s.$table.bind("stickyHeadersInit",function(){var e=s.widgetOptions.$sticky.find(".select2col"+c).empty();g('').val(n.value).appendTo(e).select2(n).bind("change",function(){s.$table.find(".select2col"+c).find(".select2").select2("val",s.widgetOptions.$sticky.find(".select2col"+c+" .select2").select2("val")),$()}),n.cellText&&e.prepend("")}),s.$table.bind("filterReset",function(){s.$table.find(".select2col"+c).find(".select2").select2("val",n.value||""),setTimeout(function(){$()},0)}),$(),r}}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/parsers/parser-network.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Parser: network - updated 2018-01-10 (v2.29.3) */ 4 | !function(d){"use strict";var e,t,o=d.tablesorter; 5 | /*! IPv6 Address parser (WIP) */d.extend(o.regex,{},{ipv4Validate:/((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})/,ipv4Extract:/([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/,ipv6Validate:/^\s*((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/i}),o.defaults.ipv6HexFormat=!1,o.addParser({id:"ipv6Address",is:function(d){return o.regex.ipv6Validate.test(d)},format:function(d,e){var t,a,r,i,f,s=!!e&&("boolean"==typeof e?e:e&&e.config.ipv6HexFormat||!1),n="",p="";if(d=d.replace(/\s*/g,""),o.regex.ipv4Validate.test(d)){for(i=d.match(o.regex.ipv4Extract),a="",t=1;ttr.hover>td,.tablesorter-jui tbody>tr:hover>td{opacity:.7}.tablesorter-jui .tablesorter-processing .tablesorter-header-inner{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-jui tr.ui-state-default{background-image:none;font-weight:400}.tablesorter-jui .tablesorter-processing{background-color:#ddd;background-color:rgba(255,255,255,.8)}.tablesorter-jui>caption{border:0}.tablesorter-jui .tablesorter-filter-row{background-color:transparent}.tablesorter-jui .tablesorter-filter-row td{background-color:transparent;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-jui .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-jui .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-jui .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-jui input.tablesorter-filter,.tablesorter-jui select.tablesorter-filter{width:98%;height:auto;margin:0;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-alignChar.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: alignChar - updated 2/7/2015 (v2.19.0) */ 4 | !function(_){"use strict";var e=_.tablesorter;e.alignChar={init:function(i,t,r){t.$headers.filter("["+r.alignChar_charAttrib+"]").each(function(){var n=_(this),a={column:this.column,align:n.attr(r.alignChar_charAttrib),alignIndex:parseInt(n.attr(r.alignChar_indexAttrib)||0,10),adjust:parseFloat(n.attr(r.alignChar_adjustAttrib))||0};a.regex=new RegExp("\\"+a.align,"g"),void 0!==a.align&&(r.alignChar_savedVars[this.column]=a,e.alignChar.setup(i,t,r,a))})},setup:function(n,a,i,t){if(!_.isEmptyObject(a.cache)){var r,e,l,h,g,o,s,d,c,u,f,m,p,C,w=[],b=[];for(r=0;r=c?"":d||""),b.push(1<=c&&t.alignIndex>=c&&d||""))}for(f=_.extend([],w).sort(function(n,a){return a.length-n.length})[0],m=_.extend([],b).sort(function(n,a){return a.length-n.length})[0],t.width=t.width||Math.floor(f.length/(f.length+m.length)*100)+t.adjust,f="min-width:"+t.width+"%",m="min-width:"+(100-t.width)+"%",r=0;r'+w[e]+''+(g.length?p+g:"")+"");i.alignChar_initialized=!0}},remove:function(n,a,i){var t,r,e,l,h;if(!_.isEmptyObject(a.cache))for(t=0;ttr.even:hover>td,.tablesorter-dark tbody>tr.hover>td,.tablesorter-dark tbody>tr.odd:hover>td,.tablesorter-dark tbody>tr:hover>td{background-color:#000}.tablesorter-dark .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-dark tr.odd>td{background-color:#202020}.tablesorter-dark tr.even>td{background-color:#101010}.tablesorter-dark td.primary,.tablesorter-dark tr.odd td.primary{background-color:#0a0a0a}.tablesorter-dark tr.even td.primary{background-color:#050505}.tablesorter-dark td.secondary,.tablesorter-dark tr.odd td.secondary{background-color:#0f0f0f}.tablesorter-dark tr.even td.secondary{background-color:#0a0a0a}.tablesorter-dark td.tertiary,.tablesorter-dark tr.odd td.tertiary{background-color:#191919}.tablesorter-dark tr.even td.tertiary{background-color:#0f0f0f}.tablesorter-dark>caption{background-color:#202020}.tablesorter-dark .tablesorter-filter-row{background-color:#202020}.tablesorter-dark .tablesorter-filter-row td{background-color:#202020;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-dark .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-dark .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-dark .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-dark input.tablesorter-filter,.tablesorter-dark select.tablesorter-filter{width:98%;height:auto;margin:0;padding:4px;background-color:#111;border:1px solid #222;color:#ddd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /liste_brute_fantoir.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Listes FANTOIR par commune 5 | 6 | 7 | 8 | 9 | 10 | 11 | 77 | 78 | 79 |
80 | 81 |
82 | 83 |
84 | Commune : 85 |
86 | 87 | 88 |
89 |
90 | 91 |
92 |
93 |
94 |
95 |
96 | 97 |
98 | 99 |
100 |
101 | 102 |
103 |
104 | 105 |
106 | 107 |
108 | 109 | 110 | -------------------------------------------------------------------------------- /css/tablesorter/theme.blackice.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-blackice{width:100%;margin-right:auto;margin-left:auto;font:11px/18px Arial,Sans-serif;text-align:left;background-color:#000;border-collapse:collapse;border-spacing:0}.tablesorter-blackice th,.tablesorter-blackice thead td{padding:4px;font:13px/20px Arial,Sans-serif;font-weight:700;color:#e5e5e5;text-align:left;text-shadow:0 1px 0 rgba(0,0,0,.7);background-color:#111;border:1px solid #232323}.tablesorter-blackice .header,.tablesorter-blackice .tablesorter-header{padding:4px 20px 4px 4px;cursor:pointer;background-image:url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);background-position:center right;background-repeat:no-repeat}.tablesorter-blackice .headerSortUp,.tablesorter-blackice .tablesorter-headerAsc,.tablesorter-blackice .tablesorter-headerSortUp{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);color:#fff}.tablesorter-blackice .headerSortDown,.tablesorter-blackice .tablesorter-headerDesc,.tablesorter-blackice .tablesorter-headerSortDown{color:#fff;background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7)}.tablesorter-blackice thead .sorter-false{background-image:none;cursor:default;padding:4px}.tablesorter-blackice tfoot .tablesorter-headerAsc,.tablesorter-blackice tfoot .tablesorter-headerDesc,.tablesorter-blackice tfoot .tablesorter-headerSortDown,.tablesorter-blackice tfoot .tablesorter-headerSortUp{background-image:none}.tablesorter-blackice td{padding:4px;color:#ccc;vertical-align:top;background-color:#333;border:1px solid #232323}.tablesorter-blackice tbody>tr.even:hover>td,.tablesorter-blackice tbody>tr.hover>td,.tablesorter-blackice tbody>tr.odd:hover>td,.tablesorter-blackice tbody>tr:hover>td{background-color:#000}.tablesorter-blackice .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-blackice tr.odd>td{background-color:#333}.tablesorter-blackice tr.even>td{background-color:#393939}.tablesorter-blackice td.primary,.tablesorter-blackice tr.odd td.primary{background-color:#2f3a40}.tablesorter-blackice tr.even td.primary{background-color:#3f4a50}.tablesorter-blackice td.secondary,.tablesorter-blackice tr.odd td.secondary{background-color:#3f4a50}.tablesorter-blackice tr.even td.secondary{background-color:#4f5a60}.tablesorter-blackice td.tertiary,.tablesorter-blackice tr.odd td.tertiary{background-color:#4f5a60}.tablesorter-blackice tr.even td.tertiary{background-color:#5a646b}.tablesorter-blackice>caption{background-color:#fff}.tablesorter-blackice .tablesorter-filter-row{background-color:#222}.tablesorter-blackice .tablesorter-filter-row td{background-color:#222;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-blackice .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-blackice .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-blackice .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-blackice input.tablesorter-filter,.tablesorter-blackice select.tablesorter-filter{width:98%;height:auto;margin:0;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /css/tablesorter/theme.default.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-default{width:100%;font:12px/18px Arial,Sans-serif;color:#333;background-color:#fff;border-spacing:0;margin:10px 0 15px;text-align:left}.tablesorter-default th,.tablesorter-default thead td{font-weight:700;color:#000;background-color:#fff;border-collapse:collapse;border-bottom:#ccc 2px solid;padding:0}.tablesorter-default tfoot td,.tablesorter-default tfoot th{border:0}.tablesorter-default .header,.tablesorter-default .tablesorter-header{background-image:url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);background-position:center right;background-repeat:no-repeat;cursor:pointer;white-space:normal;padding:4px 20px 4px 4px}.tablesorter-default thead .headerSortUp,.tablesorter-default thead .tablesorter-headerAsc,.tablesorter-default thead .tablesorter-headerSortUp{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);border-bottom:#000 2px solid}.tablesorter-default thead .headerSortDown,.tablesorter-default thead .tablesorter-headerDesc,.tablesorter-default thead .tablesorter-headerSortDown{background-image:url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);border-bottom:#000 2px solid}.tablesorter-default thead .sorter-false{background-image:none;cursor:default;padding:4px}.tablesorter-default tfoot .tablesorter-headerAsc,.tablesorter-default tfoot .tablesorter-headerDesc,.tablesorter-default tfoot .tablesorter-headerSortDown,.tablesorter-default tfoot .tablesorter-headerSortUp{border-top:#000 2px solid}.tablesorter-default td{background-color:#fff;border-bottom:#ccc 1px solid;padding:4px;vertical-align:top}.tablesorter-default tbody>tr.even:hover>td,.tablesorter-default tbody>tr.hover>td,.tablesorter-default tbody>tr.odd:hover>td,.tablesorter-default tbody>tr:hover>td{background-color:#fff;color:#000}.tablesorter-default .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-default tr.odd>td{background-color:#dfdfdf}.tablesorter-default tr.even>td{background-color:#efefef}.tablesorter-default tr.odd td.primary{background-color:#bfbfbf}.tablesorter-default td.primary,.tablesorter-default tr.even td.primary{background-color:#d9d9d9}.tablesorter-default tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-default td.secondary,.tablesorter-default tr.even td.secondary{background-color:#e6e6e6}.tablesorter-default tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-default td.tertiary,.tablesorter-default tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-default>caption{background-color:#fff}.tablesorter-default .tablesorter-filter-row{background-color:#eee}.tablesorter-default .tablesorter-filter-row td{background-color:#eee;border-bottom:#ccc 1px solid;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-default .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-default .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-default .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-default input.tablesorter-filter,.tablesorter-default select.tablesorter-filter{width:95%;height:auto;margin:4px auto;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-uitheme.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: uitheme - updated 2018-03-18 (v2.30.0) */ 4 | !function(A){"use strict";var N=A.tablesorter||{};N.themes={bootstrap:{table:"table table-bordered table-striped",caption:"caption",header:"bootstrap-header",sortNone:"",sortAsc:"",sortDesc:"",active:"",hover:"",icons:"",iconSortNone:"bootstrap-icon-unsorted",iconSortAsc:"glyphicon glyphicon-chevron-up",iconSortDesc:"glyphicon glyphicon-chevron-down",filterRow:"",footerRow:"",footerCells:"",even:"",odd:""},jui:{table:"ui-widget ui-widget-content ui-corner-all",caption:"ui-widget-content",header:"ui-widget-header ui-corner-all ui-state-default",sortNone:"",sortAsc:"",sortDesc:"",active:"ui-state-active",hover:"ui-state-hover",icons:"ui-icon",iconSortNone:"ui-icon-carat-2-n-s ui-icon-caret-2-n-s",iconSortAsc:"ui-icon-carat-1-n ui-icon-caret-1-n",iconSortDesc:"ui-icon-carat-1-s ui-icon-caret-1-s",filterRow:"",footerRow:"",footerCells:"",even:"ui-widget-content",odd:"ui-state-default"}},A.extend(N.css,{wrapper:"tablesorter-wrapper"}),N.addWidget({id:"uitheme",priority:10,format:function(e,o,t){var s,r,i,a,n,c,l,d,h,m,u,p,v,f=N.themes,b=o.$table.add(A(o.namespace+"_extra_table")),C=o.$headers.add(A(o.namespace+"_extra_headers")),w=o.theme||"jui",S=f[w]||{},g=A.trim([S.sortNone,S.sortDesc,S.sortAsc,S.active].join(" ")),j=A.trim([S.iconSortNone,S.iconSortDesc,S.iconSortAsc].join(" ")),D=N.debug(o,"uitheme");for(D&&(n=new Date),b.hasClass("tablesorter-"+w)&&o.theme===o.appliedTheme&&t.uitheme_applied||(t.uitheme_applied=!0,m=f[o.appliedTheme]||{},u=(v=!A.isEmptyObject(m))?[m.sortNone,m.sortDesc,m.sortAsc,m.active].join(" "):"",p=v?[m.iconSortNone,m.iconSortDesc,m.iconSortAsc].join(" "):"",v&&(t.zebra[0]=A.trim(" "+t.zebra[0].replace(" "+m.even,"")),t.zebra[1]=A.trim(" "+t.zebra[1].replace(" "+m.odd,"")),o.$tbodies.children().removeClass([m.even,m.odd].join(" "))),S.even&&(t.zebra[0]+=" "+S.even),S.odd&&(t.zebra[1]+=" "+S.odd),b.children("caption").removeClass(m.caption||"").addClass(S.caption),d=b.removeClass((o.appliedTheme?"tablesorter-"+(o.appliedTheme||""):"")+" "+(m.table||"")).addClass("tablesorter-"+w+" "+(S.table||"")).children("tfoot"),o.appliedTheme=o.theme,d.length&&d.children("tr").removeClass(m.footerRow||"").addClass(S.footerRow).children("th, td").removeClass(m.footerCells||"").addClass(S.footerCells),C.removeClass((v?[m.header,m.hover,u].join(" "):"")||"").addClass(S.header).not(".sorter-false").unbind("mouseenter.tsuitheme mouseleave.tsuitheme").bind("mouseenter.tsuitheme mouseleave.tsuitheme",function(e){A(this)["mouseenter"===e.type?"addClass":"removeClass"](S.hover||"")}),C.each(function(){var e=A(this);e.find("."+N.css.wrapper).length||e.wrapInner('
')}),o.cssIcon&&C.find("."+N.css.icon).removeClass(v?[m.icons,p].join(" "):"").addClass(S.icons||""),N.hasWidget(o.table,"filter")&&(r=function(){b.children("thead").children("."+N.css.filterRow).removeClass(v&&m.filterRow||"").addClass(S.filterRow||"")},t.filter_initialized?r():b.one("filterInit",function(){r()}))),s=0;s> Applied "+w+" theme"+N.benchmark(n))},remove:function(e,o,t,s){if(t.uitheme_applied){var r=o.$table,i=o.appliedTheme||"jui",a=N.themes[i]||N.themes.jui,n=r.children("thead").children(),c=a.sortNone+" "+a.sortDesc+" "+a.sortAsc,l=a.iconSortNone+" "+a.iconSortDesc+" "+a.iconSortAsc;r.removeClass("tablesorter-"+i+" "+a.table),t.uitheme_applied=!1,s||(r.find(N.css.header).removeClass(a.header),n.unbind("mouseenter.tsuitheme mouseleave.tsuitheme").removeClass(a.hover+" "+c+" "+a.active).filter("."+N.css.filterRow).removeClass(a.filterRow),n.find("."+N.css.icon).removeClass(a.icons+" "+l))}}})}(jQuery);return jQuery;})); 5 | -------------------------------------------------------------------------------- /js/tablesorter/widgets/widget-sort2Hash.min.js: -------------------------------------------------------------------------------- 1 | (function(factory){if (typeof define === 'function' && define.amd){define(['jquery'], factory);} else if (typeof module === 'object' && typeof module.exports === 'object'){module.exports = factory(require('jquery'));} else {factory(jQuery);}}(function(jQuery){ 2 | 3 | /*! Widget: sort2Hash (BETA) - updated 9/27/2017 (v2.29.0) */ 4 | !function(g){"use strict";var p=g.tablesorter||{},u=p.sort2Hash={init:function(e,t){var a,r,o,s,n=e.table,i=e.pager,h=p.hasWidget(n,"saveSort"),l=u.decodeHash(e,t,"sort");(l&&!h||l&&h&&t.sort2Hash_overrideSaveSort)&&u.convertString2Sort(e,t,l),p.hasWidget(e.table,"pager")&&(r=parseInt(u.decodeHash(e,t,"page"),10),o=i.page=r<0?0:r>i.totalPages?i.totalPages-1:r,s=i.size=parseInt(u.decodeHash(e,t,"size"),10)),p.hasWidget(n,"filter")&&(a=u.decodeHash(e,t,"filter"))&&(a=a.split(t.sort2Hash_separator),e.$table.one("tablesorter-ready",function(){setTimeout(function(){e.$table.one("filterEnd",function(){g(this).triggerHandler("pageAndSize",[o,s])}),(r=p.filter.equalFilters?p.filter.equalFilters(e,e.lastSearch,a):(e.lastSearch||[]).join("")!==(a||[]).join(""))||g.tablesorter.setFilters(n,a,!0)},100)})),a||e.$table.one("tablesorter-ready",function(){e.$table.triggerHandler("pageAndSize",[o,s])}),e.$table.on("sortEnd.sort2hash filterEnd.sort2hash pagerComplete.sort2Hash",function(){this.hasInitialized&&u.setHash(this.config,this.config.widgetOptions)})},getTableId:function(e,t){return t.sort2Hash_tableId||e.table.id||"table"+g("table").index(e.$table)},regexEscape:function(e){return e.replace(/([\.\^\$\*\+\-\?\(\)\[\]\{\}\\\|])/g,"\\$1")},convertString2Sort:function(e,t,a){for(var r,o,s,n,i,h,l=a.split(t.sort2Hash_separator),d=0,c=l.length,H=[];de.columns)for(r=new RegExp("("+u.regexEscape(o)+")","i"),i=0;itr.even.hover>td,.tablesorter-blue tbody>tr.even:hover+tr.tablesorter-childRow+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr.even:hover+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr.even:hover>td,.tablesorter-blue tbody>tr.hover>td,.tablesorter-blue tbody>tr:hover+tr.tablesorter-childRow+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr:hover+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr:hover>td{background-color:#d9d9d9}.tablesorter-blue tbody>tr.odd.hover>td,.tablesorter-blue tbody>tr.odd:hover+tr.tablesorter-childRow+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr.odd:hover+tr.tablesorter-childRow>td,.tablesorter-blue tbody>tr.odd:hover>td{background-color:#bfbfbf}.tablesorter-blue .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-blue tbody tr.odd>td{background-color:#ebf2fa}.tablesorter-blue tbody tr.even>td{background-color:#fff}.tablesorter-blue td.primary,.tablesorter-blue tr.odd td.primary{background-color:#99b3e6}.tablesorter-blue tr.even td.primary{background-color:#c2d1f0}.tablesorter-blue td.secondary,.tablesorter-blue tr.odd td.secondary{background-color:#c2d1f0}.tablesorter-blue tr.even td.secondary{background-color:#d6e0f5}.tablesorter-blue td.tertiary,.tablesorter-blue tr.odd td.tertiary{background-color:#d6e0f5}.tablesorter-blue tr.even td.tertiary{background-color:#ebf0fa}.tablesorter-blue>caption{background-color:#fff}.tablesorter-blue .tablesorter-filter-row{background-color:#eee}.tablesorter-blue .tablesorter-filter-row td{background-color:#eee;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-blue .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-blue .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-blue .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-blue input.tablesorter-filter,.tablesorter-blue select.tablesorter-filter{width:98%;height:auto;margin:0;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /css/tablesorter/theme.bootstrap_2.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-bootstrap{width:100%}.tablesorter-bootstrap .tablesorter-header,.tablesorter-bootstrap tfoot td,.tablesorter-bootstrap tfoot th{font:14px/20px Arial,Sans-serif;font-weight:700;position:relative;padding:8px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top,#fff,#efefef);background-image:-ms-linear-gradient(top,#fff,#efefef);background-image:-webkit-gradient(linear,0 0,0 100%,from(white),to(#efefef));background-image:-webkit-linear-gradient(top,#fff,#efefef);background-image:-o-linear-gradient(top,#fff,#efefef);background-image:linear-gradient(to bottom,#fff,#efefef);background-repeat:repeat-x;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.tablesorter-bootstrap .tablesorter-header{cursor:pointer}.tablesorter-bootstrap .sorter-false{cursor:default}.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon{display:none}.tablesorter-bootstrap .tablesorter-header-inner{position:relative;padding:4px 18px 4px 4px}.tablesorter-bootstrap .sorter-false .tablesorter-header-inner{padding:4px}.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon{position:absolute;right:2px;top:50%;margin-top:-7px;width:14px;height:14px;background-repeat:no-repeat;line-height:14px;display:inline-block}.tablesorter-bootstrap .bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAABGUlEQVR4AZWQAUfEYBzGC07fILfrbnfgqG1jmxliDitmYIaxb9Y3CEIEVHDaUGMfYF8gIyBqbd7eH7wWofB6/J7nN+x/IIRQbz6fH8p3slgsrkl4uv8QNU071XX9wTAMQcLTD6bi2WazubUsq3ddV5AwPftU1tbr9Z0UPhGDIHgjYXp2JS+Xy71t2wNCFEV113UxCdOzKznLshvf9z+SJHlp23ZHR8L07Er+6/u/LO96td1u3zmX/BmdjoTp2ZUchmHted4o/16sVqt7KR6TMD27kpumOc/z/EkOvWmaQp7rlYTp2ZU8juOsqqqLoij2UvhyHEeQMD27knl93x+VZXmZpukz9yVh+l+vMQzDrK7rXRzHjyQ83b8BlglBGLw1Kb4AAAAASUVORK5CYII=)}.tablesorter-bootstrap .icon-white.bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC)}.tablesorter-bootstrap tr.odd>td{background-color:#f9f9f9}.tablesorter-bootstrap tbody>.even:hover>td,.tablesorter-bootstrap tbody>.odd:hover>td,.tablesorter-bootstrap tbody>tr.hover>td{background-color:#f5f5f5}.tablesorter-bootstrap tbody>tr.even>td{background-color:#fff}.tablesorter-bootstrap .tablesorter-processing{background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=);position:absolute;z-index:1000}.tablesorter-bootstrap>tbody>tr.odd td.primary{background-color:#bfbfbf}.tablesorter-bootstrap>tbody>tr td.primary,.tablesorter-bootstrap>tbody>tr.even td.primary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr td.secondary,.tablesorter-bootstrap>tbody>tr.even td.secondary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr td.tertiary,.tablesorter-bootstrap>tbody>tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-bootstrap>caption{background-color:#fff}.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter{height:28px;width:98%;margin:0;padding:4px 6px;background-color:#fff;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled{background-color:#eee;cursor:not-allowed}.tablesorter-bootstrap .tablesorter-filter-row{background-color:#ddd}.tablesorter-bootstrap .tablesorter-filter-row td{background-color:#eee;line-height:normal;text-align:center;padding:4px 6px;vertical-align:middle;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-bootstrap tr.tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0}.tablesorter-bootstrap tr.tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter .filtered{display:none}.tablesorter-bootstrap .tablesorter-pager select{padding:4px 6px}.tablesorter-bootstrap .tablesorter-pager .pagedisplay{border:0}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /css/tablesorter/theme.bootstrap.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-bootstrap{width:100%}.tablesorter-bootstrap tfoot td,.tablesorter-bootstrap tfoot th,.tablesorter-bootstrap thead td,.tablesorter-bootstrap thead th{font:14px/20px Arial,Sans-serif;font-weight:700;padding:4px;margin:0 0 18px;background-color:#eee}.tablesorter-bootstrap .tablesorter-header{cursor:pointer}.tablesorter-bootstrap .sorter-false{cursor:default}.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon{display:none}.tablesorter-bootstrap .tablesorter-header-inner{position:relative;padding:4px 18px 4px 4px}.tablesorter-bootstrap .sorter-false .tablesorter-header-inner{padding:4px}.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon{font-size:11px;position:absolute;right:2px;top:50%;margin-top:-7px;width:14px;height:14px;background-repeat:no-repeat;line-height:14px;display:inline-block}.tablesorter-bootstrap .bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAA20lEQVR4AWJABpKSkoxALCstLb0aUAsZaCAMhVEY6B0amx8YZWDDEDSBa2AGe7XeIiAAClYwVGBvsAcIllsf/mvcC9DgOOd8h90fxWvngVEUbZIkuWRZZlE8eQjcisgZMM9zi+LJ6ZfwegmWZflZDugdHMfxTcGqql7TNBlUB/QObtv2VBSFrev6OY7jngzFk9OT/fn73fWYpqnlXNyXDMWT0zuYx/Bvel9ej+LJ6R08DMOu67q7DkTkrSA5vYPneV71fX/QASdTkJwezhs0TfMARn0wMDDGXEPgF4oijqwM5YjNAAAAAElFTkSuQmCC)}.tablesorter-bootstrap .bootstrap-icon-white.bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC)}.tablesorter-bootstrap>tbody>tr.odd>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.odd:hover~tr.tablesorter-hasChildRow.odd~.tablesorter-childRow.odd>td{background-color:#f9f9f9}.tablesorter-bootstrap>tbody>tr.even:hover>td,.tablesorter-bootstrap>tbody>tr.hover>td,.tablesorter-bootstrap>tbody>tr.odd:hover>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.even:hover~.tablesorter-childRow.even>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.odd:hover~.tablesorter-childRow.odd>td{background-color:#f5f5f5}.tablesorter-bootstrap>tbody>tr.even>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.even:hover~tr.tablesorter-hasChildRow.even~.tablesorter-childRow.even>td{background-color:#fff}.tablesorter-bootstrap .tablesorter-processing{background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=);background-position:center center!important;background-repeat:no-repeat!important}.tablesorter-bootstrap>tbody>tr.odd td.primary{background-color:#bfbfbf}.tablesorter-bootstrap>tbody>tr td.primary,.tablesorter-bootstrap>tbody>tr.even td.primary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr td.secondary,.tablesorter-bootstrap>tbody>tr.even td.secondary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr td.tertiary,.tablesorter-bootstrap>tbody>tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-bootstrap>.caption{background-color:#fff}.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter{width:98%;margin:0;padding:4px 6px;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled{background-color:#eee;color:#555;cursor:not-allowed;border:1px solid #ccc;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.075) inset;box-sizing:border-box;transition:height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row{background-color:#efefef}.tablesorter-bootstrap .tablesorter-filter-row td{background-color:#efefef;line-height:normal;text-align:center;padding:4px 6px;vertical-align:middle;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0}.tablesorter-bootstrap .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter .filtered{display:none}.tablesorter-bootstrap .tablesorter-pager select{padding:4px 6px}.tablesorter-bootstrap .tablesorter-pager .pagedisplay{border:0}.tablesorter-bootstrap tfoot i{font-size:11px}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /css/tablesorter/theme.bootstrap_3.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-bootstrap{width:100%}.tablesorter-bootstrap tfoot td,.tablesorter-bootstrap tfoot th,.tablesorter-bootstrap thead td,.tablesorter-bootstrap thead th{font:14px/20px Arial,Sans-serif;font-weight:700;padding:4px;margin:0 0 18px;background-color:#eee}.tablesorter-bootstrap .tablesorter-header{cursor:pointer}.tablesorter-bootstrap .sorter-false{cursor:default}.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon{display:none}.tablesorter-bootstrap .tablesorter-header-inner{position:relative;padding:4px 18px 4px 4px}.tablesorter-bootstrap .sorter-false .tablesorter-header-inner{padding:4px}.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon{font-size:11px;position:absolute;right:2px;top:50%;margin-top:-7px;width:14px;height:14px;background-repeat:no-repeat;line-height:14px;display:inline-block}.tablesorter-bootstrap .bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAA20lEQVR4AWJABpKSkoxALCstLb0aUAsZaCAMhVEY6B0amx8YZWDDEDSBa2AGe7XeIiAAClYwVGBvsAcIllsf/mvcC9DgOOd8h90fxWvngVEUbZIkuWRZZlE8eQjcisgZMM9zi+LJ6ZfwegmWZflZDugdHMfxTcGqql7TNBlUB/QObtv2VBSFrev6OY7jngzFk9OT/fn73fWYpqnlXNyXDMWT0zuYx/Bvel9ej+LJ6R08DMOu67q7DkTkrSA5vYPneV71fX/QASdTkJwezhs0TfMARn0wMDDGXEPgF4oijqwM5YjNAAAAAElFTkSuQmCC)}.tablesorter-bootstrap .bootstrap-icon-white.bootstrap-icon-unsorted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC)}.tablesorter-bootstrap>tbody>tr.odd>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.odd:hover~tr.tablesorter-hasChildRow.odd~.tablesorter-childRow.odd>td{background-color:#f9f9f9}.tablesorter-bootstrap>tbody>tr.even:hover>td,.tablesorter-bootstrap>tbody>tr.hover>td,.tablesorter-bootstrap>tbody>tr.odd:hover>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.even:hover~.tablesorter-childRow.even>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.odd:hover~.tablesorter-childRow.odd>td{background-color:#f5f5f5}.tablesorter-bootstrap>tbody>tr.even>td,.tablesorter-bootstrap>tbody>tr.tablesorter-hasChildRow.even:hover~tr.tablesorter-hasChildRow.even~.tablesorter-childRow.even>td{background-color:#fff}.tablesorter-bootstrap .tablesorter-processing{background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=);background-position:center center!important;background-repeat:no-repeat!important}.tablesorter-bootstrap>tbody>tr.odd td.primary{background-color:#bfbfbf}.tablesorter-bootstrap>tbody>tr td.primary,.tablesorter-bootstrap>tbody>tr.even td.primary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-bootstrap>tbody>tr td.secondary,.tablesorter-bootstrap>tbody>tr.even td.secondary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-bootstrap>tbody>tr td.tertiary,.tablesorter-bootstrap>tbody>tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-bootstrap>.caption{background-color:#fff}.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter{width:98%;margin:0;padding:4px 6px;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled{background-color:#eee;color:#555;cursor:not-allowed;border:1px solid #ccc;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.075) inset;box-sizing:border-box;transition:height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row{background-color:#efefef}.tablesorter-bootstrap .tablesorter-filter-row td{background-color:#efefef;line-height:normal;text-align:center;padding:4px 6px;vertical-align:middle;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-bootstrap .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0}.tablesorter-bootstrap .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter .filtered{display:none}.tablesorter-bootstrap .tablesorter-pager select{padding:4px 6px}.tablesorter-bootstrap .tablesorter-pager .pagedisplay{border:0}.tablesorter-bootstrap tfoot i{font-size:11px}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} -------------------------------------------------------------------------------- /css/tablesorter/theme.metro-dark.min.css: -------------------------------------------------------------------------------- 1 | .tablesorter-metro-dark{width:100%;font:12px/18px 'Segoe UI Semilight','Open Sans',Verdana,Arial,Helvetica,sans-serif;color:#000;background-color:#333;border-spacing:0;margin:10px 0 15px;text-align:left}.tablesorter-metro-dark caption.dark-row,.tablesorter-metro-dark tr.dark-row td,.tablesorter-metro-dark tr.dark-row th{background-color:#222;color:#fff;padding:2px;text-align:left;font-size:14px}.tablesorter-metro-dark caption,.tablesorter-metro-dark tfoot td,.tablesorter-metro-dark tfoot th,.tablesorter-metro-dark th,.tablesorter-metro-dark thead td{font-weight:300;font-size:15px;color:#ddd;background-color:#333;padding:4px}.tablesorter-metro-dark .header,.tablesorter-metro-dark .tablesorter-header{background-image:url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAGFBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u5jNePWAAAACHRSTlMAMxIHKwEgMWD59H4AAABSSURBVAjXY2BgYFJgAAHzYhDJ6igSAKTYBAUTgJSioKAQAwNzoaCguAFDiCAQuDIkgigxBgiA8cJAVCpQt6AgSL+JoKAzA0gjUBsQqBcBCYhFAAE/CV4zeSzxAAAAAElFTkSuQmCC);background-position:right 5px center;background-repeat:no-repeat;cursor:pointer;white-space:normal}.tablesorter-metro-dark .tablesorter-header-inner{padding:0 18px 0 4px}.tablesorter-metro-dark thead .headerSortUp,.tablesorter-metro-dark thead .tablesorter-headerAsc,.tablesorter-metro-dark thead .tablesorter-headerSortUp{background-image:url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAIVBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u5meJAOAAAACnRSTlMAMwsqXt+gIBUGxGoDMAAAAFlJREFUCNctzC0SQAAUReEzGNQ3AlHRiSRZFCVZYgeswRL8hLdK7834wj3tAlGP6y7fYHpKS6w6WwbVG0I1NZVnZPG8/DYxOYlnhUYkA06R1s9ESsxR4NIdPhkPFDFYuEnMAAAAAElFTkSuQmCC)}.tablesorter-metro-dark thead .headerSortDown,.tablesorter-metro-dark thead .tablesorter-headerDesc,.tablesorter-metro-dark thead .tablesorter-headerSortDown{background-image:url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAALVBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7i0NViAAAADnRSTlMAMiweCQITTvDctZZqaTlM310AAABcSURBVAjXY2BgYEtgAAFHERDJqigUAKSYBQUNgFSioKAYAwOLIBA4MASBKFUGQxAlzAAF+94BwWuGKBC1lIFl3rt3Lx0YGCzevWsGSjK9e6cAUlT3HKyW9wADAwDRrBiDy6bKzwAAAABJRU5ErkJggg==)}.tablesorter-metro-dark thead .sorter-false{background-image:none;cursor:default;padding:4px}.tablesorter-metro-dark td{background-color:#fff;padding:4px;vertical-align:top}.tablesorter-metro-dark tbody>tr.even:hover>td,.tablesorter-metro-dark tbody>tr.hover>td,.tablesorter-metro-dark tbody>tr.odd:hover>td,.tablesorter-metro-dark tbody>tr:hover>td{background-color:#bbb;color:#000}.tablesorter-metro-dark .tablesorter-processing{background-position:center center!important;background-repeat:no-repeat!important;background-image:url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=)!important}.tablesorter-metro-dark .tablesorter-pager button{background-color:#444;color:#eee;border:#555 1px solid;cursor:pointer}.tablesorter-metro-dark .tablesorter-pager button:hover{background-color:#555}.tablesorter-metro-dark tr.odd>td{background-color:#eee}.tablesorter-metro-dark tr.even>td{background-color:#fff}.tablesorter-metro-dark tr.odd td.primary{background-color:#bfbfbf}.tablesorter-metro-dark td.primary,.tablesorter-metro-dark tr.even td.primary{background-color:#d9d9d9}.tablesorter-metro-dark tr.odd td.secondary{background-color:#d9d9d9}.tablesorter-metro-dark td.secondary,.tablesorter-metro-dark tr.even td.secondary{background-color:#e6e6e6}.tablesorter-metro-dark tr.odd td.tertiary{background-color:#e6e6e6}.tablesorter-metro-dark td.tertiary,.tablesorter-metro-dark tr.even td.tertiary{background-color:#f2f2f2}.tablesorter-metro-dark .tablesorter-filter-row{background-color:#eee}.tablesorter-metro-dark .tablesorter-filter-row td{background-color:#eee;line-height:normal;text-align:center;-webkit-transition:line-height .1s ease;-moz-transition:line-height .1s ease;-o-transition:line-height .1s ease;transition:line-height .1s ease}.tablesorter-metro-dark .tablesorter-filter-row .disabled{opacity:.5;cursor:not-allowed}.tablesorter-metro-dark .tablesorter-filter-row.hideme td{padding:2px;margin:0;line-height:0;cursor:pointer}.tablesorter-metro-dark .tablesorter-filter-row.hideme *{height:1px;min-height:0;border:0;padding:0;margin:0;opacity:0}.tablesorter-metro-dark input.tablesorter-filter,.tablesorter-metro-dark select.tablesorter-filter{width:95%;height:auto;margin:0;padding:4px;background-color:#fff;border:1px solid #bbb;color:#333;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:height .1s ease;-moz-transition:height .1s ease;-o-transition:height .1s ease;transition:height .1s ease}.tablesorter .filtered{display:none}.tablesorter .tablesorter-errorRow td{text-align:center;cursor:pointer;background-color:#e6bf99} --------------------------------------------------------------------------------