Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions opac/tests/test_admin_custom_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import unittest
from uuid import uuid4

from flask_admin.contrib.mongoengine.tools import parse_like_term
from flask_babelex import lazy_gettext as __
from flask_admin.contrib.pymongo.tools import parse_like_term
from flask_babel import lazy_gettext as __
from mongoengine.queryset import Q
from opac_schema.v1.models import Article, Issue, Journal
from tests.utils import makeOneArticle, makeOneIssue, makeOneJournal
Expand Down
20 changes: 10 additions & 10 deletions opac/webapp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

import flask_admin
import rq_dashboard
import rq_scheduler_dashboard
# import rq_scheduler_dashboard
from elasticapm.contrib.flask import ElasticAPM
from flask import Flask, flash, redirect, request, url_for
from flask_babelex import Babel, lazy_gettext
from flask_babel import Babel, lazy_gettext
from flask_caching import Cache
from flask_htmlmin import HTMLMIN
from flask_login import LoginManager, current_user
from flask_mail import Mail
from flask_mongoengine import MongoEngine
from flask_mongoengine2 import MongoEngine
from flask_sqlalchemy import SQLAlchemy
from opac_schema.v1.models import (
Article,
Expand All @@ -28,6 +28,7 @@
from raven.contrib.flask import Sentry
from werkzeug.middleware.proxy_fix import ProxyFix
from werkzeug.routing import BaseConverter
# from webapp.main.views import get_locale

login_manager = LoginManager()
dbmongo = MongoEngine()
Expand Down Expand Up @@ -125,7 +126,7 @@ def create_app():

# Configurações
app.config.from_object(rq_dashboard.default_settings)
app.config.from_object(rq_scheduler_dashboard.default_settings)
# app.config.from_object(rq_scheduler_dashboard.default_settings)
app.config.from_object("webapp.config.default") # Configuração basica
app.config.from_envvar("OPAC_CONFIG", silent=True) # configuração do ambiente
app.logger.root.setLevel(app.config.get("LOG_LEVEL"))
Expand All @@ -150,9 +151,9 @@ def create_app():
# Registrando os filtros
app.jinja_env.filters["trans_alpha2"] = custom_filters.trans_alpha2
app.jinja_env.filters["datetimefilter"] = custom_filters.datetimefilter

from webapp.main.views import get_locale
# i18n
babel.init_app(app)
babel.init_app(app, locale_selector=get_locale)
# Debug Toolbar
if app.config["DEBUG"]:
# Toolbar
Expand Down Expand Up @@ -183,7 +184,6 @@ def create_app():
app,
"OPAC admin",
index_view=views.AdminIndexView(),
template_mode="bootstrap3",
base_template="admin/opac_base.html",
)

Expand Down Expand Up @@ -261,9 +261,9 @@ def check_user_logged_in_or_redirect():

# Use `with app.app_context()` within the `create_app` definition.
with app.app_context():
app.register_blueprint(
rq_scheduler_dashboard.blueprint, url_prefix="/admin/scheduler"
)
# app.register_blueprint(
# rq_scheduler_dashboard.blueprint, url_prefix="/admin/scheduler"
# )
app.register_blueprint(rq_dashboard.blueprint, url_prefix="/admin/workers")
# FIM do setup RQ Dashboard e Scheduler: - mover para um modulo proprio

Expand Down
7 changes: 5 additions & 2 deletions opac/webapp/admin/ajax.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
# coding: utf-8
from flask_admin._compat import as_unicode
from flask_admin.contrib.mongoengine.ajax import QueryAjaxModelLoader
from flask_admin.contrib.sqla.ajax import QueryAjaxModelLoader
from flask_admin.model.ajax import AjaxModelLoader


class CustomQueryAjaxModelLoader(QueryAjaxModelLoader):
class CustomQueryAjaxModelLoader(AjaxModelLoader):
def __init__(self, name, model, **options):
"""
Constructor.
:param fields:
Fields to run query against
"""

super(CustomQueryAjaxModelLoader, self).__init__(name, model, **options)
self.model = model

def format(self, model):
# mudança minima porém necessária, o atributo id no modelo é _id
Expand Down
102 changes: 57 additions & 45 deletions opac/webapp/admin/custom_filters.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,20 @@
# coding: utf-8

from flask_admin.contrib import sqla
from flask_admin.contrib.mongoengine.filters import (
FilterConverter,
FilterEmpty,
from flask_admin.contrib.pymongo.filters import (
BasePyMongoFilter,
FilterEqual,
FilterInList,
FilterLike,
FilterNotEqual,
FilterNotInList,
FilterNotLike,
)
from flask_admin.contrib.mongoengine.tools import parse_like_term
from flask_admin.contrib.pymongo.tools import parse_like_term
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@samuelveigarangel (sugestão) talvez fosse interessante criar um módulo (opac_flask_admin) onde há todas as importações de flask_admin, por exemplo:

# conteúdo do módulo opac_flask_admin.db
from flask_admin.contrib.pymongo.tools import parse_like_term

então nos módulos o padrão ficaria:

from opac_flask_admin.db import parse_like_term

De modo que quando vier a ocorrer mudanças no flask_admin, a troca fica mais suave.

from flask_admin.model import filters
from mongoengine import EmbeddedDocumentField, ListField, ReferenceField, StringField
from mongoengine.queryset import Q
from opac_schema.v1.models import Issue, Journal
from webapp import models
from flask_admin.babel import lazy_gettext


def get_flt(column=None, value=None, term=""):
Expand Down Expand Up @@ -102,61 +100,75 @@ def apply(self, query, value):
return query.filter(flt)


class CustomFilterEmpty(FilterEmpty):
class CustomFilterEmpty(BasePyMongoFilter):
def apply(self, query, value):
if value == "1":
flt = get_flt(self.column, None)
else:
flt = get_flt(self.column, None, "ne")
return query.filter(flt)

def operation(self):
return lazy_gettext('empty')


class CustomFilterInList(FilterInList):
class CustomFilterInList(BasePyMongoFilter):
def __init__(self, column, name, options=None, data_type=None):
super(CustomFilterInList, self).__init__(column, name, options, data_type='select2-tags')

def apply(self, query, value):
flt = get_flt(self.column, value, "in")
return query.filter(flt)

def clean(self, value):
return [v.strip() for v in value.split(',') if v.strip()]
def operation(self):
return lazy_gettext('in list')

class CustomFilterNotInList(FilterNotInList):
class CustomFilterNotInList(BasePyMongoFilter):
def apply(self, query, value):
flt = get_flt(self.column, value, "nin")
return query.filter(flt)


class CustomFilterConverter(FilterConverter):
# Campos dentro filtros ReferenceField, EmbeddedDocumentField, ListField
# deve ser do tipo StringField

reference_filters = (
CustomFilterLike,
CustomFilterNotLike,
CustomFilterEqual,
CustomFilterNotEqual,
CustomFilterInList,
CustomFilterNotInList,
)
embedded_filters = (
CustomFilterLike,
CustomFilterNotLike,
CustomFilterEqual,
CustomFilterNotEqual,
CustomFilterEmpty,
CustomFilterInList,
CustomFilterNotInList,
)
list_filters = (CustomFilterLike, CustomFilterNotLike, CustomFilterEmpty)

@filters.convert("ReferenceField")
def conv_reference(self, column, name):
return [f(column, name) for f in self.reference_filters]

@filters.convert("EmbeddedDocumentField")
def conv_embedded(self, column, name):
return [f(column, name) for f in self.embedded_filters]

@filters.convert("ListField")
def conv_list(self, column, name):
return [f(column, name) for f in self.list_filters]

def operation(self):
return lazy_gettext('not in list')


# FIXME
# class CustomFilterConverter(FilterConverter):
# # Campos dentro filtros ReferenceField, EmbeddedDocumentField, ListField
# # deve ser do tipo StringField

# reference_filters = (
# CustomFilterLike,
# CustomFilterNotLike,
# CustomFilterEqual,
# CustomFilterNotEqual,
# CustomFilterInList,
# CustomFilterNotInList,
# )
# embedded_filters = (
# CustomFilterLike,
# CustomFilterNotLike,
# CustomFilterEqual,
# CustomFilterNotEqual,
# CustomFilterEmpty,
# CustomFilterInList,
# CustomFilterNotInList,
# )
# list_filters = (CustomFilterLike, CustomFilterNotLike, CustomFilterEmpty)

# @filters.convert("ReferenceField")
# def conv_reference(self, column, name):
# return [f(column, name) for f in self.reference_filters]

# @filters.convert("EmbeddedDocumentField")
# def conv_embedded(self, column, name):
# return [f(column, name) for f in self.embedded_filters]

# @filters.convert("ListField")
# def conv_list(self, column, name):
# return [f(column, name) for f in self.list_filters]


class CustomFilterConverterSqla(sqla.filters.FilterConverter):
Expand Down
2 changes: 1 addition & 1 deletion opac/webapp/admin/forms.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# coding: utf-8

from flask_babelex import gettext as _
from flask_babel import gettext as _
from webapp import controllers
from wtforms import fields, form, validators

Expand Down
44 changes: 25 additions & 19 deletions opac/webapp/admin/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
url_for,
)
from flask_admin.actions import action
from flask_admin.contrib import mongoengine, sqla
from flask_admin.contrib.mongoengine.tools import parse_like_term
from flask_admin.contrib import pymongo, sqla
from flask_admin.contrib.pymongo.tools import parse_like_term
from flask_admin.form import Select2Field
from flask_admin.model.form import InlineFormAdmin
from flask_babelex import gettext as _
from flask_babelex import lazy_gettext as __
from jinja2 import Markup
from flask_babel import gettext as _
from flask_babel import lazy_gettext as __
from markupsafe import Markup
from legendarium.formatter import descriptive_short_format
from mongoengine import (
EmailField,
Expand All @@ -38,7 +38,7 @@
from webapp.admin import custom_fields, forms
from webapp.admin.ajax import CustomQueryAjaxModelLoader
from webapp.admin.custom_filters import (
CustomFilterConverter,
# CustomFilterConverter,
CustomFilterConverterSqla,
get_flt,
)
Expand Down Expand Up @@ -375,7 +375,7 @@ def search_placeholder(self):
)


class OpacBaseAdminView(mongoengine.ModelView):
class OpacBaseAdminView(pymongo.ModelView):
page_size = 20
can_create = False
can_edit = False
Expand All @@ -390,7 +390,7 @@ class OpacBaseAdminView(mongoengine.ModelView):
EmbeddedDocumentField,
ReferenceField,
)
filter_converter = CustomFilterConverter()
# filter_converter = CustomFilterConverter()
object_id_converter = str

def _search(self, query, search_term):
Expand Down Expand Up @@ -1155,17 +1155,23 @@ class PressReleaseAdminView(OpacBaseAdminView):
form_overrides = dict(language=Select2Field, content=CKEditorField)

form_ajax_refs = {
"journal": CustomQueryAjaxModelLoader(
name="journal",
model=Journal,
fields=["title", "acronym", "scielo_issn", "print_issn", "eletronic_issn"],
),
"issue": CustomQueryAjaxModelLoader(
name="issue", model=Issue, fields=["label", "pid", "journal"]
),
"article": CustomQueryAjaxModelLoader(
name="article", model=Article, fields=["title", "doi", "pid"]
),
"journal": {
"fields": ("title", "acronym", "scielo_issn", "print_issn", "eletronic_issn"),
"placeholder": "Please Select",
"page_size": 10,
"minimun_input_length": 0,
},
# "journal": CustomQueryAjaxModelLoader(
# name="journal",
# model=Journal,
# fields=["title", "acronym", "scielo_issn", "print_issn", "eletronic_issn"],
# ),
# "issue": CustomQueryAjaxModelLoader(
# name="issue", model=Issue, fields=["label", "pid", "journal"]
# ),
# "article": CustomQueryAjaxModelLoader(
# name="article", model=Article, fields=["title", "doi", "pid"]
# ),
}

form_args = dict(
Expand Down
4 changes: 2 additions & 2 deletions opac/webapp/choices.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# coding: utf-8

from flask_babelex import gettext as _
from flask_babelex import lazy_gettext as __
from flask_babel import gettext as _
from flask_babel import lazy_gettext as __

UNPUBLISH_REASONS = [
_("Conteúdo temporariamente indisponível"),
Expand Down
6 changes: 3 additions & 3 deletions opac/webapp/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
import unicodecsv
import xlsxwriter
from flask import current_app, url_for
from flask_babelex import gettext as _
from flask_babelex import lazy_gettext as __
from flask_mongoengine import Pagination
from flask_babel import gettext as _
from flask_babel import lazy_gettext as __
from flask_mongoengine2 import Pagination
from legendarium.formatter import descriptive_very_short_format
from mongoengine import Q
from mongoengine.errors import InvalidQueryError
Expand Down
2 changes: 1 addition & 1 deletion opac/webapp/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import re

from flask_babelex import gettext as _
from flask_babel import gettext as _
from flask_wtf import FlaskForm
from wtforms import HiddenField, StringField, TextAreaField
from wtforms.validators import URL, DataRequired, Email, ValidationError
Expand Down
6 changes: 2 additions & 4 deletions opac/webapp/main/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,17 @@
session,
url_for,
)
from flask_babelex import gettext as _
from flask_babel import gettext as _
from legendarium.formatter import descriptive_short_format
from lxml import etree
from opac_schema.v1.models import Article, Collection, Issue, Journal
from packtools import HTMLGenerator
from webapp import babel, cache, controllers, forms
from webapp import cache, controllers, forms
from webapp.choices import STUDY_AREAS
from webapp.controllers import create_press_release_record
from webapp.config.lang_names import display_original_lang_name
from webapp.utils import utils
from webapp.utils.caching import cache_key_with_lang, cache_key_with_lang_with_qs
from webapp.main.errors import page_not_found, internal_server_error

from . import helper

Expand Down Expand Up @@ -110,7 +109,6 @@ def add_scielo_org_config_to_g():
setattr(g, "scielo_org", scielo_org_links)


@babel.localeselector
def get_locale():
langs = current_app.config.get("LANGUAGES")
lang_from_headers = request.accept_languages.best_match(list(langs.keys()))
Expand Down
2 changes: 1 addition & 1 deletion requirements.dev.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Flask-DebugToolbar==0.13.1
Flask-DebugToolbar==0.14.1
Flask-Testing==0.8.1
mock==5.0.1
coverage==7.0.5
Expand Down
Loading