diff --git a/fixtures/test_package.json b/fixtures/test_package.json index 0cdfde4..42f1db1 100644 --- a/fixtures/test_package.json +++ b/fixtures/test_package.json @@ -1,4 +1,224 @@ [ + { + "model": "initiatives.initiative", + "pk": 1, + "fields": { + "name": "Open Access Publishing", + "description": "Test initiative: Open Access Publishing", + "active": true, + "contact_email": "contact1@example.com", + "short_code": "I001" + } + }, + { + "model": "initiatives.initiative", + "pk": 2, + "fields": { + "name": "Digital Scholarship Fund", + "description": "Test initiative: Digital Scholarship Fund", + "active": true, + "contact_email": "contact2@example.com", + "short_code": "I002" + } + }, + { + "model": "initiatives.initiative", + "pk": 3, + "fields": { + "name": "Research Infrastructure Alliance", + "description": "Test initiative: Research Infrastructure Alliance", + "active": true, + "contact_email": "contact3@example.com", + "short_code": "I003" + } + }, + { + "model": "initiatives.initiative", + "pk": 4, + "fields": { + "name": "Global Knowledge Network", + "description": "Test initiative: Global Knowledge Network", + "active": true, + "contact_email": "contact4@example.com", + "short_code": "I004" + } + }, + { + "model": "initiatives.initiative", + "pk": 5, + "fields": { + "name": "Academic Commons Project", + "description": "Test initiative: Academic Commons Project", + "active": true, + "contact_email": "contact5@example.com", + "short_code": "I005" + } + }, + { + "model": "initiatives.initiative", + "pk": 6, + "fields": { + "name": "Scholarly Communication Hub", + "description": "Test initiative: Scholarly Communication Hub", + "active": true, + "contact_email": "contact6@example.com", + "short_code": "I006" + } + }, + { + "model": "initiatives.initiative", + "pk": 7, + "fields": { + "name": "Library Futures Initiative", + "description": "Test initiative: Library Futures Initiative", + "active": true, + "contact_email": "contact7@example.com", + "short_code": "I007" + } + }, + { + "model": "initiatives.initiative", + "pk": 8, + "fields": { + "name": "Open Science Collective", + "description": "Test initiative: Open Science Collective", + "active": true, + "contact_email": "contact8@example.com", + "short_code": "I008" + } + }, + { + "model": "initiatives.initiative", + "pk": 9, + "fields": { + "name": "Knowledge Equity Programme", + "description": "Test initiative: Knowledge Equity Programme", + "active": true, + "contact_email": "contact9@example.com", + "short_code": "I009" + } + }, + { + "model": "initiatives.initiative", + "pk": 10, + "fields": { + "name": "Institutional Repository Network", + "description": "Test initiative: Institutional Repository Network", + "active": true, + "contact_email": "contact10@example.com", + "short_code": "I010" + } + }, + { + "model": "initiatives.initiative", + "pk": 11, + "fields": { + "name": "Digital Preservation Trust", + "description": "Test initiative: Digital Preservation Trust", + "active": true, + "contact_email": "contact11@example.com", + "short_code": "I011" + } + }, + { + "model": "initiatives.initiative", + "pk": 12, + "fields": { + "name": "Open Monograph Press", + "description": "Test initiative: Open Monograph Press", + "active": true, + "contact_email": "contact12@example.com", + "short_code": "I012" + } + }, + { + "model": "initiatives.initiative", + "pk": 13, + "fields": { + "name": "Humanities Digital Library", + "description": "Test initiative: Humanities Digital Library", + "active": true, + "contact_email": "contact13@example.com", + "short_code": "I013" + } + }, + { + "model": "initiatives.initiative", + "pk": 14, + "fields": { + "name": "Science Access Foundation", + "description": "Test initiative: Science Access Foundation", + "active": true, + "contact_email": "contact14@example.com", + "short_code": "I014" + } + }, + { + "model": "initiatives.initiative", + "pk": 15, + "fields": { + "name": "Transformative Agreements Consortium", + "description": "Test initiative: Transformative Agreements Consortium", + "active": true, + "contact_email": "contact15@example.com", + "short_code": "I015" + } + }, + { + "model": "initiatives.initiative", + "pk": 16, + "fields": { + "name": "Community-Led Open Publishing", + "description": "Test initiative: Community-Led Open Publishing", + "active": true, + "contact_email": "contact16@example.com", + "short_code": "I016" + } + }, + { + "model": "initiatives.initiative", + "pk": 17, + "fields": { + "name": "Data Sharing Alliance", + "description": "Test initiative: Data Sharing Alliance", + "active": true, + "contact_email": "contact17@example.com", + "short_code": "I017" + } + }, + { + "model": "initiatives.initiative", + "pk": 18, + "fields": { + "name": "Open Educational Resources", + "description": "Test initiative: Open Educational Resources", + "active": true, + "contact_email": "contact18@example.com", + "short_code": "I018" + } + }, + { + "model": "initiatives.initiative", + "pk": 19, + "fields": { + "name": "Cross-Border Research Exchange", + "description": "Test initiative: Cross-Border Research Exchange", + "active": true, + "contact_email": "contact19@example.com", + "short_code": "I019" + } + }, + { + "model": "initiatives.initiative", + "pk": 20, + "fields": { + "name": "Sustainable Scholarship Fund", + "description": "Test initiative: Sustainable Scholarship Fund", + "active": true, + "contact_email": "contact20@example.com", + "short_code": "I020" + } + }, { "model": "package.country", "pk": 999, @@ -9,6 +229,26 @@ "catch_all": false } }, + { + "model": "package.country", + "pk": 998, + "fields": { + "name": "United States", + "code": "USA", + "currency": "USD", + "catch_all": false + } + }, + { + "model": "package.country", + "pk": 997, + "fields": { + "name": "Germany", + "code": "DE", + "currency": "EUR", + "catch_all": false + } + }, { "model": "package.bandingtype", "pk": 100, @@ -17,7 +257,16 @@ "name": "Institution Size (FTE)", "description": "Classification based on full-time equivalent student count", "active": true, - "vocabs": [100, 101, 102, 103] + "vocabs": [ + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107 + ] } }, { @@ -28,68 +277,158 @@ "name": "Country Income Classification", "description": "Pricing based on World Bank country income classifications", "active": true, - "vocabs": [104, 105, 106] + "vocabs": [ + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115 + ] } }, { "model": "vocab.bandingvocab", "pk": 100, "fields": { - "text": "Small (0-5,000 FTE)", + "text": "Micro (0-1,000 FTE)", "lower_limit": 0, - "upper_limit": 5000 + "upper_limit": 1000 } }, { "model": "vocab.bandingvocab", "pk": 101, "fields": { - "text": "Medium (5,001-15,000 FTE)", - "lower_limit": 5001, - "upper_limit": 15000 + "text": "Small (1,001-5,000 FTE)", + "lower_limit": 1001, + "upper_limit": 5000 } }, { "model": "vocab.bandingvocab", "pk": 102, "fields": { - "text": "Large (15,001-30,000 FTE)", - "lower_limit": 15001, - "upper_limit": 30000 + "text": "Medium (5,001-10,000 FTE)", + "lower_limit": 5001, + "upper_limit": 10000 } }, { "model": "vocab.bandingvocab", "pk": 103, "fields": { - "text": "Extra Large (30,001+ FTE)", - "lower_limit": 30001, - "upper_limit": null + "text": "Large (10,001-20,000 FTE)", + "lower_limit": 10001, + "upper_limit": 20000 } }, { "model": "vocab.bandingvocab", "pk": 104, "fields": { - "text": "Low Income Countries", + "text": "Very Large (20,001-35,000 FTE)", + "lower_limit": 20001, + "upper_limit": 35000 + } + }, + { + "model": "vocab.bandingvocab", + "pk": 105, + "fields": { + "text": "Extra Large (35,001-50,000 FTE)", + "lower_limit": 35001, + "upper_limit": 50000 + } + }, + { + "model": "vocab.bandingvocab", + "pk": 106, + "fields": { + "text": "Mega (50,001-100,000 FTE)", + "lower_limit": 50001, + "upper_limit": 100000 + } + }, + { + "model": "vocab.bandingvocab", + "pk": 107, + "fields": { + "text": "Consortium (100,001+ FTE)", + "lower_limit": 100001, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 108, + "fields": { + "text": "Band A - Least Developed", "lower_limit": null, "upper_limit": null } }, { "model": "vocab.bandingvocab", - "pk": 105, + "pk": 109, "fields": { - "text": "Middle Income Countries", + "text": "Band B - Low Income", "lower_limit": null, "upper_limit": null } }, { "model": "vocab.bandingvocab", - "pk": 106, + "pk": 110, + "fields": { + "text": "Band C - Lower-Middle Income", + "lower_limit": null, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 111, + "fields": { + "text": "Band D - Upper-Middle Income", + "lower_limit": null, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 112, + "fields": { + "text": "Band E - High Income (Developing)", + "lower_limit": null, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 113, + "fields": { + "text": "Band F - High Income (OECD)", + "lower_limit": null, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 114, + "fields": { + "text": "Band G - Premium", + "lower_limit": null, + "upper_limit": null + } + }, + { + "model": "vocab.bandingvocab", + "pk": 115, "fields": { - "text": "High Income Countries", + "text": "Band H - Elite", "lower_limit": null, "upper_limit": null } @@ -98,11 +437,11 @@ "model": "package.basepackage", "pk": 100, "fields": { - "name": "Academic Journals Premium Bundle", - "description": "Complete access to our academic journals collection with unlimited concurrent users", + "name": "Package 100 - Core (FTE+Choice/all)", + "description": "Test package 100", "active": true, "banding_type": 100, - "pricing_display": "£2,500 - £12,000", + "pricing_display": "", "display_contract_length_months": 12, "image": null, "recommended": false @@ -114,7 +453,7 @@ "fields": { "basepackage_ptr": 100, "initiative": 1, - "default_country": 999, + "default_country": 997, "meta_only": false } }, @@ -129,32 +468,32 @@ } }, { - "model": "package.bandingtypeentry", - "pk": 101, + "model": "package.bandingtypecurrencyentry", + "pk": 100, "fields": { "package": 100, - "banding_type": 101, - "redirect_display": "", - "redirect": "" + "banding_type_entry": 100, + "country": 999, + "payment_processor": null } }, { "model": "package.bandingtypecurrencyentry", - "pk": 100, + "pk": 101, "fields": { "package": 100, "banding_type_entry": 100, - "country": 999, + "country": 998, "payment_processor": null } }, { "model": "package.bandingtypecurrencyentry", - "pk": 101, + "pk": 102, "fields": { "package": 100, - "banding_type_entry": 101, - "country": 999, + "banding_type_entry": 100, + "country": 997, "payment_processor": null } }, @@ -170,139 +509,18320 @@ } }, { - "model": "package.banding", + "model": "package.price", + "pk": 100, + "fields": { + "banding": 100, + "country": 999, + "value": 50, + "default_currency": "GBP" + } + }, + { + "model": "package.price", "pk": 101, "fields": { - "package": 100, - "banding_type": 100, - "vocab": 101, - "active": true, - "order": 2 + "banding": 100, + "country": 998, + "value": 65, + "default_currency": "USD" } }, { - "model": "package.banding", + "model": "package.price", "pk": 102, "fields": { - "package": 100, - "banding_type": 100, - "vocab": 102, - "active": true, - "order": 3 + "banding": 100, + "country": 997, + "value": 57, + "default_currency": "EUR" } }, { "model": "package.banding", - "pk": 103, + "pk": 101, "fields": { "package": 100, "banding_type": 100, - "vocab": 103, + "vocab": 101, "active": true, - "order": 4 + "order": 2 } }, { - "model": "package.banding", + "model": "package.price", + "pk": 103, + "fields": { + "banding": 101, + "country": 999, + "value": 80, + "default_currency": "GBP" + } + }, + { + "model": "package.price", "pk": 104, "fields": { - "package": 100, - "banding_type": 101, - "vocab": 104, - "active": true, - "order": 1 + "banding": 101, + "country": 998, + "value": 104, + "default_currency": "USD" } }, { - "model": "package.banding", + "model": "package.price", "pk": 105, "fields": { - "package": 100, - "banding_type": 101, - "vocab": 105, - "active": true, - "order": 2 + "banding": 101, + "country": 997, + "value": 92, + "default_currency": "EUR" } }, { "model": "package.banding", - "pk": 106, + "pk": 102, "fields": { "package": 100, - "banding_type": 101, - "vocab": 106, + "banding_type": 100, + "vocab": 102, "active": true, "order": 3 } }, { "model": "package.price", - "pk": 100, + "pk": 106, "fields": { - "banding": 100, + "banding": 102, "country": 999, - "value": 2500, - "default_currency": "" + "value": 120, + "default_currency": "GBP" } }, { "model": "package.price", - "pk": 101, + "pk": 107, "fields": { - "banding": 101, - "country": 999, - "value": 5000, - "default_currency": "" + "banding": 102, + "country": 998, + "value": 156, + "default_currency": "USD" } }, { "model": "package.price", - "pk": 102, + "pk": 108, "fields": { "banding": 102, - "country": 999, - "value": 8500, - "default_currency": "" + "country": 997, + "value": 138, + "default_currency": "EUR" } }, { - "model": "package.price", + "model": "package.banding", "pk": 103, + "fields": { + "package": 100, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 109, "fields": { "banding": 103, "country": 999, - "value": 12000, - "default_currency": "" + "value": 160, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 110, + "fields": { + "banding": 103, + "country": 998, + "value": 208, + "default_currency": "USD" } }, { "model": "package.price", + "pk": 111, + "fields": { + "banding": 103, + "country": 997, + "value": 184, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", "pk": 104, + "fields": { + "package": 100, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 112, "fields": { "banding": 104, "country": 999, - "value": 1500, - "default_currency": "" + "value": 200, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 113, + "fields": { + "banding": 104, + "country": 998, + "value": 260, + "default_currency": "USD" } }, { "model": "package.price", + "pk": 114, + "fields": { + "banding": 104, + "country": 997, + "value": 230, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", "pk": 105, + "fields": { + "package": 100, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 115, "fields": { "banding": 105, "country": 999, - "value": 3500, - "default_currency": "" + "value": 260, + "default_currency": "GBP" } }, { "model": "package.price", + "pk": 116, + "fields": { + "banding": 105, + "country": 998, + "value": 338, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 117, + "fields": { + "banding": 105, + "country": 997, + "value": 299, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", "pk": 106, + "fields": { + "package": 100, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 118, + "fields": { + "banding": 106, + "country": 999, + "value": 340, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 119, + "fields": { + "banding": 106, + "country": 998, + "value": 442, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 120, "fields": { "banding": 106, + "country": 997, + "value": 391, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 107, + "fields": { + "package": 100, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 121, + "fields": { + "banding": 107, + "country": 999, + "value": 440, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 122, + "fields": { + "banding": 107, + "country": 998, + "value": 572, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 123, + "fields": { + "banding": 107, + "country": 997, + "value": 506, + "default_currency": "EUR" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 101, + "fields": { + "package": 100, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 103, + "fields": { + "package": 100, + "banding_type_entry": 101, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 104, + "fields": { + "package": 100, + "banding_type_entry": 101, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 105, + "fields": { + "package": 100, + "banding_type_entry": 101, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 108, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 124, + "fields": { + "banding": 108, + "country": 999, + "value": 30, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 125, + "fields": { + "banding": 108, + "country": 998, + "value": 39, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 126, + "fields": { + "banding": 108, + "country": 997, + "value": 34, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 109, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 127, + "fields": { + "banding": 109, + "country": 999, + "value": 50, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 128, + "fields": { + "banding": 109, + "country": 998, + "value": 65, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 129, + "fields": { + "banding": 109, + "country": 997, + "value": 57, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 110, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 130, + "fields": { + "banding": 110, "country": 999, - "value": 7500, - "default_currency": "" + "value": 80, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 131, + "fields": { + "banding": 110, + "country": 998, + "value": 104, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 132, + "fields": { + "banding": 110, + "country": 997, + "value": 92, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 111, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 133, + "fields": { + "banding": 111, + "country": 999, + "value": 110, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 134, + "fields": { + "banding": 111, + "country": 998, + "value": 143, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 135, + "fields": { + "banding": 111, + "country": 997, + "value": 126, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 112, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 136, + "fields": { + "banding": 112, + "country": 999, + "value": 140, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 137, + "fields": { + "banding": 112, + "country": 998, + "value": 182, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 138, + "fields": { + "banding": 112, + "country": 997, + "value": 161, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 113, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 139, + "fields": { + "banding": 113, + "country": 999, + "value": 170, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 140, + "fields": { + "banding": 113, + "country": 998, + "value": 221, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 141, + "fields": { + "banding": 113, + "country": 997, + "value": 195, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 114, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 142, + "fields": { + "banding": 114, + "country": 999, + "value": 200, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 143, + "fields": { + "banding": 114, + "country": 998, + "value": 260, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 144, + "fields": { + "banding": 114, + "country": 997, + "value": 230, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 115, + "fields": { + "package": 100, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 145, + "fields": { + "banding": 115, + "country": 999, + "value": 280, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 146, + "fields": { + "banding": 115, + "country": 998, + "value": 364, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 147, + "fields": { + "banding": 115, + "country": 997, + "value": 322, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 101, + "fields": { + "name": "Package 101 - Plus (FTE/GBP)", + "description": "Test package 101", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 101, + "fields": { + "basepackage_ptr": 101, + "initiative": 1, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 102, + "fields": { + "package": 101, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 106, + "fields": { + "package": 101, + "banding_type_entry": 102, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 116, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 148, + "fields": { + "banding": 116, + "country": 999, + "value": 74, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 117, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 149, + "fields": { + "banding": 117, + "country": 999, + "value": 119, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 118, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 150, + "fields": { + "banding": 118, + "country": 999, + "value": 178, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 119, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 151, + "fields": { + "banding": 119, + "country": 999, + "value": 238, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 120, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 152, + "fields": { + "banding": 120, + "country": 999, + "value": 297, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 121, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 153, + "fields": { + "banding": 121, + "country": 999, + "value": 386, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 122, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 154, + "fields": { + "banding": 122, + "country": 999, + "value": 505, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 123, + "fields": { + "package": 101, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 155, + "fields": { + "banding": 123, + "country": 999, + "value": 653, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 102, + "fields": { + "name": "Package 102 - Premium (FTE/GBP+USD)", + "description": "Test package 102", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 102, + "fields": { + "basepackage_ptr": 102, + "initiative": 1, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 103, + "fields": { + "package": 102, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 107, + "fields": { + "package": 102, + "banding_type_entry": 103, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 108, + "fields": { + "package": 102, + "banding_type_entry": 103, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 124, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 156, + "fields": { + "banding": 124, + "country": 999, + "value": 98, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 157, + "fields": { + "banding": 124, + "country": 998, + "value": 128, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 125, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 158, + "fields": { + "banding": 125, + "country": 999, + "value": 158, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 159, + "fields": { + "banding": 125, + "country": 998, + "value": 205, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 126, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 160, + "fields": { + "banding": 126, + "country": 999, + "value": 236, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 161, + "fields": { + "banding": 126, + "country": 998, + "value": 307, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 127, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 162, + "fields": { + "banding": 127, + "country": 999, + "value": 315, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 163, + "fields": { + "banding": 127, + "country": 998, + "value": 410, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 128, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 164, + "fields": { + "banding": 128, + "country": 999, + "value": 394, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 165, + "fields": { + "banding": 128, + "country": 998, + "value": 512, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 129, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 166, + "fields": { + "banding": 129, + "country": 999, + "value": 512, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 167, + "fields": { + "banding": 129, + "country": 998, + "value": 666, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 130, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 168, + "fields": { + "banding": 130, + "country": 999, + "value": 670, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 169, + "fields": { + "banding": 130, + "country": 998, + "value": 871, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 131, + "fields": { + "package": 102, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 170, + "fields": { + "banding": 131, + "country": 999, + "value": 867, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 171, + "fields": { + "banding": 131, + "country": 998, + "value": 1127, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 103, + "fields": { + "name": "Package 103 - Standard (Choice/GBP)", + "description": "Test package 103", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 103, + "fields": { + "basepackage_ptr": 103, + "initiative": 2, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 104, + "fields": { + "package": 103, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 109, + "fields": { + "package": 103, + "banding_type_entry": 104, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 132, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 172, + "fields": { + "banding": 132, + "country": 999, + "value": 74, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 133, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 173, + "fields": { + "banding": 133, + "country": 999, + "value": 123, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 134, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 174, + "fields": { + "banding": 134, + "country": 999, + "value": 196, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 135, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 175, + "fields": { + "banding": 135, + "country": 999, + "value": 270, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 136, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 176, + "fields": { + "banding": 136, + "country": 999, + "value": 344, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 137, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 177, + "fields": { + "banding": 137, + "country": 999, + "value": 417, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 138, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 178, + "fields": { + "banding": 138, + "country": 999, + "value": 491, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 139, + "fields": { + "package": 103, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 179, + "fields": { + "banding": 139, + "country": 999, + "value": 687, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 104, + "fields": { + "name": "Package 104 - Basic (FTE+Choice/GBP+USD)", + "description": "Test package 104", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 104, + "fields": { + "basepackage_ptr": 104, + "initiative": 2, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 105, + "fields": { + "package": 104, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 110, + "fields": { + "package": 104, + "banding_type_entry": 105, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 111, + "fields": { + "package": 104, + "banding_type_entry": 105, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 140, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 180, + "fields": { + "banding": 140, + "country": 999, + "value": 147, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 181, + "fields": { + "banding": 140, + "country": 998, + "value": 191, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 141, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 182, + "fields": { + "banding": 141, + "country": 999, + "value": 235, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 183, + "fields": { + "banding": 141, + "country": 998, + "value": 306, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 142, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 184, + "fields": { + "banding": 142, + "country": 999, + "value": 353, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 185, + "fields": { + "banding": 142, + "country": 998, + "value": 459, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 143, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 186, + "fields": { + "banding": 143, + "country": 999, + "value": 470, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 187, + "fields": { + "banding": 143, + "country": 998, + "value": 612, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 144, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 188, + "fields": { + "banding": 144, + "country": 999, + "value": 588, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 189, + "fields": { + "banding": 144, + "country": 998, + "value": 764, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 145, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 190, + "fields": { + "banding": 145, + "country": 999, + "value": 764, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 191, + "fields": { + "banding": 145, + "country": 998, + "value": 994, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 146, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 192, + "fields": { + "banding": 146, + "country": 999, + "value": 1000, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 193, + "fields": { + "banding": 146, + "country": 998, + "value": 1299, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 147, + "fields": { + "package": 104, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 194, + "fields": { + "banding": 147, + "country": 999, + "value": 1294, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 195, + "fields": { + "banding": 147, + "country": 998, + "value": 1682, + "default_currency": "USD" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 106, + "fields": { + "package": 104, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 112, + "fields": { + "package": 104, + "banding_type_entry": 106, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 113, + "fields": { + "package": 104, + "banding_type_entry": 106, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 148, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 196, + "fields": { + "banding": 148, + "country": 999, + "value": 88, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 197, + "fields": { + "banding": 148, + "country": 998, + "value": 115, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 149, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 198, + "fields": { + "banding": 149, + "country": 999, + "value": 147, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 199, + "fields": { + "banding": 149, + "country": 998, + "value": 191, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 150, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 200, + "fields": { + "banding": 150, + "country": 999, + "value": 235, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 201, + "fields": { + "banding": 150, + "country": 998, + "value": 306, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 151, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 202, + "fields": { + "banding": 151, + "country": 999, + "value": 323, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 203, + "fields": { + "banding": 151, + "country": 998, + "value": 420, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 152, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 204, + "fields": { + "banding": 152, + "country": 999, + "value": 412, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 205, + "fields": { + "banding": 152, + "country": 998, + "value": 535, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 153, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 206, + "fields": { + "banding": 153, + "country": 999, + "value": 500, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 207, + "fields": { + "banding": 153, + "country": 998, + "value": 650, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 154, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 208, + "fields": { + "banding": 154, + "country": 999, + "value": 588, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 209, + "fields": { + "banding": 154, + "country": 998, + "value": 764, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 155, + "fields": { + "package": 104, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 210, + "fields": { + "banding": 155, + "country": 999, + "value": 823, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 211, + "fields": { + "banding": 155, + "country": 998, + "value": 1070, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 105, + "fields": { + "name": "Package 105 - Advanced (FTE/GBP+EUR)", + "description": "Test package 105", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 105, + "fields": { + "basepackage_ptr": 105, + "initiative": 2, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 107, + "fields": { + "package": 105, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 114, + "fields": { + "package": 105, + "banding_type_entry": 107, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 115, + "fields": { + "package": 105, + "banding_type_entry": 107, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 156, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 212, + "fields": { + "banding": 156, + "country": 999, + "value": 171, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 213, + "fields": { + "banding": 156, + "country": 997, + "value": 197, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 157, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 214, + "fields": { + "banding": 157, + "country": 999, + "value": 274, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 215, + "fields": { + "banding": 157, + "country": 997, + "value": 315, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 158, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 216, + "fields": { + "banding": 158, + "country": 999, + "value": 411, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 217, + "fields": { + "banding": 158, + "country": 997, + "value": 473, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 159, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 218, + "fields": { + "banding": 159, + "country": 999, + "value": 548, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 219, + "fields": { + "banding": 159, + "country": 997, + "value": 630, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 160, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 220, + "fields": { + "banding": 160, + "country": 999, + "value": 685, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 221, + "fields": { + "banding": 160, + "country": 997, + "value": 788, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 161, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 222, + "fields": { + "banding": 161, + "country": 999, + "value": 890, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 223, + "fields": { + "banding": 161, + "country": 997, + "value": 1024, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 162, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 224, + "fields": { + "banding": 162, + "country": 999, + "value": 1164, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 225, + "fields": { + "banding": 162, + "country": 997, + "value": 1339, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 163, + "fields": { + "package": 105, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 226, + "fields": { + "banding": 163, + "country": 999, + "value": 1507, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 227, + "fields": { + "banding": 163, + "country": 997, + "value": 1733, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 106, + "fields": { + "name": "Package 106 - Pro (Choice/USD)", + "description": "Test package 106", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 106, + "fields": { + "basepackage_ptr": 106, + "initiative": 3, + "default_country": 998, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 108, + "fields": { + "package": 106, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 116, + "fields": { + "package": 106, + "banding_type_entry": 108, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 164, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 228, + "fields": { + "banding": 164, + "country": 998, + "value": 152, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 165, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 229, + "fields": { + "banding": 165, + "country": 998, + "value": 254, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 166, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 230, + "fields": { + "banding": 166, + "country": 998, + "value": 407, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 167, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 231, + "fields": { + "banding": 167, + "country": 998, + "value": 559, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 168, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 232, + "fields": { + "banding": 168, + "country": 998, + "value": 712, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 169, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 233, + "fields": { + "banding": 169, + "country": 998, + "value": 864, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 170, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 234, + "fields": { + "banding": 170, + "country": 998, + "value": 1017, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 171, + "fields": { + "package": 106, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 235, + "fields": { + "banding": 171, + "country": 998, + "value": 1423, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 107, + "fields": { + "name": "Package 107 - Essential (FTE+Choice/GBP)", + "description": "Test package 107", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 107, + "fields": { + "basepackage_ptr": 107, + "initiative": 3, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 109, + "fields": { + "package": 107, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 117, + "fields": { + "package": 107, + "banding_type_entry": 109, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 172, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 236, + "fields": { + "banding": 172, + "country": 999, + "value": 220, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 173, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 237, + "fields": { + "banding": 173, + "country": 999, + "value": 352, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 174, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 238, + "fields": { + "banding": 174, + "country": 999, + "value": 527, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 175, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 239, + "fields": { + "banding": 175, + "country": 999, + "value": 703, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 176, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 240, + "fields": { + "banding": 176, + "country": 999, + "value": 879, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 177, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 241, + "fields": { + "banding": 177, + "country": 999, + "value": 1143, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 178, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 242, + "fields": { + "banding": 178, + "country": 999, + "value": 1494, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 179, + "fields": { + "package": 107, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 243, + "fields": { + "banding": 179, + "country": 999, + "value": 1934, + "default_currency": "GBP" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 110, + "fields": { + "package": 107, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 118, + "fields": { + "package": 107, + "banding_type_entry": 110, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 180, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 244, + "fields": { + "banding": 180, + "country": 999, + "value": 132, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 181, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 245, + "fields": { + "banding": 181, + "country": 999, + "value": 220, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 182, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 246, + "fields": { + "banding": 182, + "country": 999, + "value": 352, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 183, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 247, + "fields": { + "banding": 183, + "country": 999, + "value": 483, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 184, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 248, + "fields": { + "banding": 184, + "country": 999, + "value": 615, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 185, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 249, + "fields": { + "banding": 185, + "country": 999, + "value": 747, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 186, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 250, + "fields": { + "banding": 186, + "country": 999, + "value": 879, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 187, + "fields": { + "package": 107, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 251, + "fields": { + "banding": 187, + "country": 999, + "value": 1231, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 108, + "fields": { + "name": "Package 108 - Complete (FTE/EUR)", + "description": "Test package 108", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 108, + "fields": { + "basepackage_ptr": 108, + "initiative": 3, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 111, + "fields": { + "package": 108, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 119, + "fields": { + "package": 108, + "banding_type_entry": 111, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 188, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 252, + "fields": { + "banding": 188, + "country": 997, + "value": 281, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 189, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 253, + "fields": { + "banding": 189, + "country": 997, + "value": 449, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 190, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 254, + "fields": { + "banding": 190, + "country": 997, + "value": 673, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 191, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 255, + "fields": { + "banding": 191, + "country": 997, + "value": 898, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 192, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 256, + "fields": { + "banding": 192, + "country": 997, + "value": 1122, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 193, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 257, + "fields": { + "banding": 193, + "country": 997, + "value": 1459, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 194, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 258, + "fields": { + "banding": 194, + "country": 997, + "value": 1908, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 195, + "fields": { + "package": 108, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 259, + "fields": { + "banding": 195, + "country": 997, + "value": 2469, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 109, + "fields": { + "name": "Package 109 - Select (Choice/GBP+USD)", + "description": "Test package 109", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 109, + "fields": { + "basepackage_ptr": 109, + "initiative": 4, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 112, + "fields": { + "package": 109, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 120, + "fields": { + "package": 109, + "banding_type_entry": 112, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 121, + "fields": { + "package": 109, + "banding_type_entry": 112, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 196, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 260, + "fields": { + "banding": 196, + "country": 999, + "value": 161, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 261, + "fields": { + "banding": 196, + "country": 998, + "value": 209, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 197, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 262, + "fields": { + "banding": 197, + "country": 999, + "value": 268, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 263, + "fields": { + "banding": 197, + "country": 998, + "value": 349, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 198, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 264, + "fields": { + "banding": 198, + "country": 999, + "value": 429, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 265, + "fields": { + "banding": 198, + "country": 998, + "value": 558, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 199, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 266, + "fields": { + "banding": 199, + "country": 999, + "value": 590, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 267, + "fields": { + "banding": 199, + "country": 998, + "value": 767, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 200, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 268, + "fields": { + "banding": 200, + "country": 999, + "value": 751, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 269, + "fields": { + "banding": 200, + "country": 998, + "value": 976, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 201, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 270, + "fields": { + "banding": 201, + "country": 999, + "value": 912, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 271, + "fields": { + "banding": 201, + "country": 998, + "value": 1186, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 202, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 272, + "fields": { + "banding": 202, + "country": 999, + "value": 1073, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 273, + "fields": { + "banding": 202, + "country": 998, + "value": 1395, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 203, + "fields": { + "package": 109, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 274, + "fields": { + "banding": 203, + "country": 999, + "value": 1502, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 275, + "fields": { + "banding": 203, + "country": 998, + "value": 1953, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 110, + "fields": { + "name": "Package 110 - Core (FTE+Choice/all)", + "description": "Test package 110", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 110, + "fields": { + "basepackage_ptr": 110, + "initiative": 4, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 113, + "fields": { + "package": 110, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 122, + "fields": { + "package": 110, + "banding_type_entry": 113, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 123, + "fields": { + "package": 110, + "banding_type_entry": 113, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 124, + "fields": { + "package": 110, + "banding_type_entry": 113, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 204, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 276, + "fields": { + "banding": 204, + "country": 999, + "value": 292, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 277, + "fields": { + "banding": 204, + "country": 998, + "value": 380, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 278, + "fields": { + "banding": 204, + "country": 997, + "value": 336, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 205, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 279, + "fields": { + "banding": 205, + "country": 999, + "value": 468, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 280, + "fields": { + "banding": 205, + "country": 998, + "value": 608, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 281, + "fields": { + "banding": 205, + "country": 997, + "value": 538, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 206, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 282, + "fields": { + "banding": 206, + "country": 999, + "value": 702, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 283, + "fields": { + "banding": 206, + "country": 998, + "value": 913, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 284, + "fields": { + "banding": 206, + "country": 997, + "value": 807, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 207, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 285, + "fields": { + "banding": 207, + "country": 999, + "value": 936, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 286, + "fields": { + "banding": 207, + "country": 998, + "value": 1217, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 287, + "fields": { + "banding": 207, + "country": 997, + "value": 1076, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 208, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 288, + "fields": { + "banding": 208, + "country": 999, + "value": 1170, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 289, + "fields": { + "banding": 208, + "country": 998, + "value": 1521, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 290, + "fields": { + "banding": 208, + "country": 997, + "value": 1346, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 209, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 291, + "fields": { + "banding": 209, + "country": 999, + "value": 1521, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 292, + "fields": { + "banding": 209, + "country": 998, + "value": 1977, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 293, + "fields": { + "banding": 209, + "country": 997, + "value": 1749, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 210, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 294, + "fields": { + "banding": 210, + "country": 999, + "value": 1989, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 295, + "fields": { + "banding": 210, + "country": 998, + "value": 2586, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 296, + "fields": { + "banding": 210, + "country": 997, + "value": 2287, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 211, + "fields": { + "package": 110, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 297, + "fields": { + "banding": 211, + "country": 999, + "value": 2574, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 298, + "fields": { + "banding": 211, + "country": 998, + "value": 3346, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 299, + "fields": { + "banding": 211, + "country": 997, + "value": 2960, + "default_currency": "EUR" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 114, + "fields": { + "package": 110, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 125, + "fields": { + "package": 110, + "banding_type_entry": 114, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 126, + "fields": { + "package": 110, + "banding_type_entry": 114, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 127, + "fields": { + "package": 110, + "banding_type_entry": 114, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 212, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 300, + "fields": { + "banding": 212, + "country": 999, + "value": 176, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 301, + "fields": { + "banding": 212, + "country": 998, + "value": 228, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 302, + "fields": { + "banding": 212, + "country": 997, + "value": 202, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 213, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 303, + "fields": { + "banding": 213, + "country": 999, + "value": 292, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 304, + "fields": { + "banding": 213, + "country": 998, + "value": 380, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 305, + "fields": { + "banding": 213, + "country": 997, + "value": 336, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 214, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 306, + "fields": { + "banding": 214, + "country": 999, + "value": 468, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 307, + "fields": { + "banding": 214, + "country": 998, + "value": 608, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 308, + "fields": { + "banding": 214, + "country": 997, + "value": 538, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 215, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 309, + "fields": { + "banding": 215, + "country": 999, + "value": 644, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 310, + "fields": { + "banding": 215, + "country": 998, + "value": 837, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 311, + "fields": { + "banding": 215, + "country": 997, + "value": 740, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 216, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 312, + "fields": { + "banding": 216, + "country": 999, + "value": 819, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 313, + "fields": { + "banding": 216, + "country": 998, + "value": 1065, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 314, + "fields": { + "banding": 216, + "country": 997, + "value": 942, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 217, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 315, + "fields": { + "banding": 217, + "country": 999, + "value": 994, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 316, + "fields": { + "banding": 217, + "country": 998, + "value": 1293, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 317, + "fields": { + "banding": 217, + "country": 997, + "value": 1144, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 218, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 318, + "fields": { + "banding": 218, + "country": 999, + "value": 1170, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 319, + "fields": { + "banding": 218, + "country": 998, + "value": 1521, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 320, + "fields": { + "banding": 218, + "country": 997, + "value": 1346, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 219, + "fields": { + "package": 110, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 321, + "fields": { + "banding": 219, + "country": 999, + "value": 1638, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 322, + "fields": { + "banding": 219, + "country": 998, + "value": 2129, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 323, + "fields": { + "banding": 219, + "country": 997, + "value": 1884, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 111, + "fields": { + "name": "Package 111 - Plus (FTE/GBP)", + "description": "Test package 111", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 111, + "fields": { + "basepackage_ptr": 111, + "initiative": 4, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 115, + "fields": { + "package": 111, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 128, + "fields": { + "package": 111, + "banding_type_entry": 115, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 220, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 324, + "fields": { + "banding": 220, + "country": 999, + "value": 317, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 221, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 325, + "fields": { + "banding": 221, + "country": 999, + "value": 507, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 222, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 326, + "fields": { + "banding": 222, + "country": 999, + "value": 760, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 223, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 327, + "fields": { + "banding": 223, + "country": 999, + "value": 1014, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 224, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 328, + "fields": { + "banding": 224, + "country": 999, + "value": 1267, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 225, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 329, + "fields": { + "banding": 225, + "country": 999, + "value": 1647, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 226, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 330, + "fields": { + "banding": 226, + "country": 999, + "value": 2154, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 227, + "fields": { + "package": 111, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 331, + "fields": { + "banding": 227, + "country": 999, + "value": 2787, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 112, + "fields": { + "name": "Package 112 - Premium (FTE/GBP+USD)", + "description": "Test package 112", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 112, + "fields": { + "basepackage_ptr": 112, + "initiative": 5, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 116, + "fields": { + "package": 112, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 129, + "fields": { + "package": 112, + "banding_type_entry": 116, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 130, + "fields": { + "package": 112, + "banding_type_entry": 116, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 228, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 332, + "fields": { + "banding": 228, + "country": 999, + "value": 341, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 333, + "fields": { + "banding": 228, + "country": 998, + "value": 443, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 229, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 334, + "fields": { + "banding": 229, + "country": 999, + "value": 546, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 335, + "fields": { + "banding": 229, + "country": 998, + "value": 709, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 230, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 336, + "fields": { + "banding": 230, + "country": 999, + "value": 818, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 337, + "fields": { + "banding": 230, + "country": 998, + "value": 1064, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 231, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 338, + "fields": { + "banding": 231, + "country": 999, + "value": 1091, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 339, + "fields": { + "banding": 231, + "country": 998, + "value": 1419, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 232, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 340, + "fields": { + "banding": 232, + "country": 999, + "value": 1364, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 341, + "fields": { + "banding": 232, + "country": 998, + "value": 1773, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 233, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 342, + "fields": { + "banding": 233, + "country": 999, + "value": 1773, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 343, + "fields": { + "banding": 233, + "country": 998, + "value": 2305, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 234, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 344, + "fields": { + "banding": 234, + "country": 999, + "value": 2319, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 345, + "fields": { + "banding": 234, + "country": 998, + "value": 3014, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 235, + "fields": { + "package": 112, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 346, + "fields": { + "banding": 235, + "country": 999, + "value": 3001, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 347, + "fields": { + "banding": 235, + "country": 998, + "value": 3901, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 113, + "fields": { + "name": "Package 113 - Standard (Choice/GBP)", + "description": "Test package 113", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 113, + "fields": { + "basepackage_ptr": 113, + "initiative": 5, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 117, + "fields": { + "package": 113, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 131, + "fields": { + "package": 113, + "banding_type_entry": 117, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 236, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 348, + "fields": { + "banding": 236, + "country": 999, + "value": 219, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 237, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 349, + "fields": { + "banding": 237, + "country": 999, + "value": 365, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 238, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 350, + "fields": { + "banding": 238, + "country": 999, + "value": 584, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 239, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 351, + "fields": { + "banding": 239, + "country": 999, + "value": 804, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 240, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 352, + "fields": { + "banding": 240, + "country": 999, + "value": 1023, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 241, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 353, + "fields": { + "banding": 241, + "country": 999, + "value": 1242, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 242, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 354, + "fields": { + "banding": 242, + "country": 999, + "value": 1461, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 243, + "fields": { + "package": 113, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 355, + "fields": { + "banding": 243, + "country": 999, + "value": 2045, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 114, + "fields": { + "name": "Package 114 - Basic (FTE+Choice/GBP+USD)", + "description": "Test package 114", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 114, + "fields": { + "basepackage_ptr": 114, + "initiative": 5, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 118, + "fields": { + "package": 114, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 132, + "fields": { + "package": 114, + "banding_type_entry": 118, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 133, + "fields": { + "package": 114, + "banding_type_entry": 118, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 244, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 356, + "fields": { + "banding": 244, + "country": 999, + "value": 390, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 357, + "fields": { + "banding": 244, + "country": 998, + "value": 506, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 245, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 358, + "fields": { + "banding": 245, + "country": 999, + "value": 623, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 359, + "fields": { + "banding": 245, + "country": 998, + "value": 810, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 246, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 360, + "fields": { + "banding": 246, + "country": 999, + "value": 935, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 361, + "fields": { + "banding": 246, + "country": 998, + "value": 1215, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 247, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 362, + "fields": { + "banding": 247, + "country": 999, + "value": 1246, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 363, + "fields": { + "banding": 247, + "country": 998, + "value": 1620, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 248, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 364, + "fields": { + "banding": 248, + "country": 999, + "value": 1558, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 365, + "fields": { + "banding": 248, + "country": 998, + "value": 2025, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 249, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 366, + "fields": { + "banding": 249, + "country": 999, + "value": 2025, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 367, + "fields": { + "banding": 249, + "country": 998, + "value": 2633, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 250, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 368, + "fields": { + "banding": 250, + "country": 999, + "value": 2649, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 369, + "fields": { + "banding": 250, + "country": 998, + "value": 3443, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 251, + "fields": { + "package": 114, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 370, + "fields": { + "banding": 251, + "country": 999, + "value": 3428, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 371, + "fields": { + "banding": 251, + "country": 998, + "value": 4456, + "default_currency": "USD" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 119, + "fields": { + "package": 114, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 134, + "fields": { + "package": 114, + "banding_type_entry": 119, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 135, + "fields": { + "package": 114, + "banding_type_entry": 119, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 252, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 372, + "fields": { + "banding": 252, + "country": 999, + "value": 234, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 373, + "fields": { + "banding": 252, + "country": 998, + "value": 304, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 253, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 374, + "fields": { + "banding": 253, + "country": 999, + "value": 390, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 375, + "fields": { + "banding": 253, + "country": 998, + "value": 506, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 254, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 376, + "fields": { + "banding": 254, + "country": 999, + "value": 623, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 377, + "fields": { + "banding": 254, + "country": 998, + "value": 810, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 255, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 378, + "fields": { + "banding": 255, + "country": 999, + "value": 857, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 379, + "fields": { + "banding": 255, + "country": 998, + "value": 1114, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 256, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 380, + "fields": { + "banding": 256, + "country": 999, + "value": 1091, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 381, + "fields": { + "banding": 256, + "country": 998, + "value": 1418, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 257, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 382, + "fields": { + "banding": 257, + "country": 999, + "value": 1324, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 383, + "fields": { + "banding": 257, + "country": 998, + "value": 1722, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 258, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 384, + "fields": { + "banding": 258, + "country": 999, + "value": 1558, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 385, + "fields": { + "banding": 258, + "country": 998, + "value": 2025, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 259, + "fields": { + "package": 114, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 386, + "fields": { + "banding": 259, + "country": 999, + "value": 2181, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 387, + "fields": { + "banding": 259, + "country": 998, + "value": 2836, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 115, + "fields": { + "name": "Package 115 - Advanced (FTE/GBP+EUR)", + "description": "Test package 115", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 115, + "fields": { + "basepackage_ptr": 115, + "initiative": 6, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 120, + "fields": { + "package": 115, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 136, + "fields": { + "package": 115, + "banding_type_entry": 120, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 137, + "fields": { + "package": 115, + "banding_type_entry": 120, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 260, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 388, + "fields": { + "banding": 260, + "country": 999, + "value": 414, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 389, + "fields": { + "banding": 260, + "country": 997, + "value": 476, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 261, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 390, + "fields": { + "banding": 261, + "country": 999, + "value": 662, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 391, + "fields": { + "banding": 261, + "country": 997, + "value": 761, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 262, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 392, + "fields": { + "banding": 262, + "country": 999, + "value": 993, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 393, + "fields": { + "banding": 262, + "country": 997, + "value": 1142, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 263, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 394, + "fields": { + "banding": 263, + "country": 999, + "value": 1324, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 395, + "fields": { + "banding": 263, + "country": 997, + "value": 1523, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 264, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 396, + "fields": { + "banding": 264, + "country": 999, + "value": 1655, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 397, + "fields": { + "banding": 264, + "country": 997, + "value": 1903, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 265, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 398, + "fields": { + "banding": 265, + "country": 999, + "value": 2152, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 399, + "fields": { + "banding": 265, + "country": 997, + "value": 2474, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 266, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 400, + "fields": { + "banding": 266, + "country": 999, + "value": 2814, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 401, + "fields": { + "banding": 266, + "country": 997, + "value": 3236, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 267, + "fields": { + "package": 115, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 402, + "fields": { + "banding": 267, + "country": 999, + "value": 3641, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 403, + "fields": { + "banding": 267, + "country": 997, + "value": 4187, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 116, + "fields": { + "name": "Package 116 - Pro (Choice/USD)", + "description": "Test package 116", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 116, + "fields": { + "basepackage_ptr": 116, + "initiative": 6, + "default_country": 998, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 121, + "fields": { + "package": 116, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 138, + "fields": { + "package": 116, + "banding_type_entry": 121, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 268, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 404, + "fields": { + "banding": 268, + "country": 998, + "value": 342, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 269, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 405, + "fields": { + "banding": 269, + "country": 998, + "value": 569, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 270, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 406, + "fields": { + "banding": 270, + "country": 998, + "value": 911, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 271, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 407, + "fields": { + "banding": 271, + "country": 998, + "value": 1253, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 272, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 408, + "fields": { + "banding": 272, + "country": 998, + "value": 1594, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 273, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 409, + "fields": { + "banding": 273, + "country": 998, + "value": 1936, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 274, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 410, + "fields": { + "banding": 274, + "country": 998, + "value": 2278, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 275, + "fields": { + "package": 116, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 411, + "fields": { + "banding": 275, + "country": 998, + "value": 3189, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 117, + "fields": { + "name": "Package 117 - Essential (FTE+Choice/GBP)", + "description": "Test package 117", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 117, + "fields": { + "basepackage_ptr": 117, + "initiative": 6, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 122, + "fields": { + "package": 117, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 139, + "fields": { + "package": 117, + "banding_type_entry": 122, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 276, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 412, + "fields": { + "banding": 276, + "country": 999, + "value": 462, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 277, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 413, + "fields": { + "banding": 277, + "country": 999, + "value": 740, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 278, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 414, + "fields": { + "banding": 278, + "country": 999, + "value": 1109, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 279, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 415, + "fields": { + "banding": 279, + "country": 999, + "value": 1479, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 280, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 416, + "fields": { + "banding": 280, + "country": 999, + "value": 1849, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 281, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 417, + "fields": { + "banding": 281, + "country": 999, + "value": 2404, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 282, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 418, + "fields": { + "banding": 282, + "country": 999, + "value": 3143, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 283, + "fields": { + "package": 117, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 419, + "fields": { + "banding": 283, + "country": 999, + "value": 4068, + "default_currency": "GBP" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 123, + "fields": { + "package": 117, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 140, + "fields": { + "package": 117, + "banding_type_entry": 123, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 284, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 420, + "fields": { + "banding": 284, + "country": 999, + "value": 277, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 285, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 421, + "fields": { + "banding": 285, + "country": 999, + "value": 462, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 286, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 422, + "fields": { + "banding": 286, + "country": 999, + "value": 740, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 287, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 423, + "fields": { + "banding": 287, + "country": 999, + "value": 1017, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 288, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 424, + "fields": { + "banding": 288, + "country": 999, + "value": 1294, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 289, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 425, + "fields": { + "banding": 289, + "country": 999, + "value": 1572, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 290, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 426, + "fields": { + "banding": 290, + "country": 999, + "value": 1849, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 291, + "fields": { + "package": 117, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 427, + "fields": { + "banding": 291, + "country": 999, + "value": 2589, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 118, + "fields": { + "name": "Package 118 - Complete (FTE/EUR)", + "description": "Test package 118", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 118, + "fields": { + "basepackage_ptr": 118, + "initiative": 7, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 124, + "fields": { + "package": 118, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 141, + "fields": { + "package": 118, + "banding_type_entry": 124, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 292, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 428, + "fields": { + "banding": 292, + "country": 997, + "value": 559, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 293, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 429, + "fields": { + "banding": 293, + "country": 997, + "value": 895, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 294, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 430, + "fields": { + "banding": 294, + "country": 997, + "value": 1343, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 295, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 431, + "fields": { + "banding": 295, + "country": 997, + "value": 1790, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 296, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 432, + "fields": { + "banding": 296, + "country": 997, + "value": 2238, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 297, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 433, + "fields": { + "banding": 297, + "country": 997, + "value": 2909, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 298, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 434, + "fields": { + "banding": 298, + "country": 997, + "value": 3804, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 299, + "fields": { + "package": 118, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 435, + "fields": { + "banding": 299, + "country": 997, + "value": 4923, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 119, + "fields": { + "name": "Package 119 - Select (Choice/GBP+USD)", + "description": "Test package 119", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 119, + "fields": { + "basepackage_ptr": 119, + "initiative": 7, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 125, + "fields": { + "package": 119, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 142, + "fields": { + "package": 119, + "banding_type_entry": 125, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 143, + "fields": { + "package": 119, + "banding_type_entry": 125, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 300, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 436, + "fields": { + "banding": 300, + "country": 999, + "value": 306, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 437, + "fields": { + "banding": 300, + "country": 998, + "value": 398, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 301, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 438, + "fields": { + "banding": 301, + "country": 999, + "value": 511, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 439, + "fields": { + "banding": 301, + "country": 998, + "value": 664, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 302, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 440, + "fields": { + "banding": 302, + "country": 999, + "value": 817, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 441, + "fields": { + "banding": 302, + "country": 998, + "value": 1062, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 303, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 442, + "fields": { + "banding": 303, + "country": 999, + "value": 1124, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 443, + "fields": { + "banding": 303, + "country": 998, + "value": 1461, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 304, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 444, + "fields": { + "banding": 304, + "country": 999, + "value": 1430, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 445, + "fields": { + "banding": 304, + "country": 998, + "value": 1859, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 305, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 446, + "fields": { + "banding": 305, + "country": 999, + "value": 1737, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 447, + "fields": { + "banding": 305, + "country": 998, + "value": 2258, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 306, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 448, + "fields": { + "banding": 306, + "country": 999, + "value": 2043, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 449, + "fields": { + "banding": 306, + "country": 998, + "value": 2656, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 307, + "fields": { + "package": 119, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 450, + "fields": { + "banding": 307, + "country": 999, + "value": 2860, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 451, + "fields": { + "banding": 307, + "country": 998, + "value": 3718, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 120, + "fields": { + "name": "Package 120 - Core (FTE+Choice/all)", + "description": "Test package 120", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 120, + "fields": { + "basepackage_ptr": 120, + "initiative": 7, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 126, + "fields": { + "package": 120, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 144, + "fields": { + "package": 120, + "banding_type_entry": 126, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 145, + "fields": { + "package": 120, + "banding_type_entry": 126, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 146, + "fields": { + "package": 120, + "banding_type_entry": 126, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 308, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 452, + "fields": { + "banding": 308, + "country": 999, + "value": 535, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 453, + "fields": { + "banding": 308, + "country": 998, + "value": 696, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 454, + "fields": { + "banding": 308, + "country": 997, + "value": 615, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 309, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 455, + "fields": { + "banding": 309, + "country": 999, + "value": 856, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 456, + "fields": { + "banding": 309, + "country": 998, + "value": 1113, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 457, + "fields": { + "banding": 309, + "country": 997, + "value": 984, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 310, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 458, + "fields": { + "banding": 310, + "country": 999, + "value": 1284, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 459, + "fields": { + "banding": 310, + "country": 998, + "value": 1669, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 460, + "fields": { + "banding": 310, + "country": 997, + "value": 1477, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 311, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 461, + "fields": { + "banding": 311, + "country": 999, + "value": 1712, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 462, + "fields": { + "banding": 311, + "country": 998, + "value": 2226, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 463, + "fields": { + "banding": 311, + "country": 997, + "value": 1969, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 312, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 464, + "fields": { + "banding": 312, + "country": 999, + "value": 2140, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 465, + "fields": { + "banding": 312, + "country": 998, + "value": 2782, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 466, + "fields": { + "banding": 312, + "country": 997, + "value": 2461, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 313, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 467, + "fields": { + "banding": 313, + "country": 999, + "value": 2782, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 468, + "fields": { + "banding": 313, + "country": 998, + "value": 3617, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 469, + "fields": { + "banding": 313, + "country": 997, + "value": 3199, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 314, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 470, + "fields": { + "banding": 314, + "country": 999, + "value": 3638, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 471, + "fields": { + "banding": 314, + "country": 998, + "value": 4729, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 472, + "fields": { + "banding": 314, + "country": 997, + "value": 4184, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 315, + "fields": { + "package": 120, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 473, + "fields": { + "banding": 315, + "country": 999, + "value": 4708, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 474, + "fields": { + "banding": 315, + "country": 998, + "value": 6120, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 475, + "fields": { + "banding": 315, + "country": 997, + "value": 5414, + "default_currency": "EUR" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 127, + "fields": { + "package": 120, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 147, + "fields": { + "package": 120, + "banding_type_entry": 127, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 148, + "fields": { + "package": 120, + "banding_type_entry": 127, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 149, + "fields": { + "package": 120, + "banding_type_entry": 127, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 316, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 476, + "fields": { + "banding": 316, + "country": 999, + "value": 321, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 477, + "fields": { + "banding": 316, + "country": 998, + "value": 417, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 478, + "fields": { + "banding": 316, + "country": 997, + "value": 369, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 317, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 479, + "fields": { + "banding": 317, + "country": 999, + "value": 535, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 480, + "fields": { + "banding": 317, + "country": 998, + "value": 696, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 481, + "fields": { + "banding": 317, + "country": 997, + "value": 615, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 318, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 482, + "fields": { + "banding": 318, + "country": 999, + "value": 856, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 483, + "fields": { + "banding": 318, + "country": 998, + "value": 1113, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 484, + "fields": { + "banding": 318, + "country": 997, + "value": 984, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 319, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 485, + "fields": { + "banding": 319, + "country": 999, + "value": 1177, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 486, + "fields": { + "banding": 319, + "country": 998, + "value": 1530, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 487, + "fields": { + "banding": 319, + "country": 997, + "value": 1354, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 320, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 488, + "fields": { + "banding": 320, + "country": 999, + "value": 1498, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 489, + "fields": { + "banding": 320, + "country": 998, + "value": 1947, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 490, + "fields": { + "banding": 320, + "country": 997, + "value": 1723, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 321, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 491, + "fields": { + "banding": 321, + "country": 999, + "value": 1819, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 492, + "fields": { + "banding": 321, + "country": 998, + "value": 2365, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 493, + "fields": { + "banding": 321, + "country": 997, + "value": 2092, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 322, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 494, + "fields": { + "banding": 322, + "country": 999, + "value": 2140, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 495, + "fields": { + "banding": 322, + "country": 998, + "value": 2782, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 496, + "fields": { + "banding": 322, + "country": 997, + "value": 2461, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 323, + "fields": { + "package": 120, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 497, + "fields": { + "banding": 323, + "country": 999, + "value": 2996, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 498, + "fields": { + "banding": 323, + "country": 998, + "value": 3895, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 499, + "fields": { + "banding": 323, + "country": 997, + "value": 3445, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 121, + "fields": { + "name": "Package 121 - Plus (FTE/GBP)", + "description": "Test package 121", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 121, + "fields": { + "basepackage_ptr": 121, + "initiative": 8, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 128, + "fields": { + "package": 121, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 150, + "fields": { + "package": 121, + "banding_type_entry": 128, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 324, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 500, + "fields": { + "banding": 324, + "country": 999, + "value": 559, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 325, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 501, + "fields": { + "banding": 325, + "country": 999, + "value": 895, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 326, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 502, + "fields": { + "banding": 326, + "country": 999, + "value": 1342, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 327, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 503, + "fields": { + "banding": 327, + "country": 999, + "value": 1790, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 328, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 504, + "fields": { + "banding": 328, + "country": 999, + "value": 2237, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 329, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 505, + "fields": { + "banding": 329, + "country": 999, + "value": 2908, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 330, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 506, + "fields": { + "banding": 330, + "country": 999, + "value": 3803, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 331, + "fields": { + "package": 121, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 507, + "fields": { + "banding": 331, + "country": 999, + "value": 4921, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 122, + "fields": { + "name": "Package 122 - Premium (FTE/GBP+USD)", + "description": "Test package 122", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 122, + "fields": { + "basepackage_ptr": 122, + "initiative": 8, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 129, + "fields": { + "package": 122, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 151, + "fields": { + "package": 122, + "banding_type_entry": 129, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 152, + "fields": { + "package": 122, + "banding_type_entry": 129, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 332, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 508, + "fields": { + "banding": 332, + "country": 999, + "value": 584, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 509, + "fields": { + "banding": 332, + "country": 998, + "value": 759, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 333, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 510, + "fields": { + "banding": 333, + "country": 999, + "value": 934, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 511, + "fields": { + "banding": 333, + "country": 998, + "value": 1214, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 334, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 512, + "fields": { + "banding": 334, + "country": 999, + "value": 1400, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 513, + "fields": { + "banding": 334, + "country": 998, + "value": 1821, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 335, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 514, + "fields": { + "banding": 335, + "country": 999, + "value": 1867, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 515, + "fields": { + "banding": 335, + "country": 998, + "value": 2427, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 336, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 516, + "fields": { + "banding": 336, + "country": 999, + "value": 2334, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 517, + "fields": { + "banding": 336, + "country": 998, + "value": 3034, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 337, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 518, + "fields": { + "banding": 337, + "country": 999, + "value": 3034, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 519, + "fields": { + "banding": 337, + "country": 998, + "value": 3944, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 338, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 520, + "fields": { + "banding": 338, + "country": 999, + "value": 3968, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 521, + "fields": { + "banding": 338, + "country": 998, + "value": 5158, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 339, + "fields": { + "package": 122, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 522, + "fields": { + "banding": 339, + "country": 999, + "value": 5135, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 523, + "fields": { + "banding": 339, + "country": 998, + "value": 6675, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 123, + "fields": { + "name": "Package 123 - Standard (Choice/GBP)", + "description": "Test package 123", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 123, + "fields": { + "basepackage_ptr": 123, + "initiative": 8, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 130, + "fields": { + "package": 123, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 153, + "fields": { + "package": 123, + "banding_type_entry": 130, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 340, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 524, + "fields": { + "banding": 340, + "country": 999, + "value": 365, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 341, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 525, + "fields": { + "banding": 341, + "country": 999, + "value": 608, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 342, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 526, + "fields": { + "banding": 342, + "country": 999, + "value": 972, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 343, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 527, + "fields": { + "banding": 343, + "country": 999, + "value": 1337, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 344, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 528, + "fields": { + "banding": 344, + "country": 999, + "value": 1702, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 345, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 529, + "fields": { + "banding": 345, + "country": 999, + "value": 2066, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 346, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 530, + "fields": { + "banding": 346, + "country": 999, + "value": 2431, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 347, + "fields": { + "package": 123, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 531, + "fields": { + "banding": 347, + "country": 999, + "value": 3403, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 124, + "fields": { + "name": "Package 124 - Basic (FTE+Choice/GBP+USD)", + "description": "Test package 124", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 124, + "fields": { + "basepackage_ptr": 124, + "initiative": 9, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 131, + "fields": { + "package": 124, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 154, + "fields": { + "package": 124, + "banding_type_entry": 131, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 155, + "fields": { + "package": 124, + "banding_type_entry": 131, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 348, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 532, + "fields": { + "banding": 348, + "country": 999, + "value": 632, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 533, + "fields": { + "banding": 348, + "country": 998, + "value": 822, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 349, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 534, + "fields": { + "banding": 349, + "country": 999, + "value": 1011, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 535, + "fields": { + "banding": 349, + "country": 998, + "value": 1315, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 350, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 536, + "fields": { + "banding": 350, + "country": 999, + "value": 1517, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 537, + "fields": { + "banding": 350, + "country": 998, + "value": 1972, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 351, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 538, + "fields": { + "banding": 351, + "country": 999, + "value": 2022, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 539, + "fields": { + "banding": 351, + "country": 998, + "value": 2629, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 352, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 540, + "fields": { + "banding": 352, + "country": 999, + "value": 2528, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 541, + "fields": { + "banding": 352, + "country": 998, + "value": 3286, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 353, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 542, + "fields": { + "banding": 353, + "country": 999, + "value": 3286, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 543, + "fields": { + "banding": 353, + "country": 998, + "value": 4272, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 354, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 544, + "fields": { + "banding": 354, + "country": 999, + "value": 4298, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 545, + "fields": { + "banding": 354, + "country": 998, + "value": 5587, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 355, + "fields": { + "package": 124, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 546, + "fields": { + "banding": 355, + "country": 999, + "value": 5562, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 547, + "fields": { + "banding": 355, + "country": 998, + "value": 7230, + "default_currency": "USD" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 132, + "fields": { + "package": 124, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 156, + "fields": { + "package": 124, + "banding_type_entry": 132, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 157, + "fields": { + "package": 124, + "banding_type_entry": 132, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 356, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 548, + "fields": { + "banding": 356, + "country": 999, + "value": 379, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 549, + "fields": { + "banding": 356, + "country": 998, + "value": 493, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 357, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 550, + "fields": { + "banding": 357, + "country": 999, + "value": 632, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 551, + "fields": { + "banding": 357, + "country": 998, + "value": 822, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 358, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 552, + "fields": { + "banding": 358, + "country": 999, + "value": 1011, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 553, + "fields": { + "banding": 358, + "country": 998, + "value": 1315, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 359, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 554, + "fields": { + "banding": 359, + "country": 999, + "value": 1390, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 555, + "fields": { + "banding": 359, + "country": 998, + "value": 1808, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 360, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 556, + "fields": { + "banding": 360, + "country": 999, + "value": 1770, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 557, + "fields": { + "banding": 360, + "country": 998, + "value": 2300, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 361, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 558, + "fields": { + "banding": 361, + "country": 999, + "value": 2149, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 559, + "fields": { + "banding": 361, + "country": 998, + "value": 2793, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 362, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 560, + "fields": { + "banding": 362, + "country": 999, + "value": 2528, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 561, + "fields": { + "banding": 362, + "country": 998, + "value": 3286, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 363, + "fields": { + "package": 124, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 562, + "fields": { + "banding": 363, + "country": 999, + "value": 3539, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 563, + "fields": { + "banding": 363, + "country": 998, + "value": 4601, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 125, + "fields": { + "name": "Package 125 - Advanced (FTE/GBP+EUR)", + "description": "Test package 125", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 125, + "fields": { + "basepackage_ptr": 125, + "initiative": 9, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 133, + "fields": { + "package": 125, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 158, + "fields": { + "package": 125, + "banding_type_entry": 133, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 159, + "fields": { + "package": 125, + "banding_type_entry": 133, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 364, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 564, + "fields": { + "banding": 364, + "country": 999, + "value": 656, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 565, + "fields": { + "banding": 364, + "country": 997, + "value": 755, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 365, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 566, + "fields": { + "banding": 365, + "country": 999, + "value": 1050, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 567, + "fields": { + "banding": 365, + "country": 997, + "value": 1208, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 366, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 568, + "fields": { + "banding": 366, + "country": 999, + "value": 1575, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 569, + "fields": { + "banding": 366, + "country": 997, + "value": 1811, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 367, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 570, + "fields": { + "banding": 367, + "country": 999, + "value": 2100, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 571, + "fields": { + "banding": 367, + "country": 997, + "value": 2415, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 368, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 572, + "fields": { + "banding": 368, + "country": 999, + "value": 2625, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 573, + "fields": { + "banding": 368, + "country": 997, + "value": 3019, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 369, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 574, + "fields": { + "banding": 369, + "country": 999, + "value": 3412, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 575, + "fields": { + "banding": 369, + "country": 997, + "value": 3924, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 370, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 576, + "fields": { + "banding": 370, + "country": 999, + "value": 4462, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 577, + "fields": { + "banding": 370, + "country": 997, + "value": 5132, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 371, + "fields": { + "package": 125, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 578, + "fields": { + "banding": 371, + "country": 999, + "value": 5775, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 579, + "fields": { + "banding": 371, + "country": 997, + "value": 6641, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 126, + "fields": { + "name": "Package 126 - Pro (Choice/USD)", + "description": "Test package 126", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 126, + "fields": { + "basepackage_ptr": 126, + "initiative": 9, + "default_country": 998, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 134, + "fields": { + "package": 126, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 160, + "fields": { + "package": 126, + "banding_type_entry": 134, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 372, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 580, + "fields": { + "banding": 372, + "country": 998, + "value": 531, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 373, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 581, + "fields": { + "banding": 373, + "country": 998, + "value": 885, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 374, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 582, + "fields": { + "banding": 374, + "country": 998, + "value": 1415, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 375, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 583, + "fields": { + "banding": 375, + "country": 998, + "value": 1946, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 376, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 584, + "fields": { + "banding": 376, + "country": 998, + "value": 2477, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 377, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 585, + "fields": { + "banding": 377, + "country": 998, + "value": 3008, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 378, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 586, + "fields": { + "banding": 378, + "country": 998, + "value": 3539, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 379, + "fields": { + "package": 126, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 587, + "fields": { + "banding": 379, + "country": 998, + "value": 4954, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 127, + "fields": { + "name": "Package 127 - Essential (FTE+Choice/GBP)", + "description": "Test package 127", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 127, + "fields": { + "basepackage_ptr": 127, + "initiative": 10, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 135, + "fields": { + "package": 127, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 161, + "fields": { + "package": 127, + "banding_type_entry": 135, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 380, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 588, + "fields": { + "banding": 380, + "country": 999, + "value": 705, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 381, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 589, + "fields": { + "banding": 381, + "country": 999, + "value": 1128, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 382, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 590, + "fields": { + "banding": 382, + "country": 999, + "value": 1691, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 383, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 591, + "fields": { + "banding": 383, + "country": 999, + "value": 2255, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 384, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 592, + "fields": { + "banding": 384, + "country": 999, + "value": 2819, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 385, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 593, + "fields": { + "banding": 385, + "country": 999, + "value": 3665, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 386, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 594, + "fields": { + "banding": 386, + "country": 999, + "value": 4792, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 387, + "fields": { + "package": 127, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 595, + "fields": { + "banding": 387, + "country": 999, + "value": 6202, + "default_currency": "GBP" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 136, + "fields": { + "package": 127, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 162, + "fields": { + "package": 127, + "banding_type_entry": 136, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 388, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 596, + "fields": { + "banding": 388, + "country": 999, + "value": 423, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 389, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 597, + "fields": { + "banding": 389, + "country": 999, + "value": 705, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 390, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 598, + "fields": { + "banding": 390, + "country": 999, + "value": 1128, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 391, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 599, + "fields": { + "banding": 391, + "country": 999, + "value": 1550, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 392, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 600, + "fields": { + "banding": 392, + "country": 999, + "value": 1973, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 393, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 601, + "fields": { + "banding": 393, + "country": 999, + "value": 2396, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 394, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 602, + "fields": { + "banding": 394, + "country": 999, + "value": 2819, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 395, + "fields": { + "package": 127, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 603, + "fields": { + "banding": 395, + "country": 999, + "value": 3947, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 128, + "fields": { + "name": "Package 128 - Complete (FTE/EUR)", + "description": "Test package 128", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 128, + "fields": { + "basepackage_ptr": 128, + "initiative": 10, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 137, + "fields": { + "package": 128, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 163, + "fields": { + "package": 128, + "banding_type_entry": 137, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 396, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 604, + "fields": { + "banding": 396, + "country": 997, + "value": 838, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 397, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 605, + "fields": { + "banding": 397, + "country": 997, + "value": 1341, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 398, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 606, + "fields": { + "banding": 398, + "country": 997, + "value": 2012, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 399, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 607, + "fields": { + "banding": 399, + "country": 997, + "value": 2683, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 400, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 608, + "fields": { + "banding": 400, + "country": 997, + "value": 3353, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 401, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 609, + "fields": { + "banding": 401, + "country": 997, + "value": 4359, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 402, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 610, + "fields": { + "banding": 402, + "country": 997, + "value": 5701, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 403, + "fields": { + "package": 128, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 611, + "fields": { + "banding": 403, + "country": 997, + "value": 7377, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 129, + "fields": { + "name": "Package 129 - Select (Choice/GBP+USD)", + "description": "Test package 129", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 129, + "fields": { + "basepackage_ptr": 129, + "initiative": 10, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 138, + "fields": { + "package": 129, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 164, + "fields": { + "package": 129, + "banding_type_entry": 138, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 165, + "fields": { + "package": 129, + "banding_type_entry": 138, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 404, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 612, + "fields": { + "banding": 404, + "country": 999, + "value": 452, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 613, + "fields": { + "banding": 404, + "country": 998, + "value": 588, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 405, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 614, + "fields": { + "banding": 405, + "country": 999, + "value": 753, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 615, + "fields": { + "banding": 405, + "country": 998, + "value": 979, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 406, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 616, + "fields": { + "banding": 406, + "country": 999, + "value": 1205, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 617, + "fields": { + "banding": 406, + "country": 998, + "value": 1567, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 407, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 618, + "fields": { + "banding": 407, + "country": 999, + "value": 1657, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 619, + "fields": { + "banding": 407, + "country": 998, + "value": 2154, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 408, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 620, + "fields": { + "banding": 408, + "country": 999, + "value": 2109, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 621, + "fields": { + "banding": 408, + "country": 998, + "value": 2742, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 409, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 622, + "fields": { + "banding": 409, + "country": 999, + "value": 2561, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 623, + "fields": { + "banding": 409, + "country": 998, + "value": 3329, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 410, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 624, + "fields": { + "banding": 410, + "country": 999, + "value": 3013, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 625, + "fields": { + "banding": 410, + "country": 998, + "value": 3917, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 411, + "fields": { + "package": 129, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 626, + "fields": { + "banding": 411, + "country": 999, + "value": 4218, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 627, + "fields": { + "banding": 411, + "country": 998, + "value": 5484, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 130, + "fields": { + "name": "Package 130 - Core (FTE+Choice/all)", + "description": "Test package 130", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 130, + "fields": { + "basepackage_ptr": 130, + "initiative": 11, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 139, + "fields": { + "package": 130, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 166, + "fields": { + "package": 130, + "banding_type_entry": 139, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 167, + "fields": { + "package": 130, + "banding_type_entry": 139, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 168, + "fields": { + "package": 130, + "banding_type_entry": 139, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 412, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 628, + "fields": { + "banding": 412, + "country": 999, + "value": 778, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 629, + "fields": { + "banding": 412, + "country": 998, + "value": 1011, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 630, + "fields": { + "banding": 412, + "country": 997, + "value": 894, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 413, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 631, + "fields": { + "banding": 413, + "country": 999, + "value": 1244, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 632, + "fields": { + "banding": 413, + "country": 998, + "value": 1617, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 633, + "fields": { + "banding": 413, + "country": 997, + "value": 1431, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 414, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 634, + "fields": { + "banding": 414, + "country": 999, + "value": 1866, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 635, + "fields": { + "banding": 414, + "country": 998, + "value": 2426, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 636, + "fields": { + "banding": 414, + "country": 997, + "value": 2146, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 415, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 637, + "fields": { + "banding": 415, + "country": 999, + "value": 2488, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 638, + "fields": { + "banding": 415, + "country": 998, + "value": 3234, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 639, + "fields": { + "banding": 415, + "country": 997, + "value": 2861, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 416, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 640, + "fields": { + "banding": 416, + "country": 999, + "value": 3110, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 641, + "fields": { + "banding": 416, + "country": 998, + "value": 4043, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 642, + "fields": { + "banding": 416, + "country": 997, + "value": 3576, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 417, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 643, + "fields": { + "banding": 417, + "country": 999, + "value": 4043, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 644, + "fields": { + "banding": 417, + "country": 998, + "value": 5256, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 645, + "fields": { + "banding": 417, + "country": 997, + "value": 4649, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 418, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 646, + "fields": { + "banding": 418, + "country": 999, + "value": 5287, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 647, + "fields": { + "banding": 418, + "country": 998, + "value": 6873, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 648, + "fields": { + "banding": 418, + "country": 997, + "value": 6080, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 419, + "fields": { + "package": 130, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 649, + "fields": { + "banding": 419, + "country": 999, + "value": 6842, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 650, + "fields": { + "banding": 419, + "country": 998, + "value": 8895, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 651, + "fields": { + "banding": 419, + "country": 997, + "value": 7868, + "default_currency": "EUR" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 140, + "fields": { + "package": 130, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 169, + "fields": { + "package": 130, + "banding_type_entry": 140, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 170, + "fields": { + "package": 130, + "banding_type_entry": 140, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 171, + "fields": { + "package": 130, + "banding_type_entry": 140, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 420, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 652, + "fields": { + "banding": 420, + "country": 999, + "value": 466, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 653, + "fields": { + "banding": 420, + "country": 998, + "value": 606, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 654, + "fields": { + "banding": 420, + "country": 997, + "value": 536, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 421, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 655, + "fields": { + "banding": 421, + "country": 999, + "value": 778, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 656, + "fields": { + "banding": 421, + "country": 998, + "value": 1011, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 657, + "fields": { + "banding": 421, + "country": 997, + "value": 894, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 422, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 658, + "fields": { + "banding": 422, + "country": 999, + "value": 1244, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 659, + "fields": { + "banding": 422, + "country": 998, + "value": 1617, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 660, + "fields": { + "banding": 422, + "country": 997, + "value": 1431, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 423, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 661, + "fields": { + "banding": 423, + "country": 999, + "value": 1711, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 662, + "fields": { + "banding": 423, + "country": 998, + "value": 2224, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 663, + "fields": { + "banding": 423, + "country": 997, + "value": 1967, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 424, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 664, + "fields": { + "banding": 424, + "country": 999, + "value": 2177, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 665, + "fields": { + "banding": 424, + "country": 998, + "value": 2830, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 666, + "fields": { + "banding": 424, + "country": 997, + "value": 2504, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 425, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 667, + "fields": { + "banding": 425, + "country": 999, + "value": 2644, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 668, + "fields": { + "banding": 425, + "country": 998, + "value": 3437, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 669, + "fields": { + "banding": 425, + "country": 997, + "value": 3040, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 426, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 670, + "fields": { + "banding": 426, + "country": 999, + "value": 3110, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 671, + "fields": { + "banding": 426, + "country": 998, + "value": 4043, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 672, + "fields": { + "banding": 426, + "country": 997, + "value": 3576, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 427, + "fields": { + "package": 130, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 673, + "fields": { + "banding": 427, + "country": 999, + "value": 4354, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 674, + "fields": { + "banding": 427, + "country": 998, + "value": 5660, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 675, + "fields": { + "banding": 427, + "country": 997, + "value": 5007, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 131, + "fields": { + "name": "Package 131 - Plus (FTE/GBP)", + "description": "Test package 131", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 131, + "fields": { + "basepackage_ptr": 131, + "initiative": 11, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 141, + "fields": { + "package": 131, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 172, + "fields": { + "package": 131, + "banding_type_entry": 141, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 428, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 676, + "fields": { + "banding": 428, + "country": 999, + "value": 802, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 429, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 677, + "fields": { + "banding": 429, + "country": 999, + "value": 1283, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 430, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 678, + "fields": { + "banding": 430, + "country": 999, + "value": 1924, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 431, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 679, + "fields": { + "banding": 431, + "country": 999, + "value": 2566, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 432, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 680, + "fields": { + "banding": 432, + "country": 999, + "value": 3207, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 433, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 681, + "fields": { + "banding": 433, + "country": 999, + "value": 4169, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 434, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 682, + "fields": { + "banding": 434, + "country": 999, + "value": 5452, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 435, + "fields": { + "package": 131, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 683, + "fields": { + "banding": 435, + "country": 999, + "value": 7055, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 132, + "fields": { + "name": "Package 132 - Premium (FTE/GBP+USD)", + "description": "Test package 132", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 132, + "fields": { + "basepackage_ptr": 132, + "initiative": 12, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 142, + "fields": { + "package": 132, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 173, + "fields": { + "package": 132, + "banding_type_entry": 142, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 174, + "fields": { + "package": 132, + "banding_type_entry": 142, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 436, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 684, + "fields": { + "banding": 436, + "country": 999, + "value": 826, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 685, + "fields": { + "banding": 436, + "country": 998, + "value": 1074, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 437, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 686, + "fields": { + "banding": 437, + "country": 999, + "value": 1322, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 687, + "fields": { + "banding": 437, + "country": 998, + "value": 1718, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 438, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 688, + "fields": { + "banding": 438, + "country": 999, + "value": 1982, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 689, + "fields": { + "banding": 438, + "country": 998, + "value": 2577, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 439, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 690, + "fields": { + "banding": 439, + "country": 999, + "value": 2643, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 691, + "fields": { + "banding": 439, + "country": 998, + "value": 3436, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 440, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 692, + "fields": { + "banding": 440, + "country": 999, + "value": 3304, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 693, + "fields": { + "banding": 440, + "country": 998, + "value": 4295, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 441, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 694, + "fields": { + "banding": 441, + "country": 999, + "value": 4295, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 695, + "fields": { + "banding": 441, + "country": 998, + "value": 5584, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 442, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 696, + "fields": { + "banding": 442, + "country": 999, + "value": 5617, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 697, + "fields": { + "banding": 442, + "country": 998, + "value": 7302, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 443, + "fields": { + "package": 132, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 698, + "fields": { + "banding": 443, + "country": 999, + "value": 7269, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 699, + "fields": { + "banding": 443, + "country": 998, + "value": 9449, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 133, + "fields": { + "name": "Package 133 - Standard (Choice/GBP)", + "description": "Test package 133", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 133, + "fields": { + "basepackage_ptr": 133, + "initiative": 12, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 143, + "fields": { + "package": 133, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 175, + "fields": { + "package": 133, + "banding_type_entry": 143, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 444, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 700, + "fields": { + "banding": 444, + "country": 999, + "value": 510, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 445, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 701, + "fields": { + "banding": 445, + "country": 999, + "value": 850, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 446, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 702, + "fields": { + "banding": 446, + "country": 999, + "value": 1360, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 447, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 703, + "fields": { + "banding": 447, + "country": 999, + "value": 1871, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 448, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 704, + "fields": { + "banding": 448, + "country": 999, + "value": 2381, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 449, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 705, + "fields": { + "banding": 449, + "country": 999, + "value": 2891, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 450, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 706, + "fields": { + "banding": 450, + "country": 999, + "value": 3401, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 451, + "fields": { + "package": 133, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 707, + "fields": { + "banding": 451, + "country": 999, + "value": 4761, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 134, + "fields": { + "name": "Package 134 - Basic (FTE+Choice/GBP+USD)", + "description": "Test package 134", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 134, + "fields": { + "basepackage_ptr": 134, + "initiative": 13, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 144, + "fields": { + "package": 134, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 176, + "fields": { + "package": 134, + "banding_type_entry": 144, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 177, + "fields": { + "package": 134, + "banding_type_entry": 144, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 452, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 708, + "fields": { + "banding": 452, + "country": 999, + "value": 874, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 709, + "fields": { + "banding": 452, + "country": 998, + "value": 1137, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 453, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 710, + "fields": { + "banding": 453, + "country": 999, + "value": 1399, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 711, + "fields": { + "banding": 453, + "country": 998, + "value": 1819, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 454, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 712, + "fields": { + "banding": 454, + "country": 999, + "value": 2099, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 713, + "fields": { + "banding": 454, + "country": 998, + "value": 2728, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 455, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 714, + "fields": { + "banding": 455, + "country": 999, + "value": 2798, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 715, + "fields": { + "banding": 455, + "country": 998, + "value": 3638, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 456, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 716, + "fields": { + "banding": 456, + "country": 999, + "value": 3498, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 717, + "fields": { + "banding": 456, + "country": 998, + "value": 4547, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 457, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 718, + "fields": { + "banding": 457, + "country": 999, + "value": 4547, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 719, + "fields": { + "banding": 457, + "country": 998, + "value": 5912, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 458, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 720, + "fields": { + "banding": 458, + "country": 999, + "value": 5947, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 721, + "fields": { + "banding": 458, + "country": 998, + "value": 7731, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 459, + "fields": { + "package": 134, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 722, + "fields": { + "banding": 459, + "country": 999, + "value": 7696, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 723, + "fields": { + "banding": 459, + "country": 998, + "value": 10004, + "default_currency": "USD" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 145, + "fields": { + "package": 134, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 178, + "fields": { + "package": 134, + "banding_type_entry": 145, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 179, + "fields": { + "package": 134, + "banding_type_entry": 145, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 460, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 724, + "fields": { + "banding": 460, + "country": 999, + "value": 525, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 725, + "fields": { + "banding": 460, + "country": 998, + "value": 682, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 461, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 726, + "fields": { + "banding": 461, + "country": 999, + "value": 874, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 727, + "fields": { + "banding": 461, + "country": 998, + "value": 1137, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 462, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 728, + "fields": { + "banding": 462, + "country": 999, + "value": 1399, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 729, + "fields": { + "banding": 462, + "country": 998, + "value": 1819, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 463, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 730, + "fields": { + "banding": 463, + "country": 999, + "value": 1924, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 731, + "fields": { + "banding": 463, + "country": 998, + "value": 2501, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 464, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 732, + "fields": { + "banding": 464, + "country": 999, + "value": 2449, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 733, + "fields": { + "banding": 464, + "country": 998, + "value": 3183, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 465, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 734, + "fields": { + "banding": 465, + "country": 999, + "value": 2973, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 735, + "fields": { + "banding": 465, + "country": 998, + "value": 3865, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 466, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 736, + "fields": { + "banding": 466, + "country": 999, + "value": 3498, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 737, + "fields": { + "banding": 466, + "country": 998, + "value": 4547, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 467, + "fields": { + "package": 134, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 738, + "fields": { + "banding": 467, + "country": 999, + "value": 4897, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 739, + "fields": { + "banding": 467, + "country": 998, + "value": 6366, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 135, + "fields": { + "name": "Package 135 - Advanced (FTE/GBP+EUR)", + "description": "Test package 135", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 135, + "fields": { + "basepackage_ptr": 135, + "initiative": 13, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 146, + "fields": { + "package": 135, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 180, + "fields": { + "package": 135, + "banding_type_entry": 146, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 181, + "fields": { + "package": 135, + "banding_type_entry": 146, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 468, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 740, + "fields": { + "banding": 468, + "country": 999, + "value": 899, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 741, + "fields": { + "banding": 468, + "country": 997, + "value": 1034, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 469, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 742, + "fields": { + "banding": 469, + "country": 999, + "value": 1438, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 743, + "fields": { + "banding": 469, + "country": 997, + "value": 1654, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 470, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 744, + "fields": { + "banding": 470, + "country": 999, + "value": 2157, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 745, + "fields": { + "banding": 470, + "country": 997, + "value": 2481, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 471, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 746, + "fields": { + "banding": 471, + "country": 999, + "value": 2876, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 747, + "fields": { + "banding": 471, + "country": 997, + "value": 3307, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 472, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 748, + "fields": { + "banding": 472, + "country": 999, + "value": 3595, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 749, + "fields": { + "banding": 472, + "country": 997, + "value": 4134, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 473, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 750, + "fields": { + "banding": 473, + "country": 999, + "value": 4674, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 751, + "fields": { + "banding": 473, + "country": 997, + "value": 5375, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 474, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 752, + "fields": { + "banding": 474, + "country": 999, + "value": 6112, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 753, + "fields": { + "banding": 474, + "country": 997, + "value": 7028, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 475, + "fields": { + "package": 135, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 754, + "fields": { + "banding": 475, + "country": 999, + "value": 7909, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 755, + "fields": { + "banding": 475, + "country": 997, + "value": 9095, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 136, + "fields": { + "name": "Package 136 - Pro (Choice/USD)", + "description": "Test package 136", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 136, + "fields": { + "basepackage_ptr": 136, + "initiative": 14, + "default_country": 998, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 147, + "fields": { + "package": 136, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 182, + "fields": { + "package": 136, + "banding_type_entry": 147, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 476, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 756, + "fields": { + "banding": 476, + "country": 998, + "value": 720, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 477, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 757, + "fields": { + "banding": 477, + "country": 998, + "value": 1200, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 478, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 758, + "fields": { + "banding": 478, + "country": 998, + "value": 1920, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 479, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 759, + "fields": { + "banding": 479, + "country": 998, + "value": 2640, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 480, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 760, + "fields": { + "banding": 480, + "country": 998, + "value": 3360, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 481, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 761, + "fields": { + "banding": 481, + "country": 998, + "value": 4080, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 482, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 762, + "fields": { + "banding": 482, + "country": 998, + "value": 4800, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 483, + "fields": { + "package": 136, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 763, + "fields": { + "banding": 483, + "country": 998, + "value": 6719, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 137, + "fields": { + "name": "Package 137 - Essential (FTE+Choice/GBP)", + "description": "Test package 137", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 137, + "fields": { + "basepackage_ptr": 137, + "initiative": 14, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 148, + "fields": { + "package": 137, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 183, + "fields": { + "package": 137, + "banding_type_entry": 148, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 484, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 764, + "fields": { + "banding": 484, + "country": 999, + "value": 947, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 485, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 765, + "fields": { + "banding": 485, + "country": 999, + "value": 1516, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 486, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 766, + "fields": { + "banding": 486, + "country": 999, + "value": 2273, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 487, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 767, + "fields": { + "banding": 487, + "country": 999, + "value": 3031, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 488, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 768, + "fields": { + "banding": 488, + "country": 999, + "value": 3789, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 489, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 769, + "fields": { + "banding": 489, + "country": 999, + "value": 4926, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 490, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 770, + "fields": { + "banding": 490, + "country": 999, + "value": 6441, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 491, + "fields": { + "package": 137, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 771, + "fields": { + "banding": 491, + "country": 999, + "value": 8336, + "default_currency": "GBP" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 149, + "fields": { + "package": 137, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 184, + "fields": { + "package": 137, + "banding_type_entry": 149, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 492, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 772, + "fields": { + "banding": 492, + "country": 999, + "value": 568, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 493, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 773, + "fields": { + "banding": 493, + "country": 999, + "value": 947, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 494, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 774, + "fields": { + "banding": 494, + "country": 999, + "value": 1516, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 495, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 775, + "fields": { + "banding": 495, + "country": 999, + "value": 2084, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 496, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 776, + "fields": { + "banding": 496, + "country": 999, + "value": 2652, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 497, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 777, + "fields": { + "banding": 497, + "country": 999, + "value": 3221, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 498, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 778, + "fields": { + "banding": 498, + "country": 999, + "value": 3789, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 499, + "fields": { + "package": 137, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 779, + "fields": { + "banding": 499, + "country": 999, + "value": 5305, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 138, + "fields": { + "name": "Package 138 - Complete (FTE/EUR)", + "description": "Test package 138", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 138, + "fields": { + "basepackage_ptr": 138, + "initiative": 15, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 150, + "fields": { + "package": 138, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 185, + "fields": { + "package": 138, + "banding_type_entry": 150, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 500, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 780, + "fields": { + "banding": 500, + "country": 997, + "value": 1117, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 501, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 781, + "fields": { + "banding": 501, + "country": 997, + "value": 1788, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 502, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 782, + "fields": { + "banding": 502, + "country": 997, + "value": 2681, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 503, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 783, + "fields": { + "banding": 503, + "country": 997, + "value": 3575, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 504, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 784, + "fields": { + "banding": 504, + "country": 997, + "value": 4469, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 505, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 785, + "fields": { + "banding": 505, + "country": 997, + "value": 5810, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 506, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 786, + "fields": { + "banding": 506, + "country": 997, + "value": 7597, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 507, + "fields": { + "package": 138, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 787, + "fields": { + "banding": 507, + "country": 997, + "value": 9832, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 139, + "fields": { + "name": "Package 139 - Select (Choice/GBP+USD)", + "description": "Test package 139", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 139, + "fields": { + "basepackage_ptr": 139, + "initiative": 15, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 151, + "fields": { + "package": 139, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 186, + "fields": { + "package": 139, + "banding_type_entry": 151, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 187, + "fields": { + "package": 139, + "banding_type_entry": 151, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 508, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 788, + "fields": { + "banding": 508, + "country": 999, + "value": 597, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 789, + "fields": { + "banding": 508, + "country": 998, + "value": 777, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 509, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 790, + "fields": { + "banding": 509, + "country": 999, + "value": 996, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 791, + "fields": { + "banding": 509, + "country": 998, + "value": 1294, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 510, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 792, + "fields": { + "banding": 510, + "country": 999, + "value": 1593, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 793, + "fields": { + "banding": 510, + "country": 998, + "value": 2071, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 511, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 794, + "fields": { + "banding": 511, + "country": 999, + "value": 2191, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 795, + "fields": { + "banding": 511, + "country": 998, + "value": 2848, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 512, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 796, + "fields": { + "banding": 512, + "country": 999, + "value": 2788, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 797, + "fields": { + "banding": 512, + "country": 998, + "value": 3625, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 513, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 798, + "fields": { + "banding": 513, + "country": 999, + "value": 3386, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 799, + "fields": { + "banding": 513, + "country": 998, + "value": 4401, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 514, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 800, + "fields": { + "banding": 514, + "country": 999, + "value": 3983, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 801, + "fields": { + "banding": 514, + "country": 998, + "value": 5178, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 515, + "fields": { + "package": 139, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 802, + "fields": { + "banding": 515, + "country": 999, + "value": 5576, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 803, + "fields": { + "banding": 515, + "country": 998, + "value": 7249, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 140, + "fields": { + "name": "Package 140 - Core (FTE+Choice/all)", + "description": "Test package 140", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 140, + "fields": { + "basepackage_ptr": 140, + "initiative": 16, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 152, + "fields": { + "package": 140, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 188, + "fields": { + "package": 140, + "banding_type_entry": 152, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 189, + "fields": { + "package": 140, + "banding_type_entry": 152, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 190, + "fields": { + "package": 140, + "banding_type_entry": 152, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 516, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 804, + "fields": { + "banding": 516, + "country": 999, + "value": 1020, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 805, + "fields": { + "banding": 516, + "country": 998, + "value": 1326, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 806, + "fields": { + "banding": 516, + "country": 997, + "value": 1173, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 517, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 807, + "fields": { + "banding": 517, + "country": 999, + "value": 1632, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 808, + "fields": { + "banding": 517, + "country": 998, + "value": 2122, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 809, + "fields": { + "banding": 517, + "country": 997, + "value": 1877, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 518, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 810, + "fields": { + "banding": 518, + "country": 999, + "value": 2448, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 811, + "fields": { + "banding": 518, + "country": 998, + "value": 3182, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 812, + "fields": { + "banding": 518, + "country": 997, + "value": 2815, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 519, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 813, + "fields": { + "banding": 519, + "country": 999, + "value": 3264, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 814, + "fields": { + "banding": 519, + "country": 998, + "value": 4243, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 815, + "fields": { + "banding": 519, + "country": 997, + "value": 3754, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 520, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 816, + "fields": { + "banding": 520, + "country": 999, + "value": 4080, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 817, + "fields": { + "banding": 520, + "country": 998, + "value": 5304, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 818, + "fields": { + "banding": 520, + "country": 997, + "value": 4692, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 521, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 819, + "fields": { + "banding": 521, + "country": 999, + "value": 5304, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 820, + "fields": { + "banding": 521, + "country": 998, + "value": 6895, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 821, + "fields": { + "banding": 521, + "country": 997, + "value": 6100, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 522, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 822, + "fields": { + "banding": 522, + "country": 999, + "value": 6936, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 823, + "fields": { + "banding": 522, + "country": 998, + "value": 9017, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 824, + "fields": { + "banding": 522, + "country": 997, + "value": 7976, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 523, + "fields": { + "package": 140, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 825, + "fields": { + "banding": 523, + "country": 999, + "value": 8976, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 826, + "fields": { + "banding": 523, + "country": 998, + "value": 11669, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 827, + "fields": { + "banding": 523, + "country": 997, + "value": 10322, + "default_currency": "EUR" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 153, + "fields": { + "package": 140, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 191, + "fields": { + "package": 140, + "banding_type_entry": 153, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 192, + "fields": { + "package": 140, + "banding_type_entry": 153, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 193, + "fields": { + "package": 140, + "banding_type_entry": 153, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 524, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 828, + "fields": { + "banding": 524, + "country": 999, + "value": 612, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 829, + "fields": { + "banding": 524, + "country": 998, + "value": 796, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 830, + "fields": { + "banding": 524, + "country": 997, + "value": 704, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 525, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 831, + "fields": { + "banding": 525, + "country": 999, + "value": 1020, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 832, + "fields": { + "banding": 525, + "country": 998, + "value": 1326, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 833, + "fields": { + "banding": 525, + "country": 997, + "value": 1173, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 526, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 834, + "fields": { + "banding": 526, + "country": 999, + "value": 1632, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 835, + "fields": { + "banding": 526, + "country": 998, + "value": 2122, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 836, + "fields": { + "banding": 526, + "country": 997, + "value": 1877, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 527, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 837, + "fields": { + "banding": 527, + "country": 999, + "value": 2244, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 838, + "fields": { + "banding": 527, + "country": 998, + "value": 2917, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 839, + "fields": { + "banding": 527, + "country": 997, + "value": 2581, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 528, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 840, + "fields": { + "banding": 528, + "country": 999, + "value": 2856, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 841, + "fields": { + "banding": 528, + "country": 998, + "value": 3713, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 842, + "fields": { + "banding": 528, + "country": 997, + "value": 3284, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 529, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 843, + "fields": { + "banding": 529, + "country": 999, + "value": 3468, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 844, + "fields": { + "banding": 529, + "country": 998, + "value": 4508, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 845, + "fields": { + "banding": 529, + "country": 997, + "value": 3988, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 530, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 846, + "fields": { + "banding": 530, + "country": 999, + "value": 4080, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 847, + "fields": { + "banding": 530, + "country": 998, + "value": 5304, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 848, + "fields": { + "banding": 530, + "country": 997, + "value": 4692, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 531, + "fields": { + "package": 140, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 849, + "fields": { + "banding": 531, + "country": 999, + "value": 5712, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 850, + "fields": { + "banding": 531, + "country": 998, + "value": 7426, + "default_currency": "USD" + } + }, + { + "model": "package.price", + "pk": 851, + "fields": { + "banding": 531, + "country": 997, + "value": 6569, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 141, + "fields": { + "name": "Package 141 - Plus (FTE/GBP)", + "description": "Test package 141", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 141, + "fields": { + "basepackage_ptr": 141, + "initiative": 16, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 154, + "fields": { + "package": 141, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 194, + "fields": { + "package": 141, + "banding_type_entry": 154, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 532, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 852, + "fields": { + "banding": 532, + "country": 999, + "value": 1044, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 533, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 853, + "fields": { + "banding": 533, + "country": 999, + "value": 1671, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 534, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 854, + "fields": { + "banding": 534, + "country": 999, + "value": 2506, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 535, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 855, + "fields": { + "banding": 535, + "country": 999, + "value": 3342, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 536, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 856, + "fields": { + "banding": 536, + "country": 999, + "value": 4177, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 537, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 857, + "fields": { + "banding": 537, + "country": 999, + "value": 5430, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 538, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 858, + "fields": { + "banding": 538, + "country": 999, + "value": 7101, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 539, + "fields": { + "package": 141, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 859, + "fields": { + "banding": 539, + "country": 999, + "value": 9189, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 142, + "fields": { + "name": "Package 142 - Premium (FTE/GBP+USD)", + "description": "Test package 142", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 142, + "fields": { + "basepackage_ptr": 142, + "initiative": 17, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 155, + "fields": { + "package": 142, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 195, + "fields": { + "package": 142, + "banding_type_entry": 155, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 196, + "fields": { + "package": 142, + "banding_type_entry": 155, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 540, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 860, + "fields": { + "banding": 540, + "country": 999, + "value": 1068, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 861, + "fields": { + "banding": 540, + "country": 998, + "value": 1389, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 541, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 862, + "fields": { + "banding": 541, + "country": 999, + "value": 1710, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 863, + "fields": { + "banding": 541, + "country": 998, + "value": 2222, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 542, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 864, + "fields": { + "banding": 542, + "country": 999, + "value": 2564, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 865, + "fields": { + "banding": 542, + "country": 998, + "value": 3334, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 543, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 866, + "fields": { + "banding": 543, + "country": 999, + "value": 3419, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 867, + "fields": { + "banding": 543, + "country": 998, + "value": 4445, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 544, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 868, + "fields": { + "banding": 544, + "country": 999, + "value": 4274, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 869, + "fields": { + "banding": 544, + "country": 998, + "value": 5556, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 545, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 870, + "fields": { + "banding": 545, + "country": 999, + "value": 5556, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 871, + "fields": { + "banding": 545, + "country": 998, + "value": 7223, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 546, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 872, + "fields": { + "banding": 546, + "country": 999, + "value": 7266, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 873, + "fields": { + "banding": 546, + "country": 998, + "value": 9446, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 547, + "fields": { + "package": 142, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 874, + "fields": { + "banding": 547, + "country": 999, + "value": 9403, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 875, + "fields": { + "banding": 547, + "country": 998, + "value": 12224, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 143, + "fields": { + "name": "Package 143 - Standard (Choice/GBP)", + "description": "Test package 143", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 143, + "fields": { + "basepackage_ptr": 143, + "initiative": 17, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 156, + "fields": { + "package": 143, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 197, + "fields": { + "package": 143, + "banding_type_entry": 156, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 548, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 876, + "fields": { + "banding": 548, + "country": 999, + "value": 656, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 549, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 877, + "fields": { + "banding": 549, + "country": 999, + "value": 1093, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 550, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 878, + "fields": { + "banding": 550, + "country": 999, + "value": 1748, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 551, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 879, + "fields": { + "banding": 551, + "country": 999, + "value": 2404, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 552, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 880, + "fields": { + "banding": 552, + "country": 999, + "value": 3060, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 553, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 881, + "fields": { + "banding": 553, + "country": 999, + "value": 3715, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 554, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 882, + "fields": { + "banding": 554, + "country": 999, + "value": 4371, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 555, + "fields": { + "package": 143, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 883, + "fields": { + "banding": 555, + "country": 999, + "value": 6119, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 144, + "fields": { + "name": "Package 144 - Basic (FTE+Choice/GBP+USD)", + "description": "Test package 144", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 144, + "fields": { + "basepackage_ptr": 144, + "initiative": 18, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 157, + "fields": { + "package": 144, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 198, + "fields": { + "package": 144, + "banding_type_entry": 157, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 199, + "fields": { + "package": 144, + "banding_type_entry": 157, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 556, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 884, + "fields": { + "banding": 556, + "country": 999, + "value": 1117, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 885, + "fields": { + "banding": 556, + "country": 998, + "value": 1452, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 557, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 886, + "fields": { + "banding": 557, + "country": 999, + "value": 1787, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 887, + "fields": { + "banding": 557, + "country": 998, + "value": 2323, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 558, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 888, + "fields": { + "banding": 558, + "country": 999, + "value": 2681, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 889, + "fields": { + "banding": 558, + "country": 998, + "value": 3485, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 559, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 890, + "fields": { + "banding": 559, + "country": 999, + "value": 3574, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 891, + "fields": { + "banding": 559, + "country": 998, + "value": 4647, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 560, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 892, + "fields": { + "banding": 560, + "country": 999, + "value": 4468, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 893, + "fields": { + "banding": 560, + "country": 998, + "value": 5808, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 561, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 894, + "fields": { + "banding": 561, + "country": 999, + "value": 5808, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 895, + "fields": { + "banding": 561, + "country": 998, + "value": 7551, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 562, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 896, + "fields": { + "banding": 562, + "country": 999, + "value": 7596, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 897, + "fields": { + "banding": 562, + "country": 998, + "value": 9874, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 563, + "fields": { + "package": 144, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 898, + "fields": { + "banding": 563, + "country": 999, + "value": 9830, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 899, + "fields": { + "banding": 563, + "country": 998, + "value": 12778, + "default_currency": "USD" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 158, + "fields": { + "package": 144, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 200, + "fields": { + "package": 144, + "banding_type_entry": 158, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 201, + "fields": { + "package": 144, + "banding_type_entry": 158, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 564, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 900, + "fields": { + "banding": 564, + "country": 999, + "value": 670, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 901, + "fields": { + "banding": 564, + "country": 998, + "value": 871, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 565, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 902, + "fields": { + "banding": 565, + "country": 999, + "value": 1117, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 903, + "fields": { + "banding": 565, + "country": 998, + "value": 1452, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 566, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 904, + "fields": { + "banding": 566, + "country": 999, + "value": 1787, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 905, + "fields": { + "banding": 566, + "country": 998, + "value": 2323, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 567, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 906, + "fields": { + "banding": 567, + "country": 999, + "value": 2457, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 907, + "fields": { + "banding": 567, + "country": 998, + "value": 3195, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 568, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 908, + "fields": { + "banding": 568, + "country": 999, + "value": 3128, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 909, + "fields": { + "banding": 568, + "country": 998, + "value": 4066, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 569, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 910, + "fields": { + "banding": 569, + "country": 999, + "value": 3798, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 911, + "fields": { + "banding": 569, + "country": 998, + "value": 4937, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 570, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 912, + "fields": { + "banding": 570, + "country": 999, + "value": 4468, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 913, + "fields": { + "banding": 570, + "country": 998, + "value": 5808, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 571, + "fields": { + "package": 144, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 914, + "fields": { + "banding": 571, + "country": 999, + "value": 6255, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 915, + "fields": { + "banding": 571, + "country": 998, + "value": 8132, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 145, + "fields": { + "name": "Package 145 - Advanced (FTE/GBP+EUR)", + "description": "Test package 145", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 145, + "fields": { + "basepackage_ptr": 145, + "initiative": 18, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 159, + "fields": { + "package": 145, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 202, + "fields": { + "package": 145, + "banding_type_entry": 159, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 203, + "fields": { + "package": 145, + "banding_type_entry": 159, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 572, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 916, + "fields": { + "banding": 572, + "country": 999, + "value": 1141, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 917, + "fields": { + "banding": 572, + "country": 997, + "value": 1312, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 573, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 918, + "fields": { + "banding": 573, + "country": 999, + "value": 1826, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 919, + "fields": { + "banding": 573, + "country": 997, + "value": 2100, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 574, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 920, + "fields": { + "banding": 574, + "country": 999, + "value": 2739, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 921, + "fields": { + "banding": 574, + "country": 997, + "value": 3150, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 575, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 922, + "fields": { + "banding": 575, + "country": 999, + "value": 3652, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 923, + "fields": { + "banding": 575, + "country": 997, + "value": 4200, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 576, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 924, + "fields": { + "banding": 576, + "country": 999, + "value": 4565, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 925, + "fields": { + "banding": 576, + "country": 997, + "value": 5250, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 577, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 926, + "fields": { + "banding": 577, + "country": 999, + "value": 5934, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 927, + "fields": { + "banding": 577, + "country": 997, + "value": 6825, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 578, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 928, + "fields": { + "banding": 578, + "country": 999, + "value": 7760, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 929, + "fields": { + "banding": 578, + "country": 997, + "value": 8925, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 579, + "fields": { + "package": 145, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 930, + "fields": { + "banding": 579, + "country": 999, + "value": 10043, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 931, + "fields": { + "banding": 579, + "country": 997, + "value": 11549, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 146, + "fields": { + "name": "Package 146 - Pro (Choice/USD)", + "description": "Test package 146", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 146, + "fields": { + "basepackage_ptr": 146, + "initiative": 19, + "default_country": 998, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 160, + "fields": { + "package": 146, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 204, + "fields": { + "package": 146, + "banding_type_entry": 160, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 580, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 932, + "fields": { + "banding": 580, + "country": 998, + "value": 909, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 581, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 933, + "fields": { + "banding": 581, + "country": 998, + "value": 1515, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 582, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 934, + "fields": { + "banding": 582, + "country": 998, + "value": 2424, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 583, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 935, + "fields": { + "banding": 583, + "country": 998, + "value": 3333, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 584, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 936, + "fields": { + "banding": 584, + "country": 998, + "value": 4242, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 585, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 937, + "fields": { + "banding": 585, + "country": 998, + "value": 5152, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 586, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 938, + "fields": { + "banding": 586, + "country": 998, + "value": 6061, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 587, + "fields": { + "package": 146, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 939, + "fields": { + "banding": 587, + "country": 998, + "value": 8485, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 147, + "fields": { + "name": "Package 147 - Essential (FTE+Choice/GBP)", + "description": "Test package 147", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 147, + "fields": { + "basepackage_ptr": 147, + "initiative": 19, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 161, + "fields": { + "package": 147, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 205, + "fields": { + "package": 147, + "banding_type_entry": 161, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 588, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 940, + "fields": { + "banding": 588, + "country": 999, + "value": 1190, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 589, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 941, + "fields": { + "banding": 589, + "country": 999, + "value": 1904, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 590, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 942, + "fields": { + "banding": 590, + "country": 999, + "value": 2855, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 591, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 943, + "fields": { + "banding": 591, + "country": 999, + "value": 3807, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 592, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 944, + "fields": { + "banding": 592, + "country": 999, + "value": 4759, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 593, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 945, + "fields": { + "banding": 593, + "country": 999, + "value": 6187, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 594, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 946, + "fields": { + "banding": 594, + "country": 999, + "value": 8090, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 595, + "fields": { + "package": 147, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 947, + "fields": { + "banding": 595, + "country": 999, + "value": 10470, + "default_currency": "GBP" + } + }, + { + "model": "package.bandingtypeentry", + "pk": 162, + "fields": { + "package": 147, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 206, + "fields": { + "package": 147, + "banding_type_entry": 162, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 596, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 948, + "fields": { + "banding": 596, + "country": 999, + "value": 714, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 597, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 949, + "fields": { + "banding": 597, + "country": 999, + "value": 1190, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 598, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 950, + "fields": { + "banding": 598, + "country": 999, + "value": 1904, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 599, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 951, + "fields": { + "banding": 599, + "country": 999, + "value": 2617, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 600, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 952, + "fields": { + "banding": 600, + "country": 999, + "value": 3331, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 601, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 953, + "fields": { + "banding": 601, + "country": 999, + "value": 4045, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 602, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 954, + "fields": { + "banding": 602, + "country": 999, + "value": 4759, + "default_currency": "GBP" + } + }, + { + "model": "package.banding", + "pk": 603, + "fields": { + "package": 147, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 955, + "fields": { + "banding": 603, + "country": 999, + "value": 6663, + "default_currency": "GBP" + } + }, + { + "model": "package.basepackage", + "pk": 148, + "fields": { + "name": "Package 148 - Complete (FTE/EUR)", + "description": "Test package 148", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 148, + "fields": { + "basepackage_ptr": 148, + "initiative": 20, + "default_country": 997, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 163, + "fields": { + "package": 148, + "banding_type": 100, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 207, + "fields": { + "package": 148, + "banding_type_entry": 163, + "country": 997, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 604, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 100, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 956, + "fields": { + "banding": 604, + "country": 997, + "value": 1396, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 605, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 101, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 957, + "fields": { + "banding": 605, + "country": 997, + "value": 2234, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 606, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 102, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 958, + "fields": { + "banding": 606, + "country": 997, + "value": 3351, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 607, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 103, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 959, + "fields": { + "banding": 607, + "country": 997, + "value": 4468, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 608, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 104, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 960, + "fields": { + "banding": 608, + "country": 997, + "value": 5584, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 609, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 105, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 961, + "fields": { + "banding": 609, + "country": 997, + "value": 7260, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 610, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 106, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 962, + "fields": { + "banding": 610, + "country": 997, + "value": 9493, + "default_currency": "EUR" + } + }, + { + "model": "package.banding", + "pk": 611, + "fields": { + "package": 148, + "banding_type": 100, + "vocab": 107, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 963, + "fields": { + "banding": 611, + "country": 997, + "value": 12286, + "default_currency": "EUR" + } + }, + { + "model": "package.basepackage", + "pk": 149, + "fields": { + "name": "Package 149 - Select (Choice/GBP+USD)", + "description": "Test package 149", + "active": true, + "banding_type": 101, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.package", + "pk": 149, + "fields": { + "basepackage_ptr": 149, + "initiative": 20, + "default_country": 999, + "meta_only": false + } + }, + { + "model": "package.bandingtypeentry", + "pk": 164, + "fields": { + "package": 149, + "banding_type": 101, + "redirect_display": "", + "redirect": "" + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 208, + "fields": { + "package": 149, + "banding_type_entry": 164, + "country": 999, + "payment_processor": null + } + }, + { + "model": "package.bandingtypecurrencyentry", + "pk": 209, + "fields": { + "package": 149, + "banding_type_entry": 164, + "country": 998, + "payment_processor": null + } + }, + { + "model": "package.banding", + "pk": 612, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 108, + "active": true, + "order": 1 + } + }, + { + "model": "package.price", + "pk": 964, + "fields": { + "banding": 612, + "country": 999, + "value": 743, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 965, + "fields": { + "banding": 612, + "country": 998, + "value": 966, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 613, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 109, + "active": true, + "order": 2 + } + }, + { + "model": "package.price", + "pk": 966, + "fields": { + "banding": 613, + "country": 999, + "value": 1238, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 967, + "fields": { + "banding": 613, + "country": 998, + "value": 1610, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 614, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 110, + "active": true, + "order": 3 + } + }, + { + "model": "package.price", + "pk": 968, + "fields": { + "banding": 614, + "country": 999, + "value": 1981, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 969, + "fields": { + "banding": 614, + "country": 998, + "value": 2576, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 615, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 111, + "active": true, + "order": 4 + } + }, + { + "model": "package.price", + "pk": 970, + "fields": { + "banding": 615, + "country": 999, + "value": 2724, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 971, + "fields": { + "banding": 615, + "country": 998, + "value": 3541, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 616, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 112, + "active": true, + "order": 5 + } + }, + { + "model": "package.price", + "pk": 972, + "fields": { + "banding": 616, + "country": 999, + "value": 3467, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 973, + "fields": { + "banding": 616, + "country": 998, + "value": 4507, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 617, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 113, + "active": true, + "order": 6 + } + }, + { + "model": "package.price", + "pk": 974, + "fields": { + "banding": 617, + "country": 999, + "value": 4210, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 975, + "fields": { + "banding": 617, + "country": 998, + "value": 5473, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 618, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 114, + "active": true, + "order": 7 + } + }, + { + "model": "package.price", + "pk": 976, + "fields": { + "banding": 618, + "country": 999, + "value": 4953, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 977, + "fields": { + "banding": 618, + "country": 998, + "value": 6439, + "default_currency": "USD" + } + }, + { + "model": "package.banding", + "pk": 619, + "fields": { + "package": 149, + "banding_type": 101, + "vocab": 115, + "active": true, + "order": 8 + } + }, + { + "model": "package.price", + "pk": 978, + "fields": { + "banding": 619, + "country": 999, + "value": 6934, + "default_currency": "GBP" + } + }, + { + "model": "package.price", + "pk": 979, + "fields": { + "banding": 619, + "country": 998, + "value": 9014, + "default_currency": "USD" + } + }, + { + "model": "package.basepackage", + "pk": 300, + "fields": { + "name": "Complete Academic Suite", + "description": "Meta package: Complete Academic Suite", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 300, + "fields": { + "basepackage_ptr": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 200, + "fields": { + "package": 100, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 201, + "fields": { + "package": 101, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 202, + "fields": { + "package": 102, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 203, + "fields": { + "package": 103, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 204, + "fields": { + "package": 104, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 205, + "fields": { + "package": 105, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 206, + "fields": { + "package": 110, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 207, + "fields": { + "package": 111, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 208, + "fields": { + "package": 112, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 209, + "fields": { + "package": 115, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 210, + "fields": { + "package": 116, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 211, + "fields": { + "package": 120, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 212, + "fields": { + "package": 121, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 213, + "fields": { + "package": 130, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 214, + "fields": { + "package": 131, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 215, + "fields": { + "package": 140, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 216, + "fields": { + "package": 141, + "meta_package": 300 + } + }, + { + "model": "package.metapackagelink", + "pk": 217, + "fields": { + "package": 142, + "meta_package": 300 + } + }, + { + "model": "package.basepackage", + "pk": 301, + "fields": { + "name": "Research Excellence Bundle", + "description": "Meta package: Research Excellence Bundle", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 301, + "fields": { + "basepackage_ptr": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 218, + "fields": { + "package": 103, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 219, + "fields": { + "package": 106, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 220, + "fields": { + "package": 107, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 221, + "fields": { + "package": 108, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 222, + "fields": { + "package": 113, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 223, + "fields": { + "package": 114, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 224, + "fields": { + "package": 117, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 225, + "fields": { + "package": 122, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 226, + "fields": { + "package": 123, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 227, + "fields": { + "package": 127, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 228, + "fields": { + "package": 132, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 229, + "fields": { + "package": 133, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 230, + "fields": { + "package": 143, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 231, + "fields": { + "package": 144, + "meta_package": 301 + } + }, + { + "model": "package.metapackagelink", + "pk": 232, + "fields": { + "package": 145, + "meta_package": 301 + } + }, + { + "model": "package.basepackage", + "pk": 302, + "fields": { + "name": "Digital Futures Pack", + "description": "Meta package: Digital Futures Pack", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 302, + "fields": { + "basepackage_ptr": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 233, + "fields": { + "package": 105, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 234, + "fields": { + "package": 109, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 235, + "fields": { + "package": 110, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 236, + "fields": { + "package": 118, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 237, + "fields": { + "package": 119, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 238, + "fields": { + "package": 124, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 239, + "fields": { + "package": 125, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 240, + "fields": { + "package": 128, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 241, + "fields": { + "package": 134, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 242, + "fields": { + "package": 135, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 243, + "fields": { + "package": 146, + "meta_package": 302 + } + }, + { + "model": "package.metapackagelink", + "pk": 244, + "fields": { + "package": 147, + "meta_package": 302 + } + }, + { + "model": "package.basepackage", + "pk": 303, + "fields": { + "name": "Global Access Collection", + "description": "Meta package: Global Access Collection", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 303, + "fields": { + "basepackage_ptr": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 245, + "fields": { + "package": 100, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 246, + "fields": { + "package": 111, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 247, + "fields": { + "package": 115, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 248, + "fields": { + "package": 120, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 249, + "fields": { + "package": 126, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 250, + "fields": { + "package": 129, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 251, + "fields": { + "package": 136, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 252, + "fields": { + "package": 137, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 253, + "fields": { + "package": 148, + "meta_package": 303 + } + }, + { + "model": "package.metapackagelink", + "pk": 254, + "fields": { + "package": 149, + "meta_package": 303 + } + }, + { + "model": "package.basepackage", + "pk": 304, + "fields": { + "name": "Innovation Portfolio", + "description": "Meta package: Innovation Portfolio", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 304, + "fields": { + "basepackage_ptr": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 255, + "fields": { + "package": 101, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 256, + "fields": { + "package": 106, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 257, + "fields": { + "package": 112, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 258, + "fields": { + "package": 121, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 259, + "fields": { + "package": 130, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 260, + "fields": { + "package": 138, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 261, + "fields": { + "package": 139, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 262, + "fields": { + "package": 142, + "meta_package": 304 + } + }, + { + "model": "package.metapackagelink", + "pk": 263, + "fields": { + "package": 145, + "meta_package": 304 + } + }, + { + "model": "package.basepackage", + "pk": 305, + "fields": { + "name": "Core Scholarship Set", + "description": "Meta package: Core Scholarship Set", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 305, + "fields": { + "basepackage_ptr": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 264, + "fields": { + "package": 102, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 265, + "fields": { + "package": 107, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 266, + "fields": { + "package": 113, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 267, + "fields": { + "package": 122, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 268, + "fields": { + "package": 131, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 269, + "fields": { + "package": 143, + "meta_package": 305 + } + }, + { + "model": "package.metapackagelink", + "pk": 270, + "fields": { + "package": 146, + "meta_package": 305 + } + }, + { + "model": "package.basepackage", + "pk": 306, + "fields": { + "name": "Discovery Bundle", + "description": "Meta package: Discovery Bundle", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 306, + "fields": { + "basepackage_ptr": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 271, + "fields": { + "package": 104, + "meta_package": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 272, + "fields": { + "package": 108, + "meta_package": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 273, + "fields": { + "package": 116, + "meta_package": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 274, + "fields": { + "package": 123, + "meta_package": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 275, + "fields": { + "package": 132, + "meta_package": 306 + } + }, + { + "model": "package.metapackagelink", + "pk": 276, + "fields": { + "package": 147, + "meta_package": 306 + } + }, + { + "model": "package.basepackage", + "pk": 307, + "fields": { + "name": "Analytics Pack", + "description": "Meta package: Analytics Pack", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 307, + "fields": { + "basepackage_ptr": 307 + } + }, + { + "model": "package.metapackagelink", + "pk": 277, + "fields": { + "package": 109, + "meta_package": 307 + } + }, + { + "model": "package.metapackagelink", + "pk": 278, + "fields": { + "package": 114, + "meta_package": 307 + } + }, + { + "model": "package.metapackagelink", + "pk": 279, + "fields": { + "package": 124, + "meta_package": 307 + } + }, + { + "model": "package.metapackagelink", + "pk": 280, + "fields": { + "package": 133, + "meta_package": 307 + } + }, + { + "model": "package.metapackagelink", + "pk": 281, + "fields": { + "package": 140, + "meta_package": 307 + } + }, + { + "model": "package.basepackage", + "pk": 308, + "fields": { + "name": "Essentials Collection", + "description": "Meta package: Essentials Collection", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 308, + "fields": { + "basepackage_ptr": 308 + } + }, + { + "model": "package.metapackagelink", + "pk": 282, + "fields": { + "package": 117, + "meta_package": 308 + } + }, + { + "model": "package.metapackagelink", + "pk": 283, + "fields": { + "package": 125, + "meta_package": 308 + } + }, + { + "model": "package.metapackagelink", + "pk": 284, + "fields": { + "package": 134, + "meta_package": 308 + } + }, + { + "model": "package.metapackagelink", + "pk": 285, + "fields": { + "package": 141, + "meta_package": 308 + } + }, + { + "model": "package.basepackage", + "pk": 309, + "fields": { + "name": "Starter Kit", + "description": "Meta package: Starter Kit", + "active": true, + "banding_type": 100, + "pricing_display": "", + "display_contract_length_months": 12, + "image": null, + "recommended": false + } + }, + { + "model": "package.metapackage", + "pk": 309, + "fields": { + "basepackage_ptr": 309 + } + }, + { + "model": "package.metapackagelink", + "pk": 286, + "fields": { + "package": 118, + "meta_package": 309 + } + }, + { + "model": "package.metapackagelink", + "pk": 287, + "fields": { + "package": 126, + "meta_package": 309 + } + }, + { + "model": "package.metapackagelink", + "pk": 288, + "fields": { + "package": 144, + "meta_package": 309 } } -] \ No newline at end of file +] diff --git a/src/intrepid/test_settings.py b/src/intrepid/test_settings.py new file mode 100644 index 0000000..205d441 --- /dev/null +++ b/src/intrepid/test_settings.py @@ -0,0 +1,14 @@ +import os + +from intrepid.settings import * # noqa: F401, F403 + +MIGRATION_MODULES = { + 'fluid_permissions': 'test_migrations.fluid_permissions', +} + +FIXTURE_DIRS = [ + os.path.join(BASE_DIR, '..', 'fixtures'), +] + +# Disable HTTP Basic Auth for test client requests +BASICAUTH_DISABLE = True diff --git a/src/package/forms.py b/src/package/forms.py index 89bbafc..cbcb901 100644 --- a/src/package/forms.py +++ b/src/package/forms.py @@ -214,6 +214,180 @@ def save(self) -> None: self.user_session[key] = value +class FastFTEForm(forms.Form): + """ + Optimized version of FTEForm. + Accepts prefetched site_texts dict and batch-fetches + AccountBandingChoices instead of per-type queries. + """ + + currency = forms.ModelChoiceField( + queryset=models.Country.objects.exclude( + name__in=["EUROZONE", "Eurozone", "eurozone"] + ), + help_text="", + label="", + ) + fte = forms.IntegerField( + help_text="", + label="", + ) + + def __init__(self, *args, **kwargs): + self.user_session = kwargs.pop("user_session") + self.user = kwargs.pop("user") + self.banding_types = kwargs.pop("banding_types") + self.site_texts = kwargs.pop("site_texts", None) + + super(FastFTEForm, self).__init__(*args, **kwargs) + + def get_site_text(key): + if self.site_texts and key in self.site_texts: + return self.site_texts[key].body + return SiteText.objects.get(key=key).body + + self.fields["currency"].help_text = get_site_text( + "select_currency_note" + ) + self.fields["fte"].help_text = get_site_text( + "fte_student_count_prompt" + ) + self.fields["fte"].label = get_site_text("institutions_fte") + + if self.user: + self.fields["fte"].initial = self.user.profile.fte + else: + self.fields["fte"].initial = self.user_session.get("fte", 0) + + self.helper = FormHelper() + + your_currency = get_site_text("your_currency") + + self.helper.layout = Layout( + HTML( + '

' + your_currency + "

" + ), + HTML( + "

{}

".format( + get_site_text("after_currency_bandings_info") + ) + ), + "currency", + ) + + if self.user: + self.fields["currency"].initial = ( + self.user.profile.default_currency + if self.user.profile.default_currency + else None + ) + else: + self.fields["currency"].initial = self.user_session.get( + "currency", 0 + ) + + if not self.fields["currency"].initial: + self.fields.pop("fte") + else: + self.helper.layout.append( + Layout( + HTML( + "

{}

".format( + get_site_text("institution_details") + ) + ), + "fte", + ) + ) + + if self.fields["currency"].initial: + # Batch-fetch all AccountBandingChoices at once + if self.user: + account_choices = { + abc.banding_type_id: abc + for abc in accm.AccountBandingChoices.objects.filter( + account=self.user, + ).select_related("banding_type_vocab") + } + else: + account_choices = {} + + for banding_type in self.banding_types: + if banding_type.active: + session_string = "banding_type_{}".format( + banding_type.pk + ) + choices = [["", "-----"]] + for vocab in banding_type.vocabs.all(): + choices.append([vocab.pk, vocab.text]) + self.fields[session_string] = forms.ChoiceField( + choices=choices, + label=banding_type.name, + ) + if self.user: + account_banding_choice = account_choices.get( + banding_type.pk + ) + self.fields[session_string].initial = ( + account_banding_choice.banding_type_vocab.pk + if account_banding_choice + else None + ) + else: + self.fields[session_string].initial = ( + self.user_session.get(session_string, None) + ) + + self.fields[session_string].help_text = ( + banding_type.description + ) + + self.helper.layout.append( + Layout(session_string), + ) + if "currency" in self.changed_data: + self.fields[session_string].required = False + + if "currency" in self.changed_data and self.fields.get("fte"): + self.fields["fte"].required = False + + self.helper.layout.append( + Submit( + "fte_form", + "Update", + css_class="btn btn-primary btn-obc-blue", + ), + ) + + def save(self) -> None: + for key, value in self.cleaned_data.items(): + if self.user: + if key == "fte" and value: + self.user.profile.fte = value + elif key == "currency" and value: + self.user.profile.default_currency = value + elif value: + banding_type_pk = key.replace("banding_type_", "") + banding_type_vocab = vm.BandingVocab.objects.get( + pk=value, + ) + accm.AccountBandingChoices.objects.update_or_create( + account=self.user, + banding_type_id=banding_type_pk, + defaults={ + "banding_type_vocab": banding_type_vocab, + }, + ) + self.user.profile.save() + else: + if key == "fte": + self.user_session[key] = value + elif key == "currency": + self.user_session[key] = value.pk + else: + self.user_session[key] = value + + class ManagePackageForm(forms.ModelForm): """ Form for managing packages diff --git a/src/package/migrations/0077_auto_20260208_1931.py b/src/package/migrations/0077_auto_20260208_1931.py new file mode 100644 index 0000000..266feea --- /dev/null +++ b/src/package/migrations/0077_auto_20260208_1931.py @@ -0,0 +1,33 @@ +# Generated by Django 3.2.8 on 2026-02-08 19:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('package', '0076_auto_20251020_1005'), + ] + + operations = [ + migrations.AddIndex( + model_name='banding', + index=models.Index(fields=['package', 'banding_type'], name='banding_pkg_type_idx'), + ), + migrations.AddIndex( + model_name='bandingtypecurrencyentry', + index=models.Index(fields=['package', 'banding_type_entry'], name='btce_pkg_bte_idx'), + ), + migrations.AddIndex( + model_name='bandingtypeentry', + index=models.Index(fields=['package', 'banding_type'], name='bte_pkg_type_idx'), + ), + migrations.AddIndex( + model_name='country', + index=models.Index(fields=['currency', 'catch_all'], name='country_currency_catchall_idx'), + ), + migrations.AddIndex( + model_name='price', + index=models.Index(fields=['banding', 'country'], name='price_banding_country_idx'), + ), + ] diff --git a/src/package/models.py b/src/package/models.py index 11f6b2b..f8a81ac 100644 --- a/src/package/models.py +++ b/src/package/models.py @@ -1,4 +1,5 @@ import datetime +import functools import os import sys import uuid @@ -69,6 +70,12 @@ class Country(models.Model): class Meta: verbose_name_plural = "Countries" ordering = ("name",) + indexes = [ + models.Index( + fields=["currency", "catch_all"], + name="country_currency_catchall_idx", + ), + ] def __str__(self): return "{} ({})".format(self.name, self.currency) @@ -186,6 +193,14 @@ class Banding(models.Model): ) objects = BandingManager() + class Meta: + indexes = [ + models.Index( + fields=["package", "banding_type"], + name="banding_pkg_type_idx", + ), + ] + def name(self) -> str: """ Returns the name of the banding @@ -272,6 +287,14 @@ class Price(models.Model): ) objects = PriceManager() + class Meta: + indexes = [ + models.Index( + fields=["banding", "country"], + name="price_banding_country_idx", + ), + ] + @staticmethod def collect() -> None: """ @@ -320,6 +343,14 @@ class BandingTypeCurrencyEntry(models.Model): on_delete=models.SET_NULL, ) + class Meta: + indexes = [ + models.Index( + fields=["package", "banding_type_entry"], + name="btce_pkg_bte_idx", + ), + ] + def __str__(self): return "{} ({}) in {}".format( self.country, self.banding_type_entry, self.package @@ -357,6 +388,14 @@ class BandingTypeEntry(models.Model): blank=True, null=True, default="", verbose_name="Redirect URL" ) + class Meta: + indexes = [ + models.Index( + fields=["package", "banding_type"], + name="bte_pkg_type_idx", + ), + ] + def __str__(self): return "{} in {}".format(self.banding_type, self.package) @@ -598,6 +637,60 @@ def price_bandings(self) -> dict: return prices + @functools.cached_property + def fast_price_bandings(self) -> dict: + """ + Optimized version of price_bandings. + Scopes queries to this package only and uses dict lookups + instead of triple-nested loops over global querysets. + """ + banding_entries = ( + self.bandingtypecurrencyentry_set.all() + .select_related("banding_type_entry__banding_type", "country") + .prefetch_related("banding_type_entry__banding_type__vocabs") + ) + + # Scope to THIS package only (not all bandings/prices globally) + package_bandings = Banding.objects.filter( + package=self + ).select_related("banding_type", "vocab") + + # Build lookup: (banding_type_id, vocab_id) -> banding + banding_lookup = {} + for b in package_bandings: + banding_lookup[(b.banding_type_id, b.vocab_id)] = b + + package_prices = Price.objects.filter( + banding__package=self + ).select_related("banding", "country") + + # Build lookup: (banding_id, country_id) -> price + price_lookup = {} + for p in package_prices: + price_lookup[(p.banding_id, p.country_id)] = p + + prices = {} + for banding_entry in banding_entries: + prices[banding_entry] = {} + bt = banding_entry.banding_type_entry.banding_type + + for v_banding in bt.vocabs.all(): + banding = banding_lookup.get((bt.id, v_banding.id)) + if banding is None: + continue + + price = price_lookup.get( + (banding.id, banding_entry.country_id) + ) + if price is None: + continue + + if price.country not in prices[banding_entry]: + prices[banding_entry][price.country] = [] + prices[banding_entry][price.country].append(price) + + return prices + def display_price(self) -> str: """ Gets a display string of the pricing for this package @@ -1037,6 +1130,235 @@ def get_best_bandings_for_form( ] ) + def fast_list_of_conflicting_packages(self) -> set[Package]: + """ + Optimized version of list_of_conflicting_packages. + Uses prefetched M2M data and in-memory set operations + instead of nested DB queries. + """ + basket_packages = set(self.packages.all()) + basket_meta_packages = list(self.meta_packages.all()) + + # Build {meta_package: set(its packages)} once + mp_package_sets = { + mp: set(mp.packages.all()) for mp in basket_meta_packages + } + + conflicting_packages = [] + + # Packages that appear both individually and in a meta_package + for package in basket_packages: + for mp_pkgs in mp_package_sets.values(): + if package in mp_pkgs: + conflicting_packages.append(package) + break + + # Packages shared between different meta_packages + mp_list = list(mp_package_sets.items()) + for i, (mp, mp_pkgs) in enumerate(mp_list): + for j in range(i + 1, len(mp_list)): + omp, omp_pkgs = mp_list[j] + conflicting_packages.extend(mp_pkgs & omp_pkgs) + + return set(conflicting_packages) + + def fast_cost( + self, identifier, identifier_type="user", country=None + ) -> tuple[list, dict]: + """ + Optimized version of cost. + Accepts pre-resolved country to avoid redundant user lookups. + Uses prefetched M2M relations. + Batch-prefetches all bandings and prices in 2 queries. + """ + package_costs = [] + + if country is None: + if identifier_type == "user": + user = account_models.User.objects.get(username=identifier) + country = user.profile.default_currency + else: + country_pk = identifier.get("currency", None) + country = Country.objects.filter(pk=country_pk).first() + + # Pre-fetch all AccountBandingChoices for the user once + account_banding_choices = None + if identifier_type == "user": + account_banding_choices = { + abc.banding_type_id: abc + for abc in account_models.AccountBandingChoices.objects.filter( + account=identifier, + ).select_related("banding_type_vocab") + } + + # --- Batch-prefetch all bandings and prices for all basket packages --- + all_pkg_ids = [p.pk for p in self.packages.all()] + for mp in self.meta_packages.all(): + all_pkg_ids.extend(p.pk for p in mp.packages.all()) + + all_bandings = Banding.objects.filter( + package_id__in=all_pkg_ids + ).select_related("banding_type", "vocab") + + all_prices = Price.objects.filter( + banding__package_id__in=all_pkg_ids + ).select_related("banding", "country") + + # Build lookups: (package_id, banding_type_id) -> [bandings] + bandings_cache = {} + for b in all_bandings: + bandings_cache.setdefault( + (b.package_id, b.banding_type_id), [] + ).append(b) + + # Build lookups: (banding_id, country_id) -> price + price_cache = {} + for p in all_prices: + price_cache[(p.banding_id, p.country_id)] = p + + for package in self.packages.all(): + price, banding = utils.fast_get_price_for_package( + package=package, + identifier=identifier, + identifier_type=identifier_type, + country=country if country else None, + account_banding_choices=account_banding_choices, + bandings_cache=bandings_cache, + price_cache=price_cache, + ) + package_costs.append( + {"package": package, "cost": price, "banding": banding} + ) + + for mp in self.meta_packages.all(): + for package in mp.packages.all(): + price, banding = utils.fast_get_price_for_package( + package=package, + identifier=identifier, + identifier_type=identifier_type, + country=country if country else None, + account_banding_choices=account_banding_choices, + bandings_cache=bandings_cache, + price_cache=price_cache, + ) + package_costs.append( + {"package": package, "cost": price, "banding": banding} + ) + + currency_totals = dict() + completed_packages = [] + for pc in package_costs: + if (pc.get("cost") and pc.get("banding")) and pc.get( + "package" + ) not in completed_packages: + if pc.get("cost").country: + currency = pc.get("cost").country.currency + else: + currency = pc.get("cost").default_currency + + if currency_totals.get(currency): + currency_totals[currency] = ( + currency_totals[currency] + pc.get("cost").value + ) + else: + currency_totals[currency] = pc.get("cost").value + + completed_packages.append(pc.get("package")) + + return package_costs, currency_totals + + def fast_get_best_bandings_for_form( + self, identifier, identifier_type="user", country=None + ) -> set: + """ + Optimized version of get_best_bandings_for_form. + Accepts pre-resolved country and batch-fetches all prices + in 2 queries instead of N+1. + """ + package_bandings_return = [] + + if country is None: + if identifier_type == "user": + user = account_models.User.objects.get(username=identifier) + currency = user.profile.default_currency + else: + currency_pk = identifier.get("currency") + currency = Country.objects.filter(pk=currency_pk).first() + else: + currency = country + + if not currency: + return set() + + # Collect ALL packages from basket (direct + meta_packages) + all_packages = list(self.packages.all()) + for mp in self.meta_packages.all(): + all_packages.extend(mp.packages.all()) + all_package_ids = [p.pk for p in all_packages] + + # Find catch-all country for currency + catch_all_matching_currency = Country.objects.filter( + currency=currency.currency, catch_all=True + ).first() + + if catch_all_matching_currency: + suitable_prices = Price.objects.filter( + country__currency=catch_all_matching_currency.currency, + country__catch_all=True, + ).select_related("banding__banding_type") + package_bandings_return.extend( + price.banding for price in suitable_prices + ) + + # Batch fetch ALL bandings for all basket packages at once + bandings = Banding.objects.filter( + package_id__in=all_package_ids + ).select_related("banding_type") + + # Batch fetch ALL prices for those bandings at once + all_prices = Price.objects.filter( + banding__in=bandings + ).select_related("banding__banding_type", "country") + + # Build lookup: package_id -> list of prices + price_by_package = {} + for price in all_prices: + pkg_id = price.banding.package_id + price_by_package.setdefault(pkg_id, []).append(price) + + default_countries = { + p.pk: p.default_country_id for p in all_packages + } + + for package in all_packages: + pkg_prices = price_by_package.get(package.pk, []) + + # First try: prices matching user currency + suitable = [ + p for p in pkg_prices if p.country_id == currency.pk + ] + if suitable: + package_bandings_return.extend( + p.banding for p in suitable + ) + else: + # Fallback: default country + default_country_id = default_countries.get(package.pk) + suitable = [ + p for p in pkg_prices + if p.country_id == default_country_id + ] + if suitable: + package_bandings_return.extend( + p.banding for p in suitable + ) + + return set( + banding.banding_type + for banding in package_bandings_return + if not banding.banding_type.is_fte + ) + class AggregateForm(models.Model): """ diff --git a/src/package/templatetags/country.py b/src/package/templatetags/country.py index ef09baa..f00dec1 100644 --- a/src/package/templatetags/country.py +++ b/src/package/templatetags/country.py @@ -10,6 +10,9 @@ def country_code_to_name(context): country = models.Country.objects.filter( code=request.session.get('country') ).first() - return country.name + if country: + return country.name + else: + return '' except models.Country.DoesNotExist: return request.session.get('country') diff --git a/src/package/tests.py b/src/package/tests.py new file mode 100644 index 0000000..afaaffd --- /dev/null +++ b/src/package/tests.py @@ -0,0 +1,1181 @@ +""" +Comparison tests for view_basket (original) vs fast_view_basket (optimized). + +These tests verify that for multiple package and meta-package basket +configurations, both views produce identical template context and rendered +HTML output. + +Uses fixtures/test_package.json which provides: + - 20 Initiatives (pk 1-20) + - 3 Countries (GBP pk=999, USD pk=998, EUR pk=997) + - 2 BandingTypes: FTE pk=100 (8 vocabs 100-107), + Choice pk=101 (8 vocabs 108-115) + - 50 Packages (pk 100-149) across 20 initiatives, with 10 different + banding-type / currency configurations + - 10 MetaPackages (pk 300-309) with 3-18 packages each, overlapping + membership creating 39 conflict points + - 880 prices across 520 bandings + +Additional objects (SiteSetup, SiteText, User, Profile, +AccountBandingChoices) are created programmatically in setUpTestData. +""" + +import re +import time +from decimal import Decimal +from unittest.mock import patch + +from django.contrib.auth.models import User +from django.contrib.sessions.backends.db import SessionStore +from django.core.management import call_command +from django.test import TestCase, RequestFactory + +from accounts.models import AccountBandingChoices, Profile +from cms.models import SiteText +from intrepid.models import SiteSetup +from package import forms, models, utils, views +from vocab.models import BandingVocab + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +class _AnonymousUser: + """Minimal stand-in for an anonymous user.""" + + is_authenticated = False + pk = None + + def __str__(self): + return "AnonymousUser" + + +# --------------------------------------------------------------------------- +# Shared fixture mixin +# --------------------------------------------------------------------------- + + +class BasketFixtureMixin: + """ + Loads ``fixtures/test_package.json`` (20 initiatives, 50 packages, + 10 metas, 1825 objects) and creates the supporting objects needed by + views and forms. + + Package config cycle (repeats every 10 PKs starting at 100): + 0: FTE+Choice / GBP+USD+EUR (pk 100, 110, 120, 130, 140) + 1: FTE / GBP (pk 101, 111, 121, 131, 141) + 2: FTE / GBP+USD (pk 102, 112, 122, 132, 142) + 3: Choice / GBP (pk 103, 113, 123, 133, 143) + 4: FTE+Choice / GBP+USD (pk 104, 114, 124, 134, 144) + 5: FTE / GBP+EUR (pk 105, 115, 125, 135, 145) + 6: Choice / USD (pk 106, 116, 126, 136, 146) + 7: FTE+Choice / GBP (pk 107, 117, 127, 137, 147) + 8: FTE / EUR (pk 108, 118, 128, 138, 148) + 9: Choice / GBP+USD (pk 109, 119, 129, 139, 149) + """ + + @classmethod + def setUpTestData(cls): + # ---- Load fixture (includes 20 initiatives, 50 packages, etc.) ---- + call_command("loaddata", "test_package", verbosity=0) + + # ---- Countries ---- + cls.country_gbp = models.Country.objects.get(pk=999) + cls.country_usd = models.Country.objects.get(pk=998) + cls.country_eur = models.Country.objects.get(pk=997) + + # ---- BandingTypes ---- + cls.fte_banding_type = models.BandingType.objects.get(pk=100) + cls.choice_banding_type = models.BandingType.objects.get(pk=101) + + # ---- All 50 packages (ordered by pk) ---- + cls.all_packages = list( + models.Package.objects.filter( + pk__gte=100, pk__lte=149, + ).order_by("pk") + ) + + # ---- Named references for targeted tests ---- + cls.pkg_all_combos = models.Package.objects.get(pk=100) + cls.pkg_simple_fte = models.Package.objects.get(pk=101) + cls.pkg_fte_multi_curr = models.Package.objects.get(pk=102) + cls.pkg_simple_choice = models.Package.objects.get(pk=103) + cls.pkg_dual_multi = models.Package.objects.get(pk=104) + cls.pkg_fte_gbp_eur = models.Package.objects.get(pk=105) + cls.pkg_choice_usd = models.Package.objects.get(pk=106) + cls.pkg_dual_gbp = models.Package.objects.get(pk=107) + cls.pkg_fte_eur = models.Package.objects.get(pk=108) + cls.pkg_choice_multi = models.Package.objects.get(pk=109) + + # ---- Convenience subsets ---- + # GBP-only packages (no currency conversion needed) + cls.gbp_only_packages = [ + models.Package.objects.get(pk=pk) + for pk in [101, 103, 107, 111, 113, 117, 121, 123, 127] + ] + + # ---- All 10 meta packages (ordered by pk) ---- + cls.all_metas = list( + models.MetaPackage.objects.filter( + pk__gte=300, pk__lte=309, + ).order_by("pk") + ) + cls.meta_18 = models.MetaPackage.objects.get(pk=300) + cls.meta_15 = models.MetaPackage.objects.get(pk=301) + cls.meta_3 = models.MetaPackage.objects.get(pk=309) + + # ---- SiteSetup ---- + cls.site_setup = SiteSetup.objects.create( + site_name="Test Site", + enable_signup=True, + enable_meta_package_signup=True, + enable_individual_package_signup=True, + fee_amount=5, + fallback_currency="GBP", + ) + + # ---- SiteText entries required by FTEForm / FastFTEForm ---- + for key in ( + "select_currency_note", + "fte_student_count_prompt", + "institutions_fte", + "your_currency", + "after_currency_bandings_info", + "institution_details", + "included_within_offers", + ): + SiteText.objects.get_or_create( + key=key, + defaults={ + "body": key.replace("_", " ").title(), + "help_text": "", + "rich_text": False, + "frontend": False, + }, + ) + + # ---- User + Profile ---- + cls.user = User.objects.create_user( + username="testuser", password="testpass123", + email="test@example.com", + ) + profile, _ = Profile.objects.get_or_create(account=cls.user) + profile.fte = 12000 # falls in "Large" tier (10,001-20,000) + profile.default_currency = cls.country_gbp + profile.save() + cls.profile = profile + + # ---- AccountBandingChoices (for choice-based banding type) ---- + AccountBandingChoices.objects.create( + account=cls.user, + banding_type=cls.choice_banding_type, + banding_type_vocab=BandingVocab.objects.get(pk=113), + ) + + +# --------------------------------------------------------------------------- +# Model-level: price_bandings +# --------------------------------------------------------------------------- + + +class TestFastPriceBandings(BasketFixtureMixin, TestCase): + """Verify fast_price_bandings produces identical output to price_bandings.""" + + def _compare(self, package): + original = package.price_bandings + + if "fast_price_bandings" in package.__dict__: + del package.__dict__["fast_price_bandings"] + fast = package.fast_price_bandings + + self.assertEqual( + set(original.keys()), set(fast.keys()), + "Banding entry keys differ", + ) + for entry_key in original: + orig_inner = original[entry_key] + fast_inner = fast[entry_key] + self.assertEqual( + set(orig_inner.keys()), set(fast_inner.keys()), + "Country keys differ for {}".format(entry_key), + ) + for country_key in orig_inner: + orig_pks = sorted(p.pk for p in orig_inner[country_key]) + fast_pks = sorted(p.pk for p in fast_inner[country_key]) + self.assertEqual( + orig_pks, fast_pks, + "Price PKs differ for {} / {}".format( + entry_key, country_key, + ), + ) + + def test_all_combos(self): + """FTE+Choice / GBP+USD+EUR — maximum complexity.""" + self._compare(self.pkg_all_combos) + + def test_simple_fte(self): + """FTE / GBP — simplest case.""" + self._compare(self.pkg_simple_fte) + + def test_fte_multi_currency(self): + """FTE / GBP+USD.""" + self._compare(self.pkg_fte_multi_curr) + + def test_simple_choice(self): + """Choice / GBP.""" + self._compare(self.pkg_simple_choice) + + def test_dual_multi_currency(self): + """FTE+Choice / GBP+USD.""" + self._compare(self.pkg_dual_multi) + + def test_fte_gbp_eur(self): + """FTE / GBP+EUR.""" + self._compare(self.pkg_fte_gbp_eur) + + def test_choice_usd_only(self): + """Choice / USD — foreign currency only.""" + self._compare(self.pkg_choice_usd) + + def test_dual_gbp_only(self): + """FTE+Choice / GBP.""" + self._compare(self.pkg_dual_gbp) + + def test_fte_eur_only(self): + """FTE / EUR.""" + self._compare(self.pkg_fte_eur) + + def test_choice_multi_currency(self): + """Choice / GBP+USD.""" + self._compare(self.pkg_choice_multi) + + +# --------------------------------------------------------------------------- +# Model-level: list_of_conflicting_packages +# --------------------------------------------------------------------------- + + +class TestFastListOfConflictingPackages(BasketFixtureMixin, TestCase): + """ + Verify fast_list_of_conflicting_packages matches the original for + various basket configurations. + """ + + def _compare(self, basket): + original = basket.list_of_conflicting_packages() + fast = basket.fast_list_of_conflicting_packages() + self.assertEqual(original, fast) + + def test_empty_basket(self): + basket = models.Basket.objects.create( + name="Empty", account=self.user, active=True, + ) + self._compare(basket) + + def test_packages_only_no_conflicts(self): + basket = models.Basket.objects.create( + name="Pkgs only", account=self.user, active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._compare(basket) + + def test_two_metas_with_overlap(self): + """meta_18 and meta_15 share packages -> conflicts.""" + basket = models.Basket.objects.create( + name="Meta overlap", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._compare(basket) + + def test_direct_and_meta_overlap(self): + """pkg 100 is both direct and inside meta_18 -> conflict.""" + basket = models.Basket.objects.create( + name="Direct+meta", account=self.user, active=True, + ) + basket.packages.add(self.pkg_all_combos) + basket.meta_packages.add(self.meta_18) + self._compare(basket) + + def test_all_metas(self): + """All 10 meta packages — lots of overlaps.""" + basket = models.Basket.objects.create( + name="All metas", account=self.user, active=True, + ) + basket.meta_packages.add(*self.all_metas) + self._compare(basket) + + def test_single_meta(self): + basket = models.Basket.objects.create( + name="Single meta", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_3) + self._compare(basket) + + def test_full_basket(self): + """All 50 packages + all 10 metas.""" + basket = models.Basket.objects.create( + name="Full", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._compare(basket) + + +# --------------------------------------------------------------------------- +# Model-level: cost +# --------------------------------------------------------------------------- + + +class TestFastCost(BasketFixtureMixin, TestCase): + """ + Verify fast_cost returns the same package_costs and currency_totals + as the original cost method. + """ + + def _compare(self, basket): + identifier = self.user + identifier_type = "user" + country = self.user.profile.default_currency + + orig_costs, orig_totals = basket.cost( + identifier=identifier, identifier_type=identifier_type, + ) + fast_costs, fast_totals = basket.fast_cost( + identifier=identifier, identifier_type=identifier_type, + country=country, + ) + + self.assertEqual( + len(orig_costs), len(fast_costs), + "package_costs length differs", + ) + for i, (orig, fast) in enumerate(zip(orig_costs, fast_costs)): + self.assertEqual( + orig["package"].pk, fast["package"].pk, + "package_costs[{}].package differs".format(i), + ) + if orig["cost"] == 0: + self.assertEqual( + fast["cost"], 0, + "package_costs[{}].cost: expected 0".format(i), + ) + else: + self.assertEqual( + orig["cost"].pk, fast["cost"].pk, + "package_costs[{}].cost PK differs".format(i), + ) + self.assertEqual( + orig["cost"].value, fast["cost"].value, + "package_costs[{}].cost value differs".format(i), + ) + if orig["banding"] is None: + self.assertIsNone( + fast["banding"], + "package_costs[{}].banding: expected None".format(i), + ) + else: + self.assertEqual( + orig["banding"].pk, fast["banding"].pk, + "package_costs[{}].banding PK differs".format(i), + ) + + self.assertEqual(orig_totals, fast_totals, "currency_totals differ") + + def test_single_package(self): + basket = models.Basket.objects.create( + name="Single", account=self.user, active=True, + ) + basket.packages.add(self.pkg_all_combos) + self._compare(basket) + + def test_five_gbp_packages(self): + basket = models.Basket.objects.create( + name="5 GBP", account=self.user, active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._compare(basket) + + def test_packages_mixed_currency(self): + basket = models.Basket.objects.create( + name="Mixed curr", account=self.user, active=True, + ) + basket.packages.add( + self.pkg_all_combos, self.pkg_choice_usd, self.pkg_fte_eur, + ) + self._compare(basket) + + def test_meta_packages(self): + basket = models.Basket.objects.create( + name="Meta", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._compare(basket) + + def test_twenty_packages(self): + basket = models.Basket.objects.create( + name="Twenty", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages[:20]) + self._compare(basket) + + def test_mixed_packages_and_meta(self): + basket = models.Basket.objects.create( + name="Mixed", account=self.user, active=True, + ) + basket.packages.add(self.pkg_simple_choice, self.pkg_fte_eur) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._compare(basket) + + def test_full_basket(self): + basket = models.Basket.objects.create( + name="Full", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._compare(basket) + + +# --------------------------------------------------------------------------- +# Model-level: get_best_bandings_for_form +# --------------------------------------------------------------------------- + + +class TestFastGetBestBandingsForForm(BasketFixtureMixin, TestCase): + """ + Verify fast_get_best_bandings_for_form returns the same set of + BandingType objects as the original. + """ + + def _compare(self, basket): + identifier = self.user + identifier_type = "user" + country = self.user.profile.default_currency + + original = basket.get_best_bandings_for_form( + identifier, identifier_type, + ) + fast = basket.fast_get_best_bandings_for_form( + identifier, identifier_type, country=country, + ) + self.assertEqual(original, fast) + + def test_single_package(self): + basket = models.Basket.objects.create( + name="Single", account=self.user, active=True, + ) + basket.packages.add(self.pkg_simple_choice) + self._compare(basket) + + def test_multiple_packages(self): + basket = models.Basket.objects.create( + name="Multi", account=self.user, active=True, + ) + basket.packages.add( + self.pkg_all_combos, self.pkg_simple_fte, self.pkg_simple_choice, + ) + self._compare(basket) + + def test_meta_packages(self): + basket = models.Basket.objects.create( + name="Meta", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._compare(basket) + + def test_full_basket(self): + basket = models.Basket.objects.create( + name="Full", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._compare(basket) + + def test_cross_currency_package(self): + """pkg_choice_usd is USD-priced; user prefers GBP -> fallback.""" + basket = models.Basket.objects.create( + name="Cross", account=self.user, active=True, + ) + basket.packages.add(self.pkg_choice_usd) + self._compare(basket) + + def test_multi_banding_basket(self): + basket = models.Basket.objects.create( + name="Multi-band", account=self.user, active=True, + ) + basket.packages.add( + self.pkg_all_combos, self.pkg_dual_multi, self.pkg_dual_gbp, + ) + self._compare(basket) + + +# --------------------------------------------------------------------------- +# Util-level: get_price_for_package +# --------------------------------------------------------------------------- + + +class TestFastGetPriceForPackage(BasketFixtureMixin, TestCase): + """ + Verify fast_get_price_for_package returns the same price/banding + as the original for each package. + """ + + def _compare(self, package, country=None): + identifier = self.user + identifier_type = "user" + if country is None: + country = self.user.profile.default_currency + + orig_price, orig_banding = utils.get_price_for_package( + package=package, identifier=identifier, + identifier_type=identifier_type, country=country, + ) + + if "fast_price_bandings" in package.__dict__: + del package.__dict__["fast_price_bandings"] + + account_banding_choices = { + abc.banding_type_id: abc + for abc in AccountBandingChoices.objects.filter( + account=identifier, + ).select_related("banding_type_vocab") + } + + fast_price, fast_banding = utils.fast_get_price_for_package( + package=package, identifier=identifier, + identifier_type=identifier_type, country=country, + account_banding_choices=account_banding_choices, + ) + + if orig_price == 0: + self.assertEqual(fast_price, 0) + else: + self.assertEqual(orig_price.pk, fast_price.pk) + self.assertEqual(orig_price.value, fast_price.value) + + if orig_banding is None: + self.assertIsNone(fast_banding) + else: + self.assertEqual(orig_banding.pk, fast_banding.pk) + + def test_fte_matching_currency(self): + """FTE/GBP, user currency is GBP.""" + self._compare(self.pkg_simple_fte) + + def test_fte_different_currency(self): + """FTE/EUR, user currency is GBP -> fallback.""" + self._compare(self.pkg_fte_eur) + + def test_choice_package(self): + """Choice/GBP.""" + self._compare(self.pkg_simple_choice) + + def test_all_combos_package(self): + """FTE+Choice / GBP+USD+EUR — most complex.""" + self._compare(self.pkg_all_combos) + + def test_dual_multi_currency(self): + """FTE+Choice / GBP+USD.""" + self._compare(self.pkg_dual_multi) + + def test_choice_usd_with_gbp_user(self): + """Choice/USD, user is GBP -> fallback.""" + self._compare(self.pkg_choice_usd) + + def test_eur_country_override(self): + """Force EUR country for a GBP+EUR package.""" + self._compare(self.pkg_fte_gbp_eur, country=self.country_eur) + + def test_usd_country_override(self): + """Force USD country for an all-currency package.""" + self._compare(self.pkg_all_combos, country=self.country_usd) + + +# --------------------------------------------------------------------------- +# Util-level: get_user_currency +# --------------------------------------------------------------------------- + + +class TestFastGetUserCurrency(BasketFixtureMixin, TestCase): + """Verify fast_get_user_currency matches get_user_currency.""" + + def test_authenticated_user(self): + orig = utils.get_user_currency(self.user, "user") + fast = utils.fast_get_user_currency( + self.user, "user", country=self.user.profile.default_currency, + ) + self.assertEqual(orig, fast) + + def test_session_user(self): + session = {"currency": self.country_usd.pk} + orig = utils.get_user_currency(session, "session") + fast = utils.fast_get_user_currency(session, "session") + self.assertEqual(orig, fast) + + def test_pre_resolved_bypasses_lookup(self): + """When country is passed, it should be returned as-is.""" + result = utils.fast_get_user_currency( + None, "user", country=self.country_gbp, + ) + self.assertEqual(result, self.country_gbp) + + +# --------------------------------------------------------------------------- +# View-level: compare full template contexts +# --------------------------------------------------------------------------- + + +class _ViewComparisonMixin: + """ + Shared logic for comparing view_basket vs fast_view_basket contexts. + Patches ``render`` to capture the template context dict. + """ + + def _extract_context(self, view_func, request, basket_id): + captured = {} + + import package.views as pv + original_render = pv.render + + def mock_render(req, template, context): + captured.update(context) + return original_render(req, template, context) + + pv.render = mock_render + try: + view_func(request, basket_id=basket_id) + finally: + pv.render = original_render + + return captured + + def _compare_contexts(self, orig_ctx, fast_ctx): + # ---- package_costs ---- + orig_costs = orig_ctx["package_costs"] + fast_costs = fast_ctx["package_costs"] + self.assertEqual( + len(orig_costs), len(fast_costs), + "package_costs length differs", + ) + for i, (o, f) in enumerate(zip(orig_costs, fast_costs)): + self.assertEqual( + o["package"].pk, f["package"].pk, + "package_costs[{}].package differs".format(i), + ) + if o["cost"] == 0: + self.assertEqual(f["cost"], 0) + else: + self.assertEqual( + o["cost"].pk, f["cost"].pk, + "package_costs[{}].cost PK differs".format(i), + ) + if o["banding"] is None: + self.assertIsNone(f["banding"]) + else: + self.assertEqual( + o["banding"].pk, f["banding"].pk, + "package_costs[{}].banding PK differs".format(i), + ) + + # ---- currency_totals ---- + self.assertEqual( + orig_ctx["currency_totals"], fast_ctx["currency_totals"], + ) + + # ---- conflicting_packages ---- + orig_pks = {p.pk for p in orig_ctx["conflicting_packages"]} + fast_pks = {p.pk for p in fast_ctx["conflicting_packages"]} + self.assertEqual(orig_pks, fast_pks) + + # ---- scalar context values ---- + for key in ( + "has_all_prices", + "message", + "site_percentage", + "currency_converted", + "converted_total", + "converted_currency", + ): + self.assertEqual( + orig_ctx.get(key), fast_ctx.get(key), + "Context key '{}' differs".format(key), + ) + + # ---- user_currency ---- + self.assertEqual( + orig_ctx["user_currency"], fast_ctx["user_currency"], + ) + + # ---- bandings list ---- + orig_banding_pks = [b.pk for b in orig_ctx["bandings"]] + fast_banding_pks = [b.pk for b in fast_ctx["bandings"]] + self.assertEqual(orig_banding_pks, fast_banding_pks) + + +class TestViewBasketComparison( + BasketFixtureMixin, _ViewComparisonMixin, TestCase +): + """ + End-to-end comparison for an authenticated user: call both + view_basket and fast_view_basket and verify contexts match. + """ + + def setUp(self): + self.factory = RequestFactory() + + def _make_request(self): + request = self.factory.get("/fake/") + request.user = self.user + request.session = {"country": self.country_gbp.code} + request.site = self.site_setup + request.signups = [] + return request + + def _run_comparison(self, basket): + orig_ctx = self._extract_context( + views.view_basket, self._make_request(), basket.pk, + ) + fast_ctx = self._extract_context( + views.fast_view_basket, self._make_request(), basket.pk, + ) + self._compare_contexts(orig_ctx, fast_ctx) + + def test_single_package(self): + basket = models.Basket.objects.create( + name="Single", account=self.user, active=True, + ) + basket.packages.add(self.pkg_all_combos) + self._run_comparison(basket) + + def test_five_packages(self): + basket = models.Basket.objects.create( + name="Five", account=self.user, active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_meta_packages(self, mock_convert): + basket = models.Basket.objects.create( + name="Meta", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_mixed_packages_and_meta(self, mock_convert): + basket = models.Basket.objects.create( + name="Mixed", account=self.user, active=True, + ) + basket.packages.add(self.pkg_simple_choice) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_twenty_packages(self, mock_convert): + basket = models.Basket.objects.create( + name="Twenty", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages[:20]) + basket.meta_packages.add(*self.all_metas[:5]) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_full_basket(self, mock_convert): + """All 50 packages + all 10 metas.""" + basket = models.Basket.objects.create( + name="Full", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_cross_currency(self, mock_convert): + basket = models.Basket.objects.create( + name="Cross", account=self.user, active=True, + ) + basket.packages.add( + self.pkg_all_combos, self.pkg_choice_usd, self.pkg_fte_eur, + ) + self._run_comparison(basket) + + +# --------------------------------------------------------------------------- +# Session-based (anonymous) view comparison tests +# --------------------------------------------------------------------------- + + +class TestViewBasketSessionComparison( + BasketFixtureMixin, _ViewComparisonMixin, TestCase +): + """Same comparisons but for anonymous/session-based users.""" + + def setUp(self): + self.factory = RequestFactory() + self.session = SessionStore() + self.session["currency"] = self.country_gbp.pk + self.session["fte"] = 12000 + self.session.create() + + def _make_request(self): + request = self.factory.get("/fake/") + request.user = _AnonymousUser() + request.session = self.session + request.site = self.site_setup + request.signups = [] + return request + + def _run_comparison(self, basket): + orig_ctx = self._extract_context( + views.view_basket, self._make_request(), basket.pk, + ) + fast_ctx = self._extract_context( + views.fast_view_basket, self._make_request(), basket.pk, + ) + self._compare_contexts(orig_ctx, fast_ctx) + + def test_session_single(self): + basket = models.Basket.objects.create( + name="Sess single", session_id=self.session.session_key, + active=True, + ) + basket.packages.add(self.pkg_all_combos) + self._run_comparison(basket) + + def test_session_five(self): + basket = models.Basket.objects.create( + name="Sess five", session_id=self.session.session_key, + active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._run_comparison(basket) + + def test_session_meta(self): + basket = models.Basket.objects.create( + name="Sess meta", session_id=self.session.session_key, + active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_session_twenty(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess twenty", session_id=self.session.session_key, + active=True, + ) + basket.packages.add(*self.all_packages[:20]) + basket.meta_packages.add(*self.all_metas[:5]) + self._run_comparison(basket) + + @patch("package.currency.convert", return_value=1.25) + def test_session_full(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess full", session_id=self.session.session_key, + active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._run_comparison(basket) + + +# --------------------------------------------------------------------------- +# Rendered output comparison: actual HTTP responses from both views +# --------------------------------------------------------------------------- + + +class _TimingTableMixin: + """ + Collects per-test timing results and prints a summary table in + ``tearDownClass``. + """ + + _timing_results = None + _timing_title = "Timing Results" + + @classmethod + def _init_timing(cls): + cls._timing_results = [] + + @classmethod + def _print_timing_table(cls): + if not cls._timing_results: + return + + label_w = max(len(r[0]) for r in cls._timing_results) + label_w = max(label_w, len("Scenario")) + + rows = [] + for label, orig, fast in cls._timing_results: + speedup = orig / fast if fast > 0 else float("inf") + saved = orig - fast + rows.append((label, orig, fast, speedup, saved)) + + print("\n") + print(" {}".format(cls._timing_title)) + print(" {}".format("=" * (label_w + 52))) + print(" {:<{w}} {:>10} {:>10} {:>9} {:>9}".format( + "Scenario", "Original", "Fast", "Speedup", "Saved", + w=label_w, + )) + print(" {:<{w}} {:>10} {:>10} {:>9} {:>9}".format( + "-" * label_w, "-" * 10, "-" * 10, "-" * 9, "-" * 9, + w=label_w, + )) + for label, orig, fast, speedup, saved in rows: + print(" {:<{w}} {:>9.3f}s {:>9.3f}s {:>8.1f}x {:>8.3f}s".format( + label, orig, fast, speedup, saved, + w=label_w, + )) + print(" {:<{w}} {:>10} {:>10} {:>9} {:>9}".format( + "-" * label_w, "-" * 10, "-" * 10, "-" * 9, "-" * 9, + w=label_w, + )) + + total_orig = sum(r[1] for r in rows) + total_fast = sum(r[2] for r in rows) + total_speedup = total_orig / total_fast if total_fast > 0 else float("inf") + total_saved = total_orig - total_fast + print(" {:<{w}} {:>9.3f}s {:>9.3f}s {:>8.1f}x {:>8.3f}s".format( + "TOTAL", total_orig, total_fast, total_speedup, total_saved, + w=label_w, + )) + print() + + _csrf_re = re.compile( + r'(name="csrfmiddlewaretoken"\s+value=")[^"]*(")' + ) + + @classmethod + def _normalise(cls, html): + return cls._csrf_re.sub(r'\1CSRF_TOKEN\2', html) + + def _get_responses(self, basket): + orig_url = "/packages/baskets/{}/".format(basket.pk) + fast_url = "/packages/baskets/{}/fast/".format(basket.pk) + + t0 = time.perf_counter() + orig_resp = self.client.get(orig_url) + orig_time = time.perf_counter() - t0 + + t0 = time.perf_counter() + fast_resp = self.client.get(fast_url) + fast_time = time.perf_counter() - t0 + + self.assertEqual( + orig_resp.status_code, 200, + "Original view returned {}".format(orig_resp.status_code), + ) + self.assertEqual( + fast_resp.status_code, 200, + "Fast view returned {}".format(fast_resp.status_code), + ) + return orig_resp, fast_resp, orig_time, fast_time + + def _compare_html(self, basket, label=""): + orig_resp, fast_resp, orig_time, fast_time = self._get_responses( + basket, + ) + orig_html = self._normalise(orig_resp.content.decode("utf-8")) + fast_html = self._normalise(fast_resp.content.decode("utf-8")) + + display_label = label or basket.name + self.__class__._timing_results.append( + (display_label, orig_time, fast_time), + ) + + self.assertEqual( + orig_html, fast_html, + "Rendered HTML differs between view_basket and fast_view_basket", + ) + + +class TestRenderedOutputComparison( + BasketFixtureMixin, _TimingTableMixin, TestCase, +): + """ + End-to-end test that hits both /packages/baskets// and + /packages/baskets//fast/ via Django's test Client and compares + the rendered HTML output byte-for-byte (after normalising CSRF tokens). + """ + + _timing_title = "Authenticated User Timing" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._init_timing() + + @classmethod + def tearDownClass(cls): + cls._print_timing_table() + super().tearDownClass() + + def setUp(self): + self.client.login(username="testuser", password="testpass123") + session = self.client.session + session["country"] = self.country_gbp.code + session.save() + + def test_single_package(self): + basket = models.Basket.objects.create( + name="1 pkg", account=self.user, active=True, + ) + basket.packages.add(self.pkg_all_combos) + self._compare_html(basket, label="1 pkg (auth)") + + def test_five_packages(self): + basket = models.Basket.objects.create( + name="5 pkg", account=self.user, active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._compare_html(basket, label="5 pkgs GBP-only (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_ten_packages(self, mock_convert): + basket = models.Basket.objects.create( + name="10 pkg", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages[:10]) + self._compare_html(basket, label="10 pkgs (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_twenty_packages(self, mock_convert): + basket = models.Basket.objects.create( + name="20 pkg", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages[:20]) + basket.meta_packages.add(*self.all_metas[:5]) + self._compare_html(basket, label="20 pkgs + 5 metas (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_thirty_packages_with_metas(self, mock_convert): + basket = models.Basket.objects.create( + name="30 pkg", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages[:30]) + basket.meta_packages.add(*self.all_metas[:7]) + self._compare_html(basket, label="30 pkgs + 7 metas (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_full_basket(self, mock_convert): + """All 50 packages + all 10 metas.""" + basket = models.Basket.objects.create( + name="Full", account=self.user, active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._compare_html(basket, label="50 pkgs + 10 metas (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_meta_only(self, mock_convert): + basket = models.Basket.objects.create( + name="Meta only", account=self.user, active=True, + ) + basket.meta_packages.add(self.meta_18, self.meta_15) + self._compare_html(basket, label="2 metas / 33 pkgs (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_cross_currency(self, mock_convert): + basket = models.Basket.objects.create( + name="Cross", account=self.user, active=True, + ) + basket.packages.add( + self.pkg_all_combos, self.pkg_choice_usd, self.pkg_fte_eur, + ) + self._compare_html(basket, label="3 pkgs cross-currency (auth)") + + def test_choice_only(self): + basket = models.Basket.objects.create( + name="Choice", account=self.user, active=True, + ) + basket.packages.add(self.pkg_simple_choice) + self._compare_html(basket, label="1 choice pkg (auth)") + + @patch("package.currency.convert", return_value=1.25) + def test_all_metas_no_direct(self, mock_convert): + """All 10 meta packages, no direct packages.""" + basket = models.Basket.objects.create( + name="All metas", account=self.user, active=True, + ) + basket.meta_packages.add(*self.all_metas) + self._compare_html(basket, label="10 metas / no direct (auth)") + + +class TestRenderedOutputSessionComparison( + BasketFixtureMixin, _TimingTableMixin, TestCase, +): + """Same rendered-output comparison for anonymous/session-based users.""" + + _timing_title = "Anonymous/Session User Timing" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._init_timing() + + @classmethod + def tearDownClass(cls): + cls._print_timing_table() + super().tearDownClass() + + def setUp(self): + session = self.client.session + session["country"] = self.country_gbp.code + session["currency"] = self.country_gbp.pk + session["fte"] = 12000 + session.save() + + def _get_session_key(self): + return self.client.session.session_key + + def test_session_single(self): + basket = models.Basket.objects.create( + name="Sess 1", session_id=self._get_session_key(), active=True, + ) + basket.packages.add(self.pkg_all_combos) + self._compare_html(basket, label="1 pkg (anon)") + + def test_session_five(self): + basket = models.Basket.objects.create( + name="Sess 5", session_id=self._get_session_key(), active=True, + ) + basket.packages.add(*self.gbp_only_packages[:5]) + self._compare_html(basket, label="5 pkgs (anon)") + + @patch("package.currency.convert", return_value=1.25) + def test_session_twenty(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess 20", session_id=self._get_session_key(), active=True, + ) + basket.packages.add(*self.all_packages[:20]) + basket.meta_packages.add(*self.all_metas[:5]) + self._compare_html(basket, label="20 pkgs + 5 metas (anon)") + + @patch("package.currency.convert", return_value=1.25) + def test_session_thirty(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess 30", session_id=self._get_session_key(), active=True, + ) + basket.packages.add(*self.all_packages[:30]) + basket.meta_packages.add(*self.all_metas[:7]) + self._compare_html(basket, label="30 pkgs + 7 metas (anon)") + + @patch("package.currency.convert", return_value=1.25) + def test_session_full(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess full", session_id=self._get_session_key(), active=True, + ) + basket.packages.add(*self.all_packages) + basket.meta_packages.add(*self.all_metas) + self._compare_html(basket, label="50 pkgs + 10 metas (anon)") + + @patch("package.currency.convert", return_value=1.25) + def test_session_all_metas(self, mock_convert): + basket = models.Basket.objects.create( + name="Sess metas", session_id=self._get_session_key(), active=True, + ) + basket.meta_packages.add(*self.all_metas) + self._compare_html(basket, label="10 metas / no direct (anon)") diff --git a/src/package/urls.py b/src/package/urls.py index 2079aa3..2d307b4 100644 --- a/src/package/urls.py +++ b/src/package/urls.py @@ -8,6 +8,7 @@ path('/info/', views.package_info, name='package_info'), path('baskets/', views.view_baskets, name='basket_list'), path('baskets//', views.view_basket, name='basket_detail'), + path('baskets//fast/', views.fast_view_basket, name='fast_basket_detail'), path('baskets//remove//', views.remove_from_basket, name='basket_remove_from_basket', diff --git a/src/package/utils.py b/src/package/utils.py index 3eb089a..8ac40c8 100644 --- a/src/package/utils.py +++ b/src/package/utils.py @@ -186,41 +186,63 @@ def get_price_for_package( return 0, None -def fetch_price(banding, country, explanation) -> tuple[str, "models.Price"]: +def fetch_price( + banding, country, explanation, price_cache=None, +) -> tuple[str, "models.Price"]: """ This function is used to fetch a price :param banding: the banding to fetch the price for :param country: the country to fetch the price for :param explanation: the explanation of the price calculation + :param price_cache: optional pre-fetched price lookup :return: a tuple of the explanation and the price """ explanation += "Trying to fetch {} for {}.\n".format(banding, country) - price = models.Price.objects.get( - banding=banding, - country=country, - ) + if price_cache is not None: + country_id = country.pk if country else None + price = price_cache.get((banding.pk, country_id)) + if price is None: + raise models.Price.DoesNotExist + else: + price = models.Price.objects.get( + banding=banding, + country=country, + ) return explanation, price -def use_default_pricing(banding, explanation) -> tuple[str, "models.Price"]: +def use_default_pricing( + banding, explanation, price_cache=None, +) -> tuple[str, "models.Price"]: """ This function is used to use the default pricing :param banding: the banding to use the default pricing for :param explanation: the explanation of the price calculation + :param price_cache: optional pre-fetched price lookup :return: a tuple of the explanation and the price """ explanation += "Trying to fetch {} for {} (default).\n".format( banding, banding.package.default_country ) - price = models.Price.objects.get( - banding=banding, - country=banding.package.default_country, - ) + if price_cache is not None: + default_country_id = ( + banding.package.default_country_id + if banding.package.default_country_id + else None + ) + price = price_cache.get((banding.pk, default_country_id)) + if price is None: + raise models.Price.DoesNotExist + else: + price = models.Price.objects.get( + banding=banding, + country=banding.package.default_country, + ) return explanation, price def fallback_to_default( - banding, bandings, explanation, fte, package + banding, bandings, explanation, fte, package, use_list=False, ) -> tuple["models.Banding", str]: """ This function is used to fall back to the default pricing @@ -229,6 +251,7 @@ def fallback_to_default( :param explanation: the explanation of the price calculation :param fte: the FTE to fall back to the default pricing for :param package: the package to fall back to the default pricing for + :param use_list: if True, bandings is a Python list, filter in-memory :return: a tuple of the banding and the explanation """ explanation += ( @@ -236,12 +259,17 @@ def fallback_to_default( "package because we couldn't find one in the user's " "preferred currency.\n" ) - banding = bandings.filter( - Q(vocab__upper_limit=None) | Q(vocab__upper_limit__gte=fte), - package=package, - banding_type=package.banding_type, - vocab__lower_limit__lte=fte, - ).first() + if use_list: + banding = _filter_bandings_by_fte( + bandings, package.pk, package.banding_type_id, fte + ) + else: + banding = bandings.filter( + Q(vocab__upper_limit=None) | Q(vocab__upper_limit__gte=fte), + package=package, + banding_type=package.banding_type, + vocab__lower_limit__lte=fte, + ).first() return banding, explanation @@ -277,7 +305,7 @@ def get_user( def get_band_filter( - band_filter, country, explanation, package + band_filter, country, explanation, package, bandings_cache=None, ) -> tuple[ "models.Banding", "models.QuerySet[models.Banding]", "models.Country", str ]: @@ -287,6 +315,7 @@ def get_band_filter( :param country: the country :param explanation: the explanation of the price calculation :param package: the package + :param bandings_cache: optional pre-fetched bandings lookup :return: a tuple of the band filter, country and explanation """ band_filter, explanation = test_country( @@ -294,18 +323,21 @@ def get_band_filter( ) if band_filter: bandings, explanation = handle_band_filter( - band_filter, explanation, package + band_filter, explanation, package, + bandings_cache=bandings_cache, ) else: # If we get here, we need to check for a catch-all price band_filter, bandings, country, explanation = check_for_catch_all( - band_filter, country, explanation, package + band_filter, country, explanation, package, + bandings_cache=bandings_cache, ) return band_filter, bandings, country, explanation def user_without_banding( - band_filter, banding, banding_choice, bandings, explanation, package + band_filter, banding, banding_choice, bandings, explanation, package, + use_list=False, ) -> tuple["models.Banding", str]: """ This function is used to handle a user without a banding @@ -315,14 +347,21 @@ def user_without_banding( :param bandings: the bandings :param explanation: the explanation of the price calculation :param package: the package + :param use_list: if True, bandings is a Python list, filter in-memory :return: a tuple of the banding and the explanation """ if banding_choice: - banding = bandings.get( - banding_type=band_filter.banding_type, - package=package, - vocab=banding_choice, - ) + if use_list: + banding = _find_banding_by_vocab( + bandings, band_filter.banding_type_id, + package.pk, banding_choice, + ) + else: + banding = bandings.get( + banding_type=band_filter.banding_type, + package=package, + vocab=banding_choice, + ) else: explanation += ( "The user has not set their banding for this " @@ -333,7 +372,7 @@ def user_without_banding( def check_default_currency_and_fte( - band_filter, bandings, explanation, fte, package + band_filter, bandings, explanation, fte, package, use_list=False, ) -> tuple["models.Banding", str]: """ This function is used to check the default currency and FTE @@ -342,23 +381,29 @@ def check_default_currency_and_fte( :param explanation: the explanation of the price calculation :param fte: the FTE :param package: the package + :param use_list: if True, bandings is a Python list, filter in-memory :return: a tuple of the banding and the explanation """ explanation += ( "We have found an FTE pricing in the customer's " "preferred currency.\n" ) - banding = bandings.filter( - Q(vocab__upper_limit=None) | Q(vocab__upper_limit__gte=fte), - package=package, - banding_type=band_filter.banding_type, - vocab__lower_limit__lte=fte, - ).first() + if use_list: + banding = _filter_bandings_by_fte( + bandings, package.pk, band_filter.banding_type_id, fte + ) + else: + banding = bandings.filter( + Q(vocab__upper_limit=None) | Q(vocab__upper_limit__gte=fte), + package=package, + banding_type=band_filter.banding_type, + vocab__lower_limit__lte=fte, + ).first() return banding, explanation def check_for_catch_all( - band_filter, country, explanation, package + band_filter, country, explanation, package, bandings_cache=None, ) -> tuple[ "models.Banding", "models.QuerySet[models.Banding]", "models.Country", str ]: @@ -368,6 +413,7 @@ def check_for_catch_all( :param country: the country :param explanation: the explanation of the price calculation :param package: the package + :param bandings_cache: optional pre-fetched bandings lookup :return: a tuple of the band filter, bandings, country and explanation """ if not band_filter: @@ -379,18 +425,29 @@ def check_for_catch_all( if band_filter: bandings, explanation = explain_catch_all_band_filter( - band_filter, explanation, package + band_filter, explanation, package, + bandings_cache=bandings_cache, + ) + else: + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, package.banding_type_id), [] + ) + else: + bandings = models.Banding.objects.filter( + package=package, + banding_type=package.banding_type, + ) + else: + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, package.banding_type_id), [] ) else: bandings = models.Banding.objects.filter( package=package, banding_type=package.banding_type, ) - else: - bandings = models.Banding.objects.filter( - package=package, - banding_type=package.banding_type, - ) return band_filter, bandings, country, explanation @@ -445,13 +502,14 @@ def find_user_in_database( def explain_catch_all_band_filter( - band_filter, explanation, package + band_filter, explanation, package, bandings_cache=None, ) -> tuple["models.Banding", str]: """ This function is used to explain a catch-all band filter :param band_filter: the band filter :param explanation: the explanation of the price calculation :param package: the package + :param bandings_cache: optional pre-fetched bandings lookup :return: a tuple of the banding and the explanation """ explanation += ( @@ -459,10 +517,15 @@ def explain_catch_all_band_filter( "can handle this: " "{}\n".format(band_filter) ) - bandings = models.Banding.objects.filter( - package=package, - banding_type=band_filter.banding_type, - ) + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, band_filter.banding_type_id), [] + ) + else: + bandings = models.Banding.objects.filter( + package=package, + banding_type=band_filter.banding_type, + ) return bandings, explanation @@ -493,23 +556,29 @@ def match_price_to_code( def handle_band_filter( - band_filter, explanation, package + band_filter, explanation, package, bandings_cache=None, ) -> tuple["models.Banding", str]: """ This function is used to handle a band filter :param band_filter: the band filter :param explanation: the explanation of the price calculation :param package: the package + :param bandings_cache: optional pre-fetched bandings lookup :return: a tuple of the banding and the explanation """ explanation += ( "We found a band filter that can handle this: " "{}\n".format(band_filter) ) - bandings = models.Banding.objects.filter( - package=package, - banding_type=band_filter.banding_type, - ) + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, band_filter.banding_type_id), [] + ) + else: + bandings = models.Banding.objects.filter( + package=package, + banding_type=band_filter.banding_type, + ) return bandings, explanation @@ -1354,3 +1423,368 @@ def add_pre_calc_to_meta_objects(country_code, packages): meta_package=package, ) return packages + + +# --------------------------------------------------------------------------- +# In-memory filtering helpers for pre-fetched banding lists. +# --------------------------------------------------------------------------- + + +def _filter_bandings_by_fte(bandings, package_id, banding_type_id, fte): + """Filter a pre-fetched bandings list by FTE range (mirrors queryset logic).""" + for b in bandings: + if b.package_id != package_id or b.banding_type_id != banding_type_id: + continue + if not b.vocab: + continue + if b.vocab.lower_limit is not None and b.vocab.lower_limit > fte: + continue + if ( + b.vocab.upper_limit is not None + and b.vocab.upper_limit < fte + ): + continue + return b + return None + + +def _find_banding_by_vocab(bandings, banding_type_id, package_id, vocab_pk): + """Find a single banding matching banding_type, package and vocab pk.""" + for b in bandings: + if ( + b.banding_type_id == banding_type_id + and b.package_id == package_id + and b.vocab_id == vocab_pk + ): + return b + raise models.Banding.DoesNotExist + + +# --------------------------------------------------------------------------- +# fast_ prefixed optimized versions of pricing / basket utility functions. +# These eliminate redundant DB lookups by accepting pre-resolved values. +# --------------------------------------------------------------------------- + + +def fast_get_user_currency( + identifier, identifier_type, country=None +) -> "models.Country": + """ + Optimized version of get_user_currency. + Returns pre-resolved country when provided; falls back to DB lookup. + """ + if country is not None: + return country + if identifier_type == "user": + user = account_models.User.objects.get(username=identifier) + return user.profile.default_currency + else: + country_pk = identifier.get("currency", None) + return models.Country.objects.filter(pk=country_pk).first() + + +def fast_convert_currency_totals( + request, identifier_type, identifier, totals, country=None +) -> ( + tuple[None, dict, None, None, None] + | tuple[str, dict, str, Decimal, Decimal] +): + """ + Optimized version of convert_currency_totals. + Accepts pre-resolved country to avoid redundant user lookup. + """ + if country is None: + if identifier_type == "user": + user = account_models.User.objects.get(username=identifier) + country = user.profile.default_currency + else: + country_pk = identifier.get("currency", None) + country = models.Country.objects.filter(pk=country_pk).first() + + from package import currency as convert_currency + + if country: + amounts = [] + for currency, value in totals.items(): + if currency == country.currency: + amounts.append(value) + else: + try: + converted_currency = convert_currency.convert( + currency_from=currency, + currency_to=country.currency, + value=value, + ) + amounts.append(converted_currency) + except ValueError: + country = models.Country.objects.get( + currency=request.site.fallback_currency, + ) + converted_currency = convert_currency.convert( + currency_from=currency, + currency_to=country.currency, + value=value, + ) + amounts.append(converted_currency) + + currency_conversion_total = Decimal(round(sum(amounts), 2)) + site_percentage, site_percentage_value = calculate_site_percentage( + request, {country.currency: currency_conversion_total} + ) + + return ( + site_percentage, + {country.currency: currency_conversion_total}, + country.currency, + currency_conversion_total, + site_percentage_value, + ) + return None, {}, None, None, None + + +def fast_find_user_in_database( + band_filter, explanation, identifier, package, + account_banding_choices=None, +) -> tuple["models.Banding", str, Decimal]: + """ + Optimized version of find_user_in_database. + Accepts pre-fetched account_banding_choices dict to avoid + per-package DB queries. + """ + explanation += "We are looking up a user from the database\n" + fte = identifier.profile.fte + + if account_banding_choices is not None: + bt_id = ( + band_filter.banding_type_id if band_filter + else package.banding_type_id + ) + banding_choice_obj = account_banding_choices.get(bt_id) + banding_choice = ( + banding_choice_obj.banding_type_vocab.pk + if banding_choice_obj else None + ) + else: + if band_filter: + banding_choice = account_models.AccountBandingChoices.objects.filter( + account=identifier, + banding_type=band_filter.banding_type, + ).first() + else: + banding_choice = account_models.AccountBandingChoices.objects.filter( + account=identifier, + banding_type=package.banding_type, + ).first() + if banding_choice: + banding_choice = banding_choice.banding_type_vocab.pk + + return banding_choice, explanation, fte + + +def fast_get_user( + band_filter, + banding_choice, + explanation, + fte, + identifier, + identifier_type, + package, + account_banding_choices=None, +) -> tuple[str, str, Decimal]: + """ + Optimized version of get_user. + Passes account_banding_choices through to avoid per-package queries. + """ + if identifier_type == "user": + banding_choice, explanation, fte = fast_find_user_in_database( + band_filter, explanation, identifier, package, + account_banding_choices=account_banding_choices, + ) + elif identifier_type == "session": + banding_choice, explanation, fte = find_user_from_session( + band_filter, explanation, identifier, package + ) + return banding_choice, explanation, fte + + +def fast_test_country( + band_filter, country, explanation, package +) -> tuple["models.Banding", str]: + """ + Optimized version of test_country. + Uses fast_price_bandings (cached_property, scoped queries). + """ + if country: + explanation += ( + "The user in question prefers the currency " + "{}\n".format(country) + ) + country_prices = package.fast_price_bandings + + for key, val in country_prices.items(): + for inner_key, inner_val in val.items(): + if inner_key == country: + band_filter = key.banding_type_entry + return band_filter, explanation + + +def fast_match_price_to_code( + band_filter, country, explanation, package +) -> tuple["models.Banding", "models.Country", str]: + """ + Optimized version of match_price_to_code. + Uses fast_price_bandings and fixes duplicate nested loop. + """ + explanation += "Attempting to find a catch-all price for {}\n".format( + country + ) + country_prices = package.fast_price_bandings + for key, val in country_prices.items(): + for inner_key, inner_val in val.items(): + if inner_key.catch_all: + if inner_key.currency == country.currency: + explanation += "Using {}\n".format(inner_key) + band_filter = key.banding_type_entry + country = inner_key + return band_filter, country, explanation + + +def fast_get_band_filter( + band_filter, country, explanation, package, + bandings_cache=None, +) -> tuple[ + "models.Banding", "models.QuerySet[models.Banding]", "models.Country", str +]: + """ + Optimized version of get_band_filter. + Uses fast_ variants that use fast_price_bandings. + """ + band_filter, explanation = fast_test_country( + band_filter, country, explanation, package + ) + if band_filter: + bandings, explanation = handle_band_filter( + band_filter, explanation, package, + bandings_cache=bandings_cache, + ) + else: + # Check for a catch-all price + if not band_filter: + if country: + band_filter, country, explanation = fast_match_price_to_code( + band_filter, country, explanation, package + ) + if band_filter: + bandings, explanation = explain_catch_all_band_filter( + band_filter, explanation, package, + bandings_cache=bandings_cache, + ) + else: + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, package.banding_type_id), [] + ) + else: + bandings = models.Banding.objects.filter( + package=package, + banding_type=package.banding_type, + ) + else: + if bandings_cache is not None: + bandings = bandings_cache.get( + (package.pk, package.banding_type_id), [] + ) + else: + bandings = models.Banding.objects.filter( + package=package, + banding_type=package.banding_type, + ) + return band_filter, bandings, country, explanation + + +def fast_get_price_for_package( + package, identifier, identifier_type, country=None, + account_banding_choices=None, + bandings_cache=None, price_cache=None, +) -> tuple[int, None] | tuple["models.Price", "models.Banding"]: + """ + Optimized version of get_price_for_package. + Uses fast_price_bandings (cached_property, scoped to package). + Accepts pre-fetched account_banding_choices dict. + Accepts pre-fetched bandings_cache and price_cache dicts. + Does not support explain mode (use original for debugging). + """ + band_filter = None + use_list = bandings_cache is not None + + band_filter, bandings, country, _ = fast_get_band_filter( + band_filter, country, "", package, + bandings_cache=bandings_cache, + ) + + banding, banding_choice = None, None + fte = None + + banding_choice, _, fte = fast_get_user( + band_filter, + banding_choice, + "", + fte, + identifier, + identifier_type, + package, + account_banding_choices=account_banding_choices, + ) + + if not fte: + return 0, None + + if band_filter and band_filter.banding_type.is_fte: + banding, _ = check_default_currency_and_fte( + band_filter, bandings, "", fte, package, + use_list=use_list, + ) + elif band_filter and not band_filter.banding_type.is_fte: + try: + banding, _ = user_without_banding( + band_filter, banding, banding_choice, bandings, "", package, + use_list=use_list, + ) + except (ValueError, models.Banding.DoesNotExist): + return 0, None + elif package.banding_type.is_fte: + banding, _ = fallback_to_default( + banding, bandings, "", fte, package, + use_list=use_list, + ) + elif banding_choice: + try: + if use_list: + banding = _find_banding_by_vocab( + bandings, package.banding_type_id, + package.pk, banding_choice, + ) + else: + banding = bandings.get( + banding_type=package.banding_type, + package=package, + vocab=banding_choice, + ) + except (ValueError, models.Banding.DoesNotExist): + return 0, None + + if banding: + try: + _, price = fetch_price( + banding, country, "", price_cache=price_cache, + ) + except models.Price.DoesNotExist: + try: + _, price = use_default_pricing( + banding, "", price_cache=price_cache, + ) + except models.Price.DoesNotExist: + return 0, None + return price, banding + else: + return 0, None diff --git a/src/package/views.py b/src/package/views.py index 6c56c9d..dcefc5a 100644 --- a/src/package/views.py +++ b/src/package/views.py @@ -790,6 +790,211 @@ def view_basket(request, basket_id) -> HttpResponse: ) +def fast_view_basket(request, basket_id) -> HttpResponse: + """ + Optimized version of view_basket. + - Resolves user/country once up front + - Prefetches M2M relations on the basket + - Uses fast_ model methods and utility functions + - Passes prefetched SiteText to FastFTEForm + """ + identifier = ( + request.user if request.user.is_authenticated else request.session + ) + identifier_type = "user" if request.user.is_authenticated else "session" + + # --- OPTIMIZATION: resolve country once --- + if identifier_type == "user": + country = request.user.profile.default_currency + else: + country_pk = request.session.get("currency", None) + country = ( + models.Country.objects.filter(pk=country_pk).first() + if country_pk + else None + ) + + # --- OPTIMIZATION: prefetch all CMS text objects once --- + final_prefetched = {o.key: o for o in cms_models.SiteText.objects.all()} + + ( + site_percentage, + currency_converted, + converted_total, + converted_currency, + currency_conversion_total, + site_percentage_value, + ) = (None, None, None, None, None, None) + + # --- OPTIMIZATION: prefetch M2M relations --- + basket_qs = models.Basket.objects.prefetch_related( + "packages", + "packages__bandingtypeentry_set__banding_type", + "meta_packages", + "meta_packages__packages", + ) + + if request.user.is_authenticated: + basket = get_object_or_404( + basket_qs, + pk=basket_id, + account=request.user, + active=True, + ) + else: + basket = get_object_or_404( + basket_qs, + pk=basket_id, + session_id=request.session.session_key, + active=True, + ) + + # --- OPTIMIZATION: fast_ method, pass pre-resolved country --- + banding_types = basket.fast_get_best_bandings_for_form( + identifier, identifier_type, country=country + ) + + # --- OPTIMIZATION: FastFTEForm with prefetched site_texts --- + fte_form = forms.FastFTEForm( + user_session=request.session, + user=request.user if request.user.is_authenticated else None, + banding_types=banding_types, + site_texts=final_prefetched, + ) + + message = utils.check_basket_for_disabled_signups(request, basket) + + if request.POST: + fte_form = forms.FastFTEForm( + request.POST, + user_session=request.session, + user=request.user if request.user.is_authenticated else None, + banding_types=banding_types, + site_texts=final_prefetched, + ) + if fte_form.is_valid(): + fte_form.save() + url = "{}#form_start".format( + reverse( + "fast_basket_detail", + kwargs={"basket_id": basket_id}, + ) + ) + return redirect(url) + + # --- OPTIMIZATION: fast_cost, pass pre-resolved country --- + package_costs, currency_totals = basket.fast_cost( + identifier=identifier, + identifier_type=identifier_type, + country=country, + ) + + # --- OPTIMIZATION: fast_get_user_currency, no DB hit --- + user_currency = utils.fast_get_user_currency( + identifier, identifier_type, country=country + ) + + banding_list = [] + for package in basket.packages.all(): + for obj in package.bandingtypeentry_set.all().order_by( + "banding_type__name" + ): + banding_list.append(obj) + + all_prices_found = True + for price in package_costs: + if not price["banding"] or price["cost"] == 0: + all_prices_found = False + break + + if all_prices_found: + if len(currency_totals) > 1: + # --- OPTIMIZATION: fast_convert, pass pre-resolved country --- + ( + site_percentage, + converted_total, + converted_currency, + currency_conversion_total, + site_percentage_value, + ) = utils.fast_convert_currency_totals( + request=request, + identifier_type=identifier_type, + identifier=identifier, + totals=currency_totals, + country=country, + ) + currency_converted = True + else: + ( + site_percentage, + site_percentage_value, + ) = utils.calculate_site_percentage( + request, + currency_totals, + ) + + # User clicks the proceed button + if "complete" in request.POST: + if ( + not request.site.enable_signup + or not request.site.enable_meta_package_signup + or not request.site.enable_individual_package_signup + ): + if message: + messages.add_message(request, messages.ERROR, message) + return redirect( + reverse( + "fast_basket_detail", + kwargs={"basket_id": basket.pk}, + ) + ) + + order = models.Order.objects.create( + associated_user=( + request.user if request.user.is_authenticated else None + ), + session_id=request.session.session_key, + basket=basket, + valid_period="{0} to {1}".format( + timezone.now().year, timezone.now().year + 1 + ), + order_date=timezone.now(), + converted_currency=converted_currency, + converted_value=currency_conversion_total, + platform_fee=site_percentage_value, + ) + return redirect( + reverse( + "start_checkout", + kwargs={"order_id": order.pk}, + ) + ) + + template = "package/view_basket.html" + context = { + "basket": basket, + "fte_form": fte_form, + "package_costs": package_costs, + "currency_totals": currency_totals, + # --- OPTIMIZATION: fast_ version uses prefetched M2M --- + "conflicting_packages": basket.fast_list_of_conflicting_packages(), + "bandings": banding_list, + "has_all_prices": all_prices_found, + "message": message, + "site_percentage": site_percentage, + "currency_converted": currency_converted, + "converted_total": converted_total, + "converted_currency": converted_currency, + "user_currency": user_currency, + "prefetched": final_prefetched, + } + return render( + request, + template, + context, + ) + + def manage_basket( request, package_id=None, meta_package_id=None ) -> HttpResponse: diff --git a/src/test_migrations/__init__.py b/src/test_migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/test_migrations/fluid_permissions/0001_initial.py b/src/test_migrations/fluid_permissions/0001_initial.py new file mode 100644 index 0000000..8eed058 --- /dev/null +++ b/src/test_migrations/fluid_permissions/0001_initial.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='ViewGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('view_name', models.CharField(max_length=255)), + ('groups', models.ManyToManyField(blank=True, to='auth.Group')), + ], + ), + ] diff --git a/src/test_migrations/fluid_permissions/__init__.py b/src/test_migrations/fluid_permissions/__init__.py new file mode 100644 index 0000000..e69de29