source: osmose-frontend/errors.py

Last change on this file was f517d06, checked in by Frederic Rodrigo <fred.rodrigo@…>, 5 years ago

Replace 'error' by 'issue' in string deplayed at user

  • Property mode set to 100644
File size: 7.3 KB
Line 
1#! /usr/bin/env python
2#-*- coding: utf-8 -*-
3
4###########################################################################
5##                                                                       ##
6## Copyrights Etienne Chové <chove@crans.org> 2009                       ##
7##                                                                       ##
8## This program is free software: you can redistribute it and/or modify  ##
9## it under the terms of the GNU General Public License as published by  ##
10## the Free Software Foundation, either version 3 of the License, or     ##
11## (at your option) any later version.                                   ##
12##                                                                       ##
13## This program is distributed in the hope that it will be useful,       ##
14## but WITHOUT ANY WARRANTY; without even the implied warranty of        ##
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ##
16## GNU General Public License for more details.                          ##
17##                                                                       ##
18## You should have received a copy of the GNU General Public License     ##
19## along with this program.  If not, see <http://www.gnu.org/licenses/>. ##
20##                                                                       ##
21###########################################################################
22
23from bottle import route, request, template, response, abort, redirect
24from tools import utils
25from tools import query
26from tools import query_meta
27from tools.OrderedDict import OrderedDict
28import StringIO, re
29
30import errors_graph
31
32
33def _errors_geo(db, lang, params):
34    results = query._gets(db, params)
35    translate = utils.translator(lang)
36
37    features = []
38
39    for res in results:
40        properties = {"error_id": res["id"], "item": res["item"] or 0}
41        features.append({"type": "Feature", "geometry": {"type": "Point", "coordinates": [float(res["lon"]), float(res["lat"])]}, "properties": properties})
42
43    return {"type": "FeatureCollection", "features": features}
44
45
46def _errors(db, lang, params):
47    results = query._gets(db, params)
48    out = OrderedDict()
49
50    if not params.full:
51        out["description"] = ["lat", "lon", "error_id", "item"]
52    else:
53        out["description"] = ["lat", "lon", "error_id", "item", "source", "class", "elems", "subclass", "subtitle", "title", "level", "update", "username"]
54    out["errors"] = []
55
56    translate = utils.translator(lang)
57
58    for res in results:
59        lat       = res["lat"]
60        lon       = res["lon"]
61        error_id  = res["id"]
62        item      = res["item"] or 0
63
64        if not params.full:
65            out["errors"].append([str(lat), str(lon), str(error_id), str(item)])
66        else:
67            source    = res["source"]
68            classs    = res["class"]
69            elems     = res["elems"]
70            subclass  = res["subclass"]
71            subtitle  = translate.select(res["subtitle"])
72            title     = translate.select(res["title"])
73            level     = res["level"]
74            update    = res["timestamp"]
75            username  = res["username"] or ""
76            out["errors"].append([str(lat), str(lon), str(error_id), str(item), str(source), str(classs), str(elems), str(subclass), subtitle, title, str(level), str(update), username])
77
78    return out
79
80
81@route('/api/0.2/errors')
82def errors(db, lang):
83    params = query._params()
84    return _errors(db, lang, params)
85
86
87def int_list(s):
88    return map(lambda x: int(x), filter(lambda x: x and x!='',s).split(','))
89
90@route('/errors/graph.<format:ext>')
91def graph(db, format='png'):
92    class options:
93        sources = request.params.get('source', type=int_list, default=[])
94        classes = request.params.get('class', type=int_list, default=[])
95        items   = request.params.get('item', type=int_list, default=[])
96        levels  = request.params.get('level', type=int_list, default=[])
97        country = request.params.get('country')
98        if country <> None and not re.match(r"^([a-z_]+(\*|))$", country):
99            country = None
100
101    try:
102        data = errors_graph.make_plt(db, options, format)
103        response.content_type = {'png':'image/png', 'svg':'image/svg+xml', 'pdf':'application/pdf'}[format]
104        return data
105    except Exception, e:
106        response.content_type = "text/plain"
107        import traceback
108        out = StringIO.StringIO()
109        traceback.print_exc(file=out)
110        return out.getvalue() + "\n"
111
112
113@route('/errors')
114@route('/errors.<format:ext>')
115@route('/errors/')
116@route('/errors/done')
117@route('/errors/done.<format:ext>')
118@route('/errors/false-positive')
119@route('/errors/false-positive.<format:ext>')
120def index(db, lang, format=None):
121    if request.path.endswith("false-positive"):
122        title = _("False positives")
123        gen = "false-positive"
124    elif request.path.endswith("done"):
125        title = _("Fixed issues")
126        gen = "done"
127    else:
128        title = _("Informations")
129        gen = "error"
130
131    if not format in ('rss', 'gpx', 'josm'):
132        format = None
133
134    countries = query_meta._countries(db, lang) if format == None else None
135    items = query_meta._items(db, lang)
136
137    params = query._params()
138    params.status = {"error":"open", "false-positive": "false", "done":"done"}[gen]
139    params.limit = None
140
141    if format == None and params.item:
142        errors_groups = query._count(db, params, [
143            "dynpoi_class.item",
144            "dynpoi_class.source",
145            "dynpoi_class.class",
146            "source.country",
147            "source.analyser"],
148            ["dynpoi_item"], [
149            "first(dynpoi_item.menu) AS menu",
150            "first(dynpoi_class.title) AS title"],
151            orderBy = True)
152
153        total = 0
154        for res in errors_groups:
155            if res["count"] != -1:
156                total += res["count"]
157    else:
158        errors_groups = []
159        total = 0
160
161    params.limit = request.params.get('limit', type=int, default=100)
162    if params.limit > 10000:
163        params.limit = 10000
164
165    if (total > 0 and total < 1000) or params.limit:
166        params.full = True
167        errors = query._gets(db, params)
168        if gen in ("false-positive", "done"):
169            opt_date = "date"
170        else:
171            opt_date = "-1"
172    else:
173        opt_date = None
174        errors = None
175
176    if format == 'rss':
177        response.content_type = 'application/rss+xml'
178        tpl = 'errors/list.rss'
179    elif format == 'gpx':
180        response.content_type = 'application/gpx+xml'
181        tpl = 'errors/list.gpx'
182    elif format == 'josm':
183        objects = []
184        for res in errors:
185            if res["elems"]:
186                elems = res["elems"].split("_")
187                for e in elems:
188                    m = re.match(r"([a-z]+)([0-9]+)", e)
189                    if m:
190                        cur_type = m.group(1)
191                        objects.append(cur_type[0] + m.group(2))
192
193        response.status = 302
194        response.set_header('Location', 'http://localhost:8111/load_object?objects=%s' % ','.join(objects))
195        return
196    else:
197        tpl = 'errors/index'
198
199    return template(tpl, countries=countries, items=items, errors_groups=errors_groups, total=total, errors=errors, query=request.query_string, country=params.country, item=params.item, translate=utils.translator(lang), gen=gen, opt_date=opt_date, title=title, website=utils.website)
Note: See TracBrowser for help on using the repository browser.