source: subversion/applications/editors/django/osmeditor/simple/views.py @ 13681

Last change on this file since 13681 was 13681, checked in by crschmidt, 10 years ago

add an improvement from springmeyer: login forms get prettier validation errors
now

File size: 4.5 KB
Line 
1from django.conf import settings
2from django import forms
3from django.shortcuts import render_to_response
4from django.http import HttpResponse, HttpResponseRedirect
5from django.forms.util import ValidationError
6import urllib
7
8try:
9    import httplib2
10except:
11    from third import httplib2
12
13from lib import osmparser
14
15def osmparser_obj(type, id, xml=None):
16    if not xml:
17        xml = get_xml_string(type, id)
18    output = osmparser.parseString(xml, site_url=settings.OSM_SERVER)
19    return output["%ss" % type][int(id)] 
20
21def get_xml_string(type, id):
22    url = "%s/%s/%s/full" % (settings.OSM_API, type, id)
23    if type == "node":
24        url = url.replace('/full','') # required because the API 404s on node/x/full - wtf?
25    h = httplib2.Http()   
26    (resp, content) = h.request(url)
27    if int(resp.status) != 200:
28        raise Exception("%s returned %s" % (url, resp.status))
29    return content
30
31def edit_osm_obj(type, id, post, session={}):
32    obj = osmparser_obj(type, id)
33    if obj.timestamp != post['timestamp']:
34        raise Exception("Object changed since you started editing it.")
35   
36    changed = False
37    for key in filter(lambda x: x.startswith("delete_"), post.keys()):
38        k = key.replace("delete_key_", "")
39        if k in obj.tags:
40            changed = True
41            del obj.tags[k]
42        else:
43            raise Exception("Huh? %s is not in tags" % k)
44   
45    for key in filter(lambda x: x.startswith("key_"), post.keys()):
46        k = key.replace("key_", "")
47        if k in obj.tags and post[key] != obj.tags[k]:
48            changed = True
49            obj.tags[k] = post[key]
50   
51    for key in filter(lambda x: x.startswith("new_key_"), post.keys()):
52        new_id = key.replace("new_key_", "")
53        kname = "new_key_%s" % new_id
54        vname = "new_value_%s" % new_id
55        if kname in post and vname in post:
56            k = post[kname]
57            v = post[vname]
58            if k and v:
59                obj.tags[k] = v
60                changed = True
61           
62    if not changed: return
63
64    username = post.get('username', None) or session.get("username", None)
65    password = post.get('password', None) or session.get("password", None)
66    if not username or not password:
67        raise Exception("Need username and password")
68    obj.save(username, password)
69    return obj
70
71def tag_sorter(a, b):
72    if ':' in a and not ':' in b:
73        return 1
74    elif ':' in b and not ':' in a:
75        return -1
76    return cmp(a,b)
77
78def load(request, type="node", id=0):
79    if request.method == "POST":
80        obj = edit_osm_obj(type, id, request.POST, request.session)
81        return HttpResponseRedirect(obj.local_url())   
82    xml = get_xml_string(type, id)
83    obj = osmparser_obj(type, id, xml=xml)
84   
85    tag_list = obj.tags.keys()
86    tag_list.sort(tag_sorter)
87    sorted_tags = []
88    for k in tag_list:
89        sorted_tags.append((k, obj.tags[k]))
90    return render_to_response("obj.html",{'obj':obj, 'obj_xml': xml, 
91        'sorted_tags': sorted_tags,
92        'logged_in': ('username' in request.session)})
93
94def home(request):
95    return render_to_response("home.html", {'logged_in': 'username' in request.session})
96
97class UserForm(forms.Form):
98    email = forms.CharField(max_length=255)
99    password = forms.CharField(widget=forms.PasswordInput)
100
101    def clean(self):
102        if self.cleaned_data.get('password') and self.cleaned_data.get('password'):
103            http = httplib2.Http()   
104            http.add_credentials(self.cleaned_data['email'], self.cleaned_data['password'])
105            url = "%s/user/details" % (settings.OSM_API)
106            resp, content = http.request(url, "GET")
107            if int(resp.status) == 200:
108                return self.cleaned_data
109            else:
110                raise ValidationError("Could not authenticate against OSM API") 
111                       
112
113def login(request):
114    if request.method == "POST":
115        form = UserForm(request.POST)
116        if form.is_valid():
117            request.session['username'] = form.cleaned_data['email']
118            request.session['password'] = form.cleaned_data['password']
119            return HttpResponseRedirect("/")
120    else:
121        form = UserForm()
122    return render_to_response("login.html", {'form': form})   
123
124def logout(request):
125    request.session.flush()
126    return HttpResponseRedirect("/")   
127
128def api_proxy(request, url):
129    http = httplib2.Http()   
130    url = "%s/%s?%s" % (settings.OSM_API, url, urllib.urlencode(request.GET))
131    resp, content = http.request(url, "GET")
132    return HttpResponse(content, content_type="application/osm+xml", status=resp.status)
Note: See TracBrowser for help on using the repository browser.