Skip to content

Commit

Permalink
Merge pull request #30 from rafael1717y/Rafael_Flask_Admin
Browse files Browse the repository at this point in the history
Flask Admin
  • Loading branch information
rafael1717y authored May 17, 2022
2 parents 7f15c95 + 2cf3055 commit 9269669
Show file tree
Hide file tree
Showing 12 changed files with 178 additions and 30 deletions.
1 change: 1 addition & 0 deletions .vscode/configurationCache.log
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"buildTargets":[],"launchTargets":[],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":[],"compilerArgs":[]},"fileIndex":[]}}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"makefile.extensionOutputFolder": "./.vscode"
}
27 changes: 27 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
clean:
@find ./ -name '*.pyc' -exec rm -f {} \;
@find ./ -name 'Thumbs.db' -exec rm -f {} \;
@find ./ -name '*~' -exec rm -f {} \;
rm -rf .cache
rm -rf build
rm -rf dist
rm -rf *.egg-info
rm -rf htmlcov
rm -rf .tox/
rm -rf docs/_build
pip install -e .[dev] --upgrade --no-cache

install:
pip install -e .['dev']


init_db:
FLASK_APP=econovolt.py flask create-db
FLASK_APP=econovolt.py flask db upgrade

test:
FLASK_ENV=test pytest tests/ -v --cov=delivery

format:
isort **/*.py
black -l 79 **/*.py
3 changes: 3 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
from app.ext import migrate
from app.ext import cli
from app.ext import auth
from app.ext import admin



def create_app():
app = Flask(__name__)
config.init_app(app)
db.init_app(app)
auth.init_app(app)
admin.init_app(app) # iniciar flask admin depois da autenticação
migrate.init_app(app)
cli.init_app(app)
toolbar.init_app(app)
Expand Down
16 changes: 16 additions & 0 deletions app/ext/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from app.ext.db import db
from app.ext.db.models import Simulation


admin = Admin()


def init_app(app):
admin.name = "Econovolt"
admin.template_mode = "bootstrap2"
admin.init_app(app)
admin.add_view(ModelView(Simulation, db.session)) # se nao quer especializar uma classe pode-se usar o ModelView direto.
# Adicionar o model de Resultados
# TODO: Traduzir para pt-br.
12 changes: 11 additions & 1 deletion app/ext/auth/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
from audioop import add
from app.ext.auth import models
from app.ext.auth.commands import list_users, add_user

from app.ext.db import db
from app.ext.admin import admin as main_admin
from app.ext.auth.admin import UserAdmin
from app.ext.auth.models import User



def init_app(app):
"""TODO: inicializar Flask simple login + JWT """
pass
app.cli.command()(list_users) # usando o decorator como uma função que recebe outra função.
app.cli.command()(add_user)
main_admin.add_view(UserAdmin(User, db.session))
74 changes: 74 additions & 0 deletions app/ext/auth/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from email.errors import FirstHeaderLineIsContinuationDefect
from flask_admin.contrib.sqla import ModelView
from flask_admin.actions import action
from app.ext.auth.models import User
from app.ext.db import db
from flask import flash, Markup
from flask_admin.contrib.sqla import filters
# from flask_admin.contrib.mongoengine


def format_user(self, request, user, *args):
"""Customiza o campo 'user' para retornar
apenas o nome do email.Obs.: Self representa a
própria instância do admin nesse caso."""
return user.email.split("@")[0] # só o nome



class UserAdmin(ModelView):
"""Interface administrativa de usuários."""
# formatação de uma coluna
#column_formatters = {"email": format_user}
column_formatters = {
"email": lambda s, r, u, *a: Markup(f'<b>{u.email.split("@")[0]}</b>')
}
# lambda s, r, u, *a: Markup(f'<b>(u.email.split("a")[0]}</b>')
# escolha das colunas que serão exibidas.
column_list = ["email", "admin"]

column_searchable_list = ["email"]

column_filters = ["email", "admin", filters.FilterLike(User.email, "dominio",
options=(("gmail", "Gmail"), ("uol", "Uol")))]

# customização do perfil
can_edit = False
can_create = True
can_delete = True


@action(
'toggle_admin',
'Toggle admin status',
'Are you sure?'
)
def toggle_admin_status(self, ids):
"""Mudar o status de admin para usuário"""
users = User.query.filter(User.id.in_(ids)).all()
for user in users:
#select pra trazer os usuários com id selecionados
user.admin = not user.admin
db.session.commit()
flash(f"{len(users)} usuários alterados com sucesso!", "success")


@action(
'send email',
'Send email to all users',
'Are you sure?'
)
def send_email(self, ids):
"""Enviar email."""
users = User.query.filter(User.id.in_(ids)).all()
# TODO: 1) redirect para um form para escrever a mensagem do email.
# 2) enviar o email
for user in users:
pass
#select pra trazer os usuários com id selecionados
# enviar email
#db.session.commit()
flash(f"{len(users)} um email enviado", "success")



27 changes: 27 additions & 0 deletions app/ext/auth/commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import click
from app.ext.auth.models import User
from app.ext.db import db


@click.option("--username", "-u")
@click.option("--email", "-e")
@click.option("--password_hash", "-p")
@click.option("--admin", "-a",is_flag=True, default=False)
def add_user(username, email, password_hash, admin):
"Adiciona um novo usuário."
# TODO: tratar erros - Operation error?
user = User(
username=username,
email = email,
password_hash=password_hash,
admin=admin,
)
db.session.add(user)
db.session.commit()

click.echo(f"Usuário {email} criado com sucesso!")


def list_users():
users = User.query.all()
click.echo(f"lista de usuários {users}")
26 changes: 2 additions & 24 deletions app/ext/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import click
from app.ext.db import db
from app.ext.auth.models import User
from app.ext.db import models # noqa


Expand All @@ -16,24 +15,7 @@ def create_db():
print('Não foi possível criar o db.')


@app.cli.command()
@click.option("--username", "-u")
@click.option("--email", "-e")
@click.option("--password_hash", "-p")
@click.option("--admin", "-a",is_flag=True, default=False)
def add_user(username, email, password_hash, admin):
"Adiciona um novo usuário."
# TODO: tratar erros - Operation error?
user = User(
username=username,
email = email,
password_hash=password_hash,
admin=admin,
)
db.session.add(user)
db.session.commit()

click.echo(f"Usuário {email} criado com sucesso!")



@app.cli.command()
Expand All @@ -42,11 +24,7 @@ def list_simulations():
click.echo('lista de simulações')


@app.cli.command()
def list_users():
users = User.query.all()
click.echo(f"lista de usuários {users}")




#TODO comando para criar uma simulação
4 changes: 3 additions & 1 deletion app/ext/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ def init_app(app):
app.config['SECRET_KEY'] = os.environ.get("SECRET_KEY") or "teste-development2"
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL") or "sqlite:///" + os.path.join(basedir, "econovolt.db")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
if app.debug:
app.config["DEBUG_TB_TEMPLATE_EDITOR_ENABLED"] = True # editar o template no browser.
app.config["DEBUG_TB_PROFILER-ENABLED"] = True
app.config["DEBUG_TB_PROFILER-ENABLED"] = True
app.config["DEBUG_TB_INTERCEPT_REDIRECTS"] = False
5 changes: 1 addition & 4 deletions app/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,7 @@
<footer class="footer">
<div class="content has-text-centered">
<p>
<strong>Projeto Integrador</strong> by <a href="https://jgthms.com">Jeremy Thomas</a>. The source code is licensed
<a href="http://opensource.org/licenses/mit-license.php">MIT</a>. The website content
is licensed <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY NC SA 4.0</a>.
</p>
<strong>Projeto Integrador - </strong> Grupo 63</p>
</div>
</footer>

Expand Down
10 changes: 10 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import pytest



"""
@pytest.fixture(scope="module")
def app():
"Instance of Main flask app"
return create_app()
"""

0 comments on commit 9269669

Please sign in to comment.