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

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

sort tags

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