├── .bowerrc ├── .coveragerc ├── .gitignore ├── .tx └── config ├── README.md ├── babel.config ├── bower.json ├── cli ├── __init__.py ├── debug.py ├── odi │ ├── __init__.py │ ├── actions │ │ ├── __init__.py │ │ ├── populate.py │ │ └── prepare.py │ ├── commands.py │ └── services │ │ ├── __init__.py │ │ ├── config.py │ │ └── data.py └── setup.py ├── config_default.py ├── config_deploy.py ├── config_instance.example.py ├── content ├── belgium.md ├── bulgaria.md ├── burkina-faso.md ├── chile.md ├── china.md ├── czech-republic.md ├── data │ ├── datasets.csv │ ├── entries.csv │ ├── geo.json │ ├── places.csv │ ├── questions.csv │ └── summary.csv ├── denmark.md ├── egypt.md ├── extra │ └── CNAME ├── germany.md ├── israel.md ├── italy.md ├── kenya.md ├── malaysia.md ├── moldova.md ├── nepal.md ├── new-zealand.md ├── nigeria.md ├── oman.md ├── pages │ ├── about.md │ ├── chart.md │ ├── download.md │ ├── faq.md │ ├── home.md │ ├── insights.md │ ├── methodology.md │ ├── press │ │ ├── 2014 │ │ │ ├── danish.md │ │ │ ├── english.md │ │ │ ├── french.md │ │ │ ├── german.md │ │ │ ├── japanese.md │ │ │ ├── madarin.md │ │ │ ├── portuguese.md │ │ │ └── spanish.md │ │ └── index.md │ └── vis │ │ ├── embed │ │ └── map.md │ │ ├── index.md │ │ └── permalink │ │ └── map.md ├── paraguay.md └── rwanda.md ├── develop_server.sh ├── fabfile.py ├── plugins ├── datastore │ ├── __init__.py │ └── datastore.py ├── datastore_api │ ├── __init__.py │ └── datastore_api.py ├── datastore_assets │ ├── __init__.py │ └── datastore_assets.py └── i18n_subsites │ ├── README.rst │ ├── __init__.py │ ├── _regenerate_context_helpers.py │ ├── i18n_subsites.py │ ├── implementing_language_buttons.rst │ └── localizing_using_jinja2.rst ├── requirements.txt ├── scripts └── less.js ├── tests ├── __init__.py └── component │ └── test_filters.py ├── themes └── odi │ ├── static │ ├── css │ │ ├── _sexytables.css │ │ ├── map.css │ │ ├── ok_panel.css │ │ ├── site.css │ │ └── site.css.map │ ├── files │ │ └── 2014 │ │ │ └── GlobalOpenDataIndex2014_KeyThemesBriefing.pdf │ ├── images │ │ ├── favicon.ico │ │ ├── icon-tile.png │ │ ├── icon-tile_2x.png │ │ ├── logo-black.png │ │ ├── logo-embed.png │ │ ├── logo-full-black.png │ │ ├── logo-full-black_2x.png │ │ ├── logo.png │ │ ├── logo2.png │ │ ├── map-bg.png │ │ ├── map-bg_2x.png │ │ ├── map-infog-1100.png │ │ ├── map-infog-600.png │ │ ├── map-infog-800.png │ │ ├── okfn.png │ │ ├── pie-10.png │ │ ├── pie-10_2x.png │ │ ├── press │ │ │ ├── 2014 │ │ │ │ ├── OpenDataIceberg-400.png │ │ │ │ ├── OpenDataIceberg-600.png │ │ │ │ ├── OpenDataIceberg-800.png │ │ │ │ ├── OpenDataIceberg-mandarin.png │ │ │ │ ├── OpenKnowledge_CMYK.jpg │ │ │ │ ├── OpenKnowledge_RGB.png │ │ │ │ ├── details.jpg │ │ │ │ ├── map.jpg │ │ │ │ ├── places.jpg │ │ │ │ ├── spending-400.png │ │ │ │ ├── spending-600.png │ │ │ │ ├── spending-800.png │ │ │ │ ├── spending-print-300dpi.png │ │ │ │ └── spending-print.pdf │ │ │ └── 2015 │ │ │ │ ├── map-infog-1100.png │ │ │ │ ├── map-infog-600.png │ │ │ │ ├── map-infog-800.png │ │ │ │ ├── odi-1000.png │ │ │ │ ├── odi-400.png │ │ │ │ ├── odi-600.png │ │ │ │ └── odi-800.png │ │ └── stories │ │ │ └── 2014 │ │ │ ├── belgium.png │ │ │ ├── bulgaria.jpg │ │ │ ├── burkina-faso.png │ │ │ ├── chile.jpg │ │ │ ├── china.jpg │ │ │ ├── czech-republic.jpg │ │ │ ├── denmark.jpg │ │ │ ├── egypt.jpg │ │ │ ├── germany.jpg │ │ │ ├── israel.jpg │ │ │ ├── italy.jpg │ │ │ ├── kenya.png │ │ │ ├── kenya_1.jpg │ │ │ ├── kenya_10.jpg │ │ │ ├── kenya_11.jpg │ │ │ ├── kenya_2.jpg │ │ │ ├── kenya_3.jpg │ │ │ ├── kenya_4.jpg │ │ │ ├── kenya_5.jpg │ │ │ ├── kenya_6.jpg │ │ │ ├── kenya_7.jpg │ │ │ ├── kenya_8.jpg │ │ │ ├── kenya_9.jpg │ │ │ ├── malaysia.jpg │ │ │ ├── moldova.jpg │ │ │ ├── nepal.jpg │ │ │ ├── new-zealand.jpg │ │ │ ├── nigeria.png │ │ │ ├── oman.png │ │ │ ├── paraguay.png │ │ │ └── rwanda.png │ ├── less │ │ ├── _sexytables.less │ │ ├── map.less │ │ └── site.less │ ├── scripts │ │ ├── map.js │ │ ├── map │ │ │ ├── data.js │ │ │ ├── main.js │ │ │ └── ui.js │ │ ├── require.js │ │ ├── site.js │ │ └── site │ │ │ ├── main.js │ │ │ ├── place.js │ │ │ ├── table.js │ │ │ └── ui.js │ └── vendor │ │ ├── L.Control.ZoomMin.css │ │ ├── L.Control.ZoomMin.js │ │ ├── bootstrap │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ └── glyphicons-halflings-regular.woff │ │ ├── js │ │ │ └── bootstrap.min.js │ │ └── less │ │ │ ├── .csscomb.json │ │ │ ├── .csslintrc │ │ │ ├── alerts.less │ │ │ ├── badges.less │ │ │ ├── bootstrap.less │ │ │ ├── breadcrumbs.less │ │ │ ├── button-groups.less │ │ │ ├── buttons.less │ │ │ ├── carousel.less │ │ │ ├── close.less │ │ │ ├── code.less │ │ │ ├── component-animations.less │ │ │ ├── dropdowns.less │ │ │ ├── forms.less │ │ │ ├── glyphicons.less │ │ │ ├── grid.less │ │ │ ├── input-groups.less │ │ │ ├── jumbotron.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── media.less │ │ │ ├── mixins.less │ │ │ ├── mixins │ │ │ ├── alerts.less │ │ │ ├── background-variant.less │ │ │ ├── border-radius.less │ │ │ ├── buttons.less │ │ │ ├── center-block.less │ │ │ ├── clearfix.less │ │ │ ├── forms.less │ │ │ ├── gradients.less │ │ │ ├── grid-framework.less │ │ │ ├── grid.less │ │ │ ├── hide-text.less │ │ │ ├── image.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── nav-divider.less │ │ │ ├── nav-vertical-align.less │ │ │ ├── opacity.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── progress-bar.less │ │ │ ├── reset-filter.less │ │ │ ├── resize.less │ │ │ ├── responsive-visibility.less │ │ │ ├── size.less │ │ │ ├── tab-focus.less │ │ │ ├── table-row.less │ │ │ ├── text-emphasis.less │ │ │ ├── text-overflow.less │ │ │ └── vendor-prefixes.less │ │ │ ├── modals.less │ │ │ ├── navbar.less │ │ │ ├── navs.less │ │ │ ├── normalize.less │ │ │ ├── pager.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── popovers.less │ │ │ ├── print.less │ │ │ ├── progress-bars.less │ │ │ ├── responsive-embed.less │ │ │ ├── responsive-utilities.less │ │ │ ├── scaffolding.less │ │ │ ├── tables.less │ │ │ ├── theme.less │ │ │ ├── thumbnails.less │ │ │ ├── tooltip.less │ │ │ ├── type.less │ │ │ ├── utilities.less │ │ │ ├── variables.less │ │ │ └── wells.less │ │ ├── chroma.min.js │ │ ├── domReady.js │ │ ├── font-awesome │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ │ └── less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── extras.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── spinning.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ ├── html5shiv.min.js │ │ ├── jquery.kinetic.min.js │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ ├── jquery.sticky-kit.min.js │ │ ├── jquery.tablesorter.min.js │ │ ├── lato │ │ ├── .gitignore │ │ ├── font │ │ │ ├── lato-black.eot │ │ │ ├── lato-black.svg │ │ │ ├── lato-black.ttf │ │ │ ├── lato-black.woff │ │ │ ├── lato-blackitalic.eot │ │ │ ├── lato-blackitalic.svg │ │ │ ├── lato-blackitalic.ttf │ │ │ ├── lato-blackitalic.woff │ │ │ ├── lato-bold.eot │ │ │ ├── lato-bold.svg │ │ │ ├── lato-bold.ttf │ │ │ ├── lato-bold.woff │ │ │ ├── lato-bolditalic.eot │ │ │ ├── lato-bolditalic.svg │ │ │ ├── lato-bolditalic.ttf │ │ │ ├── lato-bolditalic.woff │ │ │ ├── lato-hairline.eot │ │ │ ├── lato-hairline.svg │ │ │ ├── lato-hairline.ttf │ │ │ ├── lato-hairline.woff │ │ │ ├── lato-hairlineitalic.eot │ │ │ ├── lato-hairlineitalic.svg │ │ │ ├── lato-hairlineitalic.ttf │ │ │ ├── lato-hairlineitalic.woff │ │ │ ├── lato-italic.eot │ │ │ ├── lato-italic.svg │ │ │ ├── lato-italic.ttf │ │ │ ├── lato-italic.woff │ │ │ ├── lato-light.eot │ │ │ ├── lato-light.svg │ │ │ ├── lato-light.ttf │ │ │ ├── lato-light.woff │ │ │ ├── lato-lightitalic.eot │ │ │ ├── lato-lightitalic.svg │ │ │ ├── lato-lightitalic.ttf │ │ │ ├── lato-lightitalic.woff │ │ │ ├── lato-regular.eot │ │ │ ├── lato-regular.svg │ │ │ ├── lato-regular.ttf │ │ │ └── lato-regular.woff │ │ └── less │ │ │ ├── lato-black.less │ │ │ ├── lato-blackitalic.less │ │ │ ├── lato-bold.less │ │ │ ├── lato-bolditalic.less │ │ │ ├── lato-hairline.less │ │ │ ├── lato-hairlineitalic.less │ │ │ ├── lato-italic.less │ │ │ ├── lato-light.less │ │ │ ├── lato-lightitalic.less │ │ │ ├── lato-regular.less │ │ │ ├── lato.less │ │ │ └── variables.less │ │ ├── leaflet.css │ │ ├── leaflet.js │ │ ├── leaflet.label.css │ │ ├── leaflet.label.js │ │ ├── lodash.compat.min.js │ │ ├── marked.js │ │ ├── normalize.css │ │ ├── proj4.js │ │ ├── proj4leaflet.js │ │ ├── pubsub.js │ │ └── sexytables-1.0.min.js │ ├── templates │ ├── _analytics.html │ ├── _scope.html │ ├── article.html │ ├── base.html │ ├── categories.html │ ├── category.html │ ├── chart.html │ ├── content │ │ ├── footer_meta.md │ │ ├── historical_intro.md │ │ └── table_slice_place_help.md │ ├── dataset.html │ ├── datasets.html │ ├── dataviews │ │ ├── alt_general_stat.html │ │ ├── alt_summary.html │ │ ├── embed_map.html │ │ ├── summary.html │ │ ├── table_datasets.html │ │ ├── table_key.html │ │ ├── table_places.html │ │ ├── table_slice_dataset.html │ │ ├── table_slice_place.html │ │ └── table_tools.html │ ├── download.html │ ├── embed.html │ ├── empty.html │ ├── gallery.html │ ├── home.html │ ├── index.html │ ├── macros.html │ ├── map.embed.html │ ├── map.permalink.html │ ├── na.html │ ├── page.html │ ├── place.html │ ├── place_dataset.html │ └── places.html │ └── translations │ ├── en │ └── LC_MESSAGES │ │ ├── messages.mo │ │ └── messages.po │ ├── es │ └── LC_MESSAGES │ │ ├── messages.mo │ │ └── messages.po │ └── messages.pot └── utilities ├── __init__.py └── filters.py /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | omit = 3 | */tests* 4 | 5 | [report] 6 | exclude_lines = 7 | # Don't complain about missing debug-only code: 8 | def __repr__ 9 | if self\.debug 10 | 11 | # Don't complain if tests don't hit defensive assertion code: 12 | raise AssertionError 13 | raise NotImplementedError 14 | 15 | # Don't complain if non-runnable code isn't run: 16 | if 0: 17 | if False: 18 | if __name__ == .__main__.: 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.sublime-project 4 | *.sublime-workspace 5 | *.iml 6 | .idea 7 | *.pid 8 | cache/ 9 | output/ 10 | sandbox/* 11 | bower_components/* 12 | node_modules 13 | content/pages/places/* 14 | content/pages/datasets/* 15 | content/pages/place/* 16 | content/pages/dataset/* 17 | config_instance.py 18 | /cli/build 19 | /cli/dist 20 | /cli/*.egg-info 21 | # data processing stuff 22 | tmp/* 23 | venv 24 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [open-data-index.theme] 5 | file_filter = themes/odi/translations//LC_MESSAGES/messages.po 6 | source_file = themes/odi/translations/en/LC_MESSAGES/messages.po 7 | source_lang = en 8 | type = PO 9 | -------------------------------------------------------------------------------- /babel.config: -------------------------------------------------------------------------------- 1 | [jinja2: themes/**.html] 2 | [jinja2: themes/**.md] 3 | encoding = utf-8 4 | extensions=jinja2.ext.autoescape,jinja2.ext.with_ 5 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Open Data Index", 3 | "version": "0.1.0-alpha", 4 | "authors": [ 5 | "Open Knowledge" 6 | ], 7 | "license": "", 8 | "private": true, 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "js/vendor", 14 | "test", 15 | "tests" 16 | ], 17 | "dependencies": { 18 | "jquery": "1.11.1", 19 | "leaflet": "0.7.3", 20 | "chroma-js": "0.6.1", 21 | "pubsub-js": "1.5.0", 22 | "lodash": "2.4.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /cli/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/cli/__init__.py -------------------------------------------------------------------------------- /cli/debug.py: -------------------------------------------------------------------------------- 1 | from odi import cli 2 | 3 | 4 | cli() 5 | -------------------------------------------------------------------------------- /cli/odi/__init__.py: -------------------------------------------------------------------------------- 1 | from .commands import cli 2 | -------------------------------------------------------------------------------- /cli/odi/actions/__init__.py: -------------------------------------------------------------------------------- 1 | from . import populate, prepare 2 | -------------------------------------------------------------------------------- /cli/odi/services/__init__.py: -------------------------------------------------------------------------------- 1 | from . import config, data 2 | -------------------------------------------------------------------------------- /cli/odi/services/config.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | 5 | def get_config(key=None): 6 | """Return config module. 7 | 8 | If key is passed it returns value of key. 9 | """ 10 | base_path = os.path.join(os.getcwd()) 11 | sys.path.append(base_path) 12 | import config_default as config 13 | if key: 14 | config = getattr(config, key) 15 | sys.path.remove(base_path) 16 | return config 17 | -------------------------------------------------------------------------------- /cli/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | 4 | setup( 5 | name='odi', 6 | version='0.1.0', 7 | packages=find_packages(), 8 | include_package_data=True, 9 | install_requires=[ 10 | 'click', 11 | ], 12 | entry_points={ 13 | 'console_scripts': [ 14 | 'odi = odi:cli', 15 | 'opendataindex = odi:cli', 16 | ] 17 | }, 18 | ) 19 | -------------------------------------------------------------------------------- /config_deploy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- # 3 | from __future__ import unicode_literals 4 | import os 5 | import sys 6 | sys.path.append(os.curdir) 7 | from config_default import * 8 | 9 | 10 | RELATIVE_URLS = False 11 | SITEURL = 'http://index.okfn.org' 12 | DELETE_OUTPUT_DIRECTORY = True 13 | 14 | ODI['scheme'] = u'http://' 15 | ODI['domain'] = u'index.okfn.org' 16 | 17 | SITEURL = u'{0}{1}'.format(ODI['scheme'], ODI['domain']) 18 | -------------------------------------------------------------------------------- /config_instance.example.py: -------------------------------------------------------------------------------- 1 | # ODI = { 2 | # 'survey': { 3 | # 'name': u'Open Data Index Survey', 4 | # 'domain': u'http://global.census.okfn.org/', 5 | # 'submit_route': u'submit/' 6 | # }, 7 | # 'sponsor': { 8 | # 'name': u'Open Knowledge', 9 | # 'domain': u'https://okfn.org/', 10 | # }, 11 | # 'years': [u'2014', u'2013'], 12 | # 'current_year': u'2014', 13 | # 'na': u'n/a', 14 | # 'email': u'index@okfn.org', 15 | # 'description': u'The Open Data Index assesses the state of open government data around the world.', 16 | # 'twitter': '', 17 | # 'repo': u'https://github.com/okfn/opendataindex', 18 | # 'author': { 19 | # 'name': AUTHOR, 20 | # 'url': u'https://okfn.org/' 21 | # }, 22 | # 'googleanalytics': u'', 23 | # 'mailinglist': u'', 24 | # 'languages': LANGUAGES, 25 | # 'test_path': 'tests', 26 | # 'content_path': PATH, 27 | # 'output_path': OUTPUT_PATH, 28 | # 'trans_path': 'themes/odi/translations', 29 | # 'deploy_remote': 'upstream', 30 | # 'database': { 31 | # 'submissions': '', 32 | # 'entries': '', 33 | # 'questions': '', 34 | # 'datasets': '', 35 | # 'places': '' 36 | # }, 37 | # 'limited': { 38 | # 'places': ['au', 'gb'], 39 | # 'datasets': ['timetables', 'spending'] 40 | # } 41 | # } 42 | 43 | # I18N_SUBSITES = { 44 | # 'es': { 45 | # 'SITENAME': '' 46 | # } 47 | # } 48 | -------------------------------------------------------------------------------- /content/belgium.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Belgium 4 | date: 2014-12-01 10:00 5 | year: 2014 6 | slug: belgium 7 | category: Europe 8 | image: belgium.png 9 | author: Pieter-Jan Pauwels 10 | author_contact: 11 | author_bio: Pieter-Jan Pauwels is a Community Coordinator at Open Knowledge Belgium. He is also an organiser of open summer of code, and Open Belgium. Pieter works to translate open data efforts in Belgium into interesting projects, and is hoping to introduce the concept of open knowledge to a wider audience in Belgium through an interactive video platform. 12 | 13 | In early 2014, we used the Global Open Data Index to motivate open data experts, opinion leaders and government officials to gather for the very first edition of Open Belgium, as a part of the 'Data Days' conference in Ghent . This was a success, not only because it was an opportunity to openly discuss open data, but also act and publicise new datasets such as the company register (KBO) of the Department of Economy, and the transport data of TEC, the Walloon public transport company. 14 | 15 | Now almost a year later, we view the Global Open Data Index not just as a tool for leverage, but as a tool to support further open data publications in Belgium. It is also a way to encourage those who are opening up information in Government, and shows other departments on a federal level that opening up their data is part of a global movement. 16 | 17 | The Global Index did trigger a new mindset at Open Knowledge Belgium, and now we try to go beyond that by building a crowdsourced local data census, and using our learnings to create a regional index as well. This will hopefully provide us with an overview of where the open data comes from in Belgium, and which levels are engaged in the opening up of valuable information. In this way we can try to stimulate bottom up actions by cities and municipalities who want to show that they too believe in a more open Belgium. 18 | -------------------------------------------------------------------------------- /content/burkina-faso.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Burkina Faso 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: burkina-faso 7 | category: Africa 8 | image: burkina-faso.png 9 | author: T. Idriss Tinto 10 | author_contact: 11 | author_bio: Teg-wende Idriss TINTO is a software engineer who spend his free time to fight for freedom. He is deeply engaged in free software and "open everything" movements. He is a Mozilla rep, and a Open Knowledge Ambassador for Burkina Faso. 12 | 13 | [Translated from the [original French here](http://bf.okfn.org/2014/11/09/open-data-index-2014/)] 14 | 15 | This year, Open Knowledge initiated the Global Open Data Index 2014. This Index aims to measure the state of open data around the world through 10 key datasets: 16 | 17 | * Transport timetables 18 | * Government budget 19 | * Government spending 20 | * Election results 21 | * Company register 22 | * National map 23 | * National statistics 24 | * Postcodes/Zipcodes 25 | * Emissions of pollutants 26 | 27 | Open Knowledge and the Burkina Faso Burkina Open Data Initiative (BODI) have made submissions in the Global Open Data Index survey for Burkina Faso. 28 | 29 | Given the government's effort to modernise the administration, we note that most of the data sets are published by default. Each institution has a website and strives to publish its data on its website. However, the publication does not include ‘reuse’. Data are published in most cases in PDF or HTML, the target being the human user rather than being machine readable. 30 | 31 | In addition to the question around format, most of the published data has no associated license. In this case, the user downloads the data and is not explicitly allowed to reuse nor prohibited from reuse. The statistical law does not specify what the "public" has the right to do with the data that is published. Similarly, the law regulating services and electronic transactions in Burkina Faso, “Title V” (making available public information electronically) states that government must make available electronically to the public, without allowing for rights to reuse. All indications are that there is a tacit approval for any type of reuse but it is important that this right is enforceable, hence the need to explicitly specify that what the user has the right to do or not with the data it downloads. 32 | 33 | This identification of the state of open data around the world gives a common basis on which to compare countries. It also allows each country to see where it is important to take action. In Burkina’s case, we will see that there needs to be more focus on the format of the data and licenses on data in the publication of Global Open Data Index 2014. 34 | -------------------------------------------------------------------------------- /content/china.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: China 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: china 7 | category: Asia/Pacific 8 | image: china.jpg 9 | author: Feng Gao 10 | author_contact: 11 | author_bio: Feng Gao is an Ambassador for Open Knowledge China, and one of the co-founders of Open Data China, a network to bring different stakeholders into together to advance open data movement in China. Currently living in Shanghai, he is working with Fudan University to build a local partnership to unlock open data values. 12 | 13 | Last year, China was ranked at 34 out of 70 countries in the Global Open Data Index. Many of my friends in the open data community did feel quite surprised about this result, and I personally also think it was over-ranked. This year, China's ranking has already decreased to 50, mainly due to little progress since last year. 14 | 15 | China currently has neither set up a national open data portal, nor made any national policies on open data. At city level, however, several cities such as Shanghai, Beijing, QingDao have already started their own experimentation. We currently have a total of six so-called open data portals in China, but in fact none of them has an open license in place to ensure everyone has the legal right to freely use the data. 16 | 17 | Given the situation, the Open Data China community believes that the Open Data Index will be a useful tool for us. The Open Data Index breaks down the concept of open data into small criterias, and thus we can use it to show the government what they did right and what they did wrong in a very clear way. The ranking result also is a useful tool to put peer pressure on the government and push it to quickly adopt the open definition, and make some real progress in the next year. 18 | -------------------------------------------------------------------------------- /content/czech-republic.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Czech Republic 4 | date: 2014-12-01 10:31 5 | year: 2014 6 | slug: czech-republic 7 | category: Europe 8 | image: czech-republic.jpg 9 | author: Michaela Rybičková 10 | author_contact: 11 | author_bio: Michaela Rybičková works at The Otakar Motejl Fund, a Czech non-profit which promotes open data to transform government into a transparent service and provide citizens with fair access to information. Her main project is [NášStát.cz](http://www.nasstat.cz/en/), a platform for the Czech e-democracy community. She also coordinated the Czech edition of The Data Journalism Handbook. 12 | 13 | Participating in this year’s The Global Open Data Index was a great experience which enabled me to share experience with open data with experts from all around the world. I also had a chance to contribute to the 2013 edition and I’d say that the methodology of gathering and evaluating information improved. When deciding how to score the datasets to get most exact outcomes, we had a lots of discussion both within the Czech open data community and amongst the international team. 14 | 15 | As the results show us, the current state of open data in the Czech Republic is promising, but there is still a good deal of unfulfilled potential. While there are pioneering institutions (such as The Czech Statistical Office or The Czech Office for Surveying, Mapping and Cadastre), there is no solid conception on the national level. I think that the Index shows that we are on the right track, but still have a long road ahead of us. I hope that the Index can help us to advocate for better availability and quality of specific datasets as well as promote openness as a state of mind. 16 | 17 | I think that Open Data Index is a useful survey, because it shows the state of open data in global context, building on experience and insight of a vibrant international community. Furthermore, the Index serves as a useful benchmark and helps us to gather arguments for our advocacy efforts. I’d like to thank the Index team for cooperation and methodological advice. I’m also grateful to everyone who contributed to the Czech part of the Index: [Michal Kubáň](https://twitter.com/kubanster), my colleague from Otakar Motejl Fund, [Jan Kučera](http://nb.vse.cz/~xkucj30/homepage-en.html) and [Jindřich Mynarz](https://twitter.com/jindrichmynarz) from University of Economics in Prague, datajournalist [Jan Cibulka](https://twitter.com/jancibulka) and geodata specialist [Jáchym Čepický](https://twitter.com/jachymc). 18 | -------------------------------------------------------------------------------- /content/data/summary.csv: -------------------------------------------------------------------------------- 1 | id,title,value,value_2014,value_2013 2 | places_count,Number of Places,122,97,60 3 | entries_count,Number of Entries,1586,970,597 4 | isopen_count,Number of Open Datasets,156,124,97 5 | isopen_percent,Percent Open,9,12,16 6 | -------------------------------------------------------------------------------- /content/denmark.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Denmark 4 | date: 2014-12-01 10:02 5 | year: 2014 6 | slug: denmark 7 | category: Europe 8 | image: denmark.jpg 9 | author: Niels Erik Kaaber Rasmussen 10 | author_contact: 11 | author_bio: Niels Erik Kaaber Rasmussen has a background in Political and Computer Science and loves to find ways to combine the two fields. He is engaged in the activities of Open Knowledge Denmark. His primarily interest is in political data and he advocates for transparency, open data and open government. Among other things he has launched the Danish parliamentary monitoring site, hvemstemmerhvad.dk (direct translation - "who votes what"). 12 | 13 | I feel that the Global Open Data Index is a great way to get an overview of the open data situation in your own country. Some government agencies publish data in ways that do not live up to the standards recommended for open data, for example, they don't include a license (even though they attach an open license when asking for it they don't find it worthwhile to include it on their webpage), or they provide an advanced API but no options to a simple download in bulk. 14 | There have been multiple initiatives from government agencies in Denmark. The difficult task seems to be to turn data into knowledge and make good use of it. The wish for economic growth seems to be the number one driver for opening up data, meaning that transparency and civil society aspects are often forgotten. 15 | 16 | The Index will be a very important tool to push for more open data here, and also important in pushing for using that open data, eg. "we have a lot of open data, why don't we make use of it for x, y and z?". 17 | -------------------------------------------------------------------------------- /content/egypt.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Egypt 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: egypt 7 | category: Middle East 8 | image: egypt.jpg 9 | author: Tarek Amr 10 | author_contact: 11 | author_bio: Tarek is an Ambassador for Open Knowledge Egypt and works as a Computational Linguist. He completed his postgraduate studies in Knowledge Discovery and Data Mining in the UK. He is into Software Development, Open Data, and Open Access. Furthermore, he is a volunteer author in Global Voices Online, covering social and political events from the social media perspective. 12 | 13 | Last year I contributed to parts of the Index, but the majority of the work was done by Rayna. This year it was a much easier task, since there weren't many changes to the status of open data in Egypt. Nevertheless, I hope to see progress in the upcoming years as no progress is sometimes considered as regress when other countries are adopting openness more and more. In addition to checking whether last year’s datasets were still up, I also had to check whether they improved or newer datasets were added. 14 | 15 | I believe the Global Open Data Index is very important for various reasons. One the one hand, it shows where each country stands and pinpoints the leading countries so that others can study and learn from their experience. On the other hand, and on a micro scale, it shows how each governmental entity in each country progresses across time. The Index, represented on a graph, serves as an icebreaker when speaking with someone about the importance of government openness, especially with the correlation between developed and developing countries and their rank in the Index. 16 | 17 | P.S. One challenge is that sometimes variations of the scoring from one year to the other, and from one country to the other, can happen due to the different interpretation of the metrics for the different submitters. For sure, those will normally result in minor variations in the overall score, but those who use the Index for their analytics and advocacy work should take this into their consideration. 18 | -------------------------------------------------------------------------------- /content/extra/CNAME: -------------------------------------------------------------------------------- 1 | index.okfn.org 2 | -------------------------------------------------------------------------------- /content/germany.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Germany 4 | date: 2014-12-01 10:04 5 | year: 2014 6 | slug: germany 7 | category: Europe 8 | image: germany.jpg 9 | author: Maximilian Heimstädt 10 | author_contact: 11 | author_bio: Maximilian Heimstädt is a PhD student within the department for organisation theory at Free University Berlin where he researches the emergence and management of municipal open data ecosystems. He previously studied an M.Sc. in Management and Information Technology at the University of St Andrews, Scotland, and worked as a visiting researcher at the Open Data Institute in London. 12 | 13 | Working for the Global Open Data Index is a way to remove the idea of openness from abstraction and to see whether there is ‘real’ open data behind the political rhetoric. Doing research for the Open Data Index can be a challenging task: Some of the data is still buried deep down in some opaque websites. Sometimes it can also be challenging to identify the licensing scheme applied to a certain data set, as its either stored in a website’s bottom corner or simply missing. Finally, having all the relevant data in formats that allow for convenient and unrestricted reuse is still up there on our wish list. 14 | 15 | One of last year’s greatest achievements for open data in Germany was the publication of the new national licensing scheme by the Federal Ministry of the Interior. The so called “Data License Germany 2.0” is an update of the previous 1.0-version, but unlike its predecessor has been approved by the Open Definition Advisory Council. Although the German chapter of Open Knowledge still recommends the use of the universal Creative Commons licensing scheme it appreciates this development. However, whilst doing research for the Index it became clear that most of the datasets on our national open data portal, GovData.de, are still licensed under the former 1.0-version. We hope to encourage all German data holders to move towards the updated license. 16 | 17 | During the last year Open Knowledge Germany has launched civic technology labs in more than a dozen cities in Germany. These “OK Labs” are not just placed for open data and civic tech enthusiasts to meet - they are meant to be vehicles to lobby for more and better data on the local, state and federal levels. The results of the Open Data Index are an important tool for us and our labs to approach public administration and the government and to show them: “What you did so far is a good start, but let’s go on and improve together”. 18 | -------------------------------------------------------------------------------- /content/italy.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Italy 4 | date: 2014-12-01 10:05 5 | year: 2014 6 | slug: italy 7 | category: Europe 8 | image: italy.jpg 9 | author: Maurizio Napolitana 10 | author_contact: 11 | author_bio: Maurizio 'napo' Napolitano is coordinator of the Digital Commons Lab of FBK (Fondazione Bruno Kessler) in Trento, Italy. FBK is official node of the Open Data Institute. Napo is also closely involved with communities related to the topic of open knowledge, and is an Ambassador for Open Knowledge in Italy. Specifically, Napo is interested in the study of the processes of creation of collective knowledge with a focus on geographical information. 12 | 13 | I am glad to see that, for this edition of the Global Open Data Index, there are new names as the reviewers. In Italy international ranking is down a few places, but this is because we decided to be more strict on some datasets that have been issued but have not been updated. In particular, it is sought to assess who, from the administrative point of view, has the official task of dealing with that category of data. 14 | 15 | Unfortunately, progress is poor. In previous editions there was enthusiasm for some datasets released on the maps but with time this has not led to an incentive. Following the G8, Italy signed the Open Data Charter, and this has meant that the Agency for Digital Italy has worked to open some more key data sets. This is shown in the open data agenda. The document signaled the opening of the zipcodes later this year and other datasets of interest in the census. Probably, in the 2015 edition of the Index we will enter these. 16 | 17 | In terms of transit data, the situation is still not settled - there are many agencies that have opened the data, others have not. The demerit is that while many are distributing data to the Google Transit project, they still do not release the source for open data. 18 | 19 | The role of the Global Open Data Index is extremely important - the rankings always help to encourage us to do better the next time. Participating in the review process is also a great way to become aware of the situation in my own country. From my point of view it is a very important exercise, and if you find a good number of reviewers, it enables you to start a debate on the issue and thus helps us better understand our own country. It is for this reason that we should also invite and encourage everyone to take part in the review process of the city census for each country (eg. http://it-city.census.okfn.org/). 20 | -------------------------------------------------------------------------------- /content/moldova.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Moldova 4 | date: 2014-12-01 10:06 5 | year: 2014 6 | slug: moldova 7 | category: Europe 8 | image: moldova.jpg 9 | author: Victoria Vlad 10 | author_contact: 11 | author_bio: Victoria Vlad is working as an Economist for the Moldovan NGO and independent thinktank, EXPERT-GRUP. Victoria previously analyzed the education and health sectors and coordinated communications for BudgetStories.md, an open budgets and data visualization project. Currently, she is coordinating a national project in education, which aims to build social accountability for the education reforms in Moldova. 12 | 13 | Two years ago, in November 2012, at a OpenSpending Workshop on Budget Monitoring in Sarajevo, Bosnia and Herzegovina, I first learned about the Open Knowledge Foundation and its many innovative projects. Since then, I have been involved with Open Spending where I have worked with the platform to add some data for Moldova, and also visualized some of the datasets for BudgetStories.md and ScoalaMea.md. Last year, I had the chance to participate at the OKCon2013 with a speech at the OpenSpending and Finances panel. Also, last year, at the invitation of Christian Villum, I participated in completing the Open Data Census for the Republic of Moldova. 14 | 15 | The Open Data Index has several advantages: 16 | * It is easily accessible for everyone; 17 | * It is crowd-sourced, which brings together so many people from around the world to work on it for every country; 18 | * It puts things in perspective and shows where there is work to be done in order to improve a country’s ranking; 19 | * It’s beautifully displayed; 20 | 21 | Last year’s assessment helped Moldova’s authorities (including the E-Government Center) to focus on passing an important legislation - the Law on public sector information (PSI) re-use. Therefore, this year, Moldova improved in regards to openly licensed data. We are looking forward the final results of the reviewing process of the Global Open Data Index to see where Moldova will be placed this year, compared to last year’s ranking of 12th place. 22 | 23 | There is still work to be done, in order to improve the quality of data for the National Map, Election Results and Emission of Pollutants data, and overall, the quality of information provided to the public. 24 | -------------------------------------------------------------------------------- /content/nepal.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Nepal 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: nepal 7 | category: Asia/Pacific 8 | image: nepal.jpg 9 | author: Nikesh Balami 10 | author_contact: 11 | author_bio: Nikesh Balami is a strong supporter of Free and Open Source Software (FOSS), Open Education, Open Web, Open GLAM, Open Content, Open Data, and has been working with the various open communities in Nepal since 2012. Nikesh has a Diploma in Computer Engineering from Acme Engineering College, Kathmandu, Nepal. 12 | 13 | To monitor and measure the openness of data in the context of our country, Nepal, we decided to continue to contribute to the Global Open Data Index. We think the Index - apart from bringing direct benefits to the work of policy-makers, researchers, activists and data users - has become an useful and powerful tool to gather information around data availability, which can be easily peer-reviewed, used and understood by anyone around the world. 14 | 15 | Data Journalists are also one of the beneficiaries of the Global Open Data Index. They can create stories from the data, with a high reach potentially among the general public, by making visualizations from it, and comparing it with past data. 16 | 17 | Nepal is small, developing country, but there are many national and international communities who are working towards openness, transparency and accountability. Social organizations, activists and other concerned entities are taking Global Open Data Index as a platform to raise their voices for open data, and many communities in Nepal are helping them through advocacy. 18 | 19 | Recently, many government officers and policy-makers have started to understand the value of open data, and some of the government offices of Nepal have begun to release vast amounts of the information and data. Yet, while some information is now easily accessible, some are still trapped in paper records. 20 | 21 | The Government in Nepal has also started to update their website data and information regularly, but only few of them are in open format. We can now easily access updated government budget, government spending, election result data, etc., online, and many of the other government offices are also starting to develop portals for data publishing. Hopefully, very soon, the Government will start to publish their data in open formats too. 22 | -------------------------------------------------------------------------------- /content/new-zealand.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: New Zealand 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: new-zealand 7 | category: Asia/Pacific 8 | image: new-zealand.jpg 9 | author: Mark Heseltine 10 | author_contact: 11 | author_bio: Mark Heseltine is an engineer by trade with an interest in democratisation of knowledge. He is about to embark on a PhD in the area of smart cities. Originally from Australia, Mark lived in the UK and Ireland for 12 years, before recently moving to Auckland to enjoy the lifestyle and the burgeoning local open data scene. 12 | 13 | The Open Data movement in New Zealand continues to mature. Statistics, indicators and geographic information are published by the central government, increasingly in machine-friendly formats. Data is easy to find - even as someone quite new to the country and its Open Data ecosystem, I was able to source and update most of New Zealand’s entries in the Global Open Data Index in a single evening. Key public data sources like http://data.govt.nz and http://data.linz.govt.nz make the job easier. 14 | 15 | However, some areas continue to linger, such that our overall rating and position might not have changed substantially over the past 12 months. While some of this may in time be rectified - such as proprietary licensing of the national postcode data set - some may never rate highly on the Index due to structural assumptions that are made by the Index. For example, New Zealand has no national bus or rail networks to speak of. Even though the major cities of Wellington and Auckland have released rich sets of transport data, including real-time public transport timetables, these are not picked up by the Index, and so, perhaps, the situation is actually better than it might look. 16 | 17 | Similarly, Christchurch’s Sensing City initiative, based around open sensor data, is world-leading and yet does not contribute to New Zealand’s position on the Index because of its city focus. Around 65% of New Zealanders live in cities, and, as with the rest of the world’s population, that number continues to grow. Having considered the New Zealand experience, I think the Index is a useful guide for national government initiatives, but there is always room for it to evolve to more of an urban focus. 18 | -------------------------------------------------------------------------------- /content/nigeria.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Nigeria 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: nigeria 7 | category: Africa 8 | image: nigeria.png 9 | author: Oludotun Babayemi 10 | author_contact: 11 | author_bio: Monitoring & Evaluation Expert with Connected Development [CODE]; Co-Creator, Follow The Money, School of Data Fellow, and a CrisisMappers Fellow 12 | 13 | After 20 years outside of Nigeria, Gabriel just arrived at the Murtala Muhammed International Airport in Lagos, and would like to take the next bus that will be heading to Sokoto, about 1000 km from Lagos. He has always taught the country is now at par with some western countries that do have transport timetables like you have in a country as small as Slovenia, actually he was disappointed! Gabriel eventually waited and gets settled 3 days before he could get a cousin to put him on a bus to Sokoto. This is how interesting data availability could be in Nigeria, and while so much funds is been put into government budget on infrastructure data, the more we look, the less we see the availability of these datasets, one being government spending data in real-time! 14 | 15 | Nevertheless, postal codes of every community in Nigeria has been available since the publication of the commercialized printed copies five years ago, the National Bureau of Statistics (NBS) isn’t relenting in making statistical data available to Nigerians through its new portal that is already used in complimenting its e-library, five years ago, this wouldn’t have been possible, and this awakening isn’t peculiar to the NBS. Election results are now available immediately it’s being released by the Independent National Electoral Commission; the National Oil Spill Detection and Response Agency at the beginning of the year, released a real time map data of oil spills in the country; and talking about maps, it’s quite appalling that an online digital map of the most populated black country still remains a holy grail, despite the fact that the Office of the Surveyor General of the Federation and the National Boundary Commission has this locked in their office electronic devices! Following suit, is the company register domiciled in the strong room of the Corporate Affairs Commission, which is only available to registered legal practitioners at a fee, perhaps we will need some intervention by Open Corporates 16 | 17 | While the country might move up in its rating in the 2014 Global Open Data Index from 63 in 2013 (6th in Africa after Burkina Faso, Tunisia, South Africa, Egypt, Morocco) due to so much pressure on government agencies to make data available, there are still much challenges of the integrity of the data been published, and how downloadable some of this online data are. Having appreciated the government moving to an Open Data regime, especially with recent open data initiative of the Ministry of Communication Technology, it is important to let government institutions know how to openly license their data, and empower citizens, and strengthen non-state actors on how to make use of this available data, so that when transport data becomes available, Nigerians that might want to transit like Gabriel can quickly leverage on using it for moving from one point to another. 18 | 19 | -------------------------------------------------------------------------------- /content/pages/about.md: -------------------------------------------------------------------------------- 1 | type: page 2 | template: page 3 | title: Open Data Index: Tracking the state of government open data 4 | slug: about 5 | 6 | #Open Data Index 2015 : Civil Society Audit of the state of Open Data 7 | 8 | The Global Open Data Index is an annual effort to measure the state of open government data around the world. The crowdsourced survey is designed to assess the openness of specific government datasets according to the [Open Definition](http://opendefinition.org/). Through this initiative we want to provide a civil society audit of how governments actually publish data - with input and review from citizens and organisations around the world. 9 | The unique benefits of the Open Data Index include: - 10 | - Results from a citizen’s perspective and not simply reliant on government claims of openness. 11 | - A simple group of datasets that offer powerful insights into key government functions and performance, and that can be compared consistently across countries. 12 | - Pioneering methods, with topical experts reviewing global submissions for each dataset to ensure reliability. 13 | - An education and engagement tool for citizens to learn about open data, the state of government data in their own country, and how they can best make use of it. 14 | - Allows us to establish a baseline and track changes and trends in the open data world over time as the field evolves. 15 | 16 | Open data measurement is still new and experimental field. The Global Open Data Index, as well makes changes each year in order to improve the quality of the final benchmarking. This year, after multiple public consultations, we made three major changes to the Global Open Data Index - 17 | - We revised the set of datasets that we are evaluating and improved the datasets definitions to allow better consistency of the index. 18 | - We worked with regional index coordinators to reach more people and solicit more entries to the index. 19 | - We changed the review process from peer review to thematic review to allow better accuracy and reliability of the results. 20 | 21 | (read more about these changes in our [methodology section](../methodology)). 22 | We believe that with these changes we can create a better dialogue between government and civil society around open data. 23 | 24 | This year, we have 122 countries in the sample (up from 97 countries in 2014). You can find the full geographical data in the [places](../places) page, or see our [insights](../insights) from the index results. 25 | For more information on the Open Data Index, you may contact the team at: [index@okfn.org](index@okfn.org) or post a query on the [Open Data Index forum](https://discuss.okfn.org/c/open-data-index) 26 | -------------------------------------------------------------------------------- /content/pages/chart.md: -------------------------------------------------------------------------------- 1 | type: page 2 | template: chart 3 | title: Open Data Index Interactive Chart 4 | slug: chart 5 | -------------------------------------------------------------------------------- /content/pages/download.md: -------------------------------------------------------------------------------- 1 | type: download 2 | template: download 3 | title: Download 4 | slug: download 5 | 6 | 7 | The data of the Index is available for use under a [public domain data license](http://opendatacommons.org/licenses/pddl/1.0/). We provide the data as a single archive, and as indivdual files in CSV and JSON formats (as part of the [API](https://github.com/okfn/opendataindex#api)). 8 | 9 | A lot of work goes into preparing the Index each year, and we are eager to get feedback on how you use the data, so please do help us with this by filling out the form below. 10 | -------------------------------------------------------------------------------- /content/pages/home.md: -------------------------------------------------------------------------------- 1 | type: home 2 | template: home 3 | title: Open government data around the world, right now. 4 | save_as: index.html 5 | year: 2015 6 | 7 | 8 | The first initiative of its kind, the Global Open Data Index provides the most comprehensive snapshot available of the global state of open data. 9 | -------------------------------------------------------------------------------- /content/pages/press/2014/japanese.md: -------------------------------------------------------------------------------- 1 | type: page 2 | template: page 3 | title: PRESS RELEASE 4 | slug: press/release/japanese 5 | 6 | ## オープン・ナレッジ、世界規模でのオープンデータ現況調査にもとづき、2014年オープンデータ・インデックスを公開 7 | 8 | ### 2014オープンデータ・インデックス:世界各国の政府による主要データ公開に遅れ 9 | 10 | オープン・ナレッジはオープンデータインデックス2014を公表しました。それによると、幾分かの進捗はありましたが、ほとんどの政府は依然として重要な情報をアクセス可能なかたちで市民や企業へ提供できていないことが判明しました。最近のマッキンゼーほかの推計によれば、オープンデータの潜在的な便益は1兆ドルを越すと言われていますので、進捗が遅いということは多大な機会損失に直面していることを意味しています。 11 | 12 | オープン・ナレッジの創設者かつ代表であるルーファス・ポロックは「政府データをオープンにしていくことは、民主主義、説明責任、そしてイノベーションを牽引できます。政府データの公開は、市民に、自分たちの権利を知り、それを行使する力をもたらします。そして、社会の隅々にまで便益をもたらすことができます-交通から教育、健康といった分野にまで。過去数年の間に、政府からオープンデータへの支持が増えていることは大変喜ばしいことです。しかし、本年のオープンデータインデックスは物語っています。現場の状況の進捗は、美辞麗句とは懸け離れた状況にあるが多すぎると。 13 | 14 | このインデックスは、政府支出、選挙結果、交通時刻表、環境汚染レベル等を含む主要10領域における情報の可用性とアクセシビリティに基づいて各国をランク付けしています。 15 | 16 | 英国政府は全体スコア96%で2014年指標においても首位の座を維持しました。僅差でデンマークが2位、そして、フランスが昨年の12位から3位に上昇しています。フィンランドが4位に位置し、オーストリアとニュージーランドが5位を分け合っています。インドが27位から10位に上昇するという印象的な結果を出しています。そして、南米のコロンビアやウルグアイがともに12位に位置しています。 17 | 18 | シェラレオネ、マリ、ハイチそしてギニアは評価対象国の中では最下位にランクされていますが、オープン性の欠如や十分な市民社会の参加の欠如の故にまだ評価すらされていない国々が多数あります。 19 | 20 | 総体的に見ると、オープンなデータセット数が有意に改善(87から104へ)した一方で、全調査対象国を通したオープンなデータセットの比率は11%と低い数字にとどまっています。 21 | 22 | オープン・ガバメント・データのリーダーたちの中ですら、まだ改善の余地があります。例えば米国とドイツは統合されたオープンな企業登記情報を提供していません。政府の支出データの詳細についてのオープン性の程度についても残念な結果が出ています。ほとんどの国々は、まったく情報提供できていないか、限定的な情報しか提供できていません。参加97カ国中、英国とギリシャの2カ国だけが政府支出データのオープン性について満点を得ています。このことは、多くの国において、成長が停滞して、かつ、財政緊縮が続いている中において、特筆すべきことです。なぜなら、この種のデータへのオープンなアクセスを提供することは、政府予算を節約したり、政府の効率性を改善するための効果的な方法であろうと思えるからです。 23 | 24 | ルーファス・ポロックは次のように言っています: 25 | 「オープンデータの真の便益を実現するには、政府はオンラインにわずかなスプレッドシートを置く以上のことをしなければなりません。情報は誰でもどこでも目的を問わず容易に発見、理解でき、自由に利用・再利用・共有されるべきなのです。」 26 | 27 | 28 | また、一般社団法人オープン・ナレッジ・ファウンデーション・ジャパンは、今年の日本の評価について、次のようにコメントします。 29 | 30 | 日本はこのオープンデータインデックスで、27位(2013)から19位(2014)に上昇しました。日本政府は政府データカタログサイトを正式にローンチし、電子行政オープンデータ推進のためのロードマップを着実に実行しています。 31 | 32 | 一方、日本は国連電子政府ランキングで18位(2012)から6位(2014)へ躍進しました。電子政府分野における主要課題の一つであるオープンデータは、政府のリーダーシップを発揮によって進展できる分野です。政府は、オープンデータ政策についてもリーダーシップを発揮し、国家IT戦略(世界最先端IT国家創造宣言)の目標である2015年度末に世界最先端の国々の一員となることを目指し、今後はさらに市民社会との連携を強めて取り組んでいただきたいと考えます。 33 | 34 | その目標のために取組むべき課題は、時刻表、政府支出、企業登記と、全体的なオープンライセンス化です。 35 | 36 | 時刻表:民間の鉄道会社がデータを保有しているため、政府自身が提供することはできないデータです。しかし時刻表ではありませんが、東京メトロや東急電鉄が企業としてデータ提供に取り組み始めていることは注目に値します。政府も協力し動きを加速していくことが期待されます。 37 | 38 | 政府支出:日本政府も公開していますが、インデックスが求める詳細さに達していませんでした。英国政府等を研究し、より詳細な支出情報を公開していく必要があります。 39 | 40 | 商業・法人登記:2016年から始まる法人番号制度ではオープンデータの提供が議論されていますが、それでも情報が不足すると思われます。既存の登記情報提供サービスの改善を加速化する必要があるでしょう。 41 | 42 | ライセンス:2015年度に予定されている政府利用規約の見直しによって、完全なオープンライセンスにすることが求められます。 43 | -------------------------------------------------------------------------------- /content/pages/press/2014/madarin.md: -------------------------------------------------------------------------------- 1 | type: page 2 | template: page 3 | title: 新闻通稿 4 | slug: press/release/mandarin 5 | 6 | *2014年12月9日* 7 | 8 | ## 开放数据指数2014显示全球各国和地区政府开放关键数据集的进展缓慢 9 | 10 | ### 开放知识基金会发布的开放数据指数追踪全球各国开放数据的状态 11 | 12 | 开放知识基金会今日发布了其2014年度的开放数据指数。这项调查显示,虽然全球各国开放数据都有了一定的进步,但是大多数政府仍旧未能将关键的信息提供在市民和企业可访问的格式下。 13 | 开放知识基金会的创始人和主席 Rufus Pollock 评论道: 14 | 15 | 开放政府数据能够促进公民社会的建设,政府公信力的增强,创新产业的发展。它使得市民得以了解并施行他们的权利,并为社会各界带来益处:无论是交通领域,还是教育领域,又或是医疗领域。在过去几年里,虽然政府对开放数据的支持日益增长,但开放数据指数却显示真正的进展却远低于预期。 16 | 17 | 开放数据指数通过评估各国10个关键数据集,例如政府项目级支出数据、国家公共交通时刻表、环境污染指数等的可获取性和可访问性来进行国家级开放数据项目绩效排序。 18 | 19 | 2014年,英国再摘开放数据指数的桂冠,总体开放性达到了96%,而紧随其后的则是丹麦以及去年排名才12位而今年已到第3位的法国。第4位的是芬兰,而第5位则由澳大利亚和新西兰共享。今年的指数结果里最令人振奋的有去年排名27而今年进步到第10位的印度,以及共同占据第12位的拉丁美洲的哥伦比亚和乌拉圭。 20 | 21 | 塞拉利昂,马里共和国,海地以及几内亚在今年的开放数据指数中垫底,但需要指出的,还有更多比这些政府在数据开放性上更糟糕的,这里没有包含他们主要是因为没有足够的公开数据以供评估以及当地没有足够的志愿者来完成相应的评估。 22 | 23 | 整体而言,虽然开放的关键数据集整体数量有所上升(从87到104),但开放数据集占整体的比例仍旧很低,仅为11%。 24 | 25 | 即使对于那些在开放数据项目上的领头国家,也有大量的提升空间:比如对于美国和德国,他们就没有提供整合的、开放的企业注册数据库。而政府项目级支出的数据开放性也让人大失所望,大多数国家要么完全没有提供此类信息,又或者仅提供了有限的信息。在97个国家中,仅有英国和希腊两个国家提供了完全开放的政府项目级支出数据。在目前各国经济增长仍旧缓慢甚至艰巨的时期,提供市民和企业免费开放的数据意味着我们能够更高效的开源节流,以及提高政府效能。 26 | 27 | Pollock 说道: 28 | 29 | *为了真正实现开放数据的价值,政府不应仅仅将数据表格放到网上,而需要做更多的工作。这些数据应当能够被人轻易找到和理解,也应当能够被自由、免费使用、加值、重发布,而不限制其身份、地点和目的。* 30 | 31 | 32 | 媒体指南 33 | 34 | 开放数据指数网址:[http://index.okfn.org/](http://index.okfn.org/) 35 | 36 | * 开放数据指数是一项由开放知识基金会组织,联合全球专家和贡献者一同完成的研究项目。在项目过程中,社会大众、社会组织、开放数据专家共同协作评估各国关键数据集的可获得性和可访问性。他们贡献的评估结果都经过了同行评议和专家评审,各国的最终得分都基于这些数据。 37 | * 开放数据指数提供了一项独立的、针对各国关键性数据集开放性的评估,它涉及:国家级公共交通时刻表,国家预算数据,国家项目级支出数据,选举结果数据,企业注册数据,国家1:25万或更高请地图数据,国家统计数据,国家司法数据,国家邮政编码数据,国家环境污染物数据。关于这些数据集的更多信息,可以访问[http://index.okfn.org/dataset/](http://index.okfn.org/dataset/) 38 | * 开放数据指数2014共包括97个国家和地区:英国,丹麦,法国,芬兰,澳大利亚,新西兰,挪威,德国,美国,印度,台湾,哥伦比亚,捷克共和国,瑞典,乌拉圭,冰岛,荷兰,罗马尼亚,智利,日本,马恩岛,奥地利,加拿大,瑞士,意大利,巴西,斯洛文尼亚,韩国,墨西哥,土耳其,科索沃,马耳他,西班牙,拉脱维亚,格鲁吉亚,匈牙利,爱尔兰,南非,葡萄牙,以色列,巴基斯坦,巴拉圭,厄瓜多尔,摩尔多瓦共和国,印度尼西亚,牙买加,俄罗斯,阿根廷,波兰,塞尔维亚,保加利亚,克罗地亚,比利时,哥斯达黎加,希腊,香港,中国大陆,萨尔瓦多,布基纳法索,泰国,前南斯拉夫的马其顿共和国,斯洛伐克,孟加拉国,百慕大群岛,尼泊尔,塞内加尔,新加坡,突尼斯,危地马拉,立陶宛,菲律宾,美属维尔京群岛,尼日利亚,卢旺达,沙特阿拉伯,柬埔寨,科特迪瓦,埃及,摩洛哥,巴拿马,戛纳,津巴布韦,喀麦隆,肯尼亚,黎巴嫩,波斯尼亚和黑塞哥维那,博茨瓦纳,塞浦路斯,莱索托,坦桑尼亚,贝宁,阿曼,塞拉利昂,马里共和国,海地以及几内亚 39 | * 一些地区和国家开放数据指数相关的故事可见:[http://index.okfn.org/stories/](http://index.okfn.org/stories/) 40 | * 开放数据指数中涵盖的地方不单包括正式的国家,也包含部分地区,因为他们有相对独立的政府系统在提供数据。因此开放数据指数2014排序的是“地方”而不是“国家” 41 | * 开放数据指的是可以被自由免费使用、加值、重发布而对身份、地点、目的不加以限制的数据。真正的开放数据从技术和法律两个角度定义了一系列特性确保任何人都能有权利自由使用这些数据,而开放数据指数正是基于此对关键数据集进行评估。“开放知识定义“提供了何为”开放“的定义,详情见[http://opendefinition.org/od/1.1/zh/](http://opendefinition.org/od/1.1/zh/) 42 | * 成立于2004年的开放知识基金会(现已更名为”开放知识“)是一个由全球支持开放知识的人员组成的网络,其提倡知识开放,并通过技术和培训来释放更多的数据,并将他们转化为洞见带来转变。我们的目的是帮助人们利用开放知识来改善社会。 43 | * 访问[http://okfn.org/](http://okfn.org/)了解更多关于开放知识基金会的信息以及它的主要项目例如数据学院http://SchoolOfData.org/ 和开放支出 [http://OpenSpending.org/](http://OpenSpending.org/).。 44 | * 访问[http://okfncn.org](http://okfncn.org)来了解开放知识基金会中国的信息,访问http://opendatachina.com 来了解由开放知识基金会中国参与发起的”开放数据中国“。更多详情可微博联系@开放数据中国,或邮件[info@opendatachina.com](mailto:info@opendatachina.com) 45 | -------------------------------------------------------------------------------- /content/pages/vis/embed/map.md: -------------------------------------------------------------------------------- 1 | type: map.embed 2 | template: map.embed 3 | slug: vis/map/embed 4 | title: Map Visualisation Embed 5 | rel_permalink: vis/map 6 | -------------------------------------------------------------------------------- /content/pages/vis/index.md: -------------------------------------------------------------------------------- 1 | type: gallery 2 | template: gallery 3 | title: Visualisations 4 | slug: vis 5 | -------------------------------------------------------------------------------- /content/pages/vis/permalink/map.md: -------------------------------------------------------------------------------- 1 | type: map.permalink 2 | template: map.permalink 3 | slug: vis/map 4 | title: Map Visualisation 5 | 6 | A chloropeth map that displays place ranking in the Open Data Index. Rank can be filtered by year and dataset. 7 | -------------------------------------------------------------------------------- /content/paraguay.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Paraguay 4 | date: 2014-12-01 10:08 5 | year: 2014 6 | slug: paraguay 7 | category: Americas 8 | image: paraguay.png 9 | author: Juan Pane 10 | author_contact: jpane@pol.una.py 11 | author_bio: Juan Pane is a Lecturer and researcher for Open Data at the National University of Asunción, Paraguay. He is also researcher of the Latin American Open Data Initiative (ILDA) and a consultant for the Democracy and Governance Program for the Paraguayan Government funded by USAID and implemented by CEAMSO, Paraguay. His current research and development activities focus on ICT based Innovations for Open Data and Open Government initiatives by applying Semantic technologies and on designing automatic tools for Software Quality Assurance. 12 | 13 | Earlier this year I proposed to the teach an Open Data course, lasting the whole semester, for the Computer Science (Informatics Engineering) curriculum at the National University of Asunción, in Paraguay. I was already the editor for Paraguay of the Global Open Data Index (GODI) Survey, but only few of the datasets were being populated, I believe mainly due to the lack of knowledge about the Index. 14 | 15 | While preparing the lessons I was trying to come up with a story that could tell the students that we, as a country, are not as bad as in many other places in the world, and that this Open Data movement was not a lost cause or impossible for us. This is when it occurred to me that the GODI was the tool for the job, and by the way, I would solve two things in the process: 16 | 17 | 1. Teach about Open Government Data to the students, and the position of Paraguay with respect to the world 18 | 2. Have the GODI filled in, so that Paraguay can be put in the map of Open Data in the world 19 | 20 | Since I was collaborating with many government agencies, I knew where to look for the datasets so I could give the students pointers to where to search for the datasets, that in many cases meant making calls to check whether the datasets even existed. 21 | 22 | The result of the process was very satisfactory, the students got a grip on what it means to look for datasets in very different situations (the easy and the hard ones), and how easy the task would have been if there was an Open Government Data Catalogue for Paraguay (we are in the process of building one now). The students were also very enthusiastic about the fact that we, as a country, are not in such a bad situation with respect to many other realities. This is always a confidence booster that translates into more civic actions and awareness about transparency issues in Paraguay. Overall, it was a win/win situation. 23 | -------------------------------------------------------------------------------- /content/rwanda.md: -------------------------------------------------------------------------------- 1 | type: article 2 | template: article 3 | title: Rwanda 4 | date: 2014-12-01 10:03 5 | year: 2014 6 | slug: rwanda 7 | category: Africa 8 | image: rwanda.png 9 | author: Stephen Abbott Pugh 10 | author_contact: 11 | author_bio: Stephen Abbott Pugh is setting up Sobanukirwa, a civic technology company in Rwanda. Prior to moving to Kigali, he was the head of digital projects for the UK Parliament and spent six years as a project manager for the Guardian's website. 12 | 13 | Rwanda's institutions have made strides over the last few years in opening up some of the data held within the government and I was keen to highlight the progress made by including the country in the open data index for the first time. 14 | 15 | Rwanda has developed good practises in terms of releasing national statistics and geodata in open formats while a lot of other official information is available for free online but locked away in databases or PDFs. Work is currently underway to speed up the adoption of open data publishing in the country and an open data czar has been appointed in the Prime Minister's office. 16 | 17 | I'd like to thank Rajiv Ranjan from the National Institute of Statistics of Rwanda for his help with locating many of the datasets. 18 | 19 | The Global Open Data Index is important not only as a way to spark competition between countries in terms of transparency but also as a great showcase of the latest technologies being used being used to release the data. For a country like Rwanda which is seeking to speedily foster a knowledge-based economy, it is imperative to be able to learn quickly from other countries and the index provides a valuable resource to promote this accelerated learning curve. 20 | 21 | I hope that by highlighting the Rwandan data available, more developers inside and outside of the country will use their initiative to create user-focused services or applications which make the most of the available health, statistical or geo data. 22 | -------------------------------------------------------------------------------- /develop_server.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ## 3 | # This section should match your Makefile 4 | ## 5 | PY=${PY:-python} 6 | PELICAN=${PELICAN:-pelican} 7 | PELICANOPTS= 8 | 9 | BASEDIR=$(pwd) 10 | INPUTDIR=$BASEDIR/content 11 | OUTPUTDIR=$BASEDIR/output 12 | CONFFILE=$BASEDIR/config_default.py 13 | 14 | ### 15 | # Don't change stuff below here unless you are sure 16 | ### 17 | 18 | SRV_PID=$BASEDIR/srv.pid 19 | PELICAN_PID=$BASEDIR/pelican.pid 20 | 21 | function usage(){ 22 | echo "usage: $0 (stop) (start) (restart) [port]" 23 | echo "This starts Pelican in debug and reload mode and then launches" 24 | echo "an HTTP server to help site development. It doesn't read" 25 | echo "your Pelican settings, so if you edit any paths in your Makefile" 26 | echo "you will need to edit your settings as well." 27 | exit 3 28 | } 29 | 30 | function alive() { 31 | kill -0 $1 >/dev/null 2>&1 32 | } 33 | 34 | function shut_down(){ 35 | PID=$(cat $SRV_PID) 36 | if [[ $? -eq 0 ]]; then 37 | if alive $PID; then 38 | echo "Stopping HTTP server" 39 | kill $PID 40 | else 41 | echo "Stale PID, deleting" 42 | fi 43 | rm $SRV_PID 44 | else 45 | echo "HTTP server PIDFile not found" 46 | fi 47 | 48 | PID=$(cat $PELICAN_PID) 49 | if [[ $? -eq 0 ]]; then 50 | if alive $PID; then 51 | echo "Killing Pelican" 52 | kill $PID 53 | else 54 | echo "Stale PID, deleting" 55 | fi 56 | rm $PELICAN_PID 57 | else 58 | echo "Pelican PIDFile not found" 59 | fi 60 | } 61 | 62 | function start_up(){ 63 | local port=$1 64 | echo "Starting up Pelican and HTTP server" 65 | shift 66 | $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS & 67 | pelican_pid=$! 68 | echo $pelican_pid > $PELICAN_PID 69 | cd $OUTPUTDIR 70 | $PY -m pelican.server $port & 71 | srv_pid=$! 72 | echo $srv_pid > $SRV_PID 73 | cd $BASEDIR 74 | sleep 1 75 | if ! alive $pelican_pid ; then 76 | echo "Pelican didn't start. Is the Pelican package installed?" 77 | return 1 78 | elif ! alive $srv_pid ; then 79 | echo "The HTTP server didn't start. Is there another service using port 8000?" 80 | return 1 81 | fi 82 | echo 'Pelican and HTTP server processes now running in background.' 83 | } 84 | 85 | ### 86 | # MAIN 87 | ### 88 | [[ ($# -eq 0) || ($# -gt 2) ]] && usage 89 | port='' 90 | [[ $# -eq 2 ]] && port=$2 91 | 92 | if [[ $1 == "stop" ]]; then 93 | shut_down 94 | elif [[ $1 == "restart" ]]; then 95 | shut_down 96 | start_up $port 97 | elif [[ $1 == "start" ]]; then 98 | if ! start_up $port; then 99 | shut_down 100 | fi 101 | else 102 | usage 103 | fi 104 | -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | from fabric.api import * 2 | import fabric.contrib.project as project 3 | import os 4 | import sys 5 | import SimpleHTTPServer 6 | import SocketServer 7 | 8 | # Local path configuration (can be absolute or relative to fabfile) 9 | env.deploy_path = 'output' 10 | DEPLOY_PATH = env.deploy_path 11 | 12 | # Remote server configuration 13 | production = 'root@localhost:22' 14 | dest_path = '/var/www' 15 | 16 | # Rackspace Cloud Files configuration settings 17 | env.cloudfiles_username = 'my_rackspace_username' 18 | env.cloudfiles_api_key = 'my_rackspace_api_key' 19 | env.cloudfiles_container = 'my_cloudfiles_container' 20 | 21 | 22 | def clean(): 23 | if os.path.isdir(DEPLOY_PATH): 24 | local('rm -rf {deploy_path}'.format(**env)) 25 | local('mkdir {deploy_path}'.format(**env)) 26 | 27 | def build(): 28 | local('pelican -s config_default.py') 29 | 30 | def rebuild(): 31 | clean() 32 | build() 33 | 34 | def regenerate(): 35 | local('pelican -r -s config_default.py') 36 | 37 | def serve(): 38 | os.chdir(env.deploy_path) 39 | 40 | PORT = 8000 41 | class AddressReuseTCPServer(SocketServer.TCPServer): 42 | allow_reuse_address = True 43 | 44 | server = AddressReuseTCPServer(('', PORT), SimpleHTTPServer.SimpleHTTPRequestHandler) 45 | 46 | sys.stderr.write('Serving on port {0} ...\n'.format(PORT)) 47 | server.serve_forever() 48 | 49 | def reserve(): 50 | build() 51 | serve() 52 | 53 | def preview(): 54 | local('pelican -s config_deploy.py') 55 | 56 | def cf_upload(): 57 | rebuild() 58 | local('cd {deploy_path} && ' 59 | 'swift -v -A https://auth.api.rackspacecloud.com/v1.0 ' 60 | '-U {cloudfiles_username} ' 61 | '-K {cloudfiles_api_key} ' 62 | 'upload -c {cloudfiles_container} .'.format(**env)) 63 | 64 | @hosts(production) 65 | def publish(): 66 | local('pelican -s config_deploy.py') 67 | project.rsync_project( 68 | remote_dir=dest_path, 69 | exclude=".DS_Store", 70 | local_dir=DEPLOY_PATH.rstrip('/') + '/', 71 | delete=True, 72 | extra_opts='-c', 73 | ) 74 | -------------------------------------------------------------------------------- /plugins/datastore/__init__.py: -------------------------------------------------------------------------------- 1 | """A CSV-backed datastore for Pelican.""" 2 | 3 | 4 | from .datastore import * 5 | -------------------------------------------------------------------------------- /plugins/datastore_api/__init__.py: -------------------------------------------------------------------------------- 1 | """An API generator for Pelican Datastore.""" 2 | 3 | 4 | from .datastore_api import * 5 | -------------------------------------------------------------------------------- /plugins/datastore_assets/__init__.py: -------------------------------------------------------------------------------- 1 | """A downloadable asset generator for Pelican Datastore. 2 | 3 | Exposes the datastore as a set of downloadable assets. 4 | 5 | """ 6 | 7 | 8 | from .datastore_assets import * 9 | -------------------------------------------------------------------------------- /plugins/datastore_assets/datastore_assets.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import json 4 | from pelican import generators 5 | from pelican import signals 6 | import datastore 7 | 8 | 9 | class AssetGenerator(generators.Generator): 10 | 11 | """Generates downloadable assets from a Pelican Datastore.""" 12 | 13 | def __init__(self, *args, **kwargs): 14 | super(AssetGenerator, self).__init__(*args, **kwargs) 15 | 16 | self.datastore_path = self.settings['DATASTORE']['location'] 17 | self.dest_path = os.path.join(self.settings['OUTPUT_PATH'], 18 | self.settings['THEME_STATIC_DIR'], 19 | self.settings['DATASTORE']['assets']['location']) 20 | self.archive_format = 'gztar' 21 | self.timestamp = self.settings['TIMESTAMP'] 22 | # self.assets_exclude = self.settings['DATASTORE']['assets']['exclude'] 23 | 24 | def write_archive(self): 25 | """Write an archive of the data as a public asset.""" 26 | 27 | name = '{0}{1}'.format('opendataindex_data_', self.timestamp) 28 | archive_name = os.path.join(self.dest_path, name) 29 | shutil.make_archive(archive_name, self.archive_format, 30 | self.datastore_path) 31 | 32 | def generate_output(self, writer): 33 | """Write the assets based on configuration.""" 34 | 35 | self.write_archive() 36 | # TODO: Other public asset generators 37 | 38 | def get_generators(pelican_object): 39 | return AssetGenerator 40 | 41 | 42 | def register(): 43 | signals.get_generators.connect(get_generators) 44 | -------------------------------------------------------------------------------- /plugins/i18n_subsites/__init__.py: -------------------------------------------------------------------------------- 1 | from .i18n_subsites import * 2 | -------------------------------------------------------------------------------- /plugins/i18n_subsites/_regenerate_context_helpers.py: -------------------------------------------------------------------------------- 1 | 2 | import math 3 | import random 4 | from collections import defaultdict 5 | from operator import attrgetter, itemgetter 6 | 7 | 8 | def regenerate_context_articles(generator): 9 | """Helper to regenerate context after modifying articles draft state 10 | 11 | essentially just a copy from pelican.generators.ArticlesGenerator.generate_context 12 | after process_translations up to signal sending 13 | 14 | This has to be kept in sync untill a better solution is found 15 | This is for Pelican version 3.3.0 16 | """ 17 | # Simulate __init__ for fields that need it 18 | generator.dates = {} 19 | generator.tags = defaultdict(list) 20 | generator.categories = defaultdict(list) 21 | generator.authors = defaultdict(list) 22 | 23 | 24 | # Simulate ArticlesGenerator.generate_context 25 | for article in generator.articles: 26 | # only main articles are listed in categories and tags 27 | # not translations 28 | generator.categories[article.category].append(article) 29 | if hasattr(article, 'tags'): 30 | for tag in article.tags: 31 | generator.tags[tag].append(article) 32 | # ignore blank authors as well as undefined 33 | if hasattr(article, 'author') and article.author.name != '': 34 | generator.authors[article.author].append(article) 35 | 36 | 37 | # sort the articles by date 38 | generator.articles.sort(key=attrgetter('date'), reverse=True) 39 | generator.dates = list(generator.articles) 40 | generator.dates.sort(key=attrgetter('date'), 41 | reverse=generator.context['NEWEST_FIRST_ARCHIVES']) 42 | 43 | # create tag cloud 44 | tag_cloud = defaultdict(int) 45 | for article in generator.articles: 46 | for tag in getattr(article, 'tags', []): 47 | tag_cloud[tag] += 1 48 | 49 | tag_cloud = sorted(tag_cloud.items(), key=itemgetter(1), reverse=True) 50 | tag_cloud = tag_cloud[:generator.settings.get('TAG_CLOUD_MAX_ITEMS')] 51 | 52 | tags = list(map(itemgetter(1), tag_cloud)) 53 | if tags: 54 | max_count = max(tags) 55 | steps = generator.settings.get('TAG_CLOUD_STEPS') 56 | 57 | # calculate word sizes 58 | generator.tag_cloud = [ 59 | ( 60 | tag, 61 | int(math.floor(steps - (steps - 1) * math.log(count) 62 | / (math.log(max_count)or 1))) 63 | ) 64 | for tag, count in tag_cloud 65 | ] 66 | # put words in chaos 67 | random.shuffle(generator.tag_cloud) 68 | 69 | # and generate the output :) 70 | 71 | # order the categories per name 72 | generator.categories = list(generator.categories.items()) 73 | generator.categories.sort( 74 | reverse=generator.settings['REVERSE_CATEGORY_ORDER']) 75 | 76 | generator.authors = list(generator.authors.items()) 77 | generator.authors.sort() 78 | 79 | generator._update_context(('articles', 'dates', 'tags', 'categories', 80 | 'tag_cloud', 'authors', 'related_posts')) 81 | 82 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pelican 2 | markdown 3 | tablib 4 | ghp-import 5 | click 6 | coverage 7 | babel 8 | pelican-alias 9 | webassets 10 | requests 11 | unicodecsv 12 | natsort 13 | transifex-client 14 | git+https://github.com/r0wb0t/markdown-urlize.git 15 | nose 16 | -------------------------------------------------------------------------------- /scripts/less.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | // `npm i less nodewatch` needed in order to run this 3 | 4 | var exec = require('child_process').exec; 5 | var path = require('path'); 6 | var less = require('less'); 7 | var nodewatch = require('nodewatch'); 8 | 9 | var watch = path.join(__dirname, '..', 'themes', 'odi', 'static', 'less'); 10 | 11 | function compile (input, info) { 12 | var start = Date.now(); 13 | var output = input.replace(/less/g, 'css'); 14 | exec('`npm bin`/lessc '+input+' > '+output, function (err, stdout, stderr) { 15 | if (err) { 16 | console.log('An error occurred running the less command:'); 17 | console.log(err.message); 18 | } else if (stderr || stdout) { 19 | console.log(stdout, stderr); 20 | } else { 21 | var duration = Date.now() - start; 22 | var file = input.replace(watch, '').substr(1); 23 | console.log('[%s] recompiled %s in %sms', Date.now(), file, duration); 24 | } 25 | }); 26 | } 27 | 28 | console.log('Watching %s', watch); 29 | nodewatch.add(watch).onChange(compile); 30 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/tests/__init__.py -------------------------------------------------------------------------------- /tests/component/test_filters.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from importlib import import_module 3 | component = import_module('utilities.filters') 4 | 5 | 6 | class SelectTest(unittest.TestCase): 7 | 8 | # Actions 9 | 10 | def test(self): 11 | func = component.search 12 | item1 = {'dataset': 'transport', 'place': 'au', 'year': '2015'} 13 | item2 = {'dataset': 'transport', 'place': 'gb', 'year': '2014'} 14 | items = [item1, item2] 15 | self.assertEqual(func(items, 'entries', dataset='transport'), items) 16 | self.assertEqual(func(items, 'entries', place='au'), [item1]) 17 | self.assertEqual(func(items, 'entries', dataset='transport', year='2014'), [item2]) 18 | self.assertEqual(func(items, 'entries', dataset='transport', year='2015'), [item1]) 19 | self.assertEqual(func(items, 'entries', dataset='budget'), []) 20 | -------------------------------------------------------------------------------- /themes/odi/static/css/_sexytables.css: -------------------------------------------------------------------------------- 1 | .sexyTableContainer { 2 | overflow: hidden; 3 | width: 100%; 4 | max-height: 90%; 5 | position: relative; 6 | margin: 0 auto; 7 | } 8 | .sexyDragContainer { 9 | width: 100%; 10 | height: 100%; 11 | overflow: hidden; 12 | } 13 | .sexyHeader { 14 | z-index: 2; 15 | position: absolute; 16 | top: 0px; 17 | left: 0px; 18 | overflow: hidden; 19 | transition: none !important; 20 | } 21 | .sexyHeader table { 22 | position: absolute; 23 | left: 0; 24 | top: 0; 25 | margin: 0 !important; 26 | } 27 | .sexyColumn { 28 | z-index: 3; 29 | position: absolute; 30 | top: 0px; 31 | left: 0px; 32 | font-size: 14px; 33 | } 34 | .sexyCorner { 35 | z-index: 4; 36 | position: absolute; 37 | top: 0px; 38 | left: 0px; 39 | transition: none !important; 40 | font-size: 14px; 41 | vertical-align: bottom; 42 | background-color: #fff; 43 | box-sizing: border-box; 44 | } 45 | .sexyHeader table .place-name { 46 | display: none; 47 | } 48 | .sexyHeader table .number + .place-name { 49 | display: table-cell; 50 | } 51 | .span6.sorting { 52 | text-align: right; 53 | } 54 | .span6.sorting label { 55 | display: inline-block; 56 | margin-left: 10px; 57 | } 58 | table.response-summary, 59 | .sexyHeader table { 60 | table-layout: fixed; 61 | } 62 | table.response-summary thead tr th, 63 | .sexyCorner table tr th, 64 | .sexyHeader table tr th { 65 | padding: 8px; 66 | text-align: left; 67 | font-size: 14px; 68 | vertical-align: bottom; 69 | background-color: #fff; 70 | height: 100px; 71 | box-sizing: border-box; 72 | border-bottom: 2px solid #dddddd; 73 | } 74 | .sort_rank, 75 | .sort_place { 76 | cursor: pointer; 77 | } 78 | .sexyCorner, 79 | .sexyColumn { 80 | display: none; 81 | } 82 | .sexyCorner table, 83 | .sexyColumn table { 84 | width: 100%; 85 | } 86 | .sexyColumn table tr td { 87 | border-top: 1px solid #ddd; 88 | } 89 | .sexyColumn table tr td div { 90 | padding: 8px; 91 | text-align: center; 92 | background-color: #f0f0f0; 93 | } 94 | table.response-summary thead tr th div, 95 | .sexyCorner table tr td div, 96 | .sexyHeader table tr th div { 97 | text-align: left; 98 | vertical-align: bottom; 99 | padding: 8px; 100 | } 101 | table.response-summary thead tr th div span, 102 | .sexyHeader table tr th div span { 103 | display: block; 104 | -webkit-transform: rotate(-90deg); 105 | -o-transform: rotate(-90deg); 106 | -ms-transform: rotate(-90deg); 107 | -moz-transform: rotate(-90deg); 108 | transform: rotate(-90deg); 109 | } 110 | table.response-summary thead tr th.number, 111 | .sexyHeader table tr th.number { 112 | width: 25px !important; 113 | } 114 | table.response-summary thead tr th.place-name, 115 | .sexyHeader table tr th.place-name { 116 | width: 120px !important; 117 | } 118 | table.response-summary thead tr th.place-score, 119 | .sexyHeader table tr th.place-score { 120 | width: 65px !important; 121 | } 122 | -------------------------------------------------------------------------------- /themes/odi/static/files/2014/GlobalOpenDataIndex2014_KeyThemesBriefing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/files/2014/GlobalOpenDataIndex2014_KeyThemesBriefing.pdf -------------------------------------------------------------------------------- /themes/odi/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/favicon.ico -------------------------------------------------------------------------------- /themes/odi/static/images/icon-tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/icon-tile.png -------------------------------------------------------------------------------- /themes/odi/static/images/icon-tile_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/icon-tile_2x.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo-black.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo-embed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo-embed.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo-full-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo-full-black.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo-full-black_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo-full-black_2x.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo.png -------------------------------------------------------------------------------- /themes/odi/static/images/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/logo2.png -------------------------------------------------------------------------------- /themes/odi/static/images/map-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/map-bg.png -------------------------------------------------------------------------------- /themes/odi/static/images/map-bg_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/map-bg_2x.png -------------------------------------------------------------------------------- /themes/odi/static/images/map-infog-1100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/map-infog-1100.png -------------------------------------------------------------------------------- /themes/odi/static/images/map-infog-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/map-infog-600.png -------------------------------------------------------------------------------- /themes/odi/static/images/map-infog-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/map-infog-800.png -------------------------------------------------------------------------------- /themes/odi/static/images/okfn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/okfn.png -------------------------------------------------------------------------------- /themes/odi/static/images/pie-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/pie-10.png -------------------------------------------------------------------------------- /themes/odi/static/images/pie-10_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/pie-10_2x.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenDataIceberg-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenDataIceberg-400.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenDataIceberg-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenDataIceberg-600.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenDataIceberg-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenDataIceberg-800.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenDataIceberg-mandarin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenDataIceberg-mandarin.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenKnowledge_CMYK.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenKnowledge_CMYK.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/OpenKnowledge_RGB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/OpenKnowledge_RGB.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/details.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/map.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/map.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/places.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/places.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/spending-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/spending-400.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/spending-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/spending-600.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/spending-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/spending-800.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/spending-print-300dpi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/spending-print-300dpi.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2014/spending-print.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2014/spending-print.pdf -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/map-infog-1100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/map-infog-1100.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/map-infog-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/map-infog-600.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/map-infog-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/map-infog-800.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/odi-1000.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/odi-1000.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/odi-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/odi-400.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/odi-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/odi-600.png -------------------------------------------------------------------------------- /themes/odi/static/images/press/2015/odi-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/press/2015/odi-800.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/belgium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/belgium.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/bulgaria.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/bulgaria.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/burkina-faso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/burkina-faso.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/chile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/chile.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/china.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/china.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/czech-republic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/czech-republic.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/denmark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/denmark.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/egypt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/egypt.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/germany.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/germany.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/israel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/israel.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/italy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/italy.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_1.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_10.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_11.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_2.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_3.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_4.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_5.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_6.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_7.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_8.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/kenya_9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/kenya_9.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/malaysia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/malaysia.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/moldova.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/moldova.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/nepal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/nepal.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/new-zealand.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/new-zealand.jpg -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/nigeria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/nigeria.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/oman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/oman.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/paraguay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/paraguay.png -------------------------------------------------------------------------------- /themes/odi/static/images/stories/2014/rwanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/images/stories/2014/rwanda.png -------------------------------------------------------------------------------- /themes/odi/static/less/_sexytables.less: -------------------------------------------------------------------------------- 1 | //sexytables v1.0 2 | .sexyTableContainer { 3 | overflow: hidden; 4 | width: 100%; 5 | max-height: 90%; 6 | position: relative; 7 | margin: 0 auto; 8 | } 9 | 10 | .sexyDragContainer { 11 | width: 100%; 12 | height: 100%; 13 | overflow: hidden; 14 | } 15 | 16 | 17 | .sexyHeader { 18 | z-index: 2; 19 | position: absolute; 20 | top: 0px; 21 | left: 0px; 22 | overflow: hidden; 23 | transition: none !important; 24 | } 25 | 26 | .sexyHeader table { 27 | position: absolute; 28 | left: 0; 29 | top: 0; 30 | margin: 0 !important; 31 | } 32 | 33 | .sexyColumn { 34 | z-index: 3; 35 | position: absolute; 36 | top: 0px; 37 | left: 0px; 38 | font-size: 14px; 39 | } 40 | 41 | .sexyCorner { 42 | z-index: 4; 43 | position: absolute; 44 | top: 0px; 45 | left: 0px; 46 | transition: none !important; 47 | font-size: 14px; 48 | vertical-align: bottom; 49 | background-color: #fff; 50 | box-sizing: border-box; 51 | } 52 | 53 | .sexyHeader table .place-name { 54 | display: none; 55 | } 56 | 57 | .sexyHeader table .number + .place-name { 58 | display: table-cell; 59 | } 60 | 61 | .span6.sorting { 62 | text-align: right; 63 | } 64 | 65 | .span6.sorting label { 66 | display: inline-block; 67 | margin-left: 10px; 68 | } 69 | 70 | table.response-summary, 71 | .sexyHeader table { 72 | table-layout: fixed; 73 | } 74 | 75 | table.response-summary thead tr th, 76 | .sexyCorner table tr th, 77 | .sexyHeader table tr th { 78 | padding: 8px; 79 | text-align: left; 80 | font-size: 14px; 81 | vertical-align: bottom; 82 | background-color: #fff; 83 | height: 100px; 84 | box-sizing: border-box; 85 | border-bottom: 2px solid #dddddd; 86 | } 87 | 88 | .sort_rank, 89 | .sort_place { 90 | cursor: pointer; 91 | } 92 | 93 | .sexyCorner, 94 | .sexyColumn { 95 | display: none; 96 | } 97 | 98 | .sexyCorner table, 99 | .sexyColumn table { 100 | width: 100%; 101 | } 102 | 103 | .sexyColumn table tr td{ 104 | border-top: 1px solid #ddd; 105 | } 106 | 107 | .sexyColumn table tr td div { 108 | padding: 8px; 109 | text-align: center; 110 | background-color: #f0f0f0; 111 | } 112 | 113 | table.response-summary thead tr th div, 114 | .sexyCorner table tr td div, 115 | .sexyHeader table tr th div { 116 | text-align: left; 117 | vertical-align: bottom; 118 | padding: 8px; 119 | } 120 | 121 | table.response-summary thead tr th div span, 122 | .sexyHeader table tr th div span { 123 | display: block; 124 | -webkit-transform: rotate(-90deg); 125 | -o-transform: rotate(-90deg); 126 | -ms-transform: rotate(-90deg); 127 | -moz-transform: rotate(-90deg); 128 | transform: rotate(-90deg); 129 | } 130 | 131 | table.response-summary thead tr th.number, 132 | .sexyHeader table tr th.number { 133 | width: 25px !important; 134 | } 135 | 136 | table.response-summary thead tr th.place-name, 137 | .sexyHeader table tr th.place-name { 138 | width: 120px !important; 139 | } 140 | 141 | table.response-summary thead tr th.place-score, 142 | .sexyHeader table tr th.place-score { 143 | width: 65px !important; 144 | } -------------------------------------------------------------------------------- /themes/odi/static/scripts/map.js: -------------------------------------------------------------------------------- 1 | require.config({ 2 | baseUrl: 'SITEURL/static'.replace('SITEURL', siteUrl), 3 | shim: { 4 | leaflet: {exports: 'L'}, 5 | leaflet_zoommin: {deps: ['leaflet']}, 6 | leaflet_label: {deps: ['leaflet']} 7 | }, 8 | paths: { 9 | app: 'scripts/map/main', 10 | domReady: 'vendor/domReady', 11 | leaflet: 'vendor/leaflet', 12 | proj4: 'vendor/proj4', 13 | proj4leaflet: 'vendor/proj4leaflet', 14 | leaflet_zoommin: 'vendor/L.Control.ZoomMin', 15 | leaflet_label: 'vendor/leaflet.label', 16 | jquery: 'vendor/jquery.min', 17 | chroma: 'vendor/chroma.min', 18 | pubsub: 'vendor/pubsub', 19 | lodash: 'vendor/lodash.compat.min', 20 | marked: 'vendor/marked', 21 | data: 'scripts/map/data', 22 | ui: 'scripts/map/ui' 23 | } 24 | }); 25 | 26 | requirejs(['app']); 27 | -------------------------------------------------------------------------------- /themes/odi/static/scripts/map/main.js: -------------------------------------------------------------------------------- 1 | define(['data', 'ui', 'domReady'], function(data, ui, domReady) { 2 | domReady(function() { 3 | data.init(); 4 | ui.init(); 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /themes/odi/static/scripts/site.js: -------------------------------------------------------------------------------- 1 | require.config({ 2 | baseUrl: 'SITEURL/static'.replace('SITEURL', siteUrl), 3 | shim : { 4 | bootstrap: {deps:['jquery']}, 5 | tablesorter: {deps: ['jquery']}, 6 | stickykit: {deps: ['jquery']}, 7 | kinetic: {deps: ['jquery']}, 8 | sexyTables: {deps: ['kinetic']} 9 | }, 10 | paths: { 11 | app: 'scripts/site/main', 12 | domReady: 'vendor/domReady', 13 | jquery: 'vendor/jquery.min', 14 | tablesorter: 'vendor/jquery.tablesorter.min', 15 | stickykit: 'vendor/jquery.sticky-kit.min', 16 | bootstrap: 'vendor/bootstrap/js/bootstrap.min', 17 | chroma: 'vendor/chroma.min', 18 | lodash: 'vendor/lodash.compat.min', 19 | table: 'scripts/site/table', 20 | place: 'scripts/site/place', 21 | ui: 'scripts/site/ui', 22 | kinetic: 'vendor/jquery.kinetic.min', 23 | sexyTables: 'vendor/sexytables-1.0.min' 24 | } 25 | }); 26 | 27 | requirejs(['app']); 28 | -------------------------------------------------------------------------------- /themes/odi/static/scripts/site/main.js: -------------------------------------------------------------------------------- 1 | define(['table', 'place', 'ui', 'domReady'], function(table, place, ui, domReady) { 2 | domReady(function() { 3 | place.init(); 4 | table.init(); 5 | ui.init(); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /themes/odi/static/scripts/site/place.js: -------------------------------------------------------------------------------- 1 | define(['jquery', 'bootstrap', 'chroma'], function($, bootstrap, chroma) { 2 | 3 | var colorSteps = ['#ff0000', '#edcf3b', '#7ab800'], 4 | colorScale = chroma.scale(colorSteps).domain([0, 100]), 5 | $placeOpeness = $('.place-openness'), 6 | $datasetOpeness = $('.dataset-openness'), 7 | naString = 'n/a', 8 | score; 9 | 10 | function initializePlace() { 11 | 12 | $.each($placeOpeness, function(index, el) { 13 | var $el = $(el); 14 | if ($el.data('score') === naString) { 15 | score = 0; 16 | } else { 17 | score = parseInt($el.data('score'), 10); 18 | } 19 | $el.css({ 20 | 'background-color': colorScale(score).hex(), 21 | 'color': 'white' 22 | }); 23 | }); 24 | 25 | $.each($datasetOpeness, function(index, el) { 26 | var $el = $(el); 27 | if ($el.data('score') === naString) { 28 | score = 0; 29 | } else { 30 | score = parseInt($el.data('score'), 10); 31 | } 32 | $el.css({ 33 | 'background-color': colorScale(score).hex(), 34 | 'color': 'white' 35 | }); 36 | }); 37 | 38 | } 39 | 40 | return { 41 | init: initializePlace, 42 | }; 43 | 44 | }); 45 | -------------------------------------------------------------------------------- /themes/odi/static/scripts/site/ui.js: -------------------------------------------------------------------------------- 1 | define(['jquery', 'bootstrap', 'sexyTables'], function($, bootstrap, sexy) { 2 | 3 | function initializeUI() { 4 | $('.download-action').on('click', function() { 5 | $("#tell-us").modal(); 6 | }); 7 | 8 | $('body').on('click', 'a.ok-ribbon', function(e) { 9 | $(this).toggleClass("closed open"); 10 | $('#ok-panel').toggleClass("closed open"); 11 | return false; 12 | }); 13 | 14 | $(document).ready(function() { 15 | sexyTables(); 16 | }) 17 | } 18 | 19 | return { 20 | init: initializeUI, 21 | }; 22 | 23 | }); 24 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/L.Control.ZoomMin.css: -------------------------------------------------------------------------------- 1 | .leaflet-control-zoom-min { 2 | text-indent: -999em; 3 | background: #fff url(data:image/gif;base64,R0lGODlhGAAYAOZdACIiIiMjIy8vLyoqKsPDwzMzM0xMTDQ0NGlpaUtLS+Tk5J2dnXd3d7m5ueDg4GdnZykpKSYmJkpKSre3t09PT5eXl4KCgrCwsHNzc1lZWWhoaCcnJ5ubm3R0dFJSUp+fn1RUVJqamoODg8TExD09PYqKijo6OpGRkV1dXVFRUUNDQ3FxcZmZmYCAgEVFRXV1dSgoKIaGhlxcXEdHR5SUlMvLy5iYmNXV1VNTU7GxsbOzs9ra2jExMdbW1isrKywsLFtbW6qqqnh4eGpqat3d3XBwcI2NjWRkZLi4uL+/vyUlJZycnNvb297e3r6+vvf392VlZcbGxq2trWFhYWZmZszMzE5OTsDAwG1tbZWVlZaWlqGhod/f3////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAF0ALAAAAAAYABgAQAf/gF2Cg10KLFASAgISVBWEhFkAklaPlT0Rkpk2XRCZnj4oEwQknp4Dgw0BAFqPLZ0ZFJ4BDYICpSWEURNBpZ4Cgx+qvQAmgjs4AAEflV1XBckgShkJEQeeBUmPLwAezF0jKTqDGJkdXQaZLt5dTj/DCRq9MDldHgAbw5kPhdb5AAkXBpXAd0ABMyED8g1gsE6QAwwJhw3oQMQbB1UyRlSpQeDJAiClAoQg5OCZkUrPAGzpImJIpgJNBHWKIMUbF0FMGsTIdOpBphUNb5jo9cBWJgveLOQTgM6TihOCjkgq4s9AiGEUHFyoMMUfAA5dGHjFooEHDQSkMjEUREBYPiSDHEQkI1CJQL9SM5aAkHSAbsMuCxAYUGQAwQJvgQAAOw==) no-repeat scroll center center; 4 | background-size: 12px 12px; 5 | } 6 | .leaflet-control-zoom-min:focus { 7 | outline: 0; 8 | } 9 | .leaflet-control-zoom-min.leaflet-disabled { 10 | background-image: url(data:image/gif;base64,R0lGODlhGAAYAOZGAHp6eoWFhX9/f3t7e4KCgtvb2319faSkpJSUlMTExOzs7JiYmO/v79DQ0KWlpdXV1ZeXl8LCwq2trZWVldTU1KysrJOTk8HBwbS0tLW1tZ2dnaOjo5ubm9nZ2aurq+bm5oCAgMPDw+vr6+np6ZKSkomJicXFxYuLi9zc3Lm5ub+/v+Dg4J6enszMzMDAwN3d3djY2Pr6+oODg46OjqCgoHx8fJGRkaqqqr29vaampqenp7a2to+Pj7Ozs7u7u9HR0aKioqmpqX5+fs7OzsfHx66urv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEYALAAAAAAYABgAQAf/gEaCg0YMERskBAQkGxeEhCoAkhOPlR8GkpmOApmdICwUBSednQKDDwMALo89nBwTnQMPggSkKYQvFC2knQSDJqm8ACWCIwsAAyaVRh0ByAs1HBYGzpkBHY8VABDLRigQP4MemRVGCJk83UYwIMIWB7xCDUYQAJjCkgeF1fgW84IpMAVgsKwIJ2ECJKgTpMDDQV4CKojoFiKVBhQrVhSIkUADqQERCClw5qNSNSJGMuSwNtEIJwNDuiko9mBHJlPwJN1Y+KEErwO1MmHohgEfgXOdZuAQBERSEHwAEEQQNkFBgws0oAIIYUSCVh0HZKhwMCqTQkEFguGjMCgDsgKVFwrw62QjwTEAAeAuNJLAAQJFCBwk6BYIADs=); 11 | } -------------------------------------------------------------------------------- /themes/odi/static/vendor/L.Control.ZoomMin.js: -------------------------------------------------------------------------------- 1 | L.Control.ZoomMin = L.Control.Zoom.extend({ 2 | options: { 3 | position: "topleft", 4 | zoomInText: "+", 5 | zoomInTitle: "Zoom in", 6 | zoomOutText: "-", 7 | zoomOutTitle: "Zoom out", 8 | zoomMinText: "Zoom min", 9 | zoomMinTitle: "Zoom min" 10 | }, 11 | 12 | onAdd: function (map) { 13 | var zoomName = "leaflet-control-zoom" 14 | , container = L.DomUtil.create("div", zoomName + " leaflet-bar") 15 | , options = this.options 16 | 17 | this._map = map 18 | 19 | this._zoomInButton = this._createButton(options.zoomInText, options.zoomInTitle, 20 | zoomName + '-in', container, this._zoomIn, this) 21 | 22 | this._zoomOutButton = this._createButton(options.zoomOutText, options.zoomOutTitle, 23 | zoomName + '-out', container, this._zoomOut, this) 24 | 25 | this._zoomMinButton = this._createButton(options.zoomMinText, options.zoomMinTitle, 26 | zoomName + '-min', container, this._zoomMin, this) 27 | 28 | this._updateDisabled() 29 | map.on('zoomend zoomlevelschange', this._updateDisabled, this) 30 | 31 | return container 32 | }, 33 | 34 | _zoomMin: function () { 35 | this._map.setZoom(this._map.getMinZoom()) 36 | }, 37 | 38 | _updateDisabled: function () { 39 | var map = this._map 40 | , className = "leaflet-disabled" 41 | 42 | L.DomUtil.removeClass(this._zoomInButton, className) 43 | L.DomUtil.removeClass(this._zoomOutButton, className) 44 | L.DomUtil.removeClass(this._zoomMinButton, className) 45 | 46 | if (map._zoom === map.getMinZoom()) { 47 | L.DomUtil.addClass(this._zoomOutButton, className) 48 | } 49 | 50 | if (map._zoom === map.getMaxZoom()) { 51 | L.DomUtil.addClass(this._zoomInButton, className) 52 | } 53 | 54 | if (map._zoom === map.getMinZoom()) { 55 | L.DomUtil.addClass(this._zoomMinButton, className) 56 | } 57 | } 58 | }) -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/static/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/.csslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "adjoining-classes": false, 3 | "box-sizing": false, 4 | "box-model": false, 5 | "compatible-vendor-prefixes": false, 6 | "floats": false, 7 | "font-sizes": false, 8 | "gradients": false, 9 | "important": false, 10 | "known-properties": false, 11 | "outline-none": false, 12 | "qualified-headings": false, 13 | "regex-selectors": false, 14 | "shorthand": false, 15 | "text-indent": false, 16 | "unique-headings": false, 17 | "universal-selector": false, 18 | "unqualified-attributes": false 19 | } 20 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissible alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. 41 | .alert-dismissible { 42 | padding-right: (@alert-padding + 20); 43 | 44 | // Adjust close link position 45 | .close { 46 | position: relative; 47 | top: -2px; 48 | right: -21px; 49 | color: inherit; 50 | } 51 | } 52 | 53 | // Alternate styles 54 | // 55 | // Generate contextual modifier classes for colorizing the alert. 56 | 57 | .alert-success { 58 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 59 | } 60 | .alert-info { 61 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 62 | } 63 | .alert-warning { 64 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 65 | } 66 | .alert-danger { 67 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 68 | } 69 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | .btn-xs & { 32 | top: 0; 33 | padding: 1px 5px; 34 | } 35 | 36 | // Hover state, but only for links 37 | a& { 38 | &:hover, 39 | &:focus { 40 | color: @badge-link-hover-color; 41 | text-decoration: none; 42 | cursor: pointer; 43 | } 44 | } 45 | 46 | // Account for badges in navs 47 | a.list-group-item.active > &, 48 | .nav-pills > .active > a > & { 49 | color: @badge-active-color; 50 | background-color: @badge-active-bg; 51 | } 52 | .nav-pills > li > a > & { 53 | margin-left: 3px; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/bootstrap.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "variables.less"; 3 | @import "mixins.less"; 4 | 5 | // Reset and dependencies 6 | @import "normalize.less"; 7 | @import "print.less"; 8 | @import "glyphicons.less"; 9 | 10 | // Core CSS 11 | @import "scaffolding.less"; 12 | @import "type.less"; 13 | @import "code.less"; 14 | @import "grid.less"; 15 | @import "tables.less"; 16 | @import "forms.less"; 17 | @import "buttons.less"; 18 | 19 | // Components 20 | @import "component-animations.less"; 21 | @import "dropdowns.less"; 22 | @import "button-groups.less"; 23 | @import "input-groups.less"; 24 | @import "navs.less"; 25 | @import "navbar.less"; 26 | @import "breadcrumbs.less"; 27 | @import "pagination.less"; 28 | @import "pager.less"; 29 | @import "labels.less"; 30 | @import "badges.less"; 31 | @import "jumbotron.less"; 32 | @import "thumbnails.less"; 33 | @import "alerts.less"; 34 | @import "progress-bars.less"; 35 | @import "media.less"; 36 | @import "list-group.less"; 37 | @import "panels.less"; 38 | @import "responsive-embed.less"; 39 | @import "wells.less"; 40 | @import "close.less"; 41 | 42 | // Components w/ JavaScript 43 | @import "modals.less"; 44 | @import "tooltip.less"; 45 | @import "popovers.less"; 46 | @import "carousel.less"; 47 | 48 | // Utility classes 49 | @import "utilities.less"; 50 | @import "responsive-utilities.less"; 51 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: @breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | button& { 27 | padding: 0; 28 | cursor: pointer; 29 | background: transparent; 30 | border: 0; 31 | -webkit-appearance: none; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | border-radius: @border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 4px; 26 | font-size: 90%; 27 | color: @kbd-color; 28 | background-color: @kbd-bg; 29 | border-radius: @border-radius-small; 30 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 31 | 32 | kbd { 33 | padding: 0; 34 | font-size: 100%; 35 | font-weight: bold; 36 | box-shadow: none; 37 | } 38 | } 39 | 40 | // Blocks of code 41 | pre { 42 | display: block; 43 | padding: ((@line-height-computed - 1) / 2); 44 | margin: 0 0 (@line-height-computed / 2); 45 | font-size: (@font-size-base - 1); // 14px to 13px 46 | line-height: @line-height-base; 47 | word-break: break-all; 48 | word-wrap: break-word; 49 | color: @pre-color; 50 | background-color: @pre-bg; 51 | border: 1px solid @pre-border-color; 52 | border-radius: @border-radius-base; 53 | 54 | // Account for some code outputs that place code tags in pre tags 55 | code { 56 | padding: 0; 57 | font-size: inherit; 58 | color: inherit; 59 | white-space: pre-wrap; 60 | background-color: transparent; 61 | border-radius: 0; 62 | } 63 | } 64 | 65 | // Enable scrollable blocks of code 66 | .pre-scrollable { 67 | max-height: @pre-scrollable-max-height; 68 | overflow-y: scroll; 69 | } 70 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | visibility: hidden; 21 | 22 | &.in { display: block; visibility: visible; } 23 | tr&.in { display: table-row; } 24 | tbody&.in { display: table-row-group; } 25 | } 26 | 27 | .collapsing { 28 | position: relative; 29 | height: 0; 30 | overflow: hidden; 31 | .transition-property(~"height, visibility"); 32 | .transition-duration(.35s); 33 | .transition-timing-function(ease); 34 | } 35 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | .container-fixed(); 12 | 13 | @media (min-width: @screen-sm-min) { 14 | width: @container-sm; 15 | } 16 | @media (min-width: @screen-md-min) { 17 | width: @container-md; 18 | } 19 | @media (min-width: @screen-lg-min) { 20 | width: @container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | .container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | .make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | .make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | .make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: @screen-sm-min) { 65 | .make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: @screen-md-min) { 74 | .make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding: @jumbotron-padding (@jumbotron-padding / 2); 8 | margin-bottom: @jumbotron-padding; 9 | color: @jumbotron-color; 10 | background-color: @jumbotron-bg; 11 | 12 | h1, 13 | .h1 { 14 | color: @jumbotron-heading-color; 15 | } 16 | p { 17 | margin-bottom: (@jumbotron-padding / 2); 18 | font-size: @jumbotron-font-size; 19 | font-weight: 200; 20 | } 21 | 22 | > hr { 23 | border-top-color: darken(@jumbotron-bg, 10%); 24 | } 25 | 26 | .container &, 27 | .container-fluid & { 28 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 29 | } 30 | 31 | .container { 32 | max-width: 100%; 33 | } 34 | 35 | @media screen and (min-width: @screen-sm-min) { 36 | padding: (@jumbotron-padding * 1.6) 0; 37 | 38 | .container & { 39 | padding-left: (@jumbotron-padding * 2); 40 | padding-right: (@jumbotron-padding * 2); 41 | } 42 | 43 | h1, 44 | .h1 { 45 | font-size: (@font-size-base * 4.5); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | a& { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/media.less: -------------------------------------------------------------------------------- 1 | .media { 2 | // Proper spacing between instances of .media 3 | margin-top: 15px; 4 | 5 | &:first-child { 6 | margin-top: 0; 7 | } 8 | } 9 | 10 | .media-right, 11 | .media > .pull-right { 12 | padding-left: 10px; 13 | } 14 | 15 | .media-left, 16 | .media > .pull-left { 17 | padding-right: 10px; 18 | } 19 | 20 | .media-left, 21 | .media-right, 22 | .media-body { 23 | display: table-cell; 24 | vertical-align: top; 25 | } 26 | 27 | .media-middle { 28 | vertical-align: middle; 29 | } 30 | 31 | .media-bottom { 32 | vertical-align: bottom; 33 | } 34 | 35 | // Reset margins on headings for tighter default spacing 36 | .media-heading { 37 | margin-top: 0; 38 | margin-bottom: 5px; 39 | } 40 | 41 | // Media list variation 42 | // 43 | // Undo default ul/ol styles 44 | .media-list { 45 | padding-left: 0; 46 | list-style: none; 47 | } 48 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/labels.less"; 9 | @import "mixins/reset-filter.less"; 10 | @import "mixins/resize.less"; 11 | @import "mixins/responsive-visibility.less"; 12 | @import "mixins/size.less"; 13 | @import "mixins/tab-focus.less"; 14 | @import "mixins/text-emphasis.less"; 15 | @import "mixins/text-overflow.less"; 16 | @import "mixins/vendor-prefixes.less"; 17 | 18 | // Components 19 | @import "mixins/alerts.less"; 20 | @import "mixins/buttons.less"; 21 | @import "mixins/panels.less"; 22 | @import "mixins/pagination.less"; 23 | @import "mixins/list-group.less"; 24 | @import "mixins/nav-divider.less"; 25 | @import "mixins/forms.less"; 26 | @import "mixins/progress-bar.less"; 27 | @import "mixins/table-row.less"; 28 | 29 | // Skins 30 | @import "mixins/background-variant.less"; 31 | @import "mixins/border-radius.less"; 32 | @import "mixins/gradients.less"; 33 | 34 | // Layout 35 | @import "mixins/clearfix.less"; 36 | @import "mixins/center-block.less"; 37 | @import "mixins/nav-vertical-align.less"; 38 | @import "mixins/grid-framework.less"; 39 | @import "mixins/grid.less"; 40 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | background-color: @background; 5 | border-color: @border; 6 | color: @text-color; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | .alert-link { 12 | color: darken(@text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover { 6 | background-color: darken(@color, 10%); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | // Easily pump out default styles, as well as :hover, :focus, :active, 4 | // and disabled options for all buttons 5 | 6 | .button-variant(@color; @background; @border) { 7 | color: @color; 8 | background-color: @background; 9 | border-color: @border; 10 | 11 | &:hover, 12 | &:focus, 13 | &.focus, 14 | &:active, 15 | &.active, 16 | .open > .dropdown-toggle& { 17 | color: @color; 18 | background-color: darken(@background, 10%); 19 | border-color: darken(@border, 12%); 20 | } 21 | &:active, 22 | &.active, 23 | .open > .dropdown-toggle& { 24 | background-image: none; 25 | } 26 | &.disabled, 27 | &[disabled], 28 | fieldset[disabled] & { 29 | &, 30 | &:hover, 31 | &:focus, 32 | &.focus, 33 | &:active, 34 | &.active { 35 | background-color: @background; 36 | border-color: @border; 37 | } 38 | } 39 | 40 | .badge { 41 | color: @background; 42 | background-color: @color; 43 | } 44 | } 45 | 46 | // Button sizes 47 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 48 | padding: @padding-vertical @padding-horizontal; 49 | font-size: @font-size; 50 | line-height: @line-height; 51 | border-radius: @border-radius; 52 | } 53 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /themes/odi/static/vendor/bootstrap/less/mixins/forms.less: -------------------------------------------------------------------------------- 1 | // Form validation states 2 | // 3 | // Used in forms.less to generate the form validation CSS for warnings, errors, 4 | // and successes. 5 | 6 | .form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { 7 | // Color the label and help text 8 | .help-block, 9 | .control-label, 10 | .radio, 11 | .checkbox, 12 | .radio-inline, 13 | .checkbox-inline, 14 | &.radio label, 15 | &.checkbox label, 16 | &.radio-inline label, 17 | &.checkbox-inline label { 18 | color: @text-color; 19 | } 20 | // Set the border and box shadow on specific inputs to match 21 | .form-control { 22 | border-color: @border-color; 23 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work 24 | &:focus { 25 | border-color: darken(@border-color, 10%); 26 | @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); 27 | .box-shadow(@shadow); 28 | } 29 | } 30 | // Set validation states also for addons 31 | .input-group-addon { 32 | color: @text-color; 33 | border-color: @border-color; 34 | background-color: @background-color; 35 | } 36 | // Optional feedback icon 37 | .form-control-feedback { 38 | color: @text-color; 39 | } 40 | } 41 | 42 | 43 | // Form control focus state 44 | // 45 | // Generate a customized focus state and for any input with the specified color, 46 | // which defaults to the `@input-border-focus` variable. 47 | // 48 | // We highly encourage you to not customize the default value, but instead use 49 | // this to tweak colors on an as-needed basis. This aesthetic change is based on 50 | // WebKit's default styles, but applicable to a wider range of browsers. Its 51 | // usability and accessibility should be taken into account with any change. 52 | // 53 | // Example usage: change the default blue border and shadow to white for better 54 | // contrast against a dark gray background. 55 | .form-control-focus(@color: @input-border-focus) { 56 | @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); 57 | &:focus { 58 | border-color: @color; 59 | outline: 0; 60 | .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); 61 | } 62 | } 63 | 64 | // Form control sizing 65 | // 66 | // Relative text size, padding, and border-radii changes for form controls. For 67 | // horizontal sizing, wrap controls in the predefined grid classes. ` 5 | 6 | 7 | -------------------------------------------------------------------------------- /themes/odi/templates/embed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | {% block head_css %}{% endblock head_css %} 9 | 17 | {% block head_scripts %}{% endblock head_scripts %} 18 | 19 | 20 | {% block content %}{% endblock content %} 21 | {% block body_scripts %} 22 | {% include '_analytics.html' %} 23 | {% endblock body_scripts %} 24 | 25 | 26 | -------------------------------------------------------------------------------- /themes/odi/templates/empty.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block content %} 4 |

5 | {{ gettext('We do not current have any data for %(page)s. But you can help change that!', page=page.title) }} 6 |

7 |
8 | 13 | 18 |
19 |
20 |
21 | {% endblock content %} 22 | -------------------------------------------------------------------------------- /themes/odi/templates/gallery.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block content %} 4 | {{ page.content }} 5 |
6 |
7 |
8 |

{{ gettext('Choropleth Map') }}

9 |

{{ gettext('Explore the Open Data Index via a coded world map.') }}

10 |

11 | 12 | 13 | {{ gettext('View now') }} 14 | 15 |

16 |
17 |
18 |
19 |
20 |

{{ gettext('Table overview') }}

21 |

{{ gettext('The whole Index displayed in an easy-to-read table.') }}

22 |

23 | 24 | 25 | {{ gettext('View now') }} 26 | 27 |

28 |
29 |
30 |
31 | {% endblock content %} 32 | -------------------------------------------------------------------------------- /themes/odi/templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block main %} 4 | {% from '_scope.html' import scope with context %} 5 | {% do scope.update({ 6 | 'embed_title': '%s ; %s'|format('All datasets', page.year), 7 | }) %} 8 | 9 |
10 |
11 |

{{ gettext('Tracking the state of government open data.') }}

12 | 21 |
22 |
23 | 24 |
25 |
26 |
27 | {% include 'dataviews/alt_summary.html' %} 28 |
29 |
{% include 'dataviews/embed_map.html' %}
30 |
31 |
32 |
33 | 34 |
35 |
36 | {% include 'dataviews/alt_general_stat.html' %} 37 |
38 |
39 |
40 | 41 | {% endblock main %} 42 | -------------------------------------------------------------------------------- /themes/odi/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block meta_title -%} 4 | {{ gettext('Read our user stories on the 2014 Open Data Index') }} | {{ super() }} 5 | {%- endblock meta_title %} 6 | 7 | {% block meta_description -%} 8 | {{ gettext('Read our user stories on the 2014 Open Data Index') }} 9 | {%- endblock meta_description %} 10 | 11 | {% block meta_keywords -%} 12 | {{ ODI.keywords }} 13 | {%- endblock meta_keywords %} 14 | 15 | {% block body_classes -%}stories{%- endblock body_classes %} 16 | {% block page_title -%}{{ gettext('Global %(name)s stories', name=SITENAME) }}{%- endblock page_title %} 17 | 18 | {% block breadcrumbs_inner %} 19 |
  • {{ gettext('Global %(name)s stories', name=SITENAME) }}
  • 20 | {% endblock breadcrumbs_inner %} 21 | 22 | {% block content -%} 23 |
    24 |
    25 |

    26 | {{ gettext('We invited the community to send in their 2014 open data index stories.') }} 27 |

    28 |

    29 | {{ gettext('Do you have a case study you would like to contribute?') }} {{ gettext('Send us an email') }} 30 |

    31 |
    32 |
    33 | {% block articles %} 34 | {% for category, articles in categories %} 35 |

    {{ category }}

    36 | {% for article in articles %} 37 |
    38 |
    39 |

    40 | {{ article.title }} / {{ article.author }} 41 |

    42 |
    43 | {{ article.summary }} 44 |
    45 | {{ gettext('Read more') }} 46 |
    47 |
    48 | {{ author }} {{ gettext('on the') }} {{ SITENAME }} 49 |
    50 |
    51 |
    52 | {% endfor %} 53 |
    54 |
    55 |
    56 |
    57 |
    58 | {% endfor %} 59 | {% endblock articles %} 60 | {%- endblock content %} 61 | -------------------------------------------------------------------------------- /themes/odi/templates/map.permalink.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block content %} 4 | {% from '_scope.html' import scope with context %} 5 | {{ page.content }} 6 | 9 | {% endblock content %} 10 | -------------------------------------------------------------------------------- /themes/odi/templates/na.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% block content %} 4 |

    {{ gettext('Sorry') }}

    5 |

    6 | {{ gettext('There is no data available for %(page)s in the Index.', page=page.title) }} 7 |

    8 | {% endblock content %} 9 | -------------------------------------------------------------------------------- /themes/odi/templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block meta_title -%} 4 | {{ page.title }} | {{ super() }} 5 | {%- endblock meta_title %} 6 | 7 | {% block meta_description -%} 8 | {% if scope and scope.metadescription %} 9 | {{ scope.metadescription }} 10 | {% else %} 11 | {{ ODI.description }} 12 | {% endif %} 13 | {%- endblock meta_description %} 14 | 15 | {% block meta_keywords -%} 16 | {% if scope and scope.metakeywords %} 17 | {{ scope.metakeywords }}, {{ ODI.keywords }} 18 | {% else %} 19 | {{ ODI.keywords }} 20 | {% endif %} 21 | {%- endblock meta_keywords %} 22 | 23 | {% block body_classes -%}{{ page.type }}{%- endblock body_classes %} 24 | {% block page_title -%}{{ page.title }}{%- endblock page_title %} 25 | 26 | {% block breadcrumbs_inner %} 27 |
  • {% if page.slug == 'about' %}{{ gettext('About') }}{% else %}{{ page.title }}{% endif %}
  • 28 | {% endblock breadcrumbs_inner %} 29 | 30 | {% block content -%} 31 | {{ page.content }} 32 | {%- endblock content %} 33 | -------------------------------------------------------------------------------- /themes/odi/templates/places.html: -------------------------------------------------------------------------------- 1 | {% extends 'page.html' %} 2 | 3 | {% from 'macros.html' import history, share %} 4 | {% from '_scope.html' import scope with context %} 5 | {% set fragment = 'place' %} 6 | 7 | {% block heading %}{% endblock heading %} 8 | 9 | {% block breadcrumbs_inner %} 10 |
  • {{ gettext('Places') }}
  • 11 | {% endblock breadcrumbs_inner %} 12 | 13 | {% block content %} 14 | 20 | {% include 'dataviews/table_places.html' %} 21 | {% endblock content %} 22 | -------------------------------------------------------------------------------- /themes/odi/translations/en/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/translations/en/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /themes/odi/translations/es/LC_MESSAGES/messages.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okfn/opendataindex/4bf34a92c5f988e18b7e59065c0e5c2bfbd7bae6/themes/odi/translations/es/LC_MESSAGES/messages.mo -------------------------------------------------------------------------------- /utilities/__init__.py: -------------------------------------------------------------------------------- 1 | from . import filters 2 | -------------------------------------------------------------------------------- /utilities/filters.py: -------------------------------------------------------------------------------- 1 | """Custom Jinja filters.""" 2 | 3 | 4 | import sys 5 | import operator 6 | import json 7 | import jinja2 8 | import hashlib 9 | import mdx_urlize as urlize 10 | import markdown as mdlib 11 | import natsort as natsortlib 12 | 13 | md = mdlib.Markdown(extensions=[urlize.UrlizeExtension()]) 14 | 15 | operators = { 16 | '==': operator.eq, 17 | '!=': operator.ne, 18 | '>': operator.gt, 19 | '>=': operator.ge, 20 | '<': operator.lt, 21 | '<=': operator.le, 22 | 'is': operator.is_, 23 | 'is_not': operator.is_not 24 | } 25 | 26 | 27 | markdown_cache = {} 28 | def markdown(content): 29 | """Parse `content` as markdown.""" 30 | hash = hashlib.sha256(content.encode('ascii', 'replace')).hexdigest() 31 | if hash not in markdown_cache: 32 | markdown_cache[hash] = jinja2.Markup(md.convert(content)) 33 | return markdown_cache[hash] 34 | 35 | 36 | def where(iterable, key, value, op='=='): 37 | """Filter `iterable` of dicts on `key` where `key` `op` `value`""" 38 | operator_func = operators[op] 39 | return [o for o in iterable if operator_func(o[key], value)] 40 | 41 | 42 | def natsort(iterable, attribute=None, reverse=False): 43 | """Like sort, but, all natural. For us, sorts strings as numbers.""" 44 | _key = operator.itemgetter(attribute) 45 | return natsortlib.natsorted(iterable, key=_key, reverse=reverse) 46 | 47 | 48 | def tojson(content): 49 | """Parse content as JSON. Does not handle errors.""" 50 | return json.dumps(content) 51 | 52 | 53 | def debug(value): 54 | print(value) 55 | return '' 56 | 57 | 58 | search_cache = {} 59 | def search(items, namespace, **conditions): 60 | """Return new filtered list. 61 | 62 | Functions use cache to store indexed items. 63 | First time we index items using conditions, 64 | then we use indexed items to make fast searches. 65 | """ 66 | # Caclculate outer hash 67 | outer_keys = sorted(conditions.keys()) 68 | # It's like `-place-year` 69 | outer_hash = '-'.join([namespace] + outer_keys) 70 | 71 | # Calculate inner hash 72 | inner_keys = [] 73 | for outer_key in outer_keys: 74 | inner_keys.append(conditions[outer_key]) 75 | # It's like `au-2015` 76 | inner_hash = '-'.join(inner_keys) 77 | 78 | # Prepare indexed items 79 | if outer_hash not in search_cache: 80 | search_cache[outer_hash] = {} 81 | for item in items: 82 | item_keys = [] 83 | for outer_key in outer_keys: 84 | item_keys.append(item[outer_key]) 85 | # It's like `gb-2014` 86 | item_hash = '-'.join(item_keys) 87 | store = search_cache[outer_hash].setdefault(item_hash, []) 88 | store.append(item) 89 | 90 | return list(search_cache[outer_hash].get(inner_hash, [])) 91 | 92 | 93 | def first_or_default(items, default): 94 | """Return first item or default if items is empty. 95 | """ 96 | if items: 97 | return items[0] 98 | return default 99 | --------------------------------------------------------------------------------