This repository has been archived by the owner on May 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
genus.py
104 lines (81 loc) · 2.61 KB
/
genus.py
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from flask import abort, request
from flask.ext.login import login_required
import sqlalchemy.orm as orm
from webargs import fields
from webargs.flaskparser import use_args
import bauble.db as db
from bauble.forms import form_factory
from bauble.models import Genus
from bauble.resource import Resource
import bauble.utils as utils
resource = Resource('genus', __name__)
@resource.index
@login_required
def index():
genera = Genus.query.all()
if not request.accept_json:
abort(406)
return resource.render_json(genera)
@resource.show
@login_required
def show(id):
genus = Genus.query \
.options(orm.joinedload(*Genus.synonyms.attr)) \
.get_or_404(id)
if request.prefers_json:
return resource.render_json(genus)
relations = ['/taxa', '/taxa/accessions', '/taxa/accessions/plants']
counts = {}
for relation in relations:
_, base = relation.rsplit('/', 1)
counts[base] = utils.count_relation(genus, relation)
return resource.render_html(genus=genus, counts=counts)
@resource.new
@login_required
def new():
genus = Genus()
return resource.render_html(genus=genus, form=form_factory(genus))
@resource.create
@login_required
def create():
genus = Genus()
form = resource.save_request_params(genus)
if request.prefers_json:
return (resource.render_json(genus, status=201)
if not form.errors
else resource.render_json_errors(form.errors))
return resource.render_html('new', status=201, genus=genus, form=form)
@resource.update
@login_required
def update(id):
genus = Genus.query.get_or_404(id)
form = resource.save_request_params(genus)
if request.prefers_json:
return (resource.render_json(genus)
if not form.errors
else resource.render_json_errors(form.errors))
return resource.render_html('edit', genus=genus, form=form)
@resource.edit
@login_required
def edit(id):
genus = Genus.query.get_or_404(id)
return resource.render_html(genus=genus, form=form_factory(genus))
@resource.destroy
@login_required
def destroy(id):
genus = Genus.query.get_or_404(id)
db.session.delete(genus)
db.session.commit()
return '', 204
@resource.route("/<int:id>/count")
@login_required
@use_args({
'relation': fields.DelimitedList(fields.String(), required=True)
})
def genus_count(args, id):
data = {}
genus = Genus.query.get_or_404(id)
for relation in args['relation']:
_, base = relation.rsplit('/', 1)
data[base] = utils.count_relation(genus, relation)
return utils.json_response(data)