blob: 4ffc5cfd5fc47897966b3d28a5dfa00621cc5b07 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
from d2.app.controllers import BaseController
from collections import namedtuple
from d2.app.adapters.detail import DetailAdapter
from d2.app.adapters.forge import ForgeAdapter
from d2.app.model.generate_svg_text import Svg
from d2.db import LabelCoordinate
from d2.db import Occupant
from d2.db import Plot
from d2.db import Map
class SvgTextController(BaseController):
MAKE_ROW = namedtuple('ResultRow', 'id type label x y')
def _fetch_map(self, map_id):
return self._db.session.query(Map).filter(
'id=:id').params(id=map_id).first()
def _fetch_data(self, map_id):
out = []
# get all plot_ids of a given map
plots = self._db.session.query(Plot).filter(
'map_id=:map_id').params(map_id=map_id).all()
plot_ids = [plot.id for plot in plots]
# select from forge where plot_id is in plots
forge_adapter = ForgeAdapter.load(self._config)
forge_records = forge_adapter.get_all_by_plot_ids(plot_ids)
# find each occupant's type, label and its coordinate
detail_adapter = DetailAdapter.load(self._config)
for forge_record in forge_records:
occupant_record = self._db.session.query(Occupant).filter(
"occupant_id=:occupant_id").params(
occupant_id=forge_record.occupant_id).first()
details = detail_adapter.details(None, forge_record.occupant_id)
if details:
label = details.label
coordinate = self._db.session.query(LabelCoordinate).filter(
"plot_id=:plot_id").filter(
"detail_type_id=:detail_type_id").params(
plot_id=forge_record.plot_id,
detail_type_id=self._static.detail_type.name).first()
if coordinate:
out.append(self.MAKE_ROW(forge_record.occupant_id,
occupant_record.occupant_type.name,
label,
coordinate.x,
coordinate.y))
return out
def get(self, map_id):
map = self._fetch_map(map_id)
data = self._fetch_data(map_id)
svg = Svg()
svg.set_map(map)
for row in data:
svg.add(row)
self.set_header("Content-Type", "image/svg+xml")
self.write(svg.render())
|