Compare commits

...

67 Commits

Author SHA1 Message Date
Mojib Wali
44e5857143 v0.5.9 2021-05-07 12:01:04 +02:00
mb-wali
460de9fc35 feature: adds searchguide german 2021-05-07 11:02:25 +02:00
Mojib Wali
b1d7a6558e v0.5.8 2021-04-30 13:32:46 +02:00
mb-wali
890fded625 dep: installing invenio-app-rdm 2021-04-30 13:32:23 +02:00
Mojib Wali
1304563a3e v0.5.7 2021-04-28 09:01:04 +02:00
mb-wali
a08201041a bugfix: search guide url 2021-04-28 08:54:48 +02:00
Mojib Wali
548896be11 v0.5.6 2021-04-27 15:53:59 +02:00
Mojib Wali
a10433aba3 email: welcome email template 2021-04-27 15:48:05 +02:00
Mojib Wali
f0fbabbaa8 v0.5.5 2021-04-22 09:46:08 +02:00
Mojib Wali
5e2a58c764 i18n: adds translation
* babel: adds a wildcard to extract txt files.
* refactor txt file
2021-04-22 09:45:42 +02:00
Mojib Wali
9af1beff88 v0.5.4 2021-04-21 16:11:09 +02:00
rekt-hard
80575cbced feature: override email welcome template
* overrides flask-security welcome template
2021-04-21 16:10:30 +02:00
Unix
60b85e6ad5 global: repo cleanup 2021-03-31 14:22:32 +02:00
Mojib Wali
10f68379b5 v0.5.3 2021-03-29 10:06:21 +02:00
Mojib Wali
49766790d7 config: refactor email subject. 2021-03-24 09:42:41 +01:00
Mojib Wali
977d5588f4 refactor: changed the link to point correct repo. 2021-03-18 13:55:35 +01:00
Mojib Wali
ded93fabeb v0.5.2 2021-03-18 10:26:00 +01:00
Mojib Wali
c2ee5fa4b7 configs(db): adds SQLALCHEMY configs
* configs(db): adds SQLALCHEMY configs
configs: adds fixture user
2021-03-18 10:24:55 +01:00
Unix
cf3ffa1543 config: adds default rdm depsit fields empty
refactor: removes saml configs
2021-03-18 09:53:59 +01:00
Mojib Wali
927fb44f95 v0.5.1 2021-03-10 20:24:42 +01:00
Mojib Wali
d7c91765b4 config: shibboleth default not configured 2021-03-10 20:24:13 +01:00
Mojib Wali
dba1cd5d62 v0.5.0 2021-03-09 09:34:59 +01:00
rekt-hard
49b5477ebc fix: extend csp to allow datacite and zammad (#48) 2021-03-09 09:04:24 +01:00
Mojib Wali
92cfad940f v0.4.2 2021-03-02 15:25:02 +01:00
Mojib Wali
93ad527061 config: disable registration
* vocab: remove override vocab
* global: disable user registration
2021-03-02 15:24:18 +01:00
Mojib Wali
9d2ad34601 v0.4.1 2021-01-18 10:54:09 +01:00
Mojib Wali
1eb836aec8 permission: restriction to only open access 2021-01-18 10:28:34 +01:00
Mojib Wali
42e7a332d0 v0.4.0 2021-01-05 13:27:16 +01:00
Mojib Wali
5dd1bf0602 refactor(config): #41
* adding domain name for the production
* disable RDM records permission override
2021-01-05 13:24:56 +01:00
Mojib Wali
956a9eea76 feature(permission): AuthenticatedUser Generator #39 2021-01-05 13:23:11 +01:00
mb
4310ca8755 feature: adding domain to allowed host
refactor: disabled RDM permission override

This closes #40
2021-01-05 11:03:46 +01:00
Mojib Wali
ce97c5378c feature(permissions): RecordIp generator #36 2021-01-05 09:44:27 +01:00
Mojib Wali
e2b1c59c5d feature(permission): split the base from rdm permissions
* updated rdm permission policy
* ci: updating test commands to new 1.4.41
2020-12-21 14:54:05 +01:00
Mojib Wali
cb7f00d76c v0.3.0 2020-12-04 10:35:38 +01:00
Mojib Wali
be22817a91 ci(repo): migrate to github actions. #34
tests(repo): modified to github actions.
2020-12-04 10:30:34 +01:00
Mojib Wali
1ca39d2f8d refactor(user):userprofile #31
* disable userprofile extended form.
  User is no longer obliged to provide username and name when registering.
  This mean that the user can change/add name and username from profile section.
* disable changing email address.
  User no longer can change the email address from profile section.
2020-11-10 12:19:55 +01:00
mb
7069bbe481 refactor(user):disable changing email address
* disable userprofile extended form.
2020-11-09 12:23:12 +01:00
Mojib Wali
396f44fbd8 url/badge update
Repository transfer from 'https://github.com/mb-wali' to 'https://github.com/tu-graz-library'.
2020-10-28 13:55:09 +01:00
Unix
8f2670235b badges/url updated
after transfering the module the path/url was invalid.
2020-10-28 13:46:34 +01:00
Mojib Wali
d70c690ab3 v0.2.2 2020-10-19 14:39:41 +02:00
Mojib Wali
6803ce9614 bump dependencies
* bump dependency : invenio-rdm-records
* SQLAlchemy-Utils for SQL queries
* invenio-search with elasticsearch 7
* SQLAlchemy-Continuum for a versioning extension for SQLAlchemy
2020-10-19 14:28:53 +02:00
Mojib Wali
4d89290b58 bump dependency : invenio-rdm-records
This change is required for the latest invenioRDM - sep release.
2020-10-19 14:10:07 +02:00
Christoph Ladurner
2ccd24cfca all python files are now formated with black (#23)
* all python files are now formated with black

NOTE:
some configurations where necessary. flake8 line-length has to be set to 88
which is the default for black. but this was not enough some lines of black
where formated longer then 88 characters. found flake8-bugbear with B950.

with that and in combination with ignore=E501 it is possible to ignore long
lines, but if there are lines to long it will still point it out.

further also for isort some configuration was necessary

REFERENCES:
https://github.com/psf/black/blob/master/docs/compatible_configs.md#isort
https://github.com/psf/black/blob/master/docs/compatible_configs.md#flake8
https://github.com/PyCQA/flake8-bugbear#opinionated-warnings

* ext removed unnecessary commented import statement

* generators add pragma: no cover to increase code coverage

NOTE:
this should be corrected with a real test in one of the next commits

* fixed the syntax.

Co-authored-by: Mojib Wali <44528277+mb-wali@users.noreply.github.com>
2020-10-15 10:36:58 +02:00
Mojib Wali
0a37a8015e global: extension class to uppercase.
The extension class name is changed to uppercase.
2020-10-12 10:03:55 +02:00
Mojib Wali
975ac67a8a release; v0.2.1 2020-10-06 09:34:09 +02:00
mb
21d1a9d4c6 Merge branch 'master' of https://github.com/mb-wali/invenio-config-tugraz 2020-10-06 09:30:32 +02:00
mb
3d3354805d translation: extract messages and added required files for i18n, This closes #18 2020-10-06 09:29:52 +02:00
Mojib Wali
b514a38ed9 release: v0.2.0 2020-10-06 09:24:29 +02:00
mb
1556bc7f18 ci:use github actions to publish to pypi
Using github action - passwords are secured in secrets, and it seperated the publishing the package from testing the package. This closes #20
2020-10-06 09:21:16 +02:00
mb
6b175bacf8 test:migrate to latest pytest-invenio and docker-services-cli
This closes #19
2020-10-06 09:04:15 +02:00
mb
89ab18cf04 commented the overriden
uncomment to enable, also excluded some line of code from coverage.
2020-09-29 14:33:34 +02:00
mb-wali
595bf8ca48 Generators for permissions(WIP)
First draft Custom Generators for permissions(WIP)
2020-09-29 13:37:56 +02:00
mb
b4a2f2a36b get user remote_ip
* function to check user ip. * renamed the files.
2020-09-24 10:42:14 +02:00
mb
2f4df9167b seperate file for access control configuration
permissionsPolicy file will handle the access control configurations.
2020-09-23 14:22:02 +02:00
mb
2b71d1af73 Access control configuration
updated the dependencies & documentation for permissions based on new release on invenio-records-permission.
2020-09-22 13:27:50 +02:00
mb
9bd44f269b not relevant to permissions.
by default this variable should be set to True.
2020-09-18 11:52:31 +02:00
mb
6e3e8e24c8 generator documentations. 2020-08-26 13:21:12 +02:00
mb
8a5cef77f4 documentation:how to override the default policies for records
adding custom generator to the overriden policy.
2020-08-20 15:00:48 +02:00
mb
8b3b577d32 how to:implementing generator for RecordIp. 2020-08-20 14:47:30 +02:00
mb-wali
9cd3f33475 configs
extra information on config variables.
2020-08-17 17:47:43 +02:00
mb
24b29ff668 extra information on config variables. 2020-07-31 09:48:34 +02:00
mb
e431ff2eb6 updated tests files
with pytest version 6.0.0, these changes were required.
2020-07-30 11:42:06 +02:00
mb
6cd0fabf9e update config file 2020-07-27 15:52:24 +02:00
mb-wali
f543f1f08c v0.1.5 2020-07-27 11:58:58 +02:00
mb-wali
94c858f412 Update .travis.yml 2020-07-27 11:58:21 +02:00
mb-wali
33fc35272c v0.1.4 2020-07-27 11:47:26 +02:00
mb-wali
02db7a01c9 Update .travis.yml 2020-07-27 11:45:44 +02:00
39 changed files with 1640 additions and 411 deletions

View File

@@ -32,8 +32,8 @@ indent_size = 4
[*.{css,html,js,json,yml}] [*.{css,html,js,json,yml}]
indent_size = 2 indent_size = 2
# Matches the exact files either package.json or .travis.yml # Matches the exact files either package.json or .github/workflows/*.yml
[{package.json,.travis.yml}] [{package.json,.github/workflows/*.yml}]
indent_size = 2 indent_size = 2
# Dockerfile # Dockerfile

26
.github/workflows/pypi-publish.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
on:
push:
tags:
- v*
jobs:
build-n-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.7
uses: actions/setup-python@v2
with:
python-version: 3.7
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel
- name: Build package
run: |
python setup.py compile_catalog sdist bdist_wheel
- name: pypi-publish
uses: pypa/gh-action-pypi-publish@v1.3.1
with:
user: __token__
password: ${{ secrets.pypi_password }}

87
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,87 @@
name: CI
on:
push:
branches: master
pull_request:
branches: master
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 3 * * 6'
workflow_dispatch:
inputs:
reason:
description: 'Reason'
required: false
default: 'Manual trigger'
jobs:
Tests:
runs-on: ubuntu-20.04
strategy:
matrix:
python-version: [3.6, 3.7, 3.8, 3.9]
requirements-level: [min, pypi]
db-service: [postgresql12]
search-service: [elasticsearch7]
exclude:
- python-version: 3.6
requirements-level: pypi
- python-version: 3.7
requirements-level: min
- python-version: 3.8
requirements-level: min
- python-version: 3.9
requirements-level: min
- db-service: postgresql12
requirements-level: min
- search-service: elasticsearch7
requirements-level: min
include:
- db-service: postgresql12
DB_EXTRAS: "postgresql"
- search-service: elasticsearch7
SEARCH_EXTRAS: "elasticsearch7"
env:
DB: ${{ matrix.db-service }}
SEARCH: ${{ matrix.search-service }}
EXTRAS: all,${{ matrix.DB_EXTRAS }},${{ matrix.SEARCH_EXTRAS }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}
- name: Generate dependencies
run: |
python -m pip install --upgrade pip setuptools py wheel requirements-builder
requirements-builder -e "$EXTRAS" --level=${{ matrix.requirements-level }} setup.py > .${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt
- name: Cache pip
uses: actions/cache@v2
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('.${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt') }}
- name: Install dependencies
run: |
pip install -r .${{ matrix.requirements-level }}-${{ matrix.python-version }}-requirements.txt
pip install ".[$EXTRAS]"
pip freeze
docker --version
docker-compose --version
- name: Run tests
run: |
./run-tests.sh

View File

@@ -1,60 +0,0 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020 Mojib Wali.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
notifications:
email: false
sudo: false
language: python
matrix:
fast_finish: true
allow_failures:
# To allow failures, you need to specify the full environment
- env: REQUIREMENTS=devel
cache:
- pip
env:
- REQUIREMENTS=lowest
- REQUIREMENTS=release
- REQUIREMENTS=devel
python:
- "3.6"
- "3.7"
before_install:
- "nvm install 6; nvm use 6"
- "travis_retry pip install --upgrade pip setuptools py"
- "travis_retry pip install twine wheel coveralls requirements-builder"
- "requirements-builder -e all --level=min setup.py > .travis-lowest-requirements.txt"
- "requirements-builder -e all --level=pypi setup.py > .travis-release-requirements.txt"
- "requirements-builder -e all --level=dev --req requirements-devel.txt setup.py > .travis-devel-requirements.txt"
install:
- "travis_retry pip install -r .travis-${REQUIREMENTS}-requirements.txt"
- "travis_retry pip install -e .[all]"
script:
- "./run-tests.sh"
after_success:
- coveralls
deploy:
skip_existing: true
provider: pypi
username: __token__
password:
secure: XJtAAKVZu/bhcS3/2VAYuHmx8QChSvKis22lhAhzArMF6g+T5NDsbrn2EppBbXE2wNqiwSiMAgsebu/9wxXIRIbPbwLqb4T9SF2j/zmnhpz9ORwrniawwsc+eKamZtpdSrEpCVlrSJeat9tGxV3jKy//4T50CHLRdQA/gGGlEfBEybTtorpEyQp08Y5xIbYrFFsidjMz++gQeHiWMJ7ZSWGewJ62exYNu/Hjr6h5hk6J7yC7FhFKtcDdvWrBfiuM6JkerCRxoXBEAQWki/D1tBO0N8w20wa9dw0rzx82T5Br1uqCC1kr68Sqt7jpXKp+nCs/ClHb4cFAnXtHJ3CZd+xRBE1BX2Akgj/YyP99Epw4UIJGuoZzqHCKjoF/Nj5toMiu8VqQeR2cLCuPbzubfIkLTYMJseClLsVIn8bh5fvucIBcvLYlceuW8XU0GFrh4kN/UJTkU5a2T8fdretWrbyrssjRislXFksYMOsJz1B70EGgRqZDkSm+t6otzXbkh0ZenjMRE/U2cYyOEv6zJ7PBQMfqKucTvdv8XrEjU8zLo33K034sVEJelLObO8tXher4ut8erAwZzrD1Up8+1/VqB/TvxPINbaET5ye4y+3Q8qqSQxcLnM3zUHVbEbOBMOvUoWyPfXzpEmo0I0TowTghvgncYQ6oLHr+5TiU/J0=
distributions: sdist bdist_wheel
on:
tags: true

View File

@@ -10,7 +10,7 @@ Types of Contributions
Report Bugs Report Bugs
~~~~~~~~~~~ ~~~~~~~~~~~
Report bugs at https://github.com/mb-wali/invenio-config-tugraz/issues. Report bugs at https://github.com/tu-graz-library/invenio-config-tugraz/issues.
If you are reporting a bug, please include: If you are reporting a bug, please include:
@@ -41,7 +41,7 @@ Submit Feedback
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
The best way to send feedback is to file an issue at The best way to send feedback is to file an issue at
https://github.com/mb-wali/invenio-config-tugraz/issues. https://github.com/tu-graz-library/invenio-config-tugraz/issues.
If you are proposing a feature: If you are proposing a feature:
@@ -113,6 +113,6 @@ Before you submit a pull request, check that it meets these guidelines:
1. The pull request should include tests and must not decrease test coverage. 1. The pull request should include tests and must not decrease test coverage.
2. If the pull request adds functionality, the docs should be updated. Put 2. If the pull request adds functionality, the docs should be updated. Put
your new functionality into a function with a docstring. your new functionality into a function with a docstring.
3. The pull request should work for Python 2.7, 3.5 and 3.6. Check 3. The pull request should work for Python 3.6 and 3.7. Check
https://travis-ci.org/https://github.com/https://github.com/mb-/pull_requests https://github.com/github/tu-graz-library/invenio-config-tugraz//actions?query=event%3Apull_request
and make sure that the tests pass for all supported Python versions. and make sure that the tests pass for all supported Python versions.

View File

@@ -34,11 +34,18 @@ recursive-include docs *.py
recursive-include docs *.rst recursive-include docs *.rst
recursive-include docs *.txt recursive-include docs *.txt
recursive-include docs Makefile recursive-include docs Makefile
recursive-include invenio_config_tugraz *.html
recursive-include tests *.py recursive-include tests *.py
# added by check_manifest.py # added by check_manifest.py
recursive-include invenio_config_tugraz *.crt recursive-include invenio_config_tugraz *.crt
recursive-include invenio_config_tugraz *.json recursive-include invenio_config_tugraz *.json
recursive-include invenio_config_tugraz *.key recursive-include invenio_config_tugraz *.key
recursive-include invenio_config_tugraz *.xml recursive-include invenio_config_tugraz *.xml
recursive-include invenio_config_tugraz *.gitkeep
recursive-include invenio_config_tugraz *.txt
recursive-include invenio_config_tugraz *.html
# added by check-manifest
recursive-include invenio_config_tugraz *.csv

View File

@@ -1,5 +1,5 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020-2021 Graz University of Technology.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-tugraz is free software; you can redistribute it and/or
modify it under the terms of the MIT License; see LICENSE file for more modify it under the terms of the MIT License; see LICENSE file for more
@@ -9,16 +9,16 @@
invenio-config-tugraz invenio-config-tugraz
======================= =======================
.. image:: https://travis-ci.com/mb-wali/invenio-config-tugraz.svg .. image:: https://github.com/tu-graz-library/invenio-config-tugraz/workflows/CI/badge.svg
:target: https://travis-ci.com/github/mb-wali/invenio-config-tugraz :target: https://github.com/tu-graz-library/invenio-config-tugraz/actions
.. image:: https://img.shields.io/pypi/dm/invenio-config-tugraz.svg .. image:: https://img.shields.io/pypi/dm/invenio-config-tugraz.svg
:target: https://pypi.python.org/pypi/invenio-config-tugraz :target: https://pypi.python.org/pypi/invenio-config-tugraz
.. image:: https://img.shields.io/github/tag/mb-wali/invenio-config-tugraz.svg .. image:: https://img.shields.io/github/tag/tu-graz-library/invenio-config-tugraz.svg
:target: https://github.com/mb-wali/invenio-config-tugraz/releases :target: https://github.com/mb-wali/invenio-config-tugraz/releases
.. image:: https://img.shields.io/github/license/mb-wali/invenio-config-tugraz.svg .. image:: https://img.shields.io/github/license/tu-graz-library/invenio-config-tugraz.svg
:target: https://github.com/mb-wali/invenio-config-tugraz/blob/master/LICENSE :target: https://github.com/mb-wali/invenio-config-tugraz/blob/master/LICENSE
.. image:: https://readthedocs.org/projects/invenio-config-tugraz/badge/?version=latest .. image:: https://readthedocs.org/projects/invenio-config-tugraz/badge/?version=latest
@@ -27,6 +27,9 @@
.. image:: https://img.shields.io/coveralls/mb-wali/invenio-config-tugraz.svg .. image:: https://img.shields.io/coveralls/mb-wali/invenio-config-tugraz.svg
:target: https://coveralls.io/r/mb-wali/invenio-config-tugraz :target: https://coveralls.io/r/mb-wali/invenio-config-tugraz
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/psf/black
invenio module that adds tugraz configs. invenio module that adds tugraz configs.
Override configs from diffrent invenio modules to meet TU Graz requirement: Override configs from diffrent invenio modules to meet TU Graz requirement:

View File

@@ -13,7 +13,7 @@ encoding = utf-8
# Extraction from Jinja2 templates # Extraction from Jinja2 templates
[jinja2: **/templates/**.html] [jinja2: **/templates/**.*]
encoding = utf-8 encoding = utf-8
extensions = jinja2.ext.autoescape, jinja2.ext.with_ extensions = jinja2.ext.autoescape, jinja2.ext.with_

View File

@@ -10,45 +10,45 @@
import os import os
import sphinx.environment # import sphinx.environment
# -- General configuration ------------------------------------------------ # -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here. # If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0' # needs_sphinx = '1.0'
# Do not warn on external images. # Do not warn on external images.
suppress_warnings = ['image.nonlocal_uri'] suppress_warnings = ["image.nonlocal_uri"]
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones. # ones.
extensions = [ extensions = [
'sphinx.ext.autodoc', "sphinx.ext.autodoc",
'sphinx.ext.coverage', "sphinx.ext.coverage",
'sphinx.ext.doctest', "sphinx.ext.doctest",
'sphinx.ext.intersphinx', "sphinx.ext.intersphinx",
'sphinx.ext.viewcode', "sphinx.ext.viewcode",
] ]
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ["_templates"]
# The suffix(es) of source filenames. # The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string: # You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md'] # source_suffix = ['.rst', '.md']
source_suffix = '.rst' source_suffix = ".rst"
# The encoding of source files. # The encoding of source files.
#source_encoding = 'utf-8-sig' # source_encoding = 'utf-8-sig'
# The master toctree document. # The master toctree document.
master_doc = 'index' master_doc = "index"
# General information about the project. # General information about the project.
project = u'invenio-config-tugraz' project = u"invenio-config-tugraz"
copyright = u'2020, Mojib Wali' copyright = u"2020, Mojib Wali"
author = u'Mojib Wali' author = u"Mojib Wali"
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@@ -58,11 +58,14 @@ author = u'Mojib Wali'
# Get the version string. Cannot be done with import! # Get the version string. Cannot be done with import!
g = {} g = {}
with open(os.path.join(os.path.dirname(__file__), '..', with open(
'invenio_config_tugraz', 'version.py'), os.path.join(
'rt') as fp: os.path.dirname(__file__), "..", "invenio_config_tugraz", "version.py"
),
"rt",
) as fp:
exec(fp.read(), g) exec(fp.read(), g)
version = g['__version__'] version = g["__version__"]
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = version release = version
@@ -76,9 +79,9 @@ language = None
# There are two options for replacing |today|: either, you set today to some # There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used: # non-false value, then it is used:
#today = '' # today = ''
# Else, today_fmt is used as the format for a strftime call. # Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y' # today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
@@ -86,46 +89,46 @@ exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all # The reST default role (used for this markup: `text`) to use for all
# documents. # documents.
#default_role = None # default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text. # If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True # add_function_parentheses = True
# If true, the current module name will be prepended to all description # If true, the current module name will be prepended to all description
# unit titles (such as .. function::). # unit titles (such as .. function::).
#add_module_names = True # add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the # If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default. # output. They are ignored by default.
#show_authors = False # show_authors = False
# The name of the Pygments (syntax highlighting) style to use. # The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx' pygments_style = "sphinx"
# A list of ignored prefixes for module index sorting. # A list of ignored prefixes for module index sorting.
#modindex_common_prefix = [] # modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents. # If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False # keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing. # If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False todo_include_todos = False
# -- Options for HTML output ---------------------------------------------- # -- Options for HTML output ----------------------------------------------
html_theme = 'alabaster' html_theme = "alabaster"
html_theme_options = { html_theme_options = {
'description': 'invenio module that adds tugraz configs.', "description": "invenio module that adds tugraz configs.",
'github_user': 'inveniosoftware', "github_user": "TU Graz",
'github_repo': 'invenio-config-tugraz', "github_repo": "invenio-config-tugraz",
'github_button': False, "github_button": False,
'github_banner': True, "github_banner": True,
'show_powered_by': False, "show_powered_by": False,
'extra_nav_links': { "extra_nav_links": {
'invenio-config-tugraz@GitHub': 'https://github.com/mb-wali/invenio-config-tugraz', "invenio-config-tugraz@GitHub": "https://github.com/tu-graz-library/invenio-config-tugraz",
'invenio-config-tugraz@PyPI': 'https://pypi.python.org/pypi/invenio-config-tugraz/', "invenio-config-tugraz@PyPI": "https://pypi.python.org/pypi/invenio-config-tugraz/",
} },
} }
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
@@ -134,146 +137,148 @@ html_theme_options = {
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the # further. For a list of options available for each theme, see the
# documentation. # documentation.
#html_theme_options = {} # html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory. # Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = [] # html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to # The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation". # "<project> v<release> documentation".
#html_title = None # html_title = None
# A shorter title for the navigation bar. Default is the same as html_title. # A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None # html_short_title = None
# The name of an image file (relative to this directory) to place at the top # The name of an image file (relative to this directory) to place at the top
# of the sidebar. # of the sidebar.
#html_logo = None # html_logo = None
# The name of an image file (within the static path) to use as favicon of the # The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large. # pixels large.
#html_favicon = None # html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
#html_static_path = ['_static'] # html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or # Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied # .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation. # directly to the root of the documentation.
#html_extra_path = [] # html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format. # using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y' # html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to # If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities. # typographically correct entities.
#html_use_smartypants = True # html_use_smartypants = True
# Custom sidebar templates, maps document names to template names. # Custom sidebar templates, maps document names to template names.
html_sidebars = { html_sidebars = {
'**': [ "**": [
'about.html', "about.html",
'navigation.html', "navigation.html",
'relations.html', "relations.html",
'searchbox.html', "searchbox.html",
'donate.html', "donate.html",
] ]
} }
# Additional templates that should be rendered to pages, maps page names to # Additional templates that should be rendered to pages, maps page names to
# template names. # template names.
#html_additional_pages = {} # html_additional_pages = {}
# If false, no module index is generated. # If false, no module index is generated.
#html_domain_indices = True # html_domain_indices = True
# If false, no index is generated. # If false, no index is generated.
#html_use_index = True # html_use_index = True
# If true, the index is split into individual pages for each letter. # If true, the index is split into individual pages for each letter.
#html_split_index = False # html_split_index = False
# If true, links to the reST sources are added to the pages. # If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True # html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True # html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True # html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will # If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the # contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served. # base URL from which the finished HTML is served.
#html_use_opensearch = '' # html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml"). # This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None # html_file_suffix = None
# Language to be used for generating the HTML full-text search index. # Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages: # Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en' # html_search_language = 'en'
# A dictionary with options for the search language support, empty by default. # A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value # Now only 'ja' uses this config value
#html_search_options = {'type': 'default'} # html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that # The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used. # implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js' # html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder. # Output file base name for HTML help builder.
htmlhelp_basename = 'invenio-config-tugraz_namedoc' htmlhelp_basename = "invenio-config-tugraz_namedoc"
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ---------------------------------------------
latex_elements = { latex_elements = {
# The paper size ('letterpaper' or 'a4paper'). # The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper', # 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
# The font size ('10pt', '11pt' or '12pt'). # 'pointsize': '10pt',
#'pointsize': '10pt', # Additional stuff for the LaTeX preamble.
# 'preamble': '',
# Additional stuff for the LaTeX preamble. # Latex figure (float) alignment
#'preamble': '', # 'figure_align': 'htbp',
# Latex figure (float) alignment
#'figure_align': 'htbp',
} }
# Grouping the document tree into LaTeX files. List of tuples # Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
(master_doc, 'invenio-config-tugraz.tex', u'invenio-config-tugraz Documentation', (
u'Mojib Wali', 'manual'), master_doc,
"invenio-config-tugraz.tex",
u"invenio-config-tugraz Documentation",
u"Mojib Wali",
"manual",
),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
# the title page. # the title page.
#latex_logo = None # latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts, # For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters. # not chapters.
#latex_use_parts = False # latex_use_parts = False
# If true, show page references after internal links. # If true, show page references after internal links.
#latex_show_pagerefs = False # latex_show_pagerefs = False
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
#latex_show_urls = False # latex_show_urls = False
# Documents to append as an appendix to all manuals. # Documents to append as an appendix to all manuals.
#latex_appendices = [] # latex_appendices = []
# If false, no module index is generated. # If false, no module index is generated.
#latex_domain_indices = True # latex_domain_indices = True
# -- Options for manual page output --------------------------------------- # -- Options for manual page output ---------------------------------------
@@ -281,12 +286,17 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
(master_doc, 'invenio-config-tugraz', u'invenio-config-tugraz Documentation', (
[author], 1) master_doc,
"invenio-config-tugraz",
u"invenio-config-tugraz Documentation",
[author],
1,
)
] ]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
#man_show_urls = False # man_show_urls = False
# -- Options for Texinfo output ------------------------------------------- # -- Options for Texinfo output -------------------------------------------
@@ -295,30 +305,36 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
(master_doc, 'invenio-config-tugraz', u'invenio-config-tugraz Documentation', (
author, 'invenio-config-tugraz', 'invenio module that adds tugraz configs.', master_doc,
'Miscellaneous'), "invenio-config-tugraz",
u"invenio-config-tugraz Documentation",
author,
"invenio-config-tugraz",
"invenio module that adds tugraz configs.",
"Miscellaneous",
),
] ]
# Documents to append as an appendix to all manuals. # Documents to append as an appendix to all manuals.
#texinfo_appendices = [] # texinfo_appendices = []
# If false, no module index is generated. # If false, no module index is generated.
#texinfo_domain_indices = True # texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'. # How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote' # texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu. # If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False # texinfo_no_detailmenu = False
# Example configuration for intersphinx: refer to the Python standard library. # Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = { intersphinx_mapping = {
'python': ('https://docs.python.org/', None), "python": ("https://docs.python.org/", None),
# TODO: Configure external documentation references, eg: # TODO: Configure external documentation references, eg:
# 'Flask-Admin': ('https://flask-admin.readthedocs.io/en/latest/', None), # 'Flask-Admin': ('https://flask-admin.readthedocs.io/en/latest/', None),
} }
# Autodoc configuraton. # Autodoc configuraton.
autoclass_content = 'both' autoclass_content = "both"

View File

@@ -8,7 +8,8 @@
"""invenio module that adds tugraz configs.""" """invenio module that adds tugraz configs."""
from .ext import invenioconfigtugraz from .ext import InvenioConfigTugraz
from .generators import RecordIp
from .version import __version__ from .version import __version__
__all__ = ('__version__', 'invenioconfigtugraz') __all__ = ("__version__", "InvenioConfigTugraz", "RecordIp")

View File

@@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2021 Graz University of Technology.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""
Records permission policies.
Default policies for records:
.. code-block:: python
# Read access given to everyone.
can_search = [AnyUser()]
# Create action given to no one (Not even superusers) bc Deposits should
# be used.
can_create = [Disable()]
# Read access given to everyone if public record/files and owners always.
can_read = [AnyUserIfPublic(), RecordOwners()]
# Update access given to record owners.
can_update = [RecordOwners()]
# Delete access given to admins only.
can_delete = [Admin()]
# Associated files permissions (which are really bucket permissions)
can_read_files = [AnyUserIfPublic(), RecordOwners()]
can_update_files = [RecordOwners()]
How to override default policies for records.
Using Custom Generator for a policy:
.. code-block:: python
from invenio_rdm_records.permissions import RDMRecordPermissionPolicy
from invenio_config_tugraz.generators import RecordIp
class TUGRAZPermissionPolicy(RDMRecordPermissionPolicy):
# Delete access given to RecordIp only.
can_delete = [RecordIp()]
RECORDS_PERMISSIONS_RECORD_POLICY = TUGRAZPermissionPolicy
Permissions for Invenio records.
"""
# from invenio_records_permissions.generators import (
# Admin,
# AnyUser,
# AnyUserIfPublic,
# RecordOwners,
# )
# from invenio_records_permissions.policies.base import BasePermissionPolicy
# from .generators import RecordIp
# class TUGRAZPermissionPolicy(BasePermissionPolicy):
# """Access control configuration for records.
# This overrides the /api/records endpoint.
# """
# # Read access to API given to everyone.
# can_search = [AnyUser(), RecordIp()]
# # Read access given to everyone if public record/files and owners always.
# can_read = [AnyUserIfPublic(), RecordOwners(), RecordIp()]
# # Create action given to no one (Not even superusers) bc Deposits should
# # be used.
# can_create = [AnyUser()]
# # Update access given to record owners.
# can_update = [RecordOwners()]
# # Delete access given to admins only.
# can_delete = [Admin()]
# # Associated files permissions (which are really bucket permissions)
# can_read_files = [AnyUserIfPublic(), RecordOwners()]
# can_update_files = [RecordOwners()]

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020-2021 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more # modify it under the terms of the MIT License; see LICENSE file for more
@@ -8,66 +8,90 @@
"""invenio module that adds tugraz configs.""" """invenio module that adds tugraz configs."""
from os.path import abspath, dirname, join
from flask_babelex import gettext as _ from flask_babelex import gettext as _
INVENIO_CONFIG_TUGRAZ_SHIBBOLETH = True INVENIO_CONFIG_TUGRAZ_SHIBBOLETH = False
"""Set True if SAML is configured""" """Set True if SAML is configured"""
INVENIO_CONFIG_TUGRAZ_SINGLE_IP = []
"""Allows access to users whose IP address is listed.
INVENIO_CONFIG_TUGRAZ_SINGLE_IP =
["127.0.0.1", "127.0.0.2"]
"""
INVENIO_CONFIG_TUGRAZ_IP_RANGES = []
"""Allows access to users whose range of IP address is listed.
INVENIO_CONFIG_TUGRAZ_IP_RANGES =
[["127.0.0.2", "127.0.0.99"], ["127.0.1.3", "127.0.1.5"]]
"""
# Invenio-App # Invenio-App
# =========== # ===========
# See https://invenio-app.readthedocs.io/en/latest/configuration.html # See https://invenio-app.readthedocs.io/en/latest/configuration.html
APP_ALLOWED_HOSTS = ['0.0.0.0', APP_ALLOWED_HOSTS = [
'localhost', "0.0.0.0",
'127.0.0.1', "localhost",
'invenio-dev01.tugraz.at', "127.0.0.1",
'invenio-test.tugraz.at' "invenio-dev01.tugraz.at",
] "invenio-test.tugraz.at",
"repository.tugraz.at",
]
"""Allowed Hosts""" """Allowed Hosts"""
APP_DEFAULT_SECURE_HEADERS = { APP_DEFAULT_SECURE_HEADERS = {
'content_security_policy': { "content_security_policy": {
'default-src': [ "default-src": [
"'self'", "'self'",
'fonts.googleapis.com', "fonts.googleapis.com",
'*.gstatic.com', "*.gstatic.com",
'data:', "data:",
"'unsafe-inline'", "'unsafe-inline'",
"'unsafe-eval'", "'unsafe-eval'",
"blob:", "blob:",
"ub-support.tugraz.at", # zammad contact form
"api.datacite.org/dois", # datacite
"api.test.datacite.org/dois", # datacite test
], ],
}, },
'content_security_policy_report_only': False, "content_security_policy_report_only": False,
'content_security_policy_report_uri': None, "content_security_policy_report_uri": None,
'force_file_save': False, "force_file_save": False,
'force_https': True, "force_https": True,
'force_https_permanent': False, "force_https_permanent": False,
'frame_options': 'sameorigin', "frame_options": "sameorigin",
'frame_options_allow_from': None, "frame_options_allow_from": None,
'session_cookie_http_only': True, "session_cookie_http_only": True,
'session_cookie_secure': True, "session_cookie_secure": True,
'strict_transport_security': True, "strict_transport_security": True,
'strict_transport_security_include_subdomains': True, "strict_transport_security_include_subdomains": True,
'strict_transport_security_max_age': 31556926, # One year in seconds "strict_transport_security_max_age": 31556926, # One year in seconds
'strict_transport_security_preload': False, "strict_transport_security_preload": False,
} }
# Invenio-Mail # Invenio-Mail
# =========== # ===========
# See https://invenio-mail.readthedocs.io/en/latest/configuration.html # See https://invenio-mail.readthedocs.io/en/latest/configuration.html
MAIL_SERVER = '129.27.11.182' MAIL_SERVER = "localhost"
"""Domain ip where mail server is running.""" """Domain ip where mail server is running."""
SECURITY_EMAIL_SENDER = "info@invenio-test.tugraz.at" SECURITY_EMAIL_SENDER = "info@invenio-test.tugraz.at"
"""Email address used as sender of account registration emails.""" """Email address used as sender of account registration emails."""
"""Domain name should match the domain used in web server.""" """Domain name should match the domain used in web server."""
SECURITY_EMAIL_SUBJECT_REGISTER = _("Welcome to RDM!") SECURITY_EMAIL_SUBJECT_REGISTER = _("Welcome to TU Graz Repository!")
"""Email subject for account registration emails.""" """Email subject for account registration emails."""
MAIL_SUPPRESS_SEND = False MAIL_SUPPRESS_SEND = True
"""Enable email sending by default.""" """Enable email sending by default.
Set this to False when sending actual emails.
"""
# CORS - Cross-origin resource sharing # CORS - Cross-origin resource sharing
# =========== # ===========
@@ -85,38 +109,44 @@ MAIL_SUPPRESS_SEND = False
# ] # ]
# REST_ENABLE_CORS = True # REST_ENABLE_CORS = True
# Invenio-userprofiles
# Invenio-shibboleth
# =========== # ===========
# See https://invenio-shibboleth.readthedocs.io/en/latest/configuration.html # See https://invenio-userprofiles.readthedocs.io/en/latest/configuration.html
USERPROFILES_EXTEND_SECURITY_FORMS = True USERPROFILES_EXTEND_SECURITY_FORMS = False
"""Set True in order to register user_profile. """Set True in order to register user_profile.
This also forces user to add username and fullname This also forces user to add username and fullname
when register. when register.
""" """
SSO_SAML_IDPS = {} USERPROFILES_EMAIL_ENABLED = False
"""Configuration of IDPS. Actually values can be find in to invenio.cfg file""" """Exclude the user email in the profile form."""
SSO_SAML_DEFAULT_BLUEPRINT_PREFIX = '/shibboleth' # Invenio-shibboleth
# ===========
# See https://invenio-shibboleth.readthedocs.io/en/latest/configuration.html
SSO_SAML_IDPS = {}
"""Configuration of IDPS. Actual values can be find in to invenio.cfg file"""
SSO_SAML_DEFAULT_BLUEPRINT_PREFIX = "/shibboleth"
"""Base URL for the extensions endpoint.""" """Base URL for the extensions endpoint."""
SSO_SAML_DEFAULT_METADATA_ROUTE = '/metadata/<idp>' SSO_SAML_DEFAULT_METADATA_ROUTE = "/metadata/<idp>"
"""URL route for the metadata request.""" """URL route for the metadata request."""
"""This is also SP entityID https://domain/shibboleth/metadata/<idp>""" """This is also SP entityID https://domain/shibboleth/metadata/<idp>"""
SSO_SAML_DEFAULT_SSO_ROUTE = '/login/<idp>' SSO_SAML_DEFAULT_SSO_ROUTE = "/login/<idp>"
"""URL route for the SP login.""" """URL route for the SP login."""
SSO_SAML_DEFAULT_ACS_ROUTE = '/authorized/<idp>' SSO_SAML_DEFAULT_ACS_ROUTE = "/authorized/<idp>"
"""URL route to handle the IdP login request.""" """URL route to handle the IdP login request."""
SSO_SAML_DEFAULT_SLO_ROUTE = '/slo/<idp>' SSO_SAML_DEFAULT_SLO_ROUTE = "/slo/<idp>"
"""URL route for the SP logout.""" """URL route for the SP logout."""
SSO_SAML_DEFAULT_SLS_ROUTE = '/sls/<idp>' SSO_SAML_DEFAULT_SLS_ROUTE = "/sls/<idp>"
"""URL route to handle the IdP logout request.""" """URL route to handle the IdP logout request."""
# Invenio-accounts # Invenio-accounts
@@ -129,7 +159,7 @@ SECURITY_CHANGEABLE = False
SECURITY_RECOVERABLE = False SECURITY_RECOVERABLE = False
"""Allow password recovery by users.""" """Allow password recovery by users."""
SECURITY_REGISTERABLE = True SECURITY_REGISTERABLE = False
""""Allow users to register. """"Allow users to register.
With this variable set to "False" users will not be With this variable set to "False" users will not be
@@ -137,4 +167,147 @@ able to register, or to navigate to /sigup page.
""" """
SECURITY_CONFIRMABLE = False SECURITY_CONFIRMABLE = False
"""Allow user to confirm their email address.""" """Allow user to confirm their email address.
Instead user will get a welcome email.
"""
# Flask-Security
# =============
# See https://pythonhosted.org/Flask-Security/configuration.html
SECURITY_EMAIL_PLAINTEXT = True
"""Render email content as plaintext."""
SECURITY_EMAIL_HTML = False
"""Render email content as HTML."""
ACCOUNTS = True
"""Tells if the templates should use the accounts module.
If False, you won't be able to login via the web UI.
Instead if you have a overriden template somewhere in your config.py:
like this:
SECURITY_LOGIN_USER_TEMPLATE = 'invenio_theme_tugraz/accounts/login.html'
then you can remove this condition from header_login.htm:
{%- if config.ACCOUNTS %}
to render your overriden login.html
"""
# Accounts
# ========
# Actual values can be find in to invenio.cfg file
#: Recaptcha public key (change to enable).
RECAPTCHA_PUBLIC_KEY = None
#: Recaptcha private key (change to enable).
RECAPTCHA_PRIVATE_KEY = None
# invenio-records-permissions
# =======
# See:
# https://invenio-records-permissions.readthedocs.io/en/latest/configuration.html
# Uncomment these to enable overriding RDM permissions
# from .rdm_permissions import TUGRAZRDMRecordServiceConfig
# RDM_RECORDS_BIBLIOGRAPHIC_SERVICE_CONFIG = TUGRAZRDMRecordServiceConfig
"""Access control configuration for records."""
# invenio-rdm-records
# =======
# See:
# https://invenio-rdm-records.readthedocs.io/en/latest/configuration.html
#
RDM_RECORDS_USER_FIXTURE_PASSWORDS = {"info@tugraz.at": None}
"""Overrides for the user fixtures' passwords.
The password set for a user fixture in this dictionary overrides the
password set in the ``users.yaml`` file. This can be used to set custom
passwords for the fixture users (of course, this has to be configured
before the fixtures are installed, e.g. by setting up the services).
If ``None`` or an empty string is configured in this dictionary, then the
password from ``users.yaml`` will be used. If that is also absent, a password
will be generated randomly.
"""
# Custom Access Right
# RDM_RECORDS_CUSTOM_VOCABULARIES = {
# 'access_right': {
# 'path': join(
# dirname(abspath(__file__)),
# 'restrictions', 'access_right', 'access_right_limit.csv'
# )
# }
# }
# Invenio-app-rdm
# =========================
# See https://github.com/inveniosoftware/invenio-app-rdm/blob/master/invenio_app_rdm/config.py
APP_RDM_DEPOSIT_FORM_DEFAULTS = {}
"""Default values for new records in the deposit UI.
The keys denote the dot-separated path, where in the record's metadata
the values should be set (see invenio-records.dictutils).
If the value is callable, its return value will be used for the field
(e.g. lambda/function for dynamic calculation of values).
"""
SQLALCHEMY_ECHO = False
"""Enable to see all SQL queries."""
SQLALCHEMY_ENGINE_OPTIONS = {
"pool_pre_ping": False,
"pool_recycle": 3600,
# set a more agressive timeout to ensure http requests don't wait for long
"pool_timeout": 10,
}
"""SQLAlchemy engine options.
This is used to configure for instance the database connection pool.
Specifically for connection pooling the following options below are relevant.
Note, that the connection pool settings have to be aligned with:
1. your database server's max allowed connections settings, and
2. your application deployment (number of processes/threads)
**Disconnect handling**
Note, it's possible that a connection you get from the connection pool is no
longer open. This happens if e.g. the database server was restarted or the
server has a timeout that closes the connection. In these case you'll see an
error similar to::
psycopg2.OperationalError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The errors can be avoided by using the ``pool_pre_ping`` option, which will
ensure the connection is open first by issuing a ``SELECT 1``. The pre-ping
feature however, comes with a performance penalty, and thus it may be better
to first try adjusting the ``pool_recyle`` to ensure connections are closed and
reopened regularly.
... code-block:: python
SQLALCHEMY_ENGINE_OPTIONS = dict(
# enable the connection pool “pre-ping” feature that tests connections
# for liveness upon each checkout.
pool_pre_ping=True,
# the number of connections to allow in connection pool “overflow”,
# that is connections that can be opened above and beyond the
# pool_size setting
max_overflow=10,
# the number of connections to keep open inside the connection
pool_size=5,
# recycle connections after the given number of seconds has passed.
pool_recycle=3600,
# number of seconds to wait before giving up on getting a connection
# from the pool
pool_timeout=30,
)
See https://docs.sqlalchemy.org/en/latest/core/engines.html.
"""

View File

@@ -7,13 +7,12 @@
# details. # details.
"""invenio module that adds tugraz configs.""" """invenio module that adds tugraz configs."""
from flask import Blueprint
from flask_babelex import gettext as _
from . import config from . import config
class invenioconfigtugraz(object): class InvenioConfigTugraz(object):
"""invenio-config-tugraz extension.""" """invenio-config-tugraz extension."""
def __init__(self, app=None): def __init__(self, app=None):
@@ -24,10 +23,10 @@ class invenioconfigtugraz(object):
def init_app(self, app): def init_app(self, app):
"""Flask application initialization.""" """Flask application initialization."""
self.init_config(app) self.init_config(app)
app.extensions['invenio-config-tugraz'] = self app.extensions["invenio-config-tugraz"] = self
def init_config(self, app): def init_config(self, app):
"""Initialize configuration.""" """Initialize configuration."""
for k in dir(config): for k in dir(config):
if k.startswith('INVENIO_CONFIG_TUGRAZ_'): if k.startswith("INVENIO_CONFIG_TUGRAZ_"):
app.config.setdefault(k, getattr(config, k)) app.config.setdefault(k, getattr(config, k))

View File

@@ -0,0 +1,223 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2021 Graz University of Technology.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
r"""Permission generators and policies for Invenio records.
Invenio-records-permissions provides a means to fully customize access control
for Invenio records. It does so by defining and providing three layers of
permission constructs that build on each other:
Generators and Policies. You can extend or override them for maximum
control. Thankfully we provide default ones that cover most cases.
Invenio-records-permissions conveniently structures (and relies on)
functionalities from
`invenio-access <https://invenio-access.readthedocs.io>`_ and
`flask-principal <https://pythonhosted.org/Flask-Principal>`_ .
Generators
----------
Generators are the lowest level of abstraction provided by
invenio-records-permissions. A
:py:class:`~invenio_records_permissions.generators.Generator` represents
identities via
`Needs <https://invenio-access.readthedocs.io/en/latest/api.html#needs>`_ that
are allowed or disallowed to act on a kind of object. A Generator does not
specify the action, but it does specify who is allowed and the kind of object
of concern (typically records). Generators *generate* required and forbidden
Needs at the object-of-concern level and *generate* query filters
at the search-for-objects-of-concern level.
A Generator object defines 3 methods in addition to its constructor:
- ``needs(self, **kwargs)``: returns Needs, one of which a provider is
required to have to be allowed
- ``excludes(self, **kwargs)``: returns a list of Needs disallowing any
provider of a single one
- ``query_filter(self, **kwargs)``: returns a query filter to enable retrieval
of records
The ``needs`` and ``excludes`` methods specify access conditions from
the point-of-view of the object-of-concern; whereas, the ``query_filter``
method specifies those from the actor's point-of-view in search scenarios.
A simple example of a Generator is the provided
:py:class:`~invenio_records_permissions.generators.RecordOwners` Generator:
.. code-block:: python
from flask_principal import UserNeed
class RecordOwners(Generator):
'''Allows record owners.'''
def needs(self, record=None, **kwargs):
'''Enabling Needs.'''
return [UserNeed(owner) for owner in record.get('owners', [])]
def query_filter(self, record=None, **kwargs):
'''Filters for current identity as owner.'''
# NOTE: implementation subject to change until permissions metadata
# settled
provides = g.identity.provides
for need in provides:
if need.method == 'id':
return Q('term', owners=need.value)
return []
``RecordOwners`` allows any identity providing a `UserNeed
<https://pythonhosted.org/Flask-Principal/#flask_principal.UserNeed>`_
of value found in the ``owners`` metadata of a record. The
``query_filter(self, **kwargs)``
method outputs a query that returns all owned records of the current user.
Not included in the above, because it doesn't apply to ``RecordOwners``, is
the ``excludes(self, **kwargs)`` method.
.. Note::
Exclusion has priority over inclusion. If a Need is returned by both
``needs`` and ``excludes``, providers of that Need will be **excluded**.
If implementation of Generators seems daunting, fear not! A collection of
them has already been implemented in
:py:mod:`~invenio_records_permissions.generators`
and they cover most cases you may have.
To fully understand how they work, we have to show where Generators are used.
That is in the Policies.
Policies
--------
Classes inheriting from
:py:class:`~invenio_records_permissions.policies.base.BasePermissionPolicy` are
referred to as Policies. They list **what actions** can be done **by whom**
over an implied category of objects (typically records). A Policy is
instantiated on a per action basis and is a descendant of `Permission
<https://invenio-access.readthedocs.io/en/latest/api.html
#invenio_access.permissions.Permission>`_ in
`invenio-access <https://invenio-access.readthedocs.io>`_ .
Generators are used to provide the "by whom" part and the implied category of
object.
Here is an example of a custom record Policy:
.. code-block:: python
from invenio_records_permissions.generators import AnyUser, RecordOwners, \
SuperUser
from invenio_records_permissions.policies.base import BasePermissionPolicy
class ExampleRecordPermissionPolicy(BasePermissionPolicy):
can_create = [AnyUser()]
can_search = [AnyUser()]
can_read = [AnyUser()]
can_update = [RecordOwners()]
can_foo_bar = [SuperUser()]
The actions are class variables of the form: ``can_<action>`` and the
corresponding (dis-)allowed identities are a list of Generator instances.
One can define any action as long as it follows that pattern and
is verified at the moment it is undertaken.
In the example above, any user can create, list and read records, but only
a record's owner can edit it and only super users can perform the "foo_bar"
action.
We recommend you extend the provided
:py:class:`invenio_records_permissions.policies.records.RecordPermissionPolicy`
to customize record permissions for your instance.
This way you benefit from sane defaults.
After you have defined your own Policy, set it in your configuration:
.. code-block:: python
RECORDS_PERMISSIONS_RECORD_POLICY = (
'module.to.ExampleRecordPermissionPolicy'
)
The succinct encoding of the permissions for your instance gives you
- one central location where your permissions are defined
- exact control
- great flexibility by defining your own actions, generators and policies
"""
from elasticsearch_dsl.query import Q
from flask import current_app, request
from invenio_access.permissions import any_user, superuser_access
from invenio_records_permissions.generators import Generator
class RecordIp(Generator):
"""Allowed any user with accessing with the IP."""
def needs(self, record=None, **kwargs):
"""Enabling Needs, Set of Needs granting permission."""
if record is None:
return []
# check if singleip is in the records restriction
is_single_ip = record.get("access", {}).get("access_right") == "singleip"
# check if the user ip is on list
visible = self.check_permission()
if not is_single_ip:
# if record does not have singleip - return any_user
return [any_user]
# if record has singleip, then check the ip of user - if ip user is on list - return any_user
elif visible:
return [any_user]
else:
# non of the above - return empty
return []
def excludes(self, **kwargs):
"""Preventing Needs, Set of Needs denying permission.
If ANY of the Needs are matched, permission is revoked.
.. note::
``_load_permissions()`` method from `Permission
<https://invenio-access.readthedocs.io/en/latest/api.html
#invenio_access.permissions.Permission>`_ adds by default the
``superuser_access`` Need (if tied to a User or Role) for us.
It also expands ActionNeeds into the Users/Roles that
provide them.
If the same Need is returned by `needs` and `excludes`, then that
Need provider is disallowed.
"""
return []
def query_filter(self, *args, **kwargs):
"""Filters for singleip records."""
# check if the user ip is on list
visible = self.check_permission()
if not visible:
# If user ip is not on the list, and If the record contains 'singleip' will not be seen
return ~Q("match", **{"access.access_right": "singleip"})
# Lists all records
return Q("match_all")
def check_permission(self):
"""Check for User IP address in config variable."""
# Get user IP
user_ip = request.remote_addr
# Checks if the user IP is among single IPs
if user_ip in current_app.config["INVENIO_CONFIG_TUGRAZ_SINGLE_IP"]:
return True
return False

View File

@@ -0,0 +1,86 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2021 Graz University of Technology.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""
Records permission policies.
Default policies for records:
.. code-block:: python
# Read access given to everyone.
can_search = [AnyUser()]
# Create action given to no one (Not even superusers) bc Deposits should
# be used.
can_create = [Disable()]
# Read access given to everyone if public record/files and owners always.
can_read = [AnyUserIfPublic(), RecordOwners()]
# Update access given to record owners.
can_update = [RecordOwners()]
# Delete access given to admins only.
can_delete = [Admin()]
# Associated files permissions (which are really bucket permissions)
can_read_files = [AnyUserIfPublic(), RecordOwners()]
can_update_files = [RecordOwners()]
How to override default policies for rdm-records.
Using Custom Generator for a policy:
.. code-block:: python
from invenio_rdm_records.services import (
BibliographicRecordServiceConfig,
RDMRecordPermissionPolicy,
)
from invenio_config_tugraz.generators import RecordIp
class TUGRAZPermissionPolicy(RDMRecordPermissionPolicy):
# Create access given to SuperUser only.
can_create = [SuperUser()]
RDM_RECORDS_BIBLIOGRAPHIC_SERVICE_CONFIG = TUGRAZBibliographicRecordServiceConfig
Permissions for Invenio (RDM) Records.
"""
from invenio_rdm_records.services import RDMRecordPermissionPolicy
from invenio_rdm_records.services.config import RDMRecordServiceConfig
from invenio_rdm_records.services.generators import IfDraft, IfRestricted, RecordOwners
from invenio_records_permissions.generators import (
Admin,
AnyUser,
AuthenticatedUser,
Disable,
SuperUser,
SystemProcess,
)
class TUGRAZPermissionPolicy(RDMRecordPermissionPolicy):
"""Access control configuration for rdm records.
This overrides the origin:
https://github.com/inveniosoftware/invenio-rdm-records/blob/master/invenio_rdm_records/services/permissions.py.
Access control configuration for records.
Note that even if the array is empty, the invenio_access Permission class
always adds the ``superuser-access``, so admins will always be allowed.
- Create action given to everyone for now.
- Read access given to everyone if public record and given to owners
always. (inherited)
- Update access given to record owners. (inherited)
- Delete access given to admins only. (inherited)
"""
class TUGRAZRDMRecordServiceConfig(RDMRecordServiceConfig):
"""Overriding BibliographicRecordServiceConfig."""

View File

@@ -0,0 +1,6 @@
access_right,access_right_name,icon,notes
open, Open Access, lock open
embargoed, Embargoed, ban
restricted, Restricted, key
closed, Private, lock
singleip, Single Ip, lock
1 access_right,access_right_name,icon,notes
2 open, Open Access, lock open
3 embargoed, Embargoed, ban
4 restricted, Restricted, key
5 closed, Private, lock
6 singleip, Single Ip, lock

View File

@@ -0,0 +1,2 @@
access_right,access_right_name,icon,notes
open, Open Access, lock open
1 access_right,access_right_name,icon,notes
2 open, Open Access, lock open

View File

@@ -1 +0,0 @@
MIICjjCCAfegAwIBAgIBADANBgkqhkiG9w0BAQ0FADBkMQswCQYDVQQGEwJhdDENMAsGA1UECAwER3JhejEPMA0GA1UECgwGVFVHUkFaMRAwDgYDVQQDDAdpbnZlbmlvMSMwIQYJKoZIhvcNAQkBFhRtb2ppYi53YWxpQHR1Z3Jhei5hdDAeFw0yMDAxMTAyMDIwMTlaFw0yMTAxMDkyMDIwMTlaMGQxCzAJBgNVBAYTAmF0MQ0wCwYDVQQIDARHcmF6MQ8wDQYDVQQKDAZUVUdSQVoxEDAOBgNVBAMMB2ludmVuaW8xIzAhBgkqhkiG9w0BCQEWFG1vamliLndhbGlAdHVncmF6LmF0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5ZrPhRhyDyLTe93rpgqN9MMfnCsg+2QBW4EOuQnMXJzF1dqrFEsexot1FRW83IjqbY+680PmGABQtxUpS4Kinr/pLYbPhQ2WPQRad7mtOn/dD40VVwfG0GfcLrnKe5F4QLfNjervjl8jH/AKPCYwwfSeuw1LNoRjy1uDwkp9cRQIDAQABo1AwTjAdBgNVHQ4EFgQUPv2+wS1RuagCOed7w1FzouBmpP4wHwYDVR0jBBgwFoAUPv2+wS1RuagCOed7w1FzouBmpP4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOBgQA4qvU7gbgE/MoljUW68qMPs8z8Q2Ngttp6F1KOMNO9rgrYWAJh4u6BMt11mlBgBlLLJzG67wXpBr0l78IcOXun4w955te0VRp7aZ0b1uOPt0aUoDOXuBAhZURLZfbsogpWiE6bdB8N0nHTwk2WG2PPIC5Z99UdDivcP5ZeSPAkUw==

View File

@@ -1 +0,0 @@
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIHxNp8P2PsV8CAggAMBQGCCqGSIb3DQMHBAjOyik6fsEC3gSCAoC4tFsYAl4GexyXESiRKpOQzHQNFtQtwDEevT1IKgsafSNjOMJZLKrnoejNoxEQUPPPXgGEd83Fmp2cSHm+YVksH06zcsA+RKf5ab6t0bsgcyljGzkHEDQtMRPcaXNlVMbU9VEDOX26MgmlU/pd+GGfE99IbEFc6qN1e7qOnmKSw93Q3o05ubO3wEI76JhOioGGXB3pEn8f4XLDwck0thzYD6H2vdF+kyIdM8w1BgyLdeP0aDkfG1V3rLGhE8246rwVUzRSZv6BCNBZFk7YO1d7j0+BDxnbHFS631zdCgMcd/XS8u6acc3IYr/bQLH4a1y0X3Z+8ks8arEgUtXqYx9wMlp5lajlsr9JDIU5OnuZ2XY+4sqDQsTZPjBpxK8oMjvJNNatnTf+18htkTdovpInlP7xpEjp1L7H74iKY25UsAZ9e+gqHZwILnk418mQ1E4JYU6JRUZspJSFfqwn9FL6DnvhzPIhtzwhr3eL4f4RXWxxe2xCzvWg+GaWuMfZdj77SV4pMOi7vb3HlYY6luShVlYKdSaw+jf6XVy4ZMTWT5wcE1mc3tAJqF18Mi8amOetpZhz16ISOKnO0rKrfmxteNPQn2AB8QquGGn050PTW4m8zFXDBiyg2xvcRLAW/8ych3k+pkEZi4tVCkLcHM56J/XUEKMCxiSok+vbzxfVf1D2vYFFS7Lw1nP5RnLKFdn8XdHQ+lu2diod18wYBQP4eoU+XjjP2zjlpULiWHt7PpCERqGg7H2Z2amIL5rTeqQuyXczw1/xG/VBNn9qe3DXFodvoV6OZb3efNT/eJgOyaPLi2FmB7Kpdp4JIdJgLnaBCwNBXkpGSwb732O/cug8

View File

@@ -1,22 +0,0 @@
{
"strict": true,
"debug": true,
"idp": {
"entityId": "https://sso.tugraz.at/idp/shibboleth",
"singleLogoutService": {
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
"url": "https://sso.tugraz.at/slo/Logout"
},
"singleSignOnService": {
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
"url": "https://sso.tugraz.at/idp/profile/SAML2/Redirect/SSO"
},
"x509cert": "MIIDHzCCAgegAwIBAgIUG6ra0BvXswfyErcCDmzw3AV+uI0wDQYJKoZIhvcNAQEFBQAwGDEWMBQGA1UEAxMNc3NvLnR1Z3Jhei5hdDAeFw0xMDAzMjkxNzEzMTZaFw0zMDAzMjkxODEzMTZaMBgxFjAUBgNVBAMTDXNzby50dWdyYXouYXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCEyQxHIM1zxbBnXn60Ksg7B7HcPLPcN7bXLrLPOFXtkZxm0YkHY5Rxignm7wHD7C81U09DFS2eT8qRCcVtVz+kuwdgS54fC/alg9oLxXk4CgKjhtZZ2ECLdTHfUXOA5uOLlpoN1LY6VpIjSYe3UEX3HxfhXx/fPeE8VInGCKnml8Too22G30htB/EU44A2yqrR3LUngJIaq //N0QbeMYitNh02o6xB5+bp6k6noM7DH6S9phe0kCEibaiLaCf7k9LpNnAz9bPtQVth0gdJqoUry/iK1QBTFTEXvvJynFEp0+5Wz/XFmEcFhsaK8OcHd0R9FfpX5Z2fewA2Q0SLKz+bAgMBAAGjYTBfMD4GA1UdEQQ3MDWCDXNzby50dWdyYXouYXSGJGh0dHBzOi8vc3NvLnR1Z3Jhei5hdC9pZHAvc2hpYmJvbGV0aDAdBgNVHQ4EFgQUXd76PcSiXR6wFna5qQi+S0W/9Y0wDQYJKoZIhvcNAQEFBQADggEBACgkQqxBtYY1OcuoAUP/P+ukJW7XyofK89qs2dkGClx7s0hR/1zImWgljgfguLJOSfC/CWE1wfNK9bTi4Fu9809PmOoaCxkNmniFRAyaOiBoUz5XIpJniW7wBo+YBpBlXZXi5PmU2DOsfZxo7fs4se32dHO1WqgJodqkK2Wa4HDiigh42trZ9i3uS73uHSSCeIJYQNj84BMJ+ifgj3Zi/TgLS+IX7Ayy2bkDzIzIRnj7ULQ/MgfacGXQXJPHyp+w+YvydQalPAWc43+5DkNacN34K8cE3XjHq1kx/BgYOtQ7M2Xa1oApLzPoHO4D2kaf6FCgGR8Mx7GVAz0aQVxfB8I="
}
}

View File

@@ -1,26 +0,0 @@
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://sso.tugraz.at/idp/shibboleth">
<md:IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>MIIDHzCCAgegAwIBAgIUG6ra0BvXswfyErcCDmzw3AV+uI0wDQYJKoZIhvcNAQEFBQAwGDEWMBQGA1UEAxMNc3NvLnR1Z3Jhei5hdDAeFw0xMDAzMjkxNzEzMTZaFw0zMDAzMjkxODEzMTZaMBgxFjAUBgNVBAMTDXNzby50dWdyYXouYXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCEyQxHIM1zxbBnXn60Ksg7B7HcPLPcN7bXLrLPOFXtkZxm0YkHY5Rxignm7wHD7C81U09DFS2eT8qRCcVtVz+kuwdgS54fC/alg9oLxXk4CgKjhtZZ2ECLdTHfUXOA5uOLlpoN1LY6VpIjSYe3UEX3HxfhXx/fPeE8VInGCKnml8Too22G30htB/EU44A2yqrR3LUngJIaq//N0QbeMYitNh02o6xB5+bp6k6noM7DH6S9phe0kCEibaiLaCf7k9LpNnAz9bPtQVth0gdJqoUry/iK1QBTFTEXvvJynFEp0+5Wz/XFmEcFhsaK8OcHd0R9FfpX5Z2fewA2Q0SLKz+bAgMBAAGjYTBfMD4GA1UdEQQ3MDWCDXNzby50dWdyYXouYXSGJGh0dHBzOi8vc3NvLnR1Z3Jhei5hdC9pZHAvc2hpYmJvbGV0aDAdBgNVHQ4EFgQUXd76PcSiXR6wFna5qQi+S0W/9Y0wDQYJKoZIhvcNAQEFBQADggEBACgkQqxBtYY1OcuoAUP/P+ukJW7XyofK89qs2dkGClx7s0hR/1zImWgljgfguLJOSfC/CWE1wfNK9bTi4Fu9809PmOoaCxkNmniFRAyaOiBoUz5XIpJniW7wBo+YBpBlXZXi5PmU2DOsfZxo7fs4se32dHO1WqgJodqkK2Wa4HDiigh42trZ9i3uS73uHSSCeIJYQNj84BMJ+ifgj3Zi/TgLS+IX7Ayy2bkDzIzIRnj7ULQ/MgfacGXQXJPHyp+w+YvydQalPAWc43+5DkNacN34K8cE3XjHq1kx/BgYOtQ7M2Xa1oApLzPoHO4D2kaf6FCgGR8Mx7GVAz0aQVxfB8I=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:KeyDescriptor use="encryption">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIHxNp8P2PsV8CAggAMBQGCCqGSIb3DQMHBAjOyik6fsEC3gSCAoC4tFsYAl4GexyXESiRKpOQzHQNFtQtwDEevT1IKgsafSNjOMJZLKrnoejNoxEQUPPPXgGEd83Fmp2cSHm+YVksH06zcsA+RKf5ab6t0bsgcyljGzkHEDQtMRPcaXNlVMbU9VEDOX26MgmlU/pd+GGfE99IbEFc6qN1e7qOnmKSw93Q3o05ubO3wEI76JhOioGGXB3pEn8f4XLDwck0thzYD6H2vdF+kyIdM8w1BgyLdeP0aDkfG1V3rLGhE8246rwVUzRSZv6BCNBZFk7YO1d7j0+BDxnbHFS631zdCgMcd/XS8u6acc3IYr/bQLH4a1y0X3Z+8ks8arEgUtXqYx9wMlp5lajlsr9JDIU5OnuZ2XY+4sqDQsTZPjBpxK8oMjvJNNatnTf+18htkTdovpInlP7xpEjp1L7H74iKY25UsAZ9e+gqHZwILnk418mQ1E4JYU6JRUZspJSFfqwn9FL6DnvhzPIhtzwhr3eL4f4RXWxxe2xCzvWg+GaWuMfZdj77SV4pMOi7vb3HlYY6luShVlYKdSaw+jf6XVy4ZMTWT5wcE1mc3tAJqF18Mi8amOetpZhz16ISOKnO0rKrfmxteNPQn2AB8QquGGn050PTW4m8zFXDBiyg2xvcRLAW/8ych3k+pkEZi4tVCkLcHM56J/XUEKMCxiSok+vbzxfVf1D2vYFFS7Lw1nP5RnLKFdn8XdHQ+lu2diod18wYBQP4eoU+XjjP2zjlpULiWHt7PpCERqGg7H2Z2amIL5rTeqQuyXczw1/xG/VBNn9qe3DXFodvoV6OZb3efNT/eJgOyaPLi2FmB7Kpdp4JIdJgLnaBCwNBXkpGSwb732O/cug8</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://sso.tugraz.at/slo/Logout"/>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://sso.tugraz.at/idp/profile/SAML2/Redirect/SSO"/>
</md:IDPSSODescriptor>
<md:ContactPerson contactType="technical">
<md:GivenName>Administrator</md:GivenName>
<md:EmailAddress>admin@example.org</md:EmailAddress>
</md:ContactPerson>
</md:EntityDescriptor>

View File

@@ -1 +0,0 @@
MIICjjCCAfegAwIBAgIBADANBgkqhkiG9w0BAQ0FADBkMQswCQYDVQQGEwJhdDENMAsGA1UECAwER3JhejEPMA0GA1UECgwGVFVHUkFaMRAwDgYDVQQDDAdpbnZlbmlvMSMwIQYJKoZIhvcNAQkBFhRtb2ppYi53YWxpQHR1Z3Jhei5hdDAeFw0yMDAxMTAyMDIwMTlaFw0yMTAxMDkyMDIwMTlaMGQxCzAJBgNVBAYTAmF0MQ0wCwYDVQQIDARHcmF6MQ8wDQYDVQQKDAZUVUdSQVoxEDAOBgNVBAMMB2ludmVuaW8xIzAhBgkqhkiG9w0BCQEWFG1vamliLndhbGlAdHVncmF6LmF0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5ZrPhRhyDyLTe93rpgqN9MMfnCsg+2QBW4EOuQnMXJzF1dqrFEsexot1FRW83IjqbY+680PmGABQtxUpS4Kinr/pLYbPhQ2WPQRad7mtOn/dD40VVwfG0GfcLrnKe5F4QLfNjervjl8jH/AKPCYwwfSeuw1LNoRjy1uDwkp9cRQIDAQABo1AwTjAdBgNVHQ4EFgQUPv2+wS1RuagCOed7w1FzouBmpP4wHwYDVR0jBBgwFoAUPv2+wS1RuagCOed7w1FzouBmpP4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOBgQA4qvU7gbgE/MoljUW68qMPs8z8Q2Ngttp6F1KOMNO9rgrYWAJh4u6BMt11mlBgBlLLJzG67wXpBr0l78IcOXun4w955te0VRp7aZ0b1uOPt0aUoDOXuBAhZURLZfbsogpWiE6bdB8N0nHTwk2WG2PPIC5Z99UdDivcP5ZeSPAkUw==

View File

@@ -1,17 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIHxNp8P2PsV8CAggA
MBQGCCqGSIb3DQMHBAjOyik6fsEC3gSCAoC4tFsYAl4GexyXESiRKpOQzHQNFtQt
wDEevT1IKgsafSNjOMJZLKrnoejNoxEQUPPPXgGEd83Fmp2cSHm+YVksH06zcsA+
RKf5ab6t0bsgcyljGzkHEDQtMRPcaXNlVMbU9VEDOX26MgmlU/pd+GGfE99IbEFc
6qN1e7qOnmKSw93Q3o05ubO3wEI76JhOioGGXB3pEn8f4XLDwck0thzYD6H2vdF+
kyIdM8w1BgyLdeP0aDkfG1V3rLGhE8246rwVUzRSZv6BCNBZFk7YO1d7j0+BDxnb
HFS631zdCgMcd/XS8u6acc3IYr/bQLH4a1y0X3Z+8ks8arEgUtXqYx9wMlp5lajl
sr9JDIU5OnuZ2XY+4sqDQsTZPjBpxK8oMjvJNNatnTf+18htkTdovpInlP7xpEjp
1L7H74iKY25UsAZ9e+gqHZwILnk418mQ1E4JYU6JRUZspJSFfqwn9FL6DnvhzPIh
tzwhr3eL4f4RXWxxe2xCzvWg+GaWuMfZdj77SV4pMOi7vb3HlYY6luShVlYKdSaw
+jf6XVy4ZMTWT5wcE1mc3tAJqF18Mi8amOetpZhz16ISOKnO0rKrfmxteNPQn2AB
8QquGGn050PTW4m8zFXDBiyg2xvcRLAW/8ych3k+pkEZi4tVCkLcHM56J/XUEKMC
xiSok+vbzxfVf1D2vYFFS7Lw1nP5RnLKFdn8XdHQ+lu2diod18wYBQP4eoU+XjjP
2zjlpULiWHt7PpCERqGg7H2Z2amIL5rTeqQuyXczw1/xG/VBNn9qe3DXFodvoV6O
Zb3efNT/eJgOyaPLi2FmB7Kpdp4JIdJgLnaBCwNBXkpGSwb732O/cug8
-----END RSA PRIVATE KEY-----

View File

@@ -1,20 +0,0 @@
{
"strict": true,
"debug": true,
"idp": {
"entityId": "https://app.onelogin.com/saml/metadata/01661574-91ed-4735-a3b9-f4ddebb2cbb8",
"singleLogoutService": {
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
"url": "https://tugraz-dev.onelogin.com/trust/saml2/http-redirect/slo/1070112"
},
"singleSignOnService": {
"binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect",
"url": "https://tugraz-dev.onelogin.com/trust/saml2/http-post/sso/01661574-91ed-4735-a3b9-f4ddebb2cbb8"
},
"x509cert": "MIID2DCCAsCgAwIBAgIUWRGl84DFd+GbLYt0BmwyI+FCKVIwDQYJKoZIhvcNAQEFBQAwRDEPMA0GA1UECgwGVFVHUkFaMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMB4XDTIwMDEyODEwNDI1M1oXDTI1MDEyODEwNDI1M1owRDEPMA0GA1UECgwGVFVHUkFaMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAve5a++I/VHC22fMk5v8GwCvdIyiziOwGjq0XXyjTg9TyhHJZbfDXa7S0NjK7dK4+d3iaB3MvCpnr+7H2J2Cohracgy2BQz9Z4BqsjDat016zkAPoID9R6osliqocw1jESnyL59OJWftAiA4rFmQs6v/b56vgre8EP6qKbykq6mWvepGyBbfjRsYbFoIDmnW8kJoZtLMDQfTBvEF2veHDt9EbsWP+hyedMYTWCfsbTHhFKNrhRKr3m3k+w6Zsca2zp3A8xiFv0fcl6PglEwEZz2Iwb0ySifaf4ZLDVjSekpCLf29doBJYUeE5TUP8oHfATOcWW+m5D3MXVcMUax+AFwIDAQABo4HBMIG+MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFK4GHoSfnMQKb8RjP2HrGzJ4ICiDMH8GA1UdIwR4MHaAFK4GHoSfnMQKb8RjP2HrGzJ4ICiDoUikRjBEMQ8wDQYDVQQKDAZUVUdSQVoxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEaMBgGA1UEAwwRT25lTG9naW4gQWNjb3VudCCCFFkRpfOAxXfhmy2LdAZsMiPhQilSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAUg7UHFju0QA7ubcSLBuvEMUQL9jxtzDi0ndSi8qqtLJSjBalcfll0X/gI+sAMGMd0MW7P3abOVVfGBSlZN01KCPC2WHKRwzyO3sOCatkPrn2SYthQWHD/W7psyFgoDt5lQNijLyZdpvZbRIotxcWpoaTcBzaArd/0MNe1VaGlLK5GeqtbwL+dQD+O3mtSUfF918qeiOHEwI7nfPo7vjUyRT8Ov1loqP5+A0/R1CyL0Dh/tVdIkOHx6EjrIXsb/K6xXPknYZqPApPkZq514ZCEPhAILFU+5R/cQMZMZEacCdKuQ9XMkR8bqnh8xu620SCYiSVPXtVW4bpXKs0nJazBQ=="
}
}

View File

@@ -1,26 +0,0 @@
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="https://app.onelogin.com/saml/metadata/01661574-91ed-4735-a3b9-f4ddebb2cbb8">
<md:IDPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>MIID2DCCAsCgAwIBAgIUWRGl84DFd+GbLYt0BmwyI+FCKVIwDQYJKoZIhvcNAQEFBQAwRDEPMA0GA1UECgwGVFVHUkFaMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMB4XDTIwMDEyODEwNDI1M1oXDTI1MDEyODEwNDI1M1owRDEPMA0GA1UECgwGVFVHUkFaMRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAxGjAYBgNVBAMMEU9uZUxvZ2luIEFjY291bnQgMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAve5a++I/VHC22fMk5v8GwCvdIyiziOwGjq0XXyjTg9TyhHJZbfDXa7S0NjK7dK4+d3iaB3MvCpnr+7H2J2Cohracgy2BQz9Z4BqsjDat016zkAPoID9R6osliqocw1jESnyL59OJWftAiA4rFmQs6v/b56vgre8EP6qKbykq6mWvepGyBbfjRsYbFoIDmnW8kJoZtLMDQfTBvEF2veHDt9EbsWP+hyedMYTWCfsbTHhFKNrhRKr3m3k+w6Zsca2zp3A8xiFv0fcl6PglEwEZz2Iwb0ySifaf4ZLDVjSekpCLf29doBJYUeE5TUP8oHfATOcWW+m5D3MXVcMUax+AFwIDAQABo4HBMIG+MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFK4GHoSfnMQKb8RjP2HrGzJ4ICiDMH8GA1UdIwR4MHaAFK4GHoSfnMQKb8RjP2HrGzJ4ICiDoUikRjBEMQ8wDQYDVQQKDAZUVUdSQVoxFTATBgNVBAsMDE9uZUxvZ2luIElkUDEaMBgGA1UEAwwRT25lTG9naW4gQWNjb3VudCCCFFkRpfOAxXfhmy2LdAZsMiPhQilSMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAUg7UHFju0QA7ubcSLBuvEMUQL9jxtzDi0ndSi8qqtLJSjBalcfll0X/gI+sAMGMd0MW7P3abOVVfGBSlZN01KCPC2WHKRwzyO3sOCatkPrn2SYthQWHD/W7psyFgoDt5lQNijLyZdpvZbRIotxcWpoaTcBzaArd/0MNe1VaGlLK5GeqtbwL+dQD+O3mtSUfF918qeiOHEwI7nfPo7vjUyRT8Ov1loqP5+A0/R1CyL0Dh/tVdIkOHx6EjrIXsb/K6xXPknYZqPApPkZq514ZCEPhAILFU+5R/cQMZMZEacCdKuQ9XMkR8bqnh8xu620SCYiSVPXtVW4bpXKs0nJazBQ==</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:KeyDescriptor use="encryption">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIHxNp8P2PsV8CAggAMBQGCCqGSIb3DQMHBAjOyik6fsEC3gSCAoC4tFsYAl4GexyXESiRKpOQzHQNFtQtwDEevT1IKgsafSNjOMJZLKrnoejNoxEQUPPPXgGEd83Fmp2cSHm+YVksH06zcsA+RKf5ab6t0bsgcyljGzkHEDQtMRPcaXNlVMbU9VEDOX26MgmlU/pd+GGfE99IbEFc6qN1e7qOnmKSw93Q3o05ubO3wEI76JhOioGGXB3pEn8f4XLDwck0thzYD6H2vdF+kyIdM8w1BgyLdeP0aDkfG1V3rLGhE8246rwVUzRSZv6BCNBZFk7YO1d7j0+BDxnbHFS631zdCgMcd/XS8u6acc3IYr/bQLH4a1y0X3Z+8ks8arEgUtXqYx9wMlp5lajlsr9JDIU5OnuZ2XY+4sqDQsTZPjBpxK8oMjvJNNatnTf+18htkTdovpInlP7xpEjp1L7H74iKY25UsAZ9e+gqHZwILnk418mQ1E4JYU6JRUZspJSFfqwn9FL6DnvhzPIhtzwhr3eL4f4RXWxxe2xCzvWg+GaWuMfZdj77SV4pMOi7vb3HlYY6luShVlYKdSaw+jf6XVy4ZMTWT5wcE1mc3tAJqF18Mi8amOetpZhz16ISOKnO0rKrfmxteNPQn2AB8QquGGn050PTW4m8zFXDBiyg2xvcRLAW/8ych3k+pkEZi4tVCkLcHM56J/XUEKMCxiSok+vbzxfVf1D2vYFFS7Lw1nP5RnLKFdn8XdHQ+lu2diod18wYBQP4eoU+XjjP2zjlpULiWHt7PpCERqGg7H2Z2amIL5rTeqQuyXczw1/xG/VBNn9qe3DXFodvoV6OZb3efNT/eJgOyaPLi2FmB7Kpdp4JIdJgLnaBCwNBXkpGSwb732O/cug8</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://tugraz-dev.onelogin.com/trust/saml2/http-redirect/slo/1070112"/>
<md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
<md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://tugraz-dev.onelogin.com/trust/saml2/http-post/sso/01661574-91ed-4735-a3b9-f4ddebb2cbb8"/>
</md:IDPSSODescriptor>
<md:ContactPerson contactType="technical">
<md:GivenName>Administrator</md:GivenName>
<md:EmailAddress>admin@example.org</md:EmailAddress>
</md:ContactPerson>
</md:EntityDescriptor>

View File

@@ -0,0 +1,257 @@
{#
Copyright (C) 2021 CERN.
Copyright (C) 2021 Graz University of Technology.
Invenio App RDM is free software; you can redistribute it and/or modify it
under the terms of the MIT License; see LICENSE file for more details.
#}
{%- set title = _("Search guide") %}
{%- extends "invenio_theme/page.html" %}
{%- block page_body %}
<div class="ui container">
<h1>Suchanleitung</h1>
<p>
Diese Anleitung erklärt anhand von leicht verständlichen Beispielen,
wie man erweiterte Suchanfragen schreibt.
</p>
<h3>Einfache Suche (ein oder mehrere Begriffe)</h3>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=open%20science"
><code>open science</code></a
>
</p>
<p>
Die Ergebnisse entsprechen Datensätzen mit den <em>Begriffen</em> <code>open</code>
<em>oder</em> <code>science</code> in einem <em>beliebigen Feld</em>. Beachten Sie, dass die Abstammung angewendet wird,
so dass z. B. <code>science</code> auch mit
<code>sciences</code>übereinstimmt. Die Suchergebnisse werden nach einem Algorithmus geordnet,
der Ihre Suchbegriffe berücksichtigt.
</p>
<p>
Sie können das <em>Vorhandensein</em> beider Terme entweder mit dem
<code>+</code> oder dem <code>AND</code> Operator verlangen:
</p>
<p>
<strong>Beispiele:</strong>
<a href="/search?page=1&amp;size=20&amp;q=%2Bopen%20%2Bscience"
><code>+open +science</code></a
>
oder
<a href="/search?page=1&amp;size=20&amp;q=open%20AND%20science"
><code>open AND science</code></a
>
</p>
<p>
Sie können das <em>Nichtvorhandensein</em> eines oder mehrerer Begriffe mit dem Operator
<code>-</code> oder <code>NOT</code> verlangen:
</p>
<p>
<strong>Beispiele:</strong>
<a href="/search?page=1&amp;size=20&amp;q=-open%20%2Bscience"
><code>-open +science</code></a
>
oder
<a href="/search?page=1&amp;size=20&amp;q=NOT%20open%20AND%20science"
><code>NOT open AND science</code></a
>
</p>
<h3>Phrasensuche</h3>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=%22open%20science%22"
><code>"open science"</code></a
>
</p>
<p>
Die Ergebnisse entsprechen Datensätzen mit der <em>phrase</em>
<code>open science</code> in einem <em>beliebigen Feld</em>.
</p>
<h3>Feldsuche</h3>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=metadata.title:open"
><code>metadata.title:open</code></a
>
</p>
<p>
Die Ergebnisse stimmen mit Datensätzen überein, bei denen der <em>Begriff</em> <code>open</code> im
<em>Feld</em> <code>metadata.title</code>ist. enn Sie nach mehreren Begriffen im Titel suchen möchten,
müssen Sie <strong>die Begriffe</strong> mit Klammern gruppieren:
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=metadata.title:(open%20science%29"
><code>metadata.title:(open science)</code></a
>
</p>
<p>
Die vollständige Liste der Felder, die Sie durchsuchen können, finden Sie in der Feldreferenz unten.
</p>
<h3>Kombinierte einfache, Phrasen- oder Feldsuche</h3>
<p>
<strong>Beispiel:</strong>
<a
href="/search?page=1&amp;size=20&amp;q=%2Bmetadata.title:%22open%20science%22%20-metadata.title:policy"
><code>+metadata.title:"open science" -metadata.title:policy</code></a
>
oder z. B.
<a href="/search?page=1&amp;size=20&amp;q=metadata.title:(-open%20%2Bscience%29"
><code>metadata.title:(-open +science)</code></a
>
</p>
<p>
Sie können einfache, Phrasen- und Feldsuche kombinieren, um erweiterte Suchanfragen zu konstruieren.
</p>
<h3>Bereichssuche</h3>
<p>
<strong>Beispiel:</strong>
<a
href="/search?page=1&amp;size=20&amp;q=metadata.publication_date:%5B2017%20TO%202018%5D"
><code>metadata.publication_date:[2017 TO 2018]</code></a
>
(Achtung, <code>TO</code> muss großgeschrieben werden).
</p>
<p>
Die Ergebnisse entsprechen allen Datensätzen mit einem Veröffentlichungsdatum
zwischen 2017-01-01 und 2018-01-01 (beide Daten inklusive).
</p>
<p>Beachten Sie, dass partielle Daten zu vollständigen Daten erweitert werden, z. B.:</p>
<ul>
<li>2017 wird erweitert auf 2017-01-01</li>
<li>2017-06 wird erweitert auf 2017-06-01</li>
</ul>
<p>
Verwenden Sie eckige Klammern (<code>[]</code>) für <em>einschließende</em> Bereiche und geschweifte
Klammern (<code>{}</code>) für <em>ausschließende</em> Bereiche, z. B.:
</p>
<ul>
<li>
<code>[2017 TO 2018}</code> ist aufgrund der Datumserweiterung
und der exklusiven Obergrenze äquivalent zu
<code>[2017-01-01 TO 2017-12-31]</code>.
</li>
</ul>
<p>Beispiele für andere Bereiche:</p>
<ul>
<li>
<code>metadata.publication_date:{* TO 2017-01-01}</code>: Alle Tage bis 2017.
</li>
<li>
<code>metadata.publication_date:[2017-01-01 TO *]</code>: Alle Tage von 2017.
</li>
</ul>
<h3>Ranking/Sortierung</h3>
<p>
Standardmäßig werden alle Suchen nach einem internen Ranking-Algorithmus sortiert,
der jede Übereinstimmung mit Ihrer Abfrage bewertet. Sowohl in der Benutzeroberfläche
als auch in der REST-API ist es möglich, die Ergebnisse zu sortieren nach:
</p>
<ul>
<li>Aktuellste</li>
<li>Beste Übereinstimmung</li>
</ul>
<h3>Reguläre Ausdrücke</h3>
<p>
Reguläre Ausdrücke sind eine mächtige Sprache für den Mustervergleich, mit der
man nach bestimmten Mustern in einem Feld suchen kann. Wenn wir zum Beispiel
alle Datensätze mit dem DOI-Präfix 10.5281 finden wollen, können wir eine Suche mit
regulären Ausdrücken verwenden:
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=metadata.subjects.identifier:%2F03yrm5c2%5B1%2C6%5D%2F"
><code>metadata.subjects.identifier:/03yrm5c2[1,6]/</code></a
>
</p>
<p>
Vorsicht, der reguläre Ausdruck muss mit dem <em>gesamten</em> Feldwert übereinstimmen.
Weitere Einzelheiten finden Sie in der
<a
href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax"
>Syntax des regulären Ausdrucks</a
>
.
</p>
<h3>Fehlende Werte</h3>
<p>
Es ist möglich, mit den Feldnamen <code>_exists_</code> und
<code>_missing_</code> nach Datensätzen zu suchen,
in denen entweder ein Wert fehlt oder die einen Wert in einem bestimmten Feld haben.
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=_missing_:metadata.additional_titles"
><code>_missing_:metadata.additional_titles</code></a
>
(alle Datensätze ohne metadata.additional_titles)
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=_exists_:metadata.creators"
><code>_exists_:metadata.creators</code></a
>
(alle Datensätze mit metadata.creators)
</p>
<h3>Erweiterte Konzepte</h3>
<h4>Boosten</h4>
<p>
Sie können den Boost-Operator <code>^</code> verwenden, wenn ein Begriff relevanter ist als ein
anderer. Sie können z. B. nach allen Datensätzen suchen, die den Ausdruck
<em>open science</em> entweder <em>im title</em> oder im
<em>description</em> feld enthalten, aber Datensätze mit dem Ausdruck im
<em>title</em> feld höher einstufen:
</p>
<p>
<strong>Beispiel:</strong>
<a
href="/search?page=1&amp;size=20&amp;q=metadata.title:%22open%20science%22%5E5%20metadata.description:%22open%20science%22"
><code>metadata.title:"open science"^5 metadata.description:"open science"</code></a
>
</p>
<h4>Unschärfe</h4>
<p>
Mit dem Fuzzy-Operator <code>~</code>können Sie nach
Begriffen suchen, die Ihrem Suchbegriff ähnlich, aber nicht genau gleich sind.
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=oepn~"><code>oepn~</code></a>
</p>
<p>
Die Ergebnisse entsprechen Datensätzen mit ähnlichen Begriffen wie <code>oepn</code> die z. B.
auch auf <code>open</code> passen würden.
</p>
<h4>Näherungssuche</h4>
<p>
Eine Phrasensuche wie <code>"open science"</code> erwartet standardmäßig alle Begriffe in
genau der gleichen Reihenfolge und würde daher z. B. nicht auf einen Datensatz
passen, der die Phrase <em>"open access and science"</em> enthält.
Eine Proximity-Suche erlaubt, dass die Begriffe nicht in der exakten Reihenfolge stehen
und auch andere Begriffe dazwischen enthalten können.
Der Grad der Flexibilität wird anschließend durch eine Ganzzahl angegeben:
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=%22open%20science%22~5"
><code>"open science"~5</code></a
>
</p>
<h4>Wildcards</h4>
<p>
Sie können Wildcards in Suchbegriffen verwenden, um ein einzelnes Zeichen (mit
dem Operator<code>?</code> operator) oder null oder mehr Zeichen (mit dem Operator
<code>*</code> ) zu ersetzen.
</p>
<p>
<strong>Beispiel:</strong>
<a href="/search?page=1&amp;size=20&amp;q=ope%3F%20scien*"
><code>ope? scien*</code></a
>
</p>
<p>
Platzhaltersuchen können langsam sein und sollten normalerweise nach Möglichkeit vermieden werden.
</p>
</div>
{%- endblock page_body%}

View File

@@ -0,0 +1,18 @@
{{ _('Dear user,') }}
{{ _('Welcome to the Repository of TU Graz!') }}
{{ _('To help you get started, here are some useful links:') }}
- {{ _('Guidelines:')}} {{ _('Repository Guide')}} ({{ _('how to upload files')}}) (https://{{ config.SITE_HOSTNAME }}{{ url_for('invenio_theme_tugraz.guide') }})
- {{ _('Search Guide')}} (https://{{ config.SITE_HOSTNAME }}{{url_for('invenio_app_rdm.help_search')}})
- {{ _('Terms And Conditions') }} (https://{{ config.SITE_HOSTNAME }}{{ url_for('invenio_theme_tugraz.terms') }})
- {{ _('Data Protection Rights')}} (https://{{ config.SITE_HOSTNAME }}{{ url_for('invenio_theme_tugraz.gdpr') }})
{% if security.confirmable %}
{{ _('You can confirm your email through the link below:') }}
{{ confirmation_link }}">
{% endif %}
{{ _('If you require any assistance please do not hesitate to contact us at repository-support@tugraz.at.') }}
{{ _('Best regards,') }}
{{ _('TU Graz Repository Team') }}

View File

@@ -0,0 +1,83 @@
# German translations for invenio-config-tugraz.
# Copyright (C) 2021 Graz University of Technology
# This file is distributed under the same license as the
# invenio-config-tugraz project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: invenio-config-tugraz 0.5.5\n"
"Report-Msgid-Bugs-To: mojib.wali@tugraz.at\n"
"POT-Creation-Date: 2021-04-27 15:30+0200\n"
"PO-Revision-Date: 2021-04-22 11:57+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
"Language-Team: de <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 2.9.0\n"
#: invenio_config_tugraz/config.py:87
msgid "Welcome to TU Graz Repository!"
msgstr "Willkommen im TU Graz Repository!"
#: invenio_config_tugraz/templates/security/email/welcome.txt:1
msgid "Dear user,"
msgstr "Lieber Nutzer,"
#: invenio_config_tugraz/templates/security/email/welcome.txt:3
msgid "Welcome to the Repository of TU Graz!"
msgstr "Willkommen im TU Graz Repository!"
#: invenio_config_tugraz/templates/security/email/welcome.txt:5
msgid "To help you get started, here are some useful links:"
msgstr ""
"Um Ihnen den Einstieg zu erleichtern, finden Sie hier einige nützliche "
"Links:"
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "Guidelines:"
msgstr "Leitfaden:"
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "Repository Guide"
msgstr "Handbuch"
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "how to upload files"
msgstr "wie man Dateien hochlädt"
#: invenio_config_tugraz/templates/security/email/welcome.txt:8
msgid "Search Guide"
msgstr "Suchanleitung"
#: invenio_config_tugraz/templates/security/email/welcome.txt:9
msgid "Terms And Conditions"
msgstr "Nutzungsbedingungen"
#: invenio_config_tugraz/templates/security/email/welcome.txt:10
msgid "Data Protection Rights"
msgstr "Datenschutzerklärung"
#: invenio_config_tugraz/templates/security/email/welcome.txt:13
msgid "You can confirm your email through the link below:"
msgstr "Sie können Ihre E-Mail über den folgenden Link bestätigen:"
#: invenio_config_tugraz/templates/security/email/welcome.txt:16
msgid ""
"If you require any assistance please do not hesitate to contact us at "
"repository-support@tugraz.at."
msgstr ""
"Wenn Sie Hilfe benötigen, zögern Sie bitte nicht, uns unter repository-"
"support@tugraz.at zu kontaktieren."
#: invenio_config_tugraz/templates/security/email/welcome.txt:18
msgid "Best regards,"
msgstr "Mit freundlichen Grüßen,"
#: invenio_config_tugraz/templates/security/email/welcome.txt:19
msgid "TU Graz Repository Team"
msgstr "TU Graz Repository Team"

View File

@@ -0,0 +1,78 @@
# Translations template for invenio-config-tugraz.
# Copyright (C) 2021 Graz University of Technology
# This file is distributed under the same license as the
# invenio-config-tugraz project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: invenio-config-tugraz 0.5.5\n"
"Report-Msgid-Bugs-To: mojib.wali@tugraz.at\n"
"POT-Creation-Date: 2021-04-27 15:30+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.9.0\n"
#: invenio_config_tugraz/config.py:87
msgid "Welcome to TU Graz Repository!"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:1
msgid "Dear user,"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:3
msgid "Welcome to the Repository of TU Graz!"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:5
msgid "To help you get started, here are some useful links:"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "Guidelines:"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "Repository Guide"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:7
msgid "how to upload files"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:8
msgid "Search Guide"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:9
msgid "Terms And Conditions"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:10
msgid "Data Protection Rights"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:13
msgid "You can confirm your email through the link below:"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:16
msgid ""
"If you require any assistance please do not hesitate to contact us at "
"repository-support@tugraz.at."
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:18
msgid "Best regards,"
msgstr ""
#: invenio_config_tugraz/templates/security/email/welcome.txt:19
msgid "TU Graz Repository Team"
msgstr ""

View File

@@ -12,4 +12,4 @@ This file is imported by ``invenio_config_tugraz.__init__``,
and parsed by ``setup.py``. and parsed by ``setup.py``.
""" """
__version__ = '0.1.3' __version__ = "0.5.9"

View File

@@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2021 Graz University of Technology.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""invenio module for TUGRAZ config."""
from os import environ
from typing import Dict
from elasticsearch_dsl.utils import AttrDict
from flask import Blueprint, current_app
def ui_blueprint(app):
"""Blueprint for the routes and resources provided by invenio-config-tugraz."""
blueprint = Blueprint(
"invenio_config_tugraz",
__name__,
template_folder="templates",
)
@blueprint.before_app_first_request
def rank_higher():
"""Rank this modules blueprint higher than blueprint of security module."""
blueprints = current_app._blueprint_order
our_index = None
security_index = None
for index, bp in enumerate(blueprints):
if bp.name == "security":
security_index = index
if bp.name == "invenio_config_tugraz":
our_index = index
if (security_index is not None) and (our_index > security_index):
temp = blueprints[security_index]
blueprints[security_index] = blueprints[our_index]
blueprints[our_index] = temp
return blueprint

View File

@@ -7,6 +7,6 @@
# details. # details.
[pytest] [pytest]
pep8ignore = docs/conf.py ALL addopts = --isort --pydocstyle --pycodestyle --doctest-glob="*.rst" --doctest-modules --cov=invenio_config_tugraz --cov-report=term-missing tests invenio_config_tugraz
addopts = --pep8 --doctest-glob="*.rst" --doctest-modules --cov=invenio_config_tugraz --cov-report=term-missing testpaths = tests invenio_config_tugraz
testpaths = docs tests invenio_config_tugraz live_server_scope = module

View File

@@ -1,14 +1,33 @@
#!/usr/bin/env sh #!/usr/bin/env bash
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2019-2020 CERN.
# Copyright (C) 2019-2020 Northwestern University.
# Copyright (C) 2020 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more # modify it under the terms of the MIT License; see LICENSE file for more
# details. # details.
pydocstyle invenio_config_tugraz tests docs && \
isort --check-only --diff && \ # Quit on errors
check-manifest --ignore ".travis-*" && \ set -o errexit
sphinx-build -qnNW docs docs/_build/html && \
python setup.py test # Quit on unbound symbols
set -o nounset
# Always bring down docker services
function cleanup() {
eval "$(docker-services-cli down --env)"
}
trap cleanup EXIT
python -m check_manifest --ignore ".*-requirements.txt"
python -m sphinx.cmd.build -qnNW docs docs/_build/html
eval "$(docker-services-cli up --db ${DB:-postgresql} --search ${SEARCH:-elasticsearch} --cache ${CACHE:-redis} --env)"
python -m pytest
tests_exit_code=$?
python -m sphinx.cmd.build -qnNW -b doctest docs docs/_build/doctest
exit "$tests_exit_code"

View File

@@ -24,7 +24,7 @@ add_ignore = D401
directory = invenio_config_tugraz/translations/ directory = invenio_config_tugraz/translations/
[extract_messages] [extract_messages]
copyright_holder = Mojib Wali copyright_holder = Graz University of Technology
msgid_bugs_address = mojib.wali@tugraz.at msgid_bugs_address = mojib.wali@tugraz.at
mapping-file = babel.ini mapping-file = babel.ini
output-file = invenio_config_tugraz/translations/messages.pot output-file = invenio_config_tugraz/translations/messages.pot
@@ -37,3 +37,20 @@ output-dir = invenio_config_tugraz/translations/
[update_catalog] [update_catalog]
input-file = invenio_config_tugraz/translations/messages.pot input-file = invenio_config_tugraz/translations/messages.pot
output-dir = invenio_config_tugraz/translations/ output-dir = invenio_config_tugraz/translations/
[flake8]
max-line-length = 88
extend-ignore = E203
select = C,E,F,W,B,B950
ignore = E501
[isort]
multi_line_output = 3
include_trailing_comma = True
force_grid_wrap = 0
use_parentheses = True
ensure_newline_before_comments = True
line_length = 88
[pycodestyle]
ignore = E203,E501

104
setup.py
View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020-2021 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more # modify it under the terms of the MIT License; see LICENSE file for more
@@ -12,32 +12,49 @@ import os
from setuptools import find_packages, setup from setuptools import find_packages, setup
readme = open('README.rst').read() readme = open("README.rst").read()
history = open('CHANGES.rst').read() history = open("CHANGES.rst").read()
tests_require = [ tests_require = [
'pytest-invenio>=1.3.2', "pytest-invenio>=1.4.0",
"invenio-app>=1.3.0,<2.0.0",
] ]
# Should follow invenio-app-rdm
invenio_search_version = ">=1.4.0,<1.5.0"
invenio_db_version = ">=1.0.9,<1.1.0"
extras_require = { extras_require = {
'docs': [ "elasticsearch7": [f"invenio-search[elasticsearch7]{invenio_search_version}"],
'Sphinx>=1.5.1', "mysql": [f"invenio-db[mysql,versioning]{invenio_db_version}"],
"postgresql": [f"invenio-db[postgresql,versioning]{invenio_db_version}"],
"sqlite": [f"invenio-db[versioning]{invenio_db_version}"],
"docs": [
"Sphinx>=3",
], ],
'tests': tests_require, "tests": tests_require,
} }
extras_require['all'] = [] extras_require["all"] = []
for reqs in extras_require.values(): for name, reqs in extras_require.items():
extras_require['all'].extend(reqs) if name[0] == ":" or name in (
"elasticsearch7",
"mysql",
"postgresql",
"sqlite",
):
continue
extras_require["all"].extend(reqs)
setup_requires = [ setup_requires = [
'Babel>=1.3', "Babel>=1.3",
'pytest-runner>=3.0.0,<5', "pytest-runner>=3.0.0,<5",
] ]
install_requires = [ install_requires = [
'Flask-BabelEx>=0.9.4', "Flask-BabelEx>=0.9.4",
# keep this in sync with invenioRDM release
"invenio_app_rdm==3.0.0",
] ]
packages = find_packages() packages = find_packages()
@@ -45,33 +62,36 @@ packages = find_packages()
# Get the version string. Cannot be done with import! # Get the version string. Cannot be done with import!
g = {} g = {}
with open(os.path.join('invenio_config_tugraz', 'version.py'), 'rt') as fp: with open(os.path.join("invenio_config_tugraz", "version.py"), "rt") as fp:
exec(fp.read(), g) exec(fp.read(), g)
version = g['__version__'] version = g["__version__"]
setup( setup(
name='invenio-config-tugraz', name="invenio-config-tugraz",
version=version, version=version,
description=__doc__, description=__doc__,
long_description=readme + '\n\n' + history, long_description=readme + "\n\n" + history,
keywords='invenio, config, Tu Graz', keywords="invenio, config, Tu Graz",
license='MIT', license="MIT",
author='Mojib Wali', author="Mojib Wali",
author_email='mojib.wali@tugraz.at', author_email="mb_wali@hotmail.com",
url='https://github.com/mb-wali/invenio-config-tugraz', url="https://github.com/tu-graz-library/invenio-config-tugraz",
packages=packages, packages=packages,
zip_safe=False, zip_safe=False,
include_package_data=True, include_package_data=True,
platforms='any', platforms="any",
entry_points={ entry_points={
'invenio_base.apps': [ "invenio_base.apps": [
'invenio_config_tugraz = invenio_config_tugraz:invenioconfigtugraz', "invenio_config_tugraz = invenio_config_tugraz:InvenioConfigTugraz",
], ],
'invenio_i18n.translations': [ "invenio_base.blueprints": [
'messages = invenio_config_tugraz', "invenio_config_tugraz = invenio_config_tugraz.views:ui_blueprint",
], ],
'invenio_config.module': [ "invenio_i18n.translations": [
'invenio_config_tugraz = invenio_config_tugraz.config', "messages = invenio_config_tugraz",
],
"invenio_config.module": [
"invenio_config_tugraz = invenio_config_tugraz.config",
], ],
}, },
extras_require=extras_require, extras_require=extras_require,
@@ -79,17 +99,17 @@ setup(
setup_requires=setup_requires, setup_requires=setup_requires,
tests_require=tests_require, tests_require=tests_require,
classifiers=[ classifiers=[
'Environment :: Web Environment', "Environment :: Web Environment",
'Intended Audience :: Developers', "Intended Audience :: Developers",
'License :: OSI Approved :: MIT License', "License :: OSI Approved :: MIT License",
'Operating System :: OS Independent', "Operating System :: OS Independent",
'Programming Language :: Python', "Programming Language :: Python",
'Topic :: Internet :: WWW/HTTP :: Dynamic Content', "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
'Topic :: Software Development :: Libraries :: Python Modules', "Topic :: Software Development :: Libraries :: Python Modules",
'Programming Language :: Python :: 3', "Programming Language :: Python :: 3",
'Programming Language :: Python :: 3.6', "Programming Language :: Python :: 3.6",
'Programming Language :: Python :: 3.7', "Programming Language :: Python :: 3.7",
'Programming Language :: Python :: 3.8', "Programming Language :: Python :: 3.8",
'Development Status :: 3 - Alpha', "Development Status :: 3 - Alpha",
], ],
) )

View File

@@ -12,17 +12,20 @@ See https://pytest-invenio.readthedocs.io/ for documentation on which test
fixtures are available. fixtures are available.
""" """
import os
import shutil import shutil
import tempfile import tempfile
import pytest import pytest
from flask import Flask from flask import Flask
from flask_babelex import Babel from flask_babelex import Babel
from invenio_db import InvenioDB, db
from sqlalchemy_utils.functions import create_database, database_exists, drop_database
from invenio_config_tugraz import invenioconfigtugraz from invenio_config_tugraz import InvenioConfigTugraz
@pytest.fixture(scope='module') @pytest.fixture(scope="module")
def celery_config(): def celery_config():
"""Override pytest-invenio fixture. """Override pytest-invenio fixture.
@@ -31,13 +34,130 @@ def celery_config():
return {} return {}
@pytest.fixture(scope='module') @pytest.fixture()
def create_app(instance_path): def create_app(request):
"""Application factory fixture.""" """Basic Flask application."""
def factory(**config): instance_path = tempfile.mkdtemp()
app = Flask('testapp', instance_path=instance_path) app = Flask("testapp")
app.config.update(**config) DB = os.getenv("SQLALCHEMY_DATABASE_URI", "sqlite://")
Babel(app) app.config.update(
invenioconfigtugraz(app) INVENIO_CONFIG_TUGRAZ_SINGLE_IP=["127.0.0.1", "127.0.0.2"],
return app INVENIO_CONFIG_TUGRAZ_IP_RANGES=[
return factory ["127.0.0.2", "127.0.0.99"],
["127.0.1.3", "127.0.1.5"],
],
SQLALCHEMY_DATABASE_URI=DB,
SQLALCHEMY_TRACK_MODIFICATIONS=False,
)
Babel(app)
InvenioConfigTugraz(app)
InvenioDB(app)
with app.app_context():
db_url = str(db.engine.url)
if db_url != "sqlite://" and not database_exists(db_url):
create_database(db_url)
db.create_all()
def teardown():
with app.app_context():
db_url = str(db.engine.url)
db.session.close()
if db_url != "sqlite://":
drop_database(db_url)
shutil.rmtree(instance_path)
request.addfinalizer(teardown)
app.test_request_context().push()
return app
@pytest.fixture(scope='function')
def open_record():
"""Open record data as dict coming from the external world."""
return {
"access": {
"metadata": False,
"files": False,
"owned_by": [1],
"access_right": "open"
},
"metadata": {
"publication_date": "2020-06-01",
"resource_type": {
"type": "image",
"subtype": "image-photo"
},
# Technically not required
"creators": [{
"name": "Troy Brown",
"type": "personal"
}, {
"name": "Phillip Lester",
"type": "personal",
"identifiers": {"orcid": "0000-0002-1825-0097"},
"affiliations": [{
"name": "Carter-Morris",
"identifiers": {"ror": "03yrm5c26"}
}]
}, {
"name": "Steven Williamson",
"type": "personal",
"identifiers": {"orcid": "0000-0002-1825-0097"},
"affiliations": [{
"name": "Ritter and Sons",
"identifiers": {"ror": "03yrm5c26"}
}, {
"name": "Montgomery, Bush and Madden",
"identifiers": {"ror": "03yrm5c26"}
}]
}],
"title": "A Romans story"
}
}
@pytest.fixture(scope='function')
def singleip_record():
"""Single Ip record data as dict coming from the external world."""
return {
"access": {
"metadata": False,
"files": False,
"owned_by": [1],
"access_right": "singleip"
},
"metadata": {
"publication_date": "2020-06-01",
"resource_type": {
"type": "image",
"subtype": "image-photo"
},
# Technically not required
"creators": [{
"name": "Troy Brown",
"type": "personal"
}, {
"name": "Phillip Lester",
"type": "personal",
"identifiers": {"orcid": "0000-0002-1825-0097"},
"affiliations": [{
"name": "Carter-Morris",
"identifiers": {"ror": "03yrm5c26"}
}]
}, {
"name": "Steven Williamson",
"type": "personal",
"identifiers": {"orcid": "0000-0002-1825-0097"},
"affiliations": [{
"name": "Ritter and Sons",
"identifiers": {"ror": "03yrm5c26"}
}, {
"name": "Montgomery, Bush and Madden",
"identifiers": {"ror": "03yrm5c26"}
}]
}],
"title": "A Romans story"
}
}

29
tests/test_generators.py Normal file
View File

@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020 Mojib Wali.
#
# invenio-config-tugraz is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""Test Generators."""
from invenio_access.permissions import any_user
from invenio_config_tugraz.generators import RecordIp
def test_recordip(create_app, open_record, singleip_record):
"""Test Generator RecordIp."""
generator = RecordIp()
open_record = open_record
singleiprec = singleip_record
assert generator.needs(record=None) == []
assert generator.needs(record=open_record) == [any_user]
assert generator.needs(record=singleiprec) == []
assert generator.excludes(record=open_record) == []
assert generator.excludes(record=open_record) == []
assert generator.query_filter().to_dict() == {'bool': {'must_not': [{'match': {'access.access_right': 'singleip'}}]}}

View File

@@ -10,23 +10,24 @@
from flask import Flask from flask import Flask
from invenio_config_tugraz import invenioconfigtugraz from invenio_config_tugraz import InvenioConfigTugraz
def test_version(): def test_version():
"""Test version import.""" """Test version import."""
from invenio_config_tugraz import __version__ from invenio_config_tugraz import __version__
assert __version__ assert __version__
def test_init(): def test_init():
"""Test extension initialization.""" """Test extension initialization."""
app = Flask('testapp') app = Flask("testapp")
ext = invenioconfigtugraz(app) ext = InvenioConfigTugraz(app)
assert 'invenio-config-tugraz' in app.extensions assert "invenio-config-tugraz" in app.extensions
app = Flask('testapp') app = Flask("testapp")
ext = invenioconfigtugraz() ext = InvenioConfigTugraz()
assert 'invenio-config-tugraz' not in app.extensions assert "invenio-config-tugraz" not in app.extensions
ext.init_app(app) ext.init_app(app)
assert 'invenio-config-tugraz' in app.extensions assert "invenio-config-tugraz" in app.extensions