diff --git a/vasl_templates/webapp/data/default-template-pack/ob_vehicles.j2 b/vasl_templates/webapp/data/default-template-pack/ob_vehicles.j2
index b01c729..36a36c6 100644
--- a/vasl_templates/webapp/data/default-template-pack/ob_vehicles.j2
+++ b/vasl_templates/webapp/data/default-template-pack/ob_vehicles.j2
@@ -33,7 +33,7 @@ td { margin: 0 ; padding: 0 ; }
{%if veh.no_radio%} {{veh.no_radio}} {%endif%}
- {%if veh.no_if%} no IF {%endif%}
+ {%if veh.no_if%} {{veh.no_if}} {%endif%}
{%for cap in veh.capabilities%} {{cap}} {%endfor%}
{%if veh.crew_survival%} {{veh.crew_survival}} {%endif%}
{%endfor%}
diff --git a/vasl_templates/webapp/data/vehicles/french.json b/vasl_templates/webapp/data/vehicles/french.json
new file mode 100644
index 0000000..37e3241
--- /dev/null
+++ b/vasl_templates/webapp/data/vehicles/french.json
@@ -0,0 +1,291 @@
+[
+
+{ "name": "FT-17M",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "note_number": "1\u2020",
+ "notes": [ "C" ]
+},
+{ "name": "FT-17C",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 9 },
+ "note_number": "1\u2020",
+ "notes": [ "C" ]
+},
+{ "name": "FT-17 75BS",
+ "no_radio": "\u00ae",
+ "CS#": "3:brewup",
+ "no_if": true,
+ "note_number": "1\u2020",
+ "notes": [ "C" ]
+},
+{ "name": "AMR 33",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "note_number": "2\u2020",
+ "notes": [ "E" ]
+},
+{ "name": "AMR 35",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "note_number": "3\u2020",
+ "notes": [ "E" ]
+},
+{ "name": "AMR 35(L)",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "note_number": "3\u2020",
+ "notes": [ "E" ]
+},
+{ "name": "R35",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "4\u2020",
+ "notes": [ "A\u20201", "C" ]
+},
+{ "name": "H35",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "5\u2020",
+ "notes": [ "A\u20201", "C", "E" ]
+},
+{ "name": "FCM 36",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "6\u2020",
+ "notes": [ "C", "E", "I\u20201" ]
+},
+{ "name": "H39",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "7\u2020",
+ "notes": [ "A\u20201", "C", "F" ]
+},
+{ "name": "H39(L)",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "8\u2020",
+ "notes": [ "A\u20201", "C", "E", "F" ]
+},
+{ "name": "H35(L)",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "8\u2020",
+ "notes": [ "A\u20201", "C", "E" ]
+},
+{ "name": "R35(L)",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "8\u2020",
+ "notes": [ "A\u20201", "C", "E", "F" ]
+},
+{ "name": "R40",
+ "no_radio": "\u00ae",
+ "CS#": 2,
+ "capabilities2": { "AP": 10 },
+ "note_number": "9",
+ "notes": [ "A\u20201", "C", "E", "I\u2020" ]
+},
+{ "name": "D1",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": 3,
+ "note_number": "10\u2020",
+ "notes": [ "B\u20203", "C", "I\u20202", "R\u20201" ]
+},
+{ "name": "D2",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": 3,
+ "note_number": "11\u2020",
+ "notes": [ "B\u20203", "C", "E", "I\u20202", "R\u20201" ]
+},
+{ "name": "D2(L)",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": 3,
+ "note_number": "11\u2020",
+ "notes": [ "A\u20204", "B\u20203", "C", "E", "I\u20202", "R\u20201" ]
+},
+{ "name": "S35",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": 4,
+ "note_number": "12\u2020",
+ "notes": [ "A\u20203", "C", "F", "I\u20202", "R\u20201" ]
+},
+{ "name": "B1-bis",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": "5:brewup",
+ "no_if": "75\u2020",
+ "capabilities": [ "AP975\u2020" ],
+ "note_number": "13\u2020",
+ "notes": [ "A\u20204", "B\u20203", "C", "E", "F", "I\u20202", "R\u20201" ]
+},
+{ "name": "Valentine V(b)",
+ "CS#": 4,
+ "capabilities2": { "sM": 8 },
+ "note_number": "14\u2020",
+ "notes": [ "F" ]
+},
+{ "name": "AM Dodge(a)",
+ "CS#": "6\u2020",
+ "capabilities2": { "AP": 10 },
+ "note_number": "15\u2020",
+ "notes": [ "F" ]
+},
+{ "name": "AMD 20 cv TOE",
+ "no_radio": "\u00ae9\u20201",
+ "CS#": 4,
+ "capabilities2": { "AP": 9 },
+ "note_number": "16\u2020",
+ "notes": [ "D\u20202", "R\u20201" ]
+},
+{ "name": "AMD 50 AM",
+ "no_radio": "\u00ae",
+ "CS#": 4,
+ "capabilities2": { "AP": 9 },
+ "note_number": "17\u2020",
+ "notes": [ "D\u20201" ]
+},
+{ "name": "AMD 80 AM",
+ "no_radio": "\u00ae",
+ "CS#": 4,
+ "note_number": "17\u2020",
+ "notes": [ "D\u20201" ]
+},
+{ "name": "AMD 35",
+ "no_radio": "\u00ae",
+ "CS#": 4,
+ "note_number": "18\u2020",
+ "notes": [ "E" ]
+},
+{ "name": "Laffly W15T CC",
+ "CS#": 3,
+ "note_number": "19\u2020",
+ "notes": [ "E", "J\u20201" ]
+},
+{ "name": "Ac de 75 Conus(b)",
+ "CS#": 5,
+ "capabilities2": { "s": 8 },
+ "note_number": "20\u2020",
+ "notes": [ "F", "M\u20201" ]
+},
+{ "name": "Ac de 75 mle 97",
+ "CS#": 4,
+ "capabilities2": { "s": 8 },
+ "note_number": "20\u2020",
+ "notes": [ "M\u20201" ]
+},
+{ "name": "Camion de Mitr. CA",
+ "CS#": 4,
+ "note_number": "21\u2020"
+},
+{ "name": "Camion de 13.2 CAJ",
+ "CS#": 4,
+ "note_number": "21\u2020",
+ "notes": [ "AA\u20201" ]
+},
+{ "name": "Camion de 20 CA",
+ "CS#": 4,
+ "note_number": "21\u2020",
+ "notes": [ "AA\u20201" ]
+},
+{ "name": "Ac de 25 CA",
+ "CS#": 4,
+ "note_number": "21\u2020",
+ "notes": [ "F", "AA\u20201" ]
+},
+{ "name": "Ac de 40 CA(a)",
+ "CS#": 4,
+ "note_number": "22",
+ "notes": [ "E", "F", "M\u2020", "AA\u20201" ]
+},
+{ "name": "Ac de 75 mle 13/34",
+ "CS#": 7,
+ "note_number": "23\u2020",
+ "notes": [ "D\u20201", "F", "AA\u20202" ]
+},
+{ "name": "AMC 29",
+ "no_radio": "\u00ae",
+ "CS#": 3,
+ "capabilities2": { "AP": 9 },
+ "note_number": "24\u2020"
+},
+{ "name": "C-K P17",
+ "cs#": 4,
+ "note_number": "25\u2020"
+},
+{ "name": "C-K P19",
+ "cs#": 5,
+ "note_number": "25\u2020",
+ "notes": [ "H\u20201" ]
+},
+{ "name": "SOMUA MCG",
+ "cs#": 4,
+ "note_number": "26\u2020"
+},
+{ "name": "Unic P107",
+ "cs#": 5,
+ "note_number": "27\u2020",
+ "notes": [ "L\u20201" ]
+},
+{ "name": "Renault UE",
+ "cs#": "2\u20201",
+ "note_number": "28\u2020",
+ "notes": [ "G\u20201", "K" ]
+},
+{ "name": "Lorraine 38L",
+ "cs#": "3/2\u2020",
+ "note_number": "29\u2020",
+ "notes": [ "E", "H\u2020" ]
+},
+{ "name": "Lorraine 37L 44",
+ "CS#": 3,
+ "note_number": "30\u2020",
+ "notes": [ "E", "K" ]
+},
+{ "name": "Carrier AC(b)",
+ "CS#": 3,
+ "note_number": "31\u2020",
+ "notes": [ "F", "M\u20201" ]
+},
+{ "name": "Latil TAR H2",
+ "cs#": 5,
+ "note_number": "32\u2020",
+ "notes": [ "J\u20201" ]
+},
+{ "name": "Laffly S15T",
+ "cs#": 5,
+ "note_number": "33\u2020",
+ "notes": [ "J\u20201", "L\u20202" ]
+},
+{ "name": "Laffly S20TL",
+ "cs#": 5,
+ "note_number": "34\u2020",
+ "notes": [ "E", "J\u20201" ]
+},
+{ "name": "Laffly V15T",
+ "cs#": 5,
+ "note_number": "35",
+ "notes": [ "E", "J\u2020" ]
+},
+{ "name": "Peugeot 202",
+ "cs#": "2\u20201",
+ "note_number": "36\u2020",
+ "notes": [ "G\u20201" ]
+},
+{ "name": "Citro\u00ebn 23",
+ "cs#": 5,
+ "note_number": "36\u2020"
+},
+{ "name": "Renault AGR2",
+ "cs#": 7,
+ "note_number": "36\u2020"
+}
+
+]
diff --git a/vasl_templates/webapp/static/snippets.js b/vasl_templates/webapp/static/snippets.js
index 84db2a4..11541cc 100644
--- a/vasl_templates/webapp/static/snippets.js
+++ b/vasl_templates/webapp/static/snippets.js
@@ -219,8 +219,16 @@ function unload_snippet_params( params, check_date_capabilities )
} ;
if ( entry.no_radio )
obj.no_radio = entry.no_radio ;
- if ( entry.no_if )
- obj.no_if = entry.no_if ;
+ if ( entry.no_if ) {
+ obj.no_if = "no IF" ;
+ if ( typeof(entry.no_if) === "string" ) { // nb: only for the French B1-bis :-/
+ var no_if = entry.no_if ;
+ if ( no_if.substring(no_if.length-1) == "\u2020" )
+ obj.no_if += ""+no_if.substring(0,no_if.length-1)+"\u2020" ;
+ else
+ obj.no_if += ""+no_if+"" ;
+ }
+ }
// NOTE: It would be nice to have a Jinja2 filter that inserted the raw capabilities or selected
// the correct one for the scenario date e.g.
// {% for c in veh.capabilities %} {{c|selcap}} {%endif%}}
diff --git a/vasl_templates/webapp/templates/vo-report.html b/vasl_templates/webapp/templates/vo-report.html
index 9ba2663..ff032ee 100644
--- a/vasl_templates/webapp/templates/vo-report.html
+++ b/vasl_templates/webapp/templates/vo-report.html
@@ -71,7 +71,12 @@ function load_vo_listings( objs )
buf.push( " | ", fmtval(obj.name) ) ;
if ( "{{VO_TYPE}}" === "vehicles" ) {
buf.push( " | ", fmtval(obj.no_radio) ) ;
- buf.push( " | ", fmtval( obj.no_if ? "" : "✓" ) ) ;
+ var has_if = "✓" ;
+ if ( typeof(obj.no_if) === "string" ) // nb: only for the French B1-bis :-/
+ has_if = "(" + obj.no_if + ")" ;
+ else if ( obj.no_if )
+ has_if = null ;
+ buf.push( " | ", fmtval(has_if) ) ;
buf.push( " | ", fmtval(make_crew_survival(obj)) ) ;
}
var capabilities = make_capabilities( obj, theater, year, month, true, true ) ;
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1940.txt
new file mode 100644
index 0000000..8e6ef35
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1940.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1940 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1941.txt
new file mode 100644
index 0000000..1804bd0
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1941.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1941 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1942.txt
new file mode 100644
index 0000000..dc9d6a9
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1942.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1942 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1943.txt
new file mode 100644
index 0000000..b5bc8f4
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1943.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1943 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1944.txt
new file mode 100644
index 0000000..afdd239
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1944.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1944 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1945.txt
new file mode 100644
index 0000000..33d96e1
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/vehicles/french/1945.txt
@@ -0,0 +1,54 @@
+=== vehicles/french/1945 ===
+
+Name Radio IF Crew survival Capabilities (effective) # Notes
+------------------ --------------- ----- ------------------------------------ -------------- ------------- --- -----------------------------------------------------------------
+FT-17M ® yes CS 2 n/a n/a 1† C
+FT-17C ® yes CS 2 AP9 AP9 1† C
+FT-17 75BS ® n/a CS 3 (brew up) n/a n/a 1† C
+AMR 33 ® yes CS 2 n/a n/a 2† E
+AMR 35 ® yes CS 2 n/a n/a 3† E
+AMR 35(L) ® yes CS 2 n/a n/a 3† E
+R35 ® yes CS 2 AP10 AP10 4† A†1 C
+H35 ® yes CS 2 AP10 AP10 5† A†1 C E
+FCM 36 ® yes CS 2 AP10 AP10 6† C E I†1
+H39 ® yes CS 2 AP10 AP10 7† A†1 C F
+H39(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+H35(L) ® yes CS 2 AP10 AP10 8† A†1 C E
+R35(L) ® yes CS 2 AP10 AP10 8† A†1 C E F
+R40 ® yes CS 2 AP10 AP10 9 A†1 C E I†
+D1 ®9†1 yes CS 3 n/a n/a 10† B†3 C I†2 R†1
+D2 ®9†1 yes CS 3 n/a n/a 11† B†3 C E I†2 R†1
+D2(L) ®9†1 yes CS 3 n/a n/a 11† A†4 B†3 C E I†2 R†1
+S35 ®9†1 yes CS 4 n/a n/a 12† A†3 C F I†2 R†1
+B1-bis ®9†1 (75†) CS 5 (brew up) AP9[75]† AP9[75]† 13† A†4 B†3 C E F I†2 R†1
+Valentine V(b) n/a yes CS 4 sM8 sM8 14† F
+AM Dodge(a) n/a yes CS 6† AP10 AP10 15† F
+AMD 20 cv TOE ®9†1 yes CS 4 AP9 AP9 16† D†2 R†1
+AMD 50 AM ® yes CS 4 AP9 AP9 17† D†1
+AMD 80 AM ® yes CS 4 n/a n/a 17† D†1
+AMD 35 ® yes CS 4 n/a n/a 18† E
+Laffly W15T CC n/a yes CS 3 n/a n/a 19† E J†1
+Ac de 75 Conus(b) n/a yes CS 5 s8 s8 20† F M†1
+Ac de 75 mle 97 n/a yes CS 4 s8 s8 20† M†1
+Camion de Mitr. CA n/a yes CS 4 n/a n/a 21† n/a
+Camion de 13.2 CAJ n/a yes CS 4 n/a n/a 21† AA†1
+Camion de 20 CA n/a yes CS 4 n/a n/a 21† AA†1
+Ac de 25 CA n/a yes CS 4 n/a n/a 21† F AA†1
+Ac de 40 CA(a) n/a yes CS 4 n/a n/a 22 E F M† AA†1
+Ac de 75 mle 13/34 n/a yes CS 7 n/a n/a 23† D†1 F AA†2
+AMC 29 ® yes CS 3 AP9 AP9 24† n/a
+C-K P17 n/a yes cs 4 n/a n/a 25† n/a
+C-K P19 n/a yes cs 5 n/a n/a 25† H†1
+SOMUA MCG n/a yes cs 4 n/a n/a 26† n/a
+Unic P107 n/a yes cs 5 n/a n/a 27† L†1
+Renault UE n/a yes cs 2†1 n/a n/a 28† G†1 K
+Lorraine 38L n/a yes cs 3/2† n/a n/a 29† E H†
+Lorraine 37L 44 n/a yes CS 3 n/a n/a 30† E K
+Carrier AC(b) n/a yes CS 3 n/a n/a 31† F M†1
+Latil TAR H2 n/a yes cs 5 n/a n/a 32† J†1
+Laffly S15T n/a yes cs 5 n/a n/a 33† J†1 L†2
+Laffly S20TL n/a yes cs 5 n/a n/a 34† E J†1
+Laffly V15T n/a yes cs 5 n/a n/a 35 E J†
+Peugeot 202 n/a yes cs 2†1 n/a n/a 36† G†1
+Citroën 23 n/a yes cs 5 n/a n/a 36† n/a
+Renault AGR2 n/a yes cs 7 n/a n/a 36† n/a
diff --git a/vasl_templates/webapp/tests/test_vo_reports.py b/vasl_templates/webapp/tests/test_vo_reports.py
index 2497efa..611c3b5 100644
--- a/vasl_templates/webapp/tests/test_vo_reports.py
+++ b/vasl_templates/webapp/tests/test_vo_reports.py
@@ -36,7 +36,7 @@ def test_vo_reports( webapp, webdriver ):
)
# check each vehicle/ordnance report
- for nat in ["german","russian","american","british","italian","japanese","chinese"]:
+ for nat in ["german","russian","american","british","italian","japanese","chinese","french"]:
for vo_type in ["vehicles","ordnance"]:
for year in range(1940,1945+1):
|