Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F74691941
__init__.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Jul 29, 04:17
Size
7 KB
Mime Type
text/x-python
Expires
Wed, Jul 31, 04:17 (2 d)
Engine
blob
Format
Raw Data
Handle
19426173
Attached To
R3600 invenio-infoscience
__init__.py
View Options
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2012, 2013, 2014 CERN.
#
# Invenio is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# Invenio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Invenio; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
"""Additional extensions and filters for jinja2 module."""
import
re
import
six
from
.bccache
import
BytecodeCacheWithConfig
from
.context_processor
import
setup_app
as
context_processor_setup_app
from
.loader
import
OrderAwareDispatchingJinjaLoader
from
flask
import
g
,
request
,
_request_ctx_stack
,
url_for
from
jinja2
import
ChoiceLoader
from
six
import
iteritems
ENV_PREFIX
=
'_collected_'
def
render_template_to_string
(
input
,
_from_string
=
False
,
**
context
):
"""
Render a template from the template folder with the given context.
Code based on
`<https://github.com/mitsuhiko/flask/blob/master/flask/templating.py>`_
:param input: the string template, or name of the template to be
rendered, or an iterable with template names
the first one existing will be rendered
:param context: the variables that should be available in the
context of the template.
:return: a string
"""
ctx
=
_request_ctx_stack
.
top
ctx
.
app
.
update_template_context
(
context
)
if
_from_string
:
template
=
ctx
.
app
.
jinja_env
.
from_string
(
input
)
else
:
template
=
ctx
.
app
.
jinja_env
.
get_or_select_template
(
input
)
return
template
.
render
(
context
)
def
inject_utils
():
"""
Inject variables and functions to jinja execution context.
In particular it will add:
- ``url_for``: an Invenio specific wrapper of Flask url_for, that will let
you obtain URLs for non Flask-native handlers (i.e. not yet ported
Invenio URLs)
- ``_``: this can be used to automatically translate a given string.
- ``is_language_rtl``: True if the chosen language should be read right to
left.
"""
from
werkzeug.routing
import
BuildError
from
invenio.base.i18n
import
is_language_rtl
from
flask.ext.login
import
current_user
from
invenio.utils.url
import
create_url
,
get_canonical_and_alternates_urls
def
invenio_url_for
(
endpoint
,
**
values
):
try
:
return
url_for
(
endpoint
,
**
values
)
except
BuildError
:
if
re
.
match
(
"https?://"
,
endpoint
,
re
.
IGNORECASE
):
return
endpoint
if
endpoint
.
startswith
(
'.'
):
endpoint
=
request
.
blueprint
+
endpoint
url
=
create_url
(
'/'
+
endpoint
.
replace
(
'.'
,
'/'
),
values
,
False
)
return
url
.
decode
(
'utf-8'
)
user
=
current_user
.
_get_current_object
()
canonical_url
,
alternate_urls
=
get_canonical_and_alternates_urls
(
request
.
path
)
alternate_urls
=
dict
((
ln
.
replace
(
'_'
,
'-'
),
alternate_url
)
for
ln
,
alternate_url
in
iteritems
(
alternate_urls
))
try
:
# should not be global due to bibfield_config
from
invenio.modules.records.api
import
get_record
except
:
get_record
=
lambda
*
args
,
**
kwargs
:
None
return
dict
(
current_user
=
user
,
is_language_rtl
=
is_language_rtl
,
canonical_url
=
canonical_url
,
alternate_urls
=
alternate_urls
,
get_record
=
get_record
,
url_for
=
invenio_url_for
,
)
def
setup_app
(
app
):
"""
Extend application template filters with custom filters and fixes.
List of applied filters:
- filesizeformat
- path_join
- quoted_txt2html
- invenio_format_date
- invenio_pretty_date
- invenio_url_args
"""
import
os
from
datetime
import
datetime
from
invenio.utils.date
import
convert_datetext_to_dategui
,
\
convert_datestruct_to_dategui
,
pretty_date
from
.
import
config
app
.
config
.
from_object
(
config
)
context_processor_setup_app
(
app
)
app
.
context_processor
(
inject_utils
)
if
app
.
config
.
get
(
'JINJA2_BCCACHE'
,
False
):
app
.
jinja_options
=
dict
(
app
.
jinja_options
,
auto_reload
=
app
.
config
.
get
(
'JINJA2_BCCACHE_AUTO_RELOAD'
,
False
),
cache_size
=
app
.
config
.
get
(
'JINJA2_BCCACHE_SIZE'
,
-
1
),
bytecode_cache
=
BytecodeCacheWithConfig
(
app
))
## Let's customize the template loader to look into packages
## and application templates folders.
jinja_loader
=
ChoiceLoader
([
OrderAwareDispatchingJinjaLoader
(
app
),
app
.
jinja_loader
,
])
app
.
jinja_loader
=
jinja_loader
for
ext
in
app
.
config
.
get
(
'JINJA2_EXTENSIONS'
,
[]):
try
:
app
.
jinja_env
.
add_extension
(
ext
)
except
:
app
.
logger
.
error
(
'Problem with loading extension: "
%s
"'
%
(
ext
,
))
test_not_empty
=
lambda
v
:
v
is
not
None
and
v
!=
''
@app.template_filter
(
'prefix'
)
def
_prefix
(
value
,
prefix
=
''
):
return
prefix
+
value
if
test_not_empty
(
value
)
else
''
@app.template_filter
(
'suffix'
)
def
_suffix
(
value
,
suffix
=
''
):
return
value
+
suffix
if
test_not_empty
(
value
)
else
''
@app.template_filter
(
'wrap'
)
def
_wrap
(
value
,
prefix
=
''
,
suffix
=
''
):
return
prefix
+
value
+
suffix
if
test_not_empty
(
value
)
else
''
@app.template_filter
(
'sentences'
)
def
_sentences
(
value
,
limit
,
separator
=
'. '
):
"""Return first `limit` number of sentences ending by `separator`."""
return
separator
.
join
(
value
.
split
(
separator
)[:
limit
])
@app.template_filter
(
'path_join'
)
def
_os_path_join
(
d
):
"""Shortcut for `os.path.join`."""
return
os
.
path
.
join
(
*
d
)
@app.template_filter
(
'quoted_txt2html'
)
def
_quoted_txt2html
(
*
args
,
**
kwargs
):
from
invenio.utils.mail
import
email_quoted_txt2html
return
email_quoted_txt2html
(
*
args
,
**
kwargs
)
@app.template_filter
(
'invenio_format_date'
)
def
_format_date
(
date
):
"""
Format a date into a human friendly format.
It uses :py:func:`invenio.utils.date.convert_datetext_to_dategui`
"""
if
isinstance
(
date
,
datetime
):
return
convert_datestruct_to_dategui
(
date
.
timetuple
(),
getattr
(
g
,
'ln'
,
app
.
config
[
'CFG_SITE_LANG'
]))
.
decode
(
'utf-8'
)
return
convert_datetext_to_dategui
(
date
,
getattr
(
g
,
'ln'
,
app
.
config
[
'CFG_SITE_LANG'
])
)
.
decode
(
'utf-8'
)
@app.template_filter
(
'invenio_pretty_date'
)
def
_pretty_date
(
date
):
"""
Format a timestamp into a human friendly format.
It uses :py:func:`invenio.utils.date.pretty_date`
"""
if
isinstance
(
date
,
datetime
)
or
isinstance
(
date
,
six
.
string_types
):
return
pretty_date
(
date
,
ln
=
getattr
(
g
,
'ln'
,
app
.
config
[
'CFG_SITE_LANG'
]))
return
date
@app.template_filter
(
'invenio_url_args'
)
def
_url_args
(
d
,
append
=
u'?'
,
filter
=
[]):
from
jinja2.utils
import
escape
rv
=
append
+
u'&'
.
join
(
u'
%s
=
%s
'
%
(
escape
(
key
),
escape
(
value
))
for
key
,
value
in
d
.
iteritems
(
True
)
if
value
is
not
None
and
key
not
in
filter
# and not isinstance(value, Undefined)
)
return
rv
return
app
Event Timeline
Log In to Comment