Former-commit-id: d6e889dd374b721688275bc44b94427deb8caf03
--- a/documents/datagov-export.py
+++ b/documents/datagov-export.py
@@ -2,43 +2,18 @@
import couchdb
from ckanclient import CkanApiError
import re
+import html2text # aaronsw :(
+
class LoaderError(Exception):
pass
# Instantiate the CKAN client.
#ckan = ckanclient.CkanClient(base_location='http://localhost:5000/api', api_key='b47b24cd-591d-40c1-8677-d73101d56d1b')
-ckan = ckanclient.CkanClient(base_location='http://data.disclosurelo.gs/api', api_key='72f90359-0396-438c-804f-a26a24336747')
+ckan = ckanclient.CkanClient(base_location='http://data.disclosurelo.gs/api',
+ api_key='482a9dd2-a976-4adf-ac77-d71d92a98a52')
#couch = couchdb.Server('http://127.0.0.1:5984/')
couch = couchdb.Server('http://192.168.1.113:5984/')
-
-# http://stackoverflow.com/a/7778368/684978
-from HTMLParser import HTMLParser
-import htmlentitydefs
-
-class HTMLTextExtractor(HTMLParser):
- def __init__(self):
- HTMLParser.__init__(self)
- self.result = [ ]
-
- def handle_data(self, d):
- self.result.append(d)
-
- def handle_charref(self, number):
- codepoint = int(number[1:], 16) if number[0] in (u'x', u'X') else int(number)
- self.result.append(unichr(codepoint))
-
- def handle_entityref(self, name):
- codepoint = htmlentitydefs.name2codepoint[name]
- self.result.append(unichr(codepoint))
-
- def get_text(self):
- return u''.join(self.result)
-
-def html_to_text(html):
- s = HTMLTextExtractor()
- s.feed(html)
- return s.get_text()
# http://code.activestate.com/recipes/578019-bytes-to-human-human-to-bytes-converter/
SYMBOLS = {
@@ -118,6 +93,7 @@
return munge(input_name.replace(' ', '').replace('.', '_').replace('&', 'and'))
#return input_name.replace(' ', '').replace('.', '_').replace('&', 'and')
+
def get_licence_id(licencename):
map = {
"Creative Commons - Attribution-Share Alike 2.0 Australia (CC-SA)\nThe downloadable version of the database is licensed under CC-BY-SA Creative Commons Attribution Share Alike and contains only the database fields that are released under that license. These fields are object title, object number, object description as well as temporal, spatial and dimension details. It also contains a persistent URL for each record.": 'cc-by-sa',
@@ -131,9 +107,9 @@
"Creative Commons - Attribution 2.5 Australia (CC-BY)": 'cc-by',
'CreativeCommonsAttributionCCBY25': 'cc-by',
"PublicDomain": 'other-pd',
- }
+ }
if licencename not in map.keys():
- raise Exception(licencename + " not found");
+ raise Exception(licencename + " not found");
return map[licencename];
docsdb = couch['disclosr-documents']
@@ -144,43 +120,78 @@
if doc.value['url'] != "http://data.gov.au/data/":
# Collect the package metadata.
pkg_name = name_munge(doc.value['metadata']['DCTERMS.Title'][:100])
- tags = doc.value['metadata']["Keywords / Tags"]
- if not hasattr(tags, '__iter__'):
- tags = [tags]
- [re.sub('[^a-zA-Z0-9-_()]', '', tag).replace('&', 'and').lower() for tag in tags]
+ tags = []
+ if len(doc.value['metadata']["Keywords / Tags"]) > 0:
+ if hasattr(doc.value['metadata']["Keywords / Tags"], '__iter__'):
+ tags = tags + doc.value['metadata']["Keywords / Tags"]
+ else:
+ tags = tags + [doc.value['metadata']["Keywords / Tags"]]
+ if 'data.gov.au Category' in doc.value['metadata'].keys() and len(doc.value['metadata']['data.gov.au Category']) > 0:
+ if hasattr(doc.value['metadata']['data.gov.au Category'], '__iter__'):
+ tags = tags + doc.value['metadata']['data.gov.au Category']
+ else:
+ tags = tags + [doc.value['metadata']['data.gov.au Category']]
+ tags = [re.sub('[^a-zA-Z0-9-_.]', '', tag.replace('&', 'and')).lower() for tag in tags if tag]
+ print tags
package_entity = {
'name': pkg_name,
'title': doc.value['metadata']['DCTERMS.Title'],
'url': doc.value['metadata']['DCTERMS.Source.URI'],
-
+ 'tags': tags, #tags are mandatory?
'author': doc.value['metadata']["DCTERMS.Creator"],
'maintainer': doc.value['metadata']["DCTERMS.Creator"],
'licence_id': get_licence_id(doc.value['metadata']['DCTERMS.License']),
- 'notes': html_to_text(doc.value['metadata']['Description']),
+ 'notes': html2text.html2text(doc.value['metadata']['Description']),
}
- if len(tags) > 0:
- package_entity['tags'] = tags
- print tags
+
try:
- #print doc.id
+ print package_entity
ckan.package_register_post(package_entity)
except CkanApiError, e:
if ckan.last_status == 409:
- print "already exists"
+ print "package already exists"
else:
raise LoaderError('Unexpected status %s checking for package under \'%s\': %r' % (
ckan.last_status, pkg_name, e.args))
- print package_entity
- #todo add to organisation (author/creator/maintainer) http://docs.ckan.org/en/latest/apiv3.html#examples ckan.logic.action.update.package_owner_org_update
- #if 'data.gov.au Category' in doc.value['metadata'].keys(): #todo add to group
+
+ #add to group
+
+ group_name = name_munge(doc.value['metadata']["Agency"][:100])
+ try:
+ print ckan.group_entity_get(group_name)
+
+ # Update the group details
+ group_entity = ckan.last_message
+ print "group exists"
+ if 'packages' in group_entity.keys():
+ group_entity['packages'] = list(set(group_entity['packages'] + [pkg_name]))
+ else:
+ group_entity['packages'] = [pkg_name]
+ ckan.group_entity_put(group_entity)
+ except CkanApiError, e:
+ if ckan.last_status == 404:
+ print "group does not exist, creating"
+ group_entity = {
+ 'name': group_name,
+ 'title': doc.value['metadata']["Agency"],
+ 'description': doc.value['metadata']["Agency"],
+ 'packages': [pkg_name],
+ # 'type': "organization" # not allowed via API, use database query
+ # update "group" set type = 'organization';
+ }
+ print group_entity
+ ckan.group_register_post(group_entity)
+ else:
+ raise LoaderError('Unexpected status %s adding to group under \'%s\': %r' % (
+ ckan.last_status, pkg_name, e.args))
if 'Download' in doc.value['metadata'].keys():
try:
pkg = ckan.package_entity_get(pkg_name)
resources = pkg.get('resources', [])
if len(resources) < len(doc.value['metadata']['Download']):
for resource in doc.value['metadata']['Download']:
- print resource
+
# http://docs.ckan.org/en/ckan-1.7/domain-model-resource.html
# (KML/KMZ) / (Shapefile) /(Other)
format = "plain"
@@ -191,6 +202,7 @@
name = resource['href']
if 'name' in resource.keys():
name = resource['name']
+ print resource
ckan.add_package_resource(pkg_name, resource['href'], name=name, resource_type='data',
format=format, size=human2bytes(resource['size'].replace(',', '')))
else: