Commit 6ed0fa36 authored by Serge S. Koval's avatar Serge S. Koval

Merge branch 'master' of github.com:mrjoes/flask-admin

parents 4e330484 5201bd1c
......@@ -56,6 +56,47 @@ Form Rendering Rule Description
:class:`flask.ext.admin.form.rules.FieldSet` Renders form header and child rules
======================================================= ========================================================
Enabling CSRF Validation
---------------
Flask-Admin does not use Flask-WTF Form class - it uses the wtforms Form class, which does not have CSRF validation.
Adding CSRF validation will require importing flask_wtf and overriding the :class:`flask.ext.admin.form.BaseForm` by using :attr:`flask.ext.admin.model.BaseModelView.form_base_class`::
import os
import flask
**import flask_wtf**
import flask_admin
import flask_sqlalchemy
from flask_admin.contrib.sqla import ModelView
DBFILE = 'app.db'
app = flask.Flask(__name__)
app.config['SECRET_KEY'] = 'Dnit7qz7mfcP0YuelDrF8vLFvk0snhwP'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + DBFILE
**app.config['CSRF_ENABLED'] = True**
**flask_wtf.CsrfProtect(app)**
db = flask_sqlalchemy.SQLAlchemy(app)
admin = flask_admin.Admin(app, name='Admin')
## Here is the fix:
class MyModelView(ModelView):
**form_base_class = flask_wtf.Form**
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String)
password = db.Column(db.String)
if not os.path.exists(DBFILE):
db.create_all()
## The subclass is used here:
admin.add_view( MyModelView(User, db.session, name='User') )
app.run(debug=True)
Further reading
---------------
......
......@@ -292,8 +292,8 @@ class BaseView(with_metaclass(AdminViewMeta, BaseViewClass)):
"""
This method will be executed before calling any view method.
By default, it will check if the admin class is accessible and if it is not it will
throw HTTP 404 error.
It will execute the ``inaccessible_callback`` if the view is not
accessible.
:param name:
View function name
......@@ -301,7 +301,17 @@ class BaseView(with_metaclass(AdminViewMeta, BaseViewClass)):
View function arguments
"""
if not self.is_accessible():
return abort(403)
return self.inaccessible_callback(name, **kwargs)
def inaccessible_callback(self, name, **kwargs):
"""
Handle the response to inaccessible views.
By default, it throw HTTP 403 error. Override this method to
customize the behaviour.
"""
return abort(403)
@property
def _debug(self):
......
......@@ -423,12 +423,12 @@ class ModelView(BaseModelView):
Verify if the provided column type is text-based.
:returns:
``True`` for ``String``, ``Unicode``, ``Text``, ``UnicodeText``
``True`` for ``String``, ``Unicode``, ``Text``, ``UnicodeText``, ``varchar``
"""
if name:
name = name.lower()
return name in ('string', 'unicode', 'text', 'unicodetext')
return name in ('string', 'unicode', 'text', 'unicodetext', 'varchar')
def scaffold_filters(self, name):
"""
......
......@@ -7,6 +7,10 @@ from flask.ext.admin._compat import text_type, as_unicode
from . import widgets as admin_widgets
"""
An understanding of WTForms's Custom Widgets is helpful for understanding this code: http://wtforms.simplecodes.com/docs/0.6.2/widgets.html#custom-widgets
"""
__all__ = ['DateTimeField', 'TimeField', 'Select2Field', 'Select2TagsField']
class DateTimeField(fields.DateTimeField):
......@@ -14,7 +18,7 @@ class DateTimeField(fields.DateTimeField):
Allows modifying the datetime format of a DateTimeField using form_args.
"""
widget = admin_widgets.DateTimePickerWidget()
def __init__(self, label=None, validators=None, format=None, widget_format=None, **kwargs):
def __init__(self, label=None, validators=None, format=None, **kwargs):
"""
Constructor
......@@ -22,19 +26,15 @@ class DateTimeField(fields.DateTimeField):
Label
:param validators:
Field validators
:param format:
:param format:
Format for text to date conversion. Defaults to '%Y-%m-%d %H:%M:%S'
:param widget_format:
Widget date format. Defaults to 'yyyy-mm-dd hh:ii:ss'
:param kwargs:
Any additional parameters
"""
super(DateTimeField, self).__init__(label, validators, **kwargs)
self.format = format or '%Y-%m-%d %H:%M:%S'
self.widget_format = widget_format or 'yyyy-mm-dd hh:ii:ss'
self.format = format or '%Y-%m-%d %H:%M:%S'
class TimeField(fields.Field):
"""
A text field which stores a `datetime.time` object.
......@@ -55,8 +55,6 @@ class TimeField(fields.Field):
Supported time formats, as a enumerable.
:param default_format:
Default time format. Defaults to '%H:%M:%S'
:param widget_format:
Widget date format. Defaults to 'hh:ii:ss'
:param kwargs:
Any additional parameters
"""
......@@ -67,7 +65,6 @@ class TimeField(fields.Field):
'%I:%M:%S %p', '%I:%M %p')
self.default_format = default_format or '%H:%M:%S'
self.widget_format = widget_format or 'hh:ii:ss'
def _value(self):
if self.raw_data:
......
......@@ -237,7 +237,7 @@ class FileUploadField(fields.TextField):
def _save_file(self, data, filename):
path = self._get_path(filename)
if not op.exists(op.dirname(path)):
os.makedirs(os.path.dirname(path), self.permission)
os.makedirs(os.path.dirname(path), self.permission | 0o111)
data.save(path)
......
......@@ -3,9 +3,7 @@ from flask.globals import _request_ctx_stack
from flask.ext.admin.babel import gettext, ngettext
from flask.ext.admin import helpers as h
__all__ = ['Select2Widget', 'DatePickerWidget', 'DateTimePickerWidget', 'RenderTemplateWidget',
'Select2TagsWidget', ]
__all__ = ['Select2Widget', 'DatePickerWidget', 'DateTimePickerWidget', 'RenderTemplateWidget', 'Select2TagsWidget', ]
class Select2Widget(widgets.Select):
"""
......@@ -15,10 +13,9 @@ class Select2Widget(widgets.Select):
work.
"""
def __call__(self, field, **kwargs):
kwargs.setdefault('data-role', u'select2')
allow_blank = getattr(field, 'allow_blank', False)
kwargs['data-role'] = u'select2'
if allow_blank and not self.multiple:
kwargs['data-allow-blank'] = u'1'
......@@ -30,8 +27,8 @@ class Select2TagsWidget(widgets.TextInput):
You must include select2.js, form.js and select2 stylesheet for it to work.
"""
def __call__(self, field, **kwargs):
kwargs['data-role'] = u'select2'
kwargs['data-tags'] = u'1'
kwargs.setdefault('data-role', u'select2')
kwargs.setdefault('data-tags', u'1')
return super(Select2TagsWidget, self).__call__(field, **kwargs)
......@@ -43,9 +40,10 @@ class DatePickerWidget(widgets.TextInput):
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def __call__(self, field, **kwargs):
kwargs['data-role'] = u'datepicker'
kwargs['data-date-format'] = u'yyyy-mm-dd'
kwargs['data-date-autoclose'] = u'true'
kwargs.setdefault('data-role', u'datepicker')
kwargs.setdefault('data-date-format', u'yyyy-mm-dd')
kwargs.setdefault('data-date-autoclose', u'true')
self.date_format = kwargs['data-date-format']
return super(DatePickerWidget, self).__call__(field, **kwargs)
......@@ -56,11 +54,11 @@ class DateTimePickerWidget(widgets.TextInput):
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def __call__(self, field, **kwargs):
kwargs['data-role'] = u'datetimepicker'
kwargs['data-date-format'] = field.widget_format or u'yyyy-mm-dd hh:ii:ss'
kwargs['data-date-autoclose'] = u'true'
kwargs['data-date-today-btn'] = u'linked'
kwargs['data-date-today-highlight'] = u'true'
kwargs.setdefault('data-role', u'datetimepicker')
kwargs.setdefault('data-date-format', u'yyyy-mm-dd hh:ii:ss')
kwargs.setdefault('data-date-autoclose', u'true')
kwargs.setdefault('data-date-today-btn', u'linked')
kwargs.setdefault('data-date-today-highlight', u'true')
return super(DateTimePickerWidget, self).__call__(field, **kwargs)
......@@ -71,9 +69,9 @@ class TimePickerWidget(widgets.TextInput):
You must include bootstrap-datepicker.js and form.js for styling to work.
"""
def __call__(self, field, **kwargs):
kwargs['data-role'] = u'timepicker'
kwargs['data-date-format'] = field.widget_format or 'hh:ii:ss'
kwargs['data-date-autoclose'] = u'true'
kwargs.setdefault('data-role', u'timepicker')
kwargs.setdefault('data-date-format', u'hh:ii:ss')
kwargs.setdefault('data-date-autoclose', u'true')
return super(TimePickerWidget, self).__call__(field, **kwargs)
......
......@@ -365,6 +365,15 @@ class BaseModelView(BaseView, ActionsMixin):
'style': 'color: black'
}
}
Note, changing the format of a DateTimeField will require changes to both form_widget_args and form_args::
form_args = dict(
start=dict(format='%Y-%m-%d %I:%M %p') # changes how the input is parsed by strptime (12 hour time)
)
form_widget_args = dict(
start={'data-date-format': u'yyyy-mm-dd HH:ii P', 'data-show-meridian': 'True'} # changes how the DateTimeField displays the time
)
"""
form_extra_fields = None
......
from nose.tools import ok_, eq_, raises
from flask import Flask, request
from flask import Flask, request, abort
from flask.views import MethodView
from flask.ext.admin import base
......@@ -232,6 +232,20 @@ def test_permissions():
eq_(rv.status_code, 403)
def test_inaccessible_callback():
app = Flask(__name__)
admin = base.Admin(app)
view = MockView()
admin.add_view(view)
client = app.test_client()
view.allow_access = False
view.inaccessible_callback = lambda *args, **kwargs: abort(418)
rv = client.get('/admin/mockview/')
eq_(rv.status_code, 418)
def get_visibility():
app = Flask(__name__)
admin = base.Admin(app)
......
# Portuguese translations for Flask-Admin.
# Copyright (C) 2014 Koneksa Automação
# This file is distributed under the same license as the Flask-Admin
# project.
# Jonnas Fonini <jonnas@koneksa.com.br>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: Flask-Admin\n"
"Report-Msgid-Bugs-To: jonnas@koneksa.com.br\n"
"POT-Creation-Date: 2014-05-28 13:45-0300\n"
"PO-Revision-Date: 2014-05-28 14:18-0300\n"
"Last-Translator: Jonnas Fonini <jonnas@koneksa.com.br>\n"
"Language-Team: pt <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"
"X-Generator: Poedit 1.5.4\n"
#: ../flask_admin/base.py:339
msgid "Home"
msgstr "Início"
#: ../flask_admin/contrib/fileadmin.py:33
msgid "Invalid directory name"
msgstr "Nome de diretório inválido"
#: ../flask_admin/contrib/fileadmin.py:41
msgid "File to upload"
msgstr "Arquivo para upload"
#: ../flask_admin/contrib/fileadmin.py:50
msgid "File required."
msgstr "Arquivo requerido."
#: ../flask_admin/contrib/fileadmin.py:55
msgid "Invalid file type."
msgstr "Tipo de arquivo inválido."
#: ../flask_admin/contrib/fileadmin.py:59
msgid "Content"
msgstr "Conteúdo"
#: ../flask_admin/contrib/fileadmin.py:423
#, python-format
msgid "File \"%(name)s\" already exists."
msgstr "O arquivo \"%(name)s\" já existe."
#: ../flask_admin/contrib/fileadmin.py:442
#: ../flask_admin/contrib/fileadmin.py:505
#: ../flask_admin/contrib/fileadmin.py:558
#: ../flask_admin/contrib/fileadmin.py:595
#: ../flask_admin/contrib/fileadmin.py:638
#: ../flask_admin/contrib/fileadmin.py:684
msgid "Permission denied."
msgstr "Permissão negada."
#: ../flask_admin/contrib/fileadmin.py:501
msgid "File uploading is disabled."
msgstr "O Upload de arquivos está desabilitado."
#: ../flask_admin/contrib/fileadmin.py:514
#, python-format
msgid "Failed to save file: %(error)s"
msgstr "Falha ao gravar arquivo: %(error)s"
#: ../flask_admin/contrib/fileadmin.py:554
msgid "Directory creation is disabled."
msgstr "A criação de diretórios está desabilitada."
#: ../flask_admin/contrib/fileadmin.py:569
#, python-format
msgid "Failed to create directory: %(error)s"
msgstr "Falha ao criar diretório: %(error)s"
#: ../flask_admin/contrib/fileadmin.py:591
msgid "Deletion is disabled."
msgstr "Exclusão está desabilitada."
#: ../flask_admin/contrib/fileadmin.py:600
msgid "Directory deletion is disabled."
msgstr "Exclusão de diretórios está desabilitada"
#: ../flask_admin/contrib/fileadmin.py:606
#, python-format
msgid "Directory \"%(path)s\" was successfully deleted."
msgstr "Diretório \"%(path)s\" foi excluído com sucesso."
#: ../flask_admin/contrib/fileadmin.py:608
#, python-format
msgid "Failed to delete directory: %(error)s"
msgstr "Falha ao excluir diretório: %(error)s"
#: ../flask_admin/contrib/fileadmin.py:613
#: ../flask_admin/contrib/fileadmin.py:750
#, python-format
msgid "File \"%(name)s\" was successfully deleted."
msgstr "Arquivo \"%(name)s\" foi excluído com sucesso."
#: ../flask_admin/contrib/fileadmin.py:615
#: ../flask_admin/contrib/fileadmin.py:752
#, python-format
msgid "Failed to delete file: %(name)s"
msgstr "Falha ao excluir arquivo: %(name)s"
#: ../flask_admin/contrib/fileadmin.py:634
msgid "Renaming is disabled."
msgstr "Renomear está desabilitado."
#: ../flask_admin/contrib/fileadmin.py:642
msgid "Path does not exist."
msgstr "O caminho não existe."
#: ../flask_admin/contrib/fileadmin.py:654
#, python-format
msgid "Successfully renamed \"%(src)s\" to \"%(dst)s\""
msgstr "Renomeado com sucesso: de \"%(src)s\" para \"%(dst)s\""
#: ../flask_admin/contrib/fileadmin.py:657
#, python-format
msgid "Failed to rename: %(error)s"
msgstr "Falha ao renomear: %(error)s"
#: ../flask_admin/contrib/fileadmin.py:700
#, python-format
msgid "Error saving changes to %(name)s."
msgstr "Erro ao salvar alterações para %(name)s."
#: ../flask_admin/contrib/fileadmin.py:704
#, python-format
msgid "Changes to %(name)s saved successfully."
msgstr "Alterações para %(name)s salvas com sucesso."
#: ../flask_admin/contrib/fileadmin.py:711
#, python-format
msgid "Error reading %(name)s."
msgstr "Erro ao ler %(name)s."
#: ../flask_admin/contrib/fileadmin.py:714
#: ../flask_admin/contrib/fileadmin.py:723
#, python-format
msgid "Unexpected error while reading from %(name)s"
msgstr "Erro inesperado ao ler %(name)s"
#: ../flask_admin/contrib/fileadmin.py:720
#, python-format
msgid "Cannot edit %(name)s."
msgstr "Não é ṕossível editar %(name)s."
#: ../flask_admin/contrib/fileadmin.py:737
#: ../flask_admin/contrib/mongoengine/view.py:587
#: ../flask_admin/contrib/peewee/view.py:405
#: ../flask_admin/contrib/pymongo/view.py:329
#: ../flask_admin/contrib/sqla/view.py:873
msgid "Delete"
msgstr "Excluir"
#: ../flask_admin/contrib/fileadmin.py:738
msgid "Are you sure you want to delete these files?"
msgstr "Você tem certeza que deseja excluir estes arquivos?"
#: ../flask_admin/contrib/fileadmin.py:741
msgid "File deletion is disabled."
msgstr "Exclusão de arquivos desabilitada."
#: ../flask_admin/contrib/fileadmin.py:754
msgid "Edit"
msgstr "Editar"
#: ../flask_admin/contrib/rediscli.py:125
msgid "Cli: Invalid command."
msgstr "Cli: Comando inválido"
#: ../flask_admin/contrib/mongoengine/filters.py:36
#: ../flask_admin/contrib/peewee/filters.py:35
#: ../flask_admin/contrib/pymongo/filters.py:38
#: ../flask_admin/contrib/sqla/filters.py:36
msgid "equals"
msgstr "igual"
#: ../flask_admin/contrib/mongoengine/filters.py:45
#: ../flask_admin/contrib/peewee/filters.py:43
#: ../flask_admin/contrib/pymongo/filters.py:47
#: ../flask_admin/contrib/sqla/filters.py:44
msgid "not equal"
msgstr "diferente"
#: ../flask_admin/contrib/mongoengine/filters.py:55
#: ../flask_admin/contrib/peewee/filters.py:52
#: ../flask_admin/contrib/pymongo/filters.py:57
#: ../flask_admin/contrib/sqla/filters.py:53
msgid "contains"
msgstr "contém"
#: ../flask_admin/contrib/mongoengine/filters.py:65
#: ../flask_admin/contrib/peewee/filters.py:61
#: ../flask_admin/contrib/pymongo/filters.py:67
#: ../flask_admin/contrib/sqla/filters.py:62
msgid "not contains"
msgstr "não contém"
#: ../flask_admin/contrib/mongoengine/filters.py:74
#: ../flask_admin/contrib/peewee/filters.py:69
#: ../flask_admin/contrib/pymongo/filters.py:76
#: ../flask_admin/contrib/sqla/filters.py:70
msgid "greater than"
msgstr "maior que"
#: ../flask_admin/contrib/mongoengine/filters.py:83
#: ../flask_admin/contrib/peewee/filters.py:77
#: ../flask_admin/contrib/pymongo/filters.py:85
#: ../flask_admin/contrib/sqla/filters.py:78
msgid "smaller than"
msgstr "menor que"
#: ../flask_admin/contrib/mongoengine/view.py:478
#, python-format
msgid "Failed to get model. %(error)s"
msgstr "Falha ao obter model. %(error)s"
#: ../flask_admin/contrib/mongoengine/view.py:499
#: ../flask_admin/contrib/peewee/view.py:355
#: ../flask_admin/contrib/pymongo/view.py:264
#: ../flask_admin/contrib/sqla/view.py:806
#, python-format
msgid "Failed to create model. %(error)s"
msgstr "Falha ao criar model. %(error)s"
#: ../flask_admin/contrib/mongoengine/view.py:526
#: ../flask_admin/contrib/peewee/view.py:375
#: ../flask_admin/contrib/pymongo/view.py:289
#: ../flask_admin/contrib/sqla/view.py:832
#, python-format
msgid "Failed to update model. %(error)s"
msgstr "Falha ao atualizar model. %(error)s"
#: ../flask_admin/contrib/mongoengine/view.py:551
#: ../flask_admin/contrib/peewee/view.py:392
#: ../flask_admin/contrib/pymongo/view.py:315
#: ../flask_admin/contrib/sqla/view.py:859
#, python-format
msgid "Failed to delete model. %(error)s"
msgstr "Falha ao excluir model. %(error)s"
#: ../flask_admin/contrib/mongoengine/view.py:588
#: ../flask_admin/contrib/peewee/view.py:406
#: ../flask_admin/contrib/pymongo/view.py:330
#: ../flask_admin/contrib/sqla/view.py:874
msgid "Are you sure you want to delete selected models?"
msgstr "Você tem certeza que deseja excluir os models selecionados?"
#: ../flask_admin/contrib/mongoengine/view.py:597
#: ../flask_admin/contrib/peewee/view.py:422
#: ../flask_admin/contrib/pymongo/view.py:340
#: ../flask_admin/contrib/sqla/view.py:890
#, python-format
msgid "Model was successfully deleted."
msgid_plural "%(count)s models were successfully deleted."
msgstr[0] "Model was successfully deleted."
msgstr[1] "%(count)s models foram excluídos com sucesso."
#: ../flask_admin/contrib/mongoengine/view.py:605
#: ../flask_admin/contrib/peewee/view.py:430
#: ../flask_admin/contrib/pymongo/view.py:345
#: ../flask_admin/contrib/sqla/view.py:898
#, python-format
msgid "Failed to delete models. %(error)s"
msgstr "Falha ao excluir models. %(error)s"
#: ../flask_admin/contrib/sqla/fields.py:123
#: ../flask_admin/contrib/sqla/fields.py:173
#: ../flask_admin/contrib/sqla/fields.py:178
#: ../flask_admin/model/fields.py:164 ../flask_admin/model/fields.py:213
msgid "Not a valid choice"
msgstr "Não é uma escolha válida"
#: ../flask_admin/contrib/sqla/validators.py:38
msgid "Already exists."
msgstr "Já existe."
#: ../flask_admin/contrib/sqla/view.py:783
#, python-format
msgid "Integrity error. %(message)s"
msgstr "Erro de integridade. %(message)s"
#: ../flask_admin/form/fields.py:89
msgid "Invalid time format"
msgstr "Formato de hora inválido"
#: ../flask_admin/form/fields.py:133
msgid "Invalid Choice: could not coerce"
msgstr "Escolha inválida: não é possível converter"
#: ../flask_admin/form/upload.py:187
msgid "Invalid file extension"
msgstr "Extensão de arquivo inválida"
#: ../flask_admin/model/base.py:1012
msgid "There are no items in the table."
msgstr "Não existem itens na tabela."
#: ../flask_admin/model/base.py:1257
msgid "Model was successfully created."
msgstr "Model criado com sucesso."
#: ../flask_admin/model/base.py:1294
msgid "Model was successfully saved."
msgstr "Model salvo com sucesso."
#: ../flask_admin/model/filters.py:91
msgid "Yes"
msgstr "Sim"
#: ../flask_admin/model/filters.py:92
msgid "No"
msgstr "Não"
#: ../flask_admin/templates/bootstrap2/admin/actions.html:4
#: ../flask_admin/templates/bootstrap3/admin/actions.html:4
msgid "With selected"
msgstr "Com o(s) selecionado(s)"
#: ../flask_admin/templates/bootstrap2/admin/lib.html:151
#: ../flask_admin/templates/bootstrap3/admin/lib.html:144
msgid "Submit"
msgstr "Salvar"
#: ../flask_admin/templates/bootstrap2/admin/lib.html:156
#: ../flask_admin/templates/bootstrap3/admin/lib.html:149
msgid "Cancel"
msgstr "Cancelar"
#: ../flask_admin/templates/bootstrap2/admin/file/edit.html:5
#: ../flask_admin/templates/bootstrap3/admin/file/edit.html:5
#, python-format
msgid "You are editing %(path)s"
msgstr "Você está editando %(path)s"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:9
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:9
msgid "Root"
msgstr "Raíz"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:62
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:62
#, python-format
msgid "Are you sure you want to delete \\'%(name)s\\' recursively?"
msgstr "Você tem certeza que deseja excluir \\'%(name)s\\' recursivamente?"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:70
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:70
#, python-format
msgid "Are you sure you want to delete \\'%(name)s\\'?"
msgstr "Você tem certeza que deseja excluir \\'%(name)s\\'?"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:105
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:105
msgid "Upload File"
msgstr "Upload de arquivo"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:110
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:110
msgid "Create Directory"
msgstr "Criar diretório"
#: ../flask_admin/templates/bootstrap2/admin/file/list.html:127
#: ../flask_admin/templates/bootstrap3/admin/file/list.html:127
msgid "Please select at least one file."
msgstr "Por favor, selecione pelo menos um arquivo."
#: ../flask_admin/templates/bootstrap2/admin/file/rename.html:5
#: ../flask_admin/templates/bootstrap3/admin/file/rename.html:5
#, python-format
msgid "Please provide new name for %(name)s"
msgstr "Por favor, informe um novo nome para %(name)s"
#: ../flask_admin/templates/bootstrap2/admin/model/create.html:6
#: ../flask_admin/templates/bootstrap3/admin/model/create.html:6
msgid "Save and Add"
msgstr "Salvar e Adicionar"
#: ../flask_admin/templates/bootstrap2/admin/model/create.html:18
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:17
#: ../flask_admin/templates/bootstrap3/admin/model/create.html:18
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:17
msgid "List"
msgstr "Listar"
#: ../flask_admin/templates/bootstrap2/admin/model/create.html:21
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:21
#: ../flask_admin/templates/bootstrap3/admin/model/create.html:21
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:21
msgid "Create"
msgstr "Criar"
#: ../flask_admin/templates/bootstrap2/admin/model/edit.html:6
#: ../flask_admin/templates/bootstrap3/admin/model/edit.html:6
msgid "Save and Continue"
msgstr "Salvar e Continuar"
#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:10
#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:10
msgid "Delete?"
msgstr "Excluir?"
#: ../flask_admin/templates/bootstrap2/admin/model/inline_list_base.html:33
#: ../flask_admin/templates/bootstrap3/admin/model/inline_list_base.html:33
msgid "Add"
msgstr "Adicionar"
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:3
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:3
msgid "Add Filter"
msgstr "Adicionar Filtro"
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:17
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:17
msgid "Apply"
msgstr "Aplicar"
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:19
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:19
msgid "Reset Filters"
msgstr "Limpar Filtros"
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:30
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:30
msgid "Remove Filter"
msgstr "Remover Filtros"
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:69
#: ../flask_admin/templates/bootstrap2/admin/model/layout.html:76
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:69
#: ../flask_admin/templates/bootstrap3/admin/model/layout.html:76
msgid "Search"
msgstr "Pesquisar"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:21
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:21
msgid "Create new record"
msgstr "Criar novo registro"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:57
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:57
msgid "Select all records"
msgstr "Selecionar todos os registros"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:68
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:77
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:68
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:77
#, python-format
msgid "Sort by %(name)s"
msgstr "Ordenar por %(name)s"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:99
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:99
msgid "Select record"
msgstr "Selecionar registro"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:115
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:115
msgid "You sure you want to delete this item?"
msgstr "Você tem certeza que deseja excluir este item?"
#: ../flask_admin/templates/bootstrap2/admin/model/list.html:152
#: ../flask_admin/templates/bootstrap3/admin/model/list.html:152
msgid "Please select at least one model."
msgstr "Por favor, selecione pelo menos um model."
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment