Commit e8ffdb4b authored by Christopher S Barnett's avatar Christopher S Barnett
Browse files

updated source spreadsheet

updated to handle deep linking to countries and cases
parent f391e868
......@@ -415,7 +415,7 @@
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "n/a",
"value_details": "",
"corruption_details": "5.5 billion Chilean pesos (CLP) (USD 11 million)",
"transactions": [
{
......@@ -679,6 +679,263 @@
"seller": "DEU"
}
]
},
{
"deal_name": "Airbus Eurofighter sales to Austria",
"years": 2003,
"series_name": "Airbus Eurofighter sales to Austria",
"series_id": 23,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2017/12/19/airbus-eurofighter-sales-to-austria/",
"sellers_display": "Airbus (then EADS), Eurofighter Jagdflugzeug GmbH (Germany)",
"equipment": [
"15 Eurofighter Typhoon combat aircraft (reduced from 24 originally)"
],
"deal_value": 1700,
"corruption": 120,
"units": "million",
"currency_deal": "EUR",
"currency_corruption": "EUR",
"value_details": "EUR 1.95 billion (later reduced to EUR 1.7 billion)",
"corruption_details": "EUR120 million (approximately), plus offset commitments to allies of decision-makers",
"transactions": [
{
"buyer": "AUT",
"seller": "DEU"
}
]
},
{
"deal_name": "Embraer's global bribery schemes",
"years": 2008,
"series_name": "Embraer's global bribery schemes",
"series_id": 24,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2017/11/27/embers-global-bribery-schemes/",
"sellers_display": "Embraer (Brazil, USA)",
"equipment": [
"To Dominican Republic: 8 EMB-314 Super Tucano trainer/light combat aircraft",
"To India: 3 ERJ-145 transport aircraft, converted to Airborne Early-Warning & Control aircraft with Indian radar"
],
"deal_value": 300,
"corruption": 9.3,
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "$92 million to Dominican Republic; $208 million to Brazil",
"corruption_details": "Dominican Republic $3.5 m.; Brazil $5.76 m",
"transactions": [
{
"buyer": "DOM",
"seller": "BRA"
},
{
"buyer": "DOM",
"seller": "USA"
},
{
"buyer": "IND",
"seller": "BRA"
},
{
"buyer": "IND",
"seller": "USA"
}
]
},
{
"deal_name": "The 'Fat Leonard' scandal",
"years": "2004-2013",
"series_name": "The 'Fat Leonard' scandal",
"series_id": 25,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2017/11/07/glenn-defense-marine-asia-and-the-us-7th-fleet-the-fat-leonard-scandal/",
"sellers_display": "Glenn Defense Marine Asia (Singapore)",
"equipment": [
"Port services (\"husbanding services\") across the Western Pacific"
],
"deal_value": "Unclear",
"corruption": "Unclear",
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "Total contract value of USD 33 million between 2008 and 2013, according to USASpending.gov; figures for previous years not available. Prosecutors have asked the courts to apply penalties based on Leonard Francis having profited from the bribes by a sum of between USD 7 and 20 million.",
"corruption_details": "USD 500,000 cash; and a total of \u201cmillions\u201d in luxury travel, entertainment, and gifts",
"transactions": [
{
"buyer": "USA",
"seller": "SGP"
}
]
},
{
"deal_name": "Belgian Socialist Parties funding scandal",
"years": "1988-1989",
"series_name": "Belgian Socialist Parties funding scandal",
"series_id": 26,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/04/10/funding-the-belgian-socialist-parties/",
"sellers_display": "Agusta (Italy), Electronique Serge Dassault (France)",
"equipment": [
"46 A109 helicopters (Agusta)",
"upgrades to 100 F-16 combat aircraft (Dassault)"
],
"deal_value": 575,
"corruption": 4.1,
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "Augusta: BFR 12 billion (around USD 350 million); ESD: BFR 7.5 billion (around USD 225 million)",
"corruption_details": "Augusta:BFR 51 million (around USD 1.5 million); ESD: FFR 10 million and CHF 1.75 million (around USD 2.6 million)",
"transactions": [
{
"buyer": "BEL",
"seller": "FRA"
},
{
"buyer": "BEL",
"seller": "ITA"
}
]
},
{
"deal_name": "The CDU party funding scandal",
"years": 1992,
"series_name": "The CDU party funding scandal",
"series_id": 27,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/04/03/the-cdu-party-funding-scandal/",
"sellers_display": "Germany (Thyssen-Henschel, now part of Rheinmetall)",
"equipment": [
"36 Armored Vehicles, including 10 Thyssen-Henschel \u201cFuchs\u201d CBRN Detection Vehicles (Saudi Arabia)",
"Licensed production of Thyssen Armored Vehicles at a proposed facility in Nova Scotia (Canada) \u2013 not carried out."
],
"deal_value": 446,
"corruption": 234.9,
"units": "million",
"currency_deal": "DDM",
"currency_corruption": "DDM",
"value_details": "DM 446 million (aprox. USD 300 m. ) (Saudi Arabia); proposal for CAD 58 m. (aprox. USD 47 m. ) investment by Thyssen; not carried out",
"corruption_details": "DM220m. to Saudi Arabia; DM10 m. (Canada); DM1.1 m. handed to the CDU; does not include bribes to individual CDU officials.",
"transactions": [
{
"buyer": "SAU",
"seller": "DEU"
},
{
"buyer": "CAN",
"seller": "DEU"
}
]
},
{
"deal_name": "GPT and the Saudi National Guard",
"years": 2010,
"series_name": "GPT and the Saudi National Guard",
"series_id": 28,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/02/16/airbus-saudi-border-security-and-a-whistleblowers-dramatic-escape/",
"sellers_display": "GPT Special Project Management (United Kingdom), UK Ministry of Defence",
"equipment": [
"Communications and computer equipment and support, consulting, and training"
],
"deal_value": 2000,
"corruption": 14.9,
"units": "million",
"currency_deal": "GBP",
"currency_corruption": "GBP",
"value_details": "GBP 2 billion",
"corruption_details": "At least GBP 14.9 million transferred to foreign accounts (GBP 26 million per year paid out for unexplained \u201cbought in services\u201d)",
"transactions": [
{
"buyer": "SAU",
"seller": "GBR"
}
]
},
{
"deal_name": "CAS Global Ltd. and the private Nigerian Coastguard fleet",
"years": 2012,
"series_name": "CAS Global Ltd. and the private Nigerian Coastguard fleet",
"series_id": 29,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/08/02/cas-global-ltd-and-the-private-nigerian-coast-guard-fleet/",
"sellers_display": "Norwegian Defense Logistics Organisation, through the intermediary CAS-Global Ltd. (UK-registered firm)",
"equipment": [
"6 Hauk-class Missile Torpedo Boats",
"1 2,500-ton Naval Support Vessel"
],
"deal_value": 12,
"corruption": 0.242,
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "USD 12 million",
"corruption_details": "USD 242,000",
"transactions": [
{
"buyer": "NGA",
"seller": "NOR"
},
{
"buyer": "NGA",
"seller": "GBR"
}
]
},
{
"deal_name": "Litton Industries contracts with Greece and Taiwan",
"years": 1993,
"series_name": "Litton Industries contracts with Greece and Taiwan",
"series_id": 31,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/08/09/litton-industries-contracts-with-greece-and-taiwan/",
"sellers_display": "Litton Industries (USA); subsidiaries Litton Applied Technologies (USA) and Litton Systems Canada (Canada)",
"equipment": [
"Radars for F-16 aircraft (Greece)",
"Upgrades to military aircraft (Taiwan)"
],
"deal_value": 197.2,
"corruption": 16.3,
"units": "million",
"currency_deal": "USD",
"currency_corruption": "USD",
"value_details": "$150 million (Greece); $47.2 million (Taiwan)",
"corruption_details": "$12 million (Greece); $4.3 million (Taiwan)",
"transactions": [
{
"buyer": "GRC",
"seller": "USA"
},
{
"buyer": "GRC",
"seller": "CAN"
},
{
"buyer": "TWN",
"seller": "USA"
},
{
"buyer": "TWN",
"seller": "CAN"
}
]
},
{
"deal_name": "Heckler & Koch's G-36 Rifles in Mexico",
"years": "2006-2009",
"series_name": "Heckler & Koch's G-36 Rifles in Mexico",
"series_id": 32,
"blog_link": "https://sites.tufts.edu/corruptarmsdeals/2018/08/14/heckler-kochs-g-36-rifles-in-mexico/",
"sellers_display": "Heckler & Koch (Germany)",
"equipment": [
"4,500 G-36 rifles"
],
"deal_value": 4.1,
"corruption": "Unclear",
"units": "million",
"currency_deal": "EUR",
"currency_corruption": "EUR",
"value_details": "EUR4.1 million",
"corruption_details": "EUR 20,000 to German politicians; Unknown amount to Mexican officials",
"transactions": [
{
"buyer": "MEX",
"seller": "DEU"
}
]
}
]
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -50,7 +50,7 @@
</div>
<div class="side-content details-parent">
<div class="intro intro-text-body">
<p>This map presents a compendium of 18 cases of corruption in the international arms trade and
<p>This map presents a compendium of 31 cases of corruption in the international arms trade and
broader military sector,
as part of World Peace Foundation’s ongoing program on the
<a href="http://fletcher.tufts.edu/World-Peace-Foundation/Program/Research/Global--Arms-Trade-and-Corruption"
......@@ -71,7 +71,7 @@
<h1>A compendium of arms trade corruption</h1>
<div id="splash-screen-text" class="intro-text-body">
<p>This map presents a compendium of 18 cases of corruption in the
<p>This map presents a compendium of 31 cases of corruption in the
international arms trade and
broader military sector,
as part of World Peace Foundation’s ongoing program on the
......
......@@ -5,3 +5,4 @@ pycountry==17.5.14
python-dateutil==2.6.0
pytz==2017.2
six==1.10.0
xlrd==1.1.0
......@@ -159,7 +159,7 @@ class ExcelToJSON:
return df
def __load_excel(self, path, sheet=0):
df = pd.read_excel(path, sheetname=sheet)
df = pd.read_excel(path, sheet_name=sheet)
df = self.base_processor(df)
if self.df_processor is not None:
......
from ingest.wpf_ingest.ingest_data import ExcelToJSON, deals_processor_xl, JSONProcessor, convert_countries, \
from .ingest_data import ExcelToJSON, deals_processor_xl, JSONProcessor, convert_countries, \
persona_processor_xl
DEALS_PATH = 'data/wpf_deals.json'
......@@ -6,7 +6,7 @@ PERSONAE_PATH = 'data/personae.json'
EXCEL_PATH = 'ingest/wpf_arms_deals.xlsx'
'''
usage:
usage: (from base directory)
from ingest.wpf_ingest.ingest_from_excel import *
ingest_deals()
......
......@@ -232,7 +232,7 @@
this.strokeStyle = options.color || '#fff';
// TODO: set this dynamically based on distance (L)
this.defaultFactor = 0.0035; //1 / Math.pow(L, 1.5); //Math.min(2 / this.radius, 0.003);
console.log(this.defaultFactor);
//console.log(this.defaultFactor);
this.factor = this.defaultFactor;
this.deltaAngle = (80 / Math.min(this.radius, 400)) / this.tailPointsCount;
this.trailAngle = this.startAngle;
......
......@@ -22,8 +22,9 @@ ConnectionMap = function () {
filtered_deals: [],
init: function () {
init: function (selType, selValue) {
var self = this;
// instantiates the Leaflet map on the div with id 'map' and sets the view to center
// point (0,0) and zoom level 2
self.home_bounds = [[90, -180], [-90, 180]];
......@@ -82,11 +83,6 @@ ConnectionMap = function () {
L.control.watermark({position: 'bottomleft'}).addTo(self.map);
// load the country data (geojson) and deal data
self.loadBaseCountries().then(function () {
self.loadConnections();
});
// create stripe pattern for internal deals
self.hatch_pattern = new L.StripePattern({
//2 stripes defined as color + space
......@@ -98,10 +94,26 @@ ConnectionMap = function () {
self.hatch_pattern.addTo(self.map);
self.styles.both.fillPattern = self.hatch_pattern;
// attach event handlers
self.selectionTypeHandler();
self.removeSelectionHandler();
self.selectByHeaderHandler();
// load the country data (geojson) and deal data
self.loadBaseCountries().done(
function () {
self.loadConnections().done(
function () {
// attach event handlers
self.selectionTypeHandler();
self.removeSelectionHandler();
self.selectByHeaderHandler();
if (typeof selType !== "undefined") {
if (typeof selValue === "undefined") {
selValue = "";
}
self.selectDeals(selType, selValue);
}
});
});
},
styles: {
......@@ -234,7 +246,10 @@ ConnectionMap = function () {
* @param selType
* @param selValue
*/
selectDeals: function (selType, selValue) {
selectDeals: function (selType, selValue, skipHashSet) {
if (typeof skipHashSet === "undefined") {
skipHashSet = false;
}
this.setSelectionType(selType);
this.selectionVal = selValue;
var displayVal = selValue;
......@@ -255,6 +270,11 @@ ConnectionMap = function () {
this.filterDeals(selType, selValue);
this.displayDetails();
if (!skipHashSet) {
window.location.hash = '#' + encodeURIComponent(selType.substr(3)) + '=' + encodeURIComponent(selValue);
}
if (!_.isEmpty(selValue)) {
this.renderLinks();
this.map.fitBounds(this.transactionBounds);
......@@ -493,7 +513,6 @@ ConnectionMap = function () {
}).addTo(self.map);
//self.map.getPane(pane).style.pointerEvents = "none";
});
},
......@@ -525,6 +544,9 @@ ConnectionMap = function () {
* @returns {*} promise returned from getJSON
*/
loadConnections: function () {
var selType = "by-deal";
var selValue = "";
var self = this;
// Load the connections file
return $.getJSON("data/wpf_deals.json", function (data) {
......@@ -539,7 +561,7 @@ ConnectionMap = function () {
self.migrationLayer.addTo(self.map);
self.selectDeals('by-deal', '');
self.selectDeals(selType, selValue, true);
self.renderSourcesAndTargets();
......@@ -893,11 +915,34 @@ ConnectionMap = function () {
};
$(document).ready(function () {
var showIntro = true;
var selType = 'by-deal';
var selValue = '';
if (window.location.hash) {
// Fragment exists
var fragmentArr = window.location.hash.substr(1).split('=');
selType = 'by-' + fragmentArr[0];
var valid = ['by-deal', 'by-country'];
if (fragmentArr.length > 2 || valid.indexOf(selType) === -1) {
selType = 'by-deal';
selValue = '';
} else if (fragmentArr.length === 1 || fragmentArr[1].length === 0) {
selValue = '';
} else {
selValue = decodeURIComponent(fragmentArr[1]);
}
if (selValue.length > 0) {
showIntro = false;
}
}
$('.intro-text-modal').modal('show');
if (showIntro) {
$('.intro-text-modal').modal('show');
}
var map = ConnectionMap();
map.init();
map.init(selType, selValue);
var ttOptions = {
......@@ -905,7 +950,6 @@ $(document).ready(function () {
};
$('[data-toggle="tooltip"]').tooltip(ttOptions);
blah = map;
});
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment