OLD | NEW |
(Empty) | |
| 1 # coding: utf-8 |
| 2 |
| 3 # This Source Code is subject to the terms of the Mozilla Public License |
| 4 # version 2.0 (the "License"). You can obtain a copy of the License at |
| 5 # http://mozilla.org/MPL/2.0/. |
| 6 |
| 7 import os, MySQLdb, simplejson as json |
| 8 from urlparse import parse_qs |
| 9 from sitescripts.web import url_handler |
| 10 from sitescripts.utils import cached, get_config, setupStderr |
| 11 |
| 12 @url_handler("/submitData") |
| 13 def submit_data(environ, start_response): |
| 14 setupStderr(environ['wsgi.errors']) |
| 15 |
| 16 if environ["REQUEST_METHOD"].upper() != "POST": |
| 17 return showError("Unsupported request method", start_response) |
| 18 |
| 19 params = parse_qs(environ.get("QUERY_STRING", "")) |
| 20 requestVersion = params.get("version", ["0"])[0] |
| 21 data = "{}" |
| 22 try: |
| 23 data_length = int(environ.get("CONTENT_LENGTH", "0")) |
| 24 except ValueError: |
| 25 data_length = 0 |
| 26 if data_length != 0: |
| 27 data = environ["wsgi.input"].read(data_length) |
| 28 try: |
| 29 data = json.loads(data) |
| 30 except json.decoder.JSONDecodeError: |
| 31 return showError("Error while parsing JSON data.", start_response) |
| 32 |
| 33 db = _get_db() |
| 34 |
| 35 for domain, status in data.iteritems(): |
| 36 process_domain(db, domain, status) |
| 37 |
| 38 db.commit() |
| 39 |
| 40 response_headers = [("Content-type", "text/plain")] |
| 41 start_response("200 OK", response_headers) |
| 42 return [] |
| 43 |
| 44 def process_domain(db, domain, status): |
| 45 domain_id = _get_domain_id(db, domain) |
| 46 _increment_entry(db, domain_id, status) |
| 47 |
| 48 def showError(message, start_response): |
| 49 start_response("400 Processing Error", [("Content-Type", "text/plain; charset=
utf-8")]) |
| 50 return [message.encode("utf-8")] |
| 51 |
| 52 @cached(600) |
| 53 def _get_db(): |
| 54 database = get_config().get("urlfixer", "database") |
| 55 dbuser = get_config().get("urlfixer", "dbuser") |
| 56 dbpasswd = get_config().get("urlfixer", "dbpassword") |
| 57 if os.name == "nt": |
| 58 return MySQLdb.connect(user=dbuser, passwd=dbpasswd, db=database, |
| 59 use_unicode=True, charset="utf8", named_pipe=True) |
| 60 else: |
| 61 return MySQLdb.connect(user=dbuser, passwd=dbpasswd, db=database, |
| 62 use_unicode=True, charset="utf8") |
| 63 |
| 64 def _get_domain_id(db, domain): |
| 65 cursor = db.cursor(MySQLdb.cursors.DictCursor) |
| 66 cursor.execute("SELECT id FROM domains WHERE domain = %s", (domain)) |
| 67 result = cursor.fetchone() |
| 68 if result == None: |
| 69 cursor.execute("INSERT INTO domains(domain) VALUES (%s)", (domain)) |
| 70 return db.insert_id() |
| 71 else: |
| 72 return result["id"] |
| 73 |
| 74 def _increment_entry(db, domain_id, status): |
| 75 cursor = db.cursor(MySQLdb.cursors.DictCursor) |
| 76 cursor.execute("INSERT INTO corrections(domain, status, curr_month, prev_month
, curr_year, prev_year) VALUES (%s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE
curr_month = curr_month + 1, curr_year = curr_year + 1", (domain_id, status, 1,
0, 1, 0)) |
OLD | NEW |