Skip to content

Commit ab07288

Browse files
authored
Merge pull request #63 from aledruetta/devel
Devel
2 parents 3df304c + 54bec86 commit ab07288

File tree

11 files changed

+104
-25
lines changed

11 files changed

+104
-25
lines changed

prototipo/Vagrantfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Vagrant.configure("2") do |config|
1818
config.vm.provider "virtualbox" do |vb|
1919
vb.name = "focal64_flaskAPI"
2020
vb.gui = false
21-
vb.memory = "1024"
21+
vb.memory = "2048"
2222
end
2323

2424
config.vm.provision :shell, :path => "Vagrant-setup/bootstrap.sh"
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""empty message
2+
3+
Revision ID: 61fd7b1a6054
4+
Revises: 3eeb4ae85a13
5+
Create Date: 2020-11-30 14:31:27.250926
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '61fd7b1a6054'
14+
down_revision = '3eeb4ae85a13'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('user_auth', sa.Column('is_admin', sa.Boolean(), nullable=True))
22+
# ### end Alembic commands ###
23+
24+
25+
def downgrade():
26+
# ### commands auto generated by Alembic - please adjust! ###
27+
op.drop_column('user_auth', 'is_admin')
28+
# ### end Alembic commands ###

prototipo/projeto/app.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from datetime import timedelta
22
from flask import Flask
33

4-
from .ext import auth, api, db, jwt, site
4+
from .ext import admin, auth, api, db, jwt, site
55

66

77
def create_app():
@@ -15,11 +15,13 @@ def create_app():
1515
app.config["JWT_AUTH_USERNAME_KEY"] = "email"
1616
app.config["JWT_AUTH_URL_RULE"] = "/token"
1717
app.config["JWT_EXPIRATION_DELTA"] = timedelta(seconds=3600)
18+
app.config['FLASK_ADMIN_SWATCH'] = 'simplex'
1819

1920
db.init_app(app)
2021
api.init_app(app)
2122
jwt.init_app(app)
2223
auth.init_app(app)
24+
admin.init_app(app)
2325
site.init_app(app)
2426

2527
return app
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from flask import redirect, url_for, request
2+
from flask_login import current_user, login_required
3+
from flask_admin import Admin
4+
from flask_admin.contrib.sqla import ModelView
5+
from projeto.ext.auth import UserAuth
6+
from projeto.ext.api.models import Estacao, Sensor
7+
from projeto.ext.db import db
8+
9+
10+
class AdminView(ModelView):
11+
@login_required
12+
def is_accessible(self):
13+
if current_user.is_authenticated and current_user.is_admin:
14+
return True
15+
return False
16+
17+
def inaccessible_callback(self, name, **kwargs):
18+
if not self.is_accessible():
19+
return redirect(url_for("auth.login", next=request.url))
20+
21+
22+
class UserView(AdminView):
23+
column_sortable_list = ()
24+
25+
26+
class EstacaoView(AdminView):
27+
column_list = ('id', 'local', 'latitude', 'longitude')
28+
column_sortable_list = ()
29+
30+
31+
class SensorView(AdminView):
32+
column_list = ('id', 'tipo', 'descricao', 'params', 'estacao')
33+
column_sortable_list = ()
34+
35+
form_excluded_columns = [
36+
'leituras',
37+
]
38+
39+
40+
admin = Admin(name='flaskapi', template_mode='bootstrap3')
41+
42+
admin.add_view(UserView(UserAuth, db.session))
43+
admin.add_view(EstacaoView(Estacao, db.session))
44+
admin.add_view(SensorView(Sensor, db.session))
45+
46+
47+
def init_app(app):
48+
admin.init_app(app)

prototipo/projeto/ext/api/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def get_sensor(self, sensor_id):
1515
for sensor in self.sensores:
1616
if sensor.id == sensor_id:
1717
return sensor
18+
return None
1819

1920
def json(self):
2021
return {
@@ -25,7 +26,7 @@ def json(self):
2526
}
2627

2728
def __repr__(self):
28-
return f"{self.local} [{self.latitude}, {self.longitude}]"
29+
return f"{self.local}"
2930

3031

3132
class Sensor(db.Model):

prototipo/projeto/ext/api/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def put(self, estacao_id, sensor_id):
141141
parser.add_argument("params", type=str)
142142

143143
data = parser.parse_args()
144-
estacao = Estacao.query.get(sensor_id)
144+
estacao = Estacao.query.get(estacao_id)
145145

146146
if estacao:
147147
sensor = estacao.get_sensor(sensor_id)
@@ -159,7 +159,7 @@ def put(self, estacao_id, sensor_id):
159159

160160
# @jwt_required()
161161
def delete(self, estacao_id, sensor_id):
162-
estacao = Estacao.query.get(sensor_id)
162+
estacao = Estacao.query.get(estacao_id)
163163

164164
if estacao:
165165
sensor = estacao.get_sensor(sensor_id)

prototipo/projeto/ext/auth/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class UserAuth(UserMixin, db.Model):
77
id = db.Column("id", db.Integer, primary_key=True)
88
email = db.Column("email", db.String(255), nullable=False, unique=True)
99
password = db.Column("password", db.String(255), nullable=False)
10+
is_admin = db.Column("is_admin", db.Boolean, default=False)
1011

1112
def __repr__(self):
1213
return f"{self.id}: {self.email}"

prototipo/projeto/templates/base.html

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,34 @@
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1">
66
<title>{{title}}</title>
7+
78
<link rel="icon" type="image/png" href="{{ url_for('static', filename='favicon-16x16.png') }}" sizes="16x16">
89
<link rel="icon" type="image/png" href="{{ url_for('static', filename='favicon-32x32.png') }}" sizes="32x32">
910

1011
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">
1112
<link rel="stylesheet" href="{{ url_for('static', filename='font-awesome/css/font-awesome.min.css') }}">
13+
14+
{% block extracss %}{% endblock %}
15+
1216
<!--
1317
<script defer src="https://use.fontawesome.com/releases/v5.14.0/js/all.js"></script>
1418
-->
1519

16-
{% block extracss %}{% endblock %}
20+
<script src="https://code.jquery.com/jquery-3.5.1.min.js"
21+
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
22+
crossorigin="anonymous">
23+
</script>
24+
25+
<script src="{{ url_for('static', filename='script.js') }}"></script>
26+
1727
{% block extrajs %}{% endblock %}
28+
1829
</head>
1930

2031
<body>
2132

2233
{% include "navbar.html" %}
2334

2435
{% block main %}{% endblock %}
25-
26-
<script src="{{ url_for('static', filename='script.js') }}"></script>
2736
</body>
2837
</html>

prototipo/projeto/templates/index.html

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
<script src="https://code.highcharts.com/modules/exporting.js"></script>
66
<script src="https://code.highcharts.com/modules/export-data.js"></script>
77
<script src="https://code.highcharts.com/modules/accessibility.js"></script>
8-
<script src="https://code.jquery.com/jquery-3.5.1.min.js"
9-
integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
10-
crossorigin="anonymous">
11-
</script>
12-
<script src="{{ url_for('static', filename='visualizacoes.js') }}"></script>
8+
<script src="{{ url_for('static', filename='visualizacoes.js') }}"></script>
139
{% endblock %}
1410

1511
{% block main %}

prototipo/projeto/templates/navbar.html

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,8 @@
1313

1414
<div id="navbarBasicExample" class="navbar-menu">
1515
<div class="navbar-start">
16-
<a class="navbar-item" href="/">
17-
Home
18-
</a>
19-
20-
<a class="navbar-item">
21-
Documentation
16+
<a class="navbar-item" href="{{ url_for('admin.index') }}" target="_blank">
17+
Admin
2218
</a>
2319

2420
<div class="navbar-item has-dropdown is-hoverable">
@@ -30,15 +26,12 @@
3026
<a class="navbar-item">
3127
About
3228
</a>
33-
<a class="navbar-item" href="{{ url_for('site.protected') }}">
34-
Secret
35-
</a>
3629
<a class="navbar-item">
37-
Contact
30+
Documentation
3831
</a>
3932
<hr class="navbar-divider">
40-
<a class="navbar-item" href="">
41-
Others
33+
<a class="navbar-item">
34+
Contact
4235
</a>
4336
</div>
4437
</div>

0 commit comments

Comments
 (0)