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

Last change on this file since 13564 was 13564, checked in by crschmidt, 11 years ago

make map view work

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