aboutsummaryrefslogtreecommitdiff
path: root/lib/d2/app/controllers/svg_text.py
blob: 1c4d37e987a11b1091a0c2aba9e8772e7f10159d (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
63
64
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(
                              "{0}_{1}".format(forge_record.occupant_id, 
                                                   forge_record.plot_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())