raylu 12 лет назад
Родитель
Сommit
4fb8abde07
4 измененных файлов с 39 добавлено и 12 удалено
  1. 11 6
      db/queries.py
  2. 14 6
      web/api.py
  3. 7 0
      web/static/css/base.ccss
  4. 7 0
      web/static/js/common.js

+ 11 - 6
db/queries.py

@@ -27,6 +27,8 @@ def kill_list(entity_type, entity_id):
 			SELECT DISTINCT kill_id FROM characters
 			WHERE {}_id = ? ORDER BY kill_id DESC LIMIT 50
 			'''.format(entity_type), entity_id)
+		if len(kills) == 0:
+			return None
 		kill_ids = list(map(operator.itemgetter('kill_id'), kills))
 		kills = db.query(c, '''
 			SELECT kills.kill_id, kill_time, cost,
@@ -72,12 +74,15 @@ def kill_list(entity_type, entity_id):
 
 def kill(kill_id):
 	with db.cursor() as c:
-		kill = db.get(c, '''
-			SELECT kill_time, cost, solarSystemName AS system_name, security FROM kills
-			JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
-			JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
-			WHERE kills.kill_id = ?
-			''', kill_id)
+		try:
+			kill = db.get(c, '''
+				SELECT kill_time, cost, solarSystemName AS system_name, security FROM kills
+				JOIN kill_costs ON kill_costs.kill_id = kills.kill_id
+				JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
+				WHERE kills.kill_id = ?
+				''', kill_id)
+		except db.NoRowsException:
+			return None
 		kill['kill_time'] = _format_kill_time(kill['kill_time'])
 		kill['security_status'] = _security_status(kill['system_name'], kill['security'])
 

+ 14 - 6
web/api.py

@@ -6,7 +6,7 @@ import tornado.web
 from config import web as config
 import db.queries
 
-class APIHandler(tornado.web.RequestHandler):
+class APIBaseHandler(tornado.web.RequestHandler):
 	def set_default_headers(self):
 		self.set_header('Access-Control-Allow-Origin', '*')
 		self.set_header('Access-Control-Allow-Headers', 'X-Requested-With, X-Request')
@@ -23,23 +23,31 @@ class APIHandler(tornado.web.RequestHandler):
 	def options(self, *args):
 		return
 
-class SearchHandler(APIHandler):
+class SearchHandler(APIBaseHandler):
 	def get(self):
 		q = self.get_argument('q')
 		data = db.queries.search(q)
 		self.respond_json(data)
 
-class KillListHandler(APIHandler):
+class KillListHandler(APIBaseHandler):
 	def get(self, entity_type, entity_id):
-		kills = db.queries.kill_list(entity_type, int(entity_id))
+		try:
+			entity_id = int(entity_id)
+		except ValueError:
+			raise tornado.web.HTTPError(404)
+		kills = db.queries.kill_list(entity_type, entity_id)
+		if kills is None:
+			raise tornado.web.HTTPError(404)
 		self.respond_json(kills)
 
-class KillHandler(APIHandler):
+class KillHandler(APIBaseHandler):
 	def get(self, kill_id):
 		kill = db.queries.kill(kill_id)
+		if kill is None:
+			raise tornado.web.HTTPError(404)
 		self.respond_json(kill)
 
-class TopCostHandler(APIHandler):
+class TopCostHandler(APIBaseHandler):
 	def get(self):
 		kills = db.queries.top_cost()
 		self.respond_json(kills)

+ 7 - 0
web/static/css/base.ccss

@@ -76,3 +76,10 @@ footer:
 	width: 900px
 	margin: 50px auto
 	text-align: center
+
+.error:
+	padding: 50px
+	text-align: center
+	font-size: 14pt
+	font-weight: bold
+	color: #e42

+ 7 - 0
web/static/js/common.js

@@ -10,6 +10,13 @@
 			new Request.JSON({
 				'url': ykill.api_host + path,
 				'onSuccess': cb,
+				'onFailure': function(xhr) {
+					$('wrapper').empty().grab(new Element('div', {
+						'class': 'error',
+						'html': 'as you pass through the wormhole you realize that it collapses behind you.' +
+							'<br>have you become trapped?'
+					}));
+				},
 			}).get();
 		},