River   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Importance

Changes 7
Bugs 0 Features 0
Metric Value
wmc 9
c 7
b 0
f 0
dl 0
loc 79
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A to_json() 0 12 1
A __str__() 0 2 1
B to_long_json() 0 18 6
A __repr__() 0 2 1
1
"""
2
River model
3
"""
4
from flask import url_for
5
from app.database import db
6
7
# many to many table to connect rivers to regions
8
rivers_regions = db.Table('rivers_regions',
9
    db.Column('river', db.Integer, db.ForeignKey('rivers.id')),
10
    db.Column('region', db.Integer, db.ForeignKey('regions.id'))
11
)
12
13
14
class River(db.Model):
15
    """
16
    River model. Rivers are rivers as we know them they have a parent that they
17
    flow downstream into and have tributaries that flow into them.
18
19
    Arguments:
20
        id (int): Primary River id
21
        name (string): Nice River name
22
        slug (string): slug for url formatting
23
        description (text): Long description that can contain HTML or Markdown within reason.
24
        short_description (text): Short description for showing on other pages.
25
        header_image (string): Header image to override default
26
        parent_id (int): River.id for the river that this one flows into
27
        parent: ``River`` object from parent_id
28
        tributary: List of ``River`` objects for any River that has this one in it's parent_id.
29
        regions: List of ``Region`` objects for River
30
        sections: List of ``Section`` objects for River
31
    """
32
    __tablename__ = 'rivers'
33
34
    id = db.Column(db.Integer, primary_key=True)
35
    name = db.Column(db.String(80))
36
    slug = db.Column(db.String(80), unique=True)
37
    description = db.Column(db.Text)
38
    short_description = db.Column(db.Text)
39
    header_image = db.Column(db.String(80))
40
41
    parent_id = db.Column(db.Integer, db.ForeignKey('rivers.id'))
42
    parent = db.relationship('River', remote_side=id, backref='tributary')
43
44
    regions = db.relationship('Region', secondary=rivers_regions,
45
                              backref=db.backref('rivers', lazy='dynamic'))
46
47
    #def __init__(self, name, slug, description,
48
    #            short_description, header_image, parent):
49
    #    self.name = name
50
    #    self.slug = slug
51
    #    self.description = description
52
    #    self.short_description = short_description
53
    #    self.header_image = header_image
54
    #    self.parent = parent
55
56
    def to_json(self):
57
        """
58
        Creates a JSON Object from River. Used where multiple rivers may be
59
        listed at once.
60
        """
61
        json_river = {
62
            'id': self.id,
63
            'name': self.name,
64
            'html': url_for('main.riverpage', slug=self.slug, _external=True),
65
            'url': url_for('api.get_river', rid=self.id, _external=True),
66
        }
67
        return json_river
68
69
    def to_long_json(self):
70
        """
71
        Creates a JSON Object from River. Used where a single river is being
72
        displayed.
73
        """
74
        json_river = {
75
            'id': self.id,
76
            'name': self.name,
77
            'html': url_for('main.riverpage', slug=self.slug, _external=True),
78
            'url': url_for('api.get_river', rid=self.id, _external=True),
79
            'regions': [region.to_json() for region in self.regions],
80
            'sections': [section.to_json() for section in self.sections],
81
            'tributaries': [river.to_json() for river in self.tributary],
82
            'gages': [gage.to_json() for gage in self.gages]
83
        }
84
        if self.parent is not None:
85
            json_river['downstream'] = self.parent.to_json()
86
        return json_river
87
88
    def __repr__(self):
89
        return '<River %r>' % self.name
90
    
91
    def __str__(self):
92
        return self.name
93