Add controller to create a harvesting source

Before sending a create request to the forms API, an authz header is
added, with the API key defined in the config file
(ckan.harvesting.api_key). Also the data is formatted as the JSON object
expected by the forms API.
This commit is contained in:
Adrià Mercader 2011-03-10 14:02:21 +00:00
parent 1768dee13e
commit ad239b93e8
2 changed files with 66 additions and 59 deletions

View File

@ -1,63 +1,86 @@
import simplejson as json
from ckan.lib.helpers import json
import urllib2
import ckan.lib.helpers as h
from ckan.lib.base import BaseController, c, g, request, \
response, session, render, config, abort
response, session, render, config, abort, redirect
#from ..dictization import *
class ViewController(BaseController):
api_url = config.get('ckan.api_url', '/').rstrip('/')+'/api/2/rest'
def _request_document(self,url,data = False):
try:
doc = urllib2.urlopen(url).read()
return doc
except urllib2.URLError:
#TODO: log?
abort(500)
api_url = config.get('ckan.api_url', 'http://localhost:5000').rstrip('/')+'/api/2/rest'
def index(self):
"""
TODO: error handling
"""
try:
# Request all harvesting sources
sources_url = self.api_url + '/harvestsource'
doc = self._request_document(sources_url)
doc = urllib2.urlopen(sources_url).read()
sources_ids = json.loads(doc)
source_url = sources_url + '/%s'
sources = []
# For each source, request its details
for source_id in sources_ids:
doc = self._request_document(source_url % source_id)
doc = urllib2.urlopen(source_url % source_id).read()
sources.append(json.loads(doc))
c.sources = sources
return render('ckanext/harvest/index.html')
except urllib2.HTTPError as e:
raise Exception('The forms API returned an error:' + str(e.getcode()) + ' ' + e.msg )
def create(self):
# This is the DGU form API, so we don't use self.api_url
form_url = config.get('ckan.api_url', '/').rstrip('/') + \
'/api/2/form/harvestsource/create'
# Create a Request object to define the Authz header
http_request = urllib2.Request(
url = form_url,
headers = {'Authorization' : config.get('ckan.harvesting.api_key')}
)
if request.method == 'GET':
c.form = self._request_document(form_url)
# Request the fields
c.form = urllib2.urlopen(http_request).read()
return render('ckanext/harvest/create.html')
if request.method == 'POST':
# Build an object like the one expected by the DGU form API
data = {
'form_data':
{'HarvestSource--url': request.POST['HarvestSource--url'],
'HarvestSource--description': request.POST['HarvestSource--description']},
'user_ref':'',
'publisher_ref':''
}
data = json.dumps(data)
http_request.add_data(data)
try:
r = urllib2.urlopen(http_request)
h.flash_success('Harvesting source added successfully')
redirect(h.url_for(controller='harvest', action='index'))
except urllib2.HTTPError as e:
h.flash_error('An error occurred: ' + str(e.getcode()) + ' ' + e.msg)
redirect(h.url_for(controller='harvest', action='create'))
"""
TODO: Authz
if e.getcode() == 403:
abort(403)
else:
raise Exception('The forms API returned an error:' + str(e.getcode()) + ' ' + e.msg )
"""
#raw_post_data = request.environ['wsgi.input'].read(int(request.environ['CONTENT_LENGTH']))
raw_post_data = request.environ['wsgi.input'].read()
r = urllib2.urlopen(form_url,raw_post_data)
return str(r.getcode())
def show(self,id):
sources_url = self.api_url + '/harvestsource/%s' % id
doc = self._request_document(sources_url)
try:
doc = urllib2.urlopen(sources_url).read()
except urllib2.HTTPError as e:
raise Exception('The forms API returned an error:' + str(e.getcode()) + ' ' + e.msg )
c.source = json.loads(doc)
return render('ckanext/harvest/show.html')

View File

@ -12,28 +12,12 @@
<div py:match="content">
<div class="harvest-content">
<h1>Add harvesting source</h1>
<form action="create" method="POST">
${Markup(c.form)}
<div class="submit">
<input id="save" name="save" value="Save" type="button" />
<input id="save" name="save" value="Save" type="submit" />
</form>
</div>
</div>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
$('#save').click(function(){
$.post(
'http://localhost:5000/harvest/create',
{'HarvestSource--url':$('#HarvestSource--url').val(),
'HarvestSource--description':$('#HarvestSource--description').val()},
function(data,status,xhr){
alert(status);
})
});
});
//]]>
</script>
</div>
<xi:include href="../../layout.html" />
</html>