diff --git a/ckanext/harvest/controllers/view.py b/ckanext/harvest/controllers/view.py index c84e68f..048bd7a 100644 --- a/ckanext/harvest/controllers/view.py +++ b/ckanext/harvest/controllers/view.py @@ -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' + api_url = config.get('ckan.api_url', 'http://localhost:5000').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) - def index(self): - """ - TODO: error handling - """ - # Request all harvesting sources - sources_url = self.api_url + '/harvestsource' - - doc = self._request_document(sources_url) - sources_ids = json.loads(doc) + try: + # Request all harvesting sources + sources_url = self.api_url + '/harvestsource' + + doc = urllib2.urlopen(sources_url).read() + sources_ids = json.loads(doc) - source_url = sources_url + '/%s' - sources = [] - for source_id in sources_ids: - doc = self._request_document(source_url % source_id) - sources.append(json.loads(doc)) - - c.sources = sources - return render('ckanext/harvest/index.html') + source_url = sources_url + '/%s' + sources = [] + + # For each source, request its details + for source_id in sources_ids: + 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': - """ - TODO: Authz - """ + # 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) - #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()) + 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')) + """ + if e.getcode() == 403: + abort(403) + else: + raise Exception('The forms API returned an error:' + str(e.getcode()) + ' ' + e.msg ) + """ + 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') diff --git a/templates/ckanext/harvest/create.html b/templates/ckanext/harvest/create.html index c12044a..606c7ac 100644 --- a/templates/ckanext/harvest/create.html +++ b/templates/ckanext/harvest/create.html @@ -11,29 +11,13 @@