diff options
author | Michael Hudson <michael.hudson@linaro.org> | 2011-03-08 12:07:00 +1300 |
---|---|---|
committer | Michael Hudson <michael.hudson@linaro.org> | 2011-03-08 12:07:00 +1300 |
commit | 256d5d14cbdba31ef34c0f80235796723a17a213 (patch) | |
tree | 0bcf00e36645c49b3c3cc1ab43f50b6401a1b445 /android_build/frontend/views.py | |
parent | 92d85b8389bdb4bda3840ec6077ec1936c8a45b5 (diff) |
split api.py from views.py
Diffstat (limited to 'android_build/frontend/views.py')
-rw-r--r-- | android_build/frontend/views.py | 115 |
1 files changed, 4 insertions, 111 deletions
diff --git a/android_build/frontend/views.py b/android_build/frontend/views.py index 8836e0a..3aecd41 100644 --- a/android_build/frontend/views.py +++ b/android_build/frontend/views.py @@ -1,15 +1,11 @@ -import base64 -import urllib2 - from django.conf import settings -from django.http import HttpResponse from django.template import RequestContext from django.shortcuts import ( render_to_response, ) -from django.contrib.auth import decorators - -from lxml import etree +from django.contrib.auth.decorators import ( + login_required +) config_template = '''\ var globalConfig = { @@ -56,109 +52,6 @@ def build_details(request, buildName): return _render(request, 'buildDetails.html', data) -@decorators.login_required +@login_required def new(request): return _render(request, 'new.html') - - -auth_headers = { - 'Authorization': 'Basic %s' % ( - base64.encodestring('%s:%s' % ( - 'admin', 'password'))[:-1],), - } - -createItem_headers = auth_headers -createItem_headers['Content-Type'] = 'text/xml' - -def _authJenkins(jenkins_path, data=None): - req = urllib2.Request( - settings.ADMIN_JENKINS_URL + jenkins_path, data, auth_headers) - resp = urllib2.urlopen(req) - return resp.read() - -def messageFromJenkinsErrorPage(page_text): - tree = etree.XML(page_text) - return tree.xpath('//p[../a[@name="skip2content"]]')[0].text - -def getJobConfig(job_name): - try: - return _authJenkins('job/' + job_name + '/config.xml') - except urllib2.HTTPError, e: - # handle 404 here? - import subprocess - proc = subprocess.Popen( - ['tidy', '-q','-asxhtml'], stdout=subprocess.PIPE, - stdin=subprocess.PIPE) - proc.stdin.write(e.read()) - proc.stdin.close() - tree = etree.XML(proc.stdout.read().replace('xmlns="http://www.w3.org/1999/xhtml"', '')) - message = tree.xpath('//h1')[0].tail[1:] - return HttpResponse(message, status=500) - -def replaceConfigDefault(configXml, newValue): - doc_root = etree.XML(configXml) - defaultValue = doc_root.xpath('//defaultValue[../name="CONFIG"]')[0] - defaultValue.text = base64.encodestring(newValue) - return etree.tostring(doc_root) - -def postConfig(url, configXml): - req = urllib2.Request(settings.ADMIN_JENKINS_URL + url, configXml, createItem_headers) - try: - urllib2.urlopen(req).read() - return None - except Exception, e: - return HttpResponse( - messageFromJenkinsErrorPage(e.read()), - status=500) - -@decorators.login_required -def api(request, method): - if method == 'new': - return api_new(request) - elif method == 'build-now': - print request.POST['build'] - job_name = request.POST['build'][1:].replace('/', '_', 1) - _authJenkins('job/' + job_name + '/buildWithParameters?delay=0sec') - return HttpResponse(status=200) - elif method == "delete": - job_name = request.POST['build'][1:].replace('/', '_', 1) - owningUser = job_name.split('_')[0] - if owningUser != request.user.username: - return HttpResponse(status=403) - else: - _authJenkins('job/' + job_name + '/doDelete', {}) - return HttpResponse(status=200) - elif method == "edit": - job_name = request.POST['build'][1:].replace('/', '_', 1) - new_text = request.POST['newText'] - oldConfig = getJobConfig(job_name) - newConfig = replaceConfigDefault(oldConfig, new_text) - owningUser = job_name.split('_')[0] - if owningUser != request.user.username: - return HttpResponse(status=403) - else: - resp = postConfig('job/' + job_name + '/config.xml', newConfig) - if resp: - return resp - return HttpResponse(status=200) - else: - print method - return HttpResponse(status=404) - -def api_new(request): - try: - new_job_name = request.user.username + '_' + request.POST['name'] - xml_base = getJobConfig('blank') - if isinstance(xml_base, HttpResponse): - return xml_base - new_config = replaceConfigDefault(xml_base, request.POST['config']) - resp = postConfig('createItem?name=' + new_job_name, new_config) - if resp: - return resp - if request.POST.get('buildNow', False): - _authJenkins('job/' + new_job_name + '/buildWithParameters?delay=0sec') - return HttpResponse( - '~%s/%s' % (request.user.username, request.POST['name']), - status=200) - except Exception, e: - return HttpResponse("Unknown error:" + str(e), status=500) |