source: osmose-frontend/control.py @ dc7e2b1

Last change on this file since dc7e2b1 was dc7e2b1, checked in by Jocelyn Jaubert <jocelyn.jaubert@…>, 6 years ago

Fixes for updating frontend database

  • Property mode set to 100644
File size: 4.2 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, response, template, post
24from tools import utils
25import tools.update
26import os
27import sys
28
29@route('/control/update')
30def updates(db):
31    db.execute("""
32SELECT DISTINCT ON (source)
33    source,
34    EXTRACT(EPOCH FROM ((now())-timestamp)) AS age,
35    remote_url,
36    remote_ip
37FROM
38    dynpoi_update
39ORDER BY
40    source ASC,
41    timestamp DESC
42""")
43    lasts = {}
44    for res in db.fetchall():
45        lasts[int(res["source"])] = res
46
47    sources = utils.get_sources()
48
49    liste = []
50    for source_id in [str(y) for y in sorted([int(x) for x in sources])]:
51        like = sources[source_id].get("like", source_id)
52        if int(source_id) in lasts:
53            age  = lasts[int(source_id)]["age"]
54            if age >= 0:
55                # TRANSLATORS: days / hours / minutes since last source update, abbreviated to d / h / m
56                txt = _("{day}d, {hour}h, {minute}m ago").format(day=int(age/86400), hour=int(age/3600)%24, minute=int(age/60)%60)
57            else:
58                txt = _("in {day}d, {hour}h, {minute}m").format(day=int(-age/86400), hour=int(-age/3600)%24, minute=int(-age/60)%60)
59            liste.append((sources[source_id]["comment"], age, txt, source_id))
60        else:
61            liste.append((sources[source_id]["comment"], 1e10, _("never generated"), source_id))
62    liste.sort(lambda x, y: -cmp(x[1], y[1]))
63
64    return template('control/updates', liste=liste)
65
66
67@route('/control/update/<source:int>')
68def update(db, source=None):
69    sql = "SELECT source,timestamp,remote_url,remote_ip FROM dynpoi_update WHERE source=%d ORDER BY timestamp DESC;" % source
70    db.execute(sql)
71    return template('control/update', liste=db.fetchall())
72
73
74@route('/control/i18n')
75def update():
76    return os.popen("cd po && make statistics | sed -n '1h;2,$H;${g;s/\\n/<br>/g;p}'").read()
77
78
79@route('/control/lang')
80def update(lang):
81    out = request.headers['Accept-Language'] + "\n"
82    out += "\n".join(lang)
83    response.content_type = "text/plain; charset=utf-8"
84    return out
85
86
87@post('/control/send-update')
88@post('/cgi-bin/update.py') # Backward compatibility
89def send_update():
90    code = request.params.get('code')
91    url = request.params.get('url')
92
93    response.content_type = "text/plain; charset=utf-8"
94
95    if not code or not url:
96        return "FAIL"
97
98    sources = utils.get_sources()
99    for s in sources:
100        if sources[s].get("updatecode", 0) <> code:
101            continue
102        try:
103            tools.update.update(sources[s], url)
104        except:
105            import traceback
106            from cStringIO import StringIO
107            import smtplib
108            s = StringIO()
109            sys.stderr = s
110            traceback.print_exc()
111            sys.stderr = sys.__stderr__
112            traceback = s.getvalue()
113            return traceback.rstrip()
114
115        return "OK"
116
117    return "AUTH FAIL"
Note: See TracBrowser for help on using the repository browser.