Compare commits

...

75 Commits

Author SHA1 Message Date
672f686d1a Added dependabot config 2025-05-27 17:52:59 +01:00
59c3ac5bc2 Patch: badge display fix 2025-05-23 17:24:58 +01:00
1e75799497 Patch: Another attempt to fix badge display 2025-05-23 17:20:57 +01:00
fec9dd75c7 Patch: Fixed code coverage badge display 2025-05-23 17:17:57 +01:00
2ae8ab6926 Patch: fixed test config typo 2025-05-23 17:15:02 +01:00
e24e1f2cbc Patch: code cleanup 2025-05-23 17:13:41 +01:00
e3465637f9 Removed unnecessary babel config 2025-05-23 17:10:48 +01:00
f7a4ab0939 Removed unnecessary docker version check 2025-05-23 16:26:13 +01:00
a7ffce1f43 Fixed coverage badge url 2025-05-23 16:14:43 +01:00
3b1526d4d8 Patch: typo fix in reporting config 2025-05-23 16:10:08 +01:00
fd4f97fd41 Another attempt to patch coverage reporting 2025-05-23 16:08:39 +01:00
c91ff83bb5 Attempt to patch automatic coveralls reporting 2025-05-23 16:06:49 +01:00
c22f4f4d02 Patch: Added coverage upload to coveralls to tests workflow 2025-05-23 15:57:45 +01:00
919cd3e4bd Removed unnecessary docs/requirements.txt 2025-05-23 15:24:52 +01:00
4fad1ced08 Updated sphinx documentation config 2025-05-23 15:20:26 +01:00
3bb38a95eb Removed default sphinx build pipeline 2025-05-23 14:57:39 +01:00
36f9b91cc1 Another attempt to fix readthedocs 2025-05-23 14:55:44 +01:00
3013095bdd Attempt to fix readthedocs build 2025-05-23 14:36:32 +01:00
6e84ea0446 Added readthedocs config 2025-05-23 14:19:15 +01:00
529fe17d24 Patch to improve uv publishing 2025-05-23 12:57:52 +01:00
0fd2466b49 Another attempt to patch publish workflow 2025-05-23 12:45:29 +01:00
8f5c1e36a5 Attempt to patch publishing workflow 2025-05-23 12:39:16 +01:00
1992a4cee0 Version Increment 2025-05-23 12:36:23 +01:00
40ed1aa4f9 Set publish to trigger on tagging 2025-05-23 12:35:57 +01:00
51f11bd910 Added automatic publishing to pypi 2025-05-23 12:31:16 +01:00
f4c8cbea03 Fixed mistake in tagging workflow 2025-05-23 12:19:25 +01:00
56f7739ae4 Tweaked tagging workflow to only run after successful tests 2025-05-23 12:18:12 +01:00
f2bcb03cd0 Version increment 2025-05-23 12:14:00 +01:00
9646985e7c AddedAdded auto-tagging workflow 2025-05-23 12:11:58 +01:00
b514df9d48 Updated tests workflow 2025-05-23 12:11:58 +01:00
e1d975dc98 Version increment 2025-05-20 11:22:01 +01:00
d4f6efe5a2 Removed unnecessary git hook 2025-05-20 11:21:52 +01:00
9b7aa9a217 Improved check_version_increment script 2025-05-20 11:19:10 +01:00
a0da4cf05f Added version check script and pre-push hooks 2025-05-20 10:10:47 +01:00
84595fa54f Switched to calver managed by hatch 2025-05-20 10:01:19 +01:00
2cf44242fa Update devenv 2025-05-08 14:35:52 +01:00
899b391e29 Version bump 2025-05-02 14:05:20 +01:00
610ea83652 Re-added entrypoints 2025-05-02 13:52:53 +01:00
28aa1eb9a3 Updated to run on python 3.13 2025-05-01 09:02:07 +01:00
98f37fc6d7 Added license header 2025-04-29 14:35:26 +01:00
7c938751e6 Version bump 2025-04-29 14:12:54 +01:00
7bd474a247 Fixed testing workflow 2025-04-29 14:05:50 +01:00
8582c8ce23 Switched tests to be managed by package manager 2025-04-29 14:03:16 +01:00
3ba2169591 Fixed policies 2025-04-29 13:29:06 +01:00
3e566699c6 Updated test settings 2025-04-29 12:49:31 +01:00
811bf6514d Renamed test file 2025-04-29 12:15:48 +01:00
668ae1e34c Switched build system from setuptools to hatchling 2025-04-29 12:13:57 +01:00
60085e90ab Removed deprecated ruff rules 2025-04-29 08:48:05 +01:00
cb836a1d6d Updated devenv 2025-04-29 08:43:20 +01:00
5fea611ab4 Added act to test actions locally 2025-04-29 08:42:09 +01:00
e8df1e4541 Removed manifest from package 2025-04-28 18:50:42 +01:00
069bb11033 Added test script logging 2025-04-28 18:45:20 +01:00
cd35917894 UV tests fix? 2025-04-28 18:39:51 +01:00
302ff471fd Trying again 2025-04-28 18:36:53 +01:00
e2e6a32c08 Another fix attempt 2025-04-28 18:34:15 +01:00
32f0c0af61 Another fix attempt 2025-04-28 18:27:49 +01:00
d26e8cae6f Another tests.yml fix 2025-04-28 18:26:14 +01:00
f537f0e383 Attempted tests.yml fix 2025-04-28 18:13:31 +01:00
3e82144fd3 Another attempt to fix tests.yml 2025-04-28 18:12:18 +01:00
b925eaa678 Fixed tests workflow 2025-04-28 18:08:04 +01:00
5b2eb94994 FIxed tests workflow and removed automatic publishing 2025-04-28 18:01:35 +01:00
7c7a281a5f Configured for build and publish 2025-04-28 17:51:28 +01:00
8e3b48ab52 Added devenv definition 2025-04-28 17:51:28 +01:00
Cian Hughes
8746d704a1 Update pypi-publish.yml 2025-04-25 16:52:25 +01:00
Cian Hughes
a7b474bb78 Update tests.yml 2025-04-25 16:50:18 +01:00
969b16fe4a Updated README.rst 2025-04-25 16:43:07 +01:00
d452fca79e Update README.rst 2025-04-25 16:40:41 +01:00
2069f0826d Updated README.rst 2025-04-25 16:29:06 +01:00
98893598f8 Update README.rst 2025-04-25 16:26:59 +01:00
4e20d6a5fe Lint and format according to new codestyle 2025-04-25 16:24:31 +01:00
58a7e2f3a8 Switched from black to ruff 2025-04-25 16:22:11 +01:00
5665b01979 Migrate from setup.py to uv 2025-04-25 15:51:27 +01:00
b6cbd03f9c Changed names for new fork 2025-04-25 15:51:08 +01:00
Christoph Ladurner
04ca3f5661 release v0.12.5 2024-07-29 09:46:39 +02:00
Christoph Ladurner
5d84b08e26 fix: permission for ip 2024-07-29 09:36:36 +02:00
70 changed files with 6276 additions and 481 deletions

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020 Mojib Wali.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.

5
.envrc Normal file
View File

@@ -0,0 +1,5 @@
export DIRENV_WARN_TIMEOUT=20s
eval "$(devenv direnvrc)"
use devenv

29
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
version: 2
updates:
- package-ecosystem: "uv"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "04:00"
open-pull-requests-limit: 8
allow:
- dependency-type: "all"
reviewers:
- "Cian-H"
assignees:
- "Cian-H"
commit-message:
prefix: "uv-deps"
prefix-development: "uv-deps-dev"
include: "scope"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "04:00"
open-pull-requests-limit: 5
commit-message:
prefix: "ci"

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

@@ -0,0 +1,26 @@
name: Publish to PyPI
on:
workflow_run:
workflows:
- Auto Version Tag
types:
- completed
jobs:
publish:
runs-on: ubuntu-latest
environment: release
steps:
- uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
python-version: "${{ matrix.python-version }}"
enable-cache: true
cache-dependency-glob: |
pyproject.toml
- name: Build package
run: uv build
- name: Publish to PyPI
run: uv publish --token ${{ secrets.PYPI_API_TOKEN }}

View File

@@ -1,9 +0,0 @@
on:
push:
tags:
- v*
jobs:
build-n-publish:
uses: tu-graz-library/.github/.github/workflows/pypi-publish.yml@main
secrets: inherit

20
.github/workflows/tagging.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Auto Version Tag
on:
workflow_run:
workflows:
- Tests
types:
- completed
jobs:
tag:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Version tag
uses: Jorricks/action-python-autotagging@1.0.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
path: invenio_config_iform/__about__.py
variable: __version__

View File

@@ -1,20 +1,92 @@
name: CI # -*- coding: utf-8 -*-
#
# Copyright (C) 2025 I-Form Advanced Manufacturing Research Centre.
#
# invenio-theme-iform is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
name: Tests
on: on:
push: push:
branches: master branches:
- master
pull_request: pull_request:
branches: master branches:
schedule: - master
# * is a special character in YAML so you have to quote this string
- cron: '0 3 * * 6'
workflow_dispatch: workflow_dispatch:
inputs: inputs:
reason: reason:
description: 'Reason' description: "Reason"
required: false required: false
default: 'Manual trigger' default: "Manual trigger"
jobs: jobs:
create-strategy:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.requirements.outputs.matrix }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: requirements
id: requirements
run: |
# Define a simple matrix with your Python version
# Since we're using pyproject.toml with Python 3.12 requirement
echo "matrix={\"include\": [{\"python-version\": \"3.12\"}]}" >> $GITHUB_OUTPUT
# Print the matrix for debugging
echo "-------------------"
echo "Matrix: {\"include\": [{\"python-version\": \"3.12\"}]}"
echo "-------------------"
tests: tests:
uses: tu-graz-library/.github/.github/workflows/tests.yml@main needs: create-strategy
runs-on: ubuntu-latest
name: Test (Python ${{matrix.python-version}})
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.create-strategy.outputs.matrix) }}
# Simplified environment without service variables
env:
PYTHON_VERSION: ${{ matrix.python-version }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
python-version: "${{ matrix.python-version }}"
enable-cache: true
cache-dependency-glob: |
pyproject.toml
cache-suffix: ${{ matrix.python-version }}
- name: Show configuration
run: |
uv --version
uv run python --version
- name: Install dependencies
run: |
uv sync --group tests
- name: Run tests
env:
PYTEST_ADDOPTS: "--cov-report=lcov"
run: |
uv run test
- name: Upload coverage to Coveralls
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
path-to-lcov: coverage.lcov

10
.gitignore vendored
View File

@@ -60,3 +60,13 @@ target/
# Vim swapfiles # Vim swapfiles
.*.sw? .*.sw?
# Devenv
.devenv*
devenv.local.nix
# direnv
.direnv
# python version lock
.python-version

24
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,24 @@
repos:
- repo: local
hooks:
- id: check-version-increment
name: Check Version Increment
entry: python scripts/hooks/pre-push/check_version_increment.py
language: system
pass_filenames: false
stages: [pre-push]
- id: tests
name: Run Python Tests
entry: uv run test
language: system
pass_filenames: false
stages: [pre-push]
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.11.9
hooks:
- id: ruff
stages: [pre-push]
- id: ruff-format
stages: [pre-push]

20
.readthedocs.yaml Normal file
View File

@@ -0,0 +1,20 @@
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the OS, Python version, and other tools you might need
build:
os: ubuntu-24.04
tools:
python: "3.13"
jobs:
pre_create_environment:
- asdf plugin add uv
- asdf install uv latest
- asdf global uv latest
create_environment:
- uv sync --group docs
install:
- uv run python -m sphinx -T -d docs/_build/doctrees -D language=en docs $READTHEDOCS_OUTPUT/html

View File

@@ -1,13 +1,15 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
Authors Authors
======= =======
invenio module that adds tugraz configs. invenio module that adds I-Form configs.
- Mojib Wali <mojib.wali@tugraz.at> - Cian Hughes <cian.hughes@dcu.ie>
Forked from https://github.com/tu-graz-library/invenio-theme-tugraz

View File

@@ -1,16 +1,21 @@
.. ..
Copyright (C) 2020 - 2022 Graz University of Technology. Copyright (C) 2020 - 2022 Graz University of Technology.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
Changes Changes
======= =======
Version v0.12.5 (release 2024-07-29)
- fix: permission for ip
Version v0.12.3 (release 2024-07-25) Version v0.12.3 (release 2024-07-25)
- fix(tugraz_authenticated): missmatch of role name - fix(iform_authenticated): missmatch of role name
Version v0.12.2 (release 2024-07-19) Version v0.12.2 (release 2024-07-19)

View File

@@ -10,7 +10,7 @@ Types of Contributions
Report Bugs Report Bugs
~~~~~~~~~~~ ~~~~~~~~~~~
Report bugs at https://github.com/tu-graz-library/invenio-config-tugraz/issues. Report bugs at https://github.com/Cian-H/invenio-config-iform/issues.
If you are reporting a bug, please include: If you are reporting a bug, please include:
@@ -33,15 +33,15 @@ is open to whoever wants to implement it.
Write Documentation Write Documentation
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
invenio-config-tugraz could always use more documentation, whether as part of the invenio-config-iform could always use more documentation, whether as part of the
official invenio-config-tugraz docs, in docstrings, or even on the web in blog posts, official invenio-config-iform docs, in docstrings, or even on the web in blog posts,
articles, and such. articles, and such.
Submit Feedback 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/tu-graz-library/invenio-config-tugraz/issues. https://github.com/Cian-H/invenio-config-iform/issues.
If you are proposing a feature: If you are proposing a feature:
@@ -53,14 +53,14 @@ If you are proposing a feature:
Get Started! Get Started!
------------ ------------
Ready to contribute? Here's how to set up `invenio-config-tugraz` for local development. Ready to contribute? Here's how to set up `invenio-config-iform` for local development.
1. Fork the `https://github.com/https://github.com/mb-` repo on GitHub. 1. Fork the `https://github.com/https://github.com/mb-` repo on GitHub.
2. Clone your fork locally: 2. Clone your fork locally:
.. code-block:: console .. code-block:: console
$ git clone git@github.com:your_name_here/invenio-config-tugraz.git $ git clone git@github.com:your_name_here/invenio-config-iform.git
3. Install your local copy into a virtualenv. Assuming you have 3. Install your local copy into a virtualenv. Assuming you have
virtualenvwrapper installed, this is how you set up your fork for local virtualenvwrapper installed, this is how you set up your fork for local
@@ -68,8 +68,8 @@ Ready to contribute? Here's how to set up `invenio-config-tugraz` for local deve
.. code-block:: console .. code-block:: console
$ mkvirtualenv invenio-config-tugraz $ mkvirtualenv invenio-config-iform
$ cd invenio-config-tugraz/ $ cd invenio-config-iform/
$ pip install -e .[all] $ pip install -e .[all]
4. Create a branch for local development: 4. Create a branch for local development:
@@ -114,5 +114,5 @@ Before you submit a pull request, check that it meets these guidelines:
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 3.6 and 3.7. Check 3. The pull request should work for Python 3.6 and 3.7. Check
https://github.com/github/tu-graz-library/invenio-config-tugraz//actions?query=event%3Apull_request https://github.com/github/Cian-H/invenio-config-iform//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

@@ -1,8 +1,8 @@
Installation Installation
============ ============
invenio-config-tugraz is on PyPI so all you need is: invenio-config-iform is on PyPI so all you need is:
.. code-block:: console .. code-block:: console
$ pip install invenio-config-tugraz $ pip install invenio-config-iform

View File

@@ -1,55 +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.
# TODO: Generate this manifest file by running the following commands:
# (please sort the lines in this file after running below commands)
#
# git init
# git add -A
# pip install -e .[all]
# check-manifest -u
include .dockerignore
include .editorconfig
include .tx/config
prune docs/_build
recursive-include invenio_config_tugraz/translations *.po *.pot *.mo
# added by check_manifest.py
include *.md
include *.rst
include *.sh
include *.txt
include *.rst
include LICENSE
include babel.ini
include pytest.ini
recursive-include docs *.bat
recursive-include docs *.py
recursive-include docs *.rst
recursive-include docs *.txt
recursive-include docs Makefile
recursive-include tests *.py
# added by check_manifest.py
recursive-include invenio_config_tugraz *.crt
recursive-include invenio_config_tugraz *.json
recursive-include invenio_config_tugraz *.key
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
# added by check-manifest
recursive-include invenio_config_tugraz *.pdf
include .git-blame-ignore-revs

View File

@@ -1,45 +1,47 @@
.. ..
Copyright (C) 2020-2021 Graz University of Technology. Copyright (C) 2020-2021 Graz University of Technology.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
======================= =======================
invenio-config-tugraz invenio-config-iform
======================= =======================
.. image:: https://github.com/tu-graz-library/invenio-config-tugraz/workflows/CI/badge.svg .. image:: https://github.com/Cian-H/invenio-config-iform/workflows/CI/badge.svg
:target: https://github.com/tu-graz-library/invenio-config-tugraz/actions :target: https://github.com/Cian-H/invenio-config-iform/actions
.. image:: https://img.shields.io/pypi/dm/invenio-config-tugraz.svg .. image:: https://img.shields.io/pypi/dm/invenio-config-iform.svg
:target: https://pypi.python.org/pypi/invenio-config-tugraz :target: https://pypi.python.org/pypi/invenio-config-iform
.. image:: https://img.shields.io/github/tag/tu-graz-library/invenio-config-tugraz.svg .. image:: https://img.shields.io/github/tag/Cian-H/invenio-config-iform.svg
:target: https://github.com/tu-graz-library/invenio-config-tugraz/releases :target: https://github.com/Cian-H/invenio-config-iform/releases
.. image:: https://img.shields.io/github/license/tu-graz-library/invenio-config-tugraz.svg .. image:: https://img.shields.io/github/license/Cian-H/invenio-config-iform.svg
:target: https://github.com/tu-graz-library/invenio-config-tugraz/blob/master/LICENSE :target: https://github.com/Cian-H/invenio-config-iform/blob/master/LICENSE
.. image:: https://readthedocs.org/projects/invenio-config-tugraz/badge/?version=latest .. image:: https://readthedocs.org/projects/invenio-config-iform/badge/?version=latest
:target: https://invenio-config-tugraz.readthedocs.io/en/latest/?badge=latest :target: https://invenio-config-iform.readthedocs.io/en/latest/?badge=latest
.. image:: https://img.shields.io/coveralls/mb-wali/invenio-config-tugraz.svg .. image:: https://coveralls.io/repos/github/Cian-H/invenio-config-iform/badge.svg?branch=master
:target: https://coveralls.io/r/mb-wali/invenio-config-tugraz :target: https://coveralls.io/github/Cian-H/invenio-config-iform?branch=master
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg .. image:: https://img.shields.io/badge/code%20style-Ruff-D7FF64.svg
:target: https://github.com/psf/black :target: https://github.com/astral-sh/ruff
invenio module that adds tugraz configs. invenio module that adds I-Form configs.
Override configs from diffrent invenio modules to meet TU Graz requirement: Override configs from invenio modules with I-Form configurations:
* Invenio-App * Invenio-App
* Invenio-Mail * Invenio-Mail
* Invenio-shibboleth * Invenio-shibboleth
* Invenio-accounts * Invenio-accounts
* Flask-security * Flask-security
* Defined routes for TUG * Defined routes for I-Form
Further documentation is available on Further documentation is available on
https://invenio-config-tugraz.readthedocs.io/ https://invenio-config-iform.readthedocs.io/
Forked from https://github.com/tu-graz-library/invenio-config-tugraz

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020 Mojib Wali.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.

103
devenv.lock Normal file
View File

@@ -0,0 +1,103 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1746707904,
"owner": "cachix",
"repo": "devenv",
"rev": "fada79d97f2066c444766d039b0a62affd3e3cab",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1733328505,
"owner": "edolstra",
"repo": "flake-compat",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1746537231,
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "fa466640195d38ec97cf0493d6d6882bc4d14969",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1745934659,
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "fbc071e5c11e23fba50037de37268e3d8a1858eb",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"git-hooks": "git-hooks",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": [
"git-hooks"
]
}
}
},
"root": "root",
"version": 7
}

19
devenv.nix Normal file
View File

@@ -0,0 +1,19 @@
{
pkgs,
lib,
config,
inputs,
...
}: {
packages = [
pkgs.git
pkgs.act
];
languages.python = {
enable = true;
uv = {
enable = true;
};
};
}

4
devenv.yaml Normal file
View File

@@ -0,0 +1,4 @@
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling

View File

@@ -87,9 +87,9 @@ qthelp:
@echo @echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:" ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/invenio-config-tugraz.qhcp" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/invenio-config-iform.qhcp"
@echo "To view the help file:" @echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/invenio-config-tugraz.qhc" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/invenio-config-iform.qhc"
applehelp: applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@@ -104,8 +104,8 @@ devhelp:
@echo @echo
@echo "Build finished." @echo "Build finished."
@echo "To view the help file:" @echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/invenio-config-tugraz" @echo "# mkdir -p $$HOME/.local/share/devhelp/invenio-config-iform"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/invenio-config-tugraz" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/invenio-config-iform"
@echo "# devhelp" @echo "# devhelp"
epub: epub:

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
@@ -9,5 +9,5 @@
API Docs API Docs
======== ========
.. automodule:: invenio_config_tugraz.ext .. automodule:: invenio_config_iform.ext
:members: :members:

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.

View File

@@ -2,13 +2,13 @@
# #
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020 Mojib Wali.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""Sphinx configuration.""" """Sphinx configuration."""
from invenio_config_tugraz import __version__ from invenio_config_iform import __version__
# import sphinx.environment # import sphinx.environment
@@ -46,9 +46,9 @@ source_suffix = ".rst"
master_doc = "index" master_doc = "index"
# General information about the project. # General information about the project.
project = "invenio-config-tugraz" project = "invenio-config-iform"
copyright = "2022, TU Graz" copyright = "2025, I-Form"
author = "TU Graz" author = "I-Form"
# 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
@@ -108,15 +108,15 @@ todo_include_todos = False
html_theme = "alabaster" html_theme = "alabaster"
html_theme_options = { html_theme_options = {
"description": "invenio module that adds tugraz configs.", "description": "invenio module that adds iform configs.",
"github_user": "TU Graz", "github_user": "Cian-H",
"github_repo": "invenio-config-tugraz", "github_repo": "invenio-config-iform",
"github_button": False, "github_button": True,
"github_banner": True, "github_banner": False,
"show_powered_by": False, "show_powered_by": False,
"extra_nav_links": { "extra_nav_links": {
"invenio-config-tugraz@GitHub": "https://github.com/tu-graz-library/invenio-config-tugraz", "invenio-config-iform@Github": "https://github.com/Cian-H/invenio-config-iform",
"invenio-config-tugraz@PyPI": "https://pypi.python.org/pypi/invenio-config-tugraz/", "invenio-config-iform@PyPI": "https://pypi.python.org/pypi/invenio-config-iform/",
}, },
} }
@@ -221,7 +221,7 @@ html_sidebars = {
# 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-iform_namedoc"
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ---------------------------------------------
@@ -242,9 +242,9 @@ latex_elements = {
latex_documents = [ latex_documents = [
( (
master_doc, master_doc,
"invenio-config-tugraz.tex", "invenio-config-iform.tex",
"invenio-config-tugraz Documentation", "invenio-config-iform Documentation",
"Mojib Wali", "I-Form",
"manual", "manual",
), ),
] ]
@@ -277,8 +277,8 @@ latex_documents = [
man_pages = [ man_pages = [
( (
master_doc, master_doc,
"invenio-config-tugraz", "invenio-config-iform",
"invenio-config-tugraz Documentation", "invenio-config-iform Documentation",
[author], [author],
1, 1,
) )
@@ -296,11 +296,11 @@ man_pages = [
texinfo_documents = [ texinfo_documents = [
( (
master_doc, master_doc,
"invenio-config-tugraz", "invenio-config-iform",
"invenio-config-tugraz Documentation", "invenio-config-iform Documentation",
author, author,
"invenio-config-tugraz", "invenio-config-iform",
"invenio module that adds tugraz configs.", "invenio module that adds iform configs.",
"Miscellaneous", "Miscellaneous",
), ),
] ]

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
@@ -9,5 +9,5 @@
Configuration Configuration
============= =============
.. automodule:: invenio_config_tugraz.config .. automodule:: invenio_config_iform.config
:members: :members:

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
@@ -12,7 +12,7 @@ User's Guide
------------ ------------
This part of the documentation will show you how to get started in using This part of the documentation will show you how to get started in using
invenio-config-tugraz. invenio-config-iform.
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.

View File

@@ -127,9 +127,9 @@ if "%1" == "qthelp" (
echo. echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^ echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this: .qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\invenio-config-tugraz.qhcp echo.^> qcollectiongenerator %BUILDDIR%\qthelp\invenio-config-iform.qhcp
echo.To view the help file: echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\invenio-config-tugraz.ghc echo.^> assistant -collectionFile %BUILDDIR%\qthelp\invenio-config-iform.ghc
goto end goto end
) )

View File

@@ -1 +0,0 @@
-e .[docs,tests]

View File

@@ -1,7 +1,7 @@
.. ..
Copyright (C) 2020 Mojib Wali. Copyright (C) 2020 Mojib Wali.
invenio-config-tugraz is free software; you can redistribute it and/or invenio-config-iform 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.
@@ -9,4 +9,4 @@
Usage Usage
===== =====
.. automodule:: invenio_config_tugraz .. automodule:: invenio_config_iform

View File

@@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2025 I-Form Advanced Manufacturing Research Centre.
#
# invenio-config-iform is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""Metadata for this python module."""
__version__ = "2025.5.20.21"

View File

@@ -2,19 +2,18 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""invenio module that adds tugraz configs.""" """invenio module that adds I-Form configs."""
from .ext import InvenioConfigTugraz from .__about__ import __version__
from .ext import InvenioConfigIform
from .utils import get_identity_from_user_by_email from .utils import get_identity_from_user_by_email
__version__ = "0.12.3"
__all__ = ( __all__ = (
"InvenioConfigIform",
"__version__", "__version__",
"InvenioConfigTugraz",
"get_identity_from_user_by_email", "get_identity_from_user_by_email",
) )

View File

@@ -2,36 +2,36 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""invenio module that adds tugraz configs.""" """invenio module that adds I-Form configs."""
from invenio_i18n import gettext as _ from invenio_i18n import gettext as _
CONFIG_TUGRAZ_SHIBBOLETH = False CONFIG_IFORM_SHIBBOLETH = False
"""Set True if SAML is configured""" """Set True if SAML is configured"""
CONFIG_TUGRAZ_SINGLE_IPS = [] CONFIG_IFORM_SINGLE_IPS = []
"""Allows access to users whose IP address is listed. """Allows access to users whose IP address is listed.
INVENIO_CONFIG_TUGRAZ_SINGLE_IPS = INVENIO_CONFIG_IFORM_SINGLE_IPS =
["127.0.0.1", "127.0.0.2"] ["127.0.0.1", "127.0.0.2"]
""" """
CONFIG_TUGRAZ_IP_RANGES = [] CONFIG_IFORM_IP_RANGES = []
"""Allows access to users whose range of IP address is listed. """Allows access to users whose range of IP address is listed.
INVENIO_CONFIG_TUGRAZ_IP_RANGES = INVENIO_CONFIG_IFORM_IP_RANGES =
[["127.0.0.2", "127.0.0.99"], ["127.0.1.3", "127.0.1.5"]] [["127.0.0.2", "127.0.0.99"], ["127.0.1.3", "127.0.1.5"]]
""" """
CONFIG_TUGRAZ_IP_NETWORK = "" CONFIG_IFORM_IP_NETWORK = ""
"""Allows access to users who are in the IP network.""" """Allows access to users who are in the IP network."""
CONFIG_TUGRAZ_ROUTES = { CONFIG_IFORM_ROUTES = {
"guide": "/guide", "guide": "/guide",
"terms": "/terms", "terms": "/terms",
"gdpr": "/gdpr", "gdpr": "/gdpr",
@@ -201,7 +201,7 @@ 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: Instead if you have a overriden template somewhere in your config.py:
like this: like this:
SECURITY_LOGIN_USER_TEMPLATE = 'invenio_theme_tugraz/accounts/login.html' SECURITY_LOGIN_USER_TEMPLATE = 'invenio_theme_iform/accounts/login.html'
then you can remove this condition from header_login.htm: then you can remove this condition from header_login.htm:
{%- if config.ACCOUNTS %} {%- if config.ACCOUNTS %}
to render your overriden login.html to render your overriden login.html
@@ -220,8 +220,8 @@ RECAPTCHA_PRIVATE_KEY = None
# See: # See:
# https://invenio-records-permissions.readthedocs.io/en/latest/configuration.html # https://invenio-records-permissions.readthedocs.io/en/latest/configuration.html
# Uncomment these to enable overriding RDM permissions # Uncomment these to enable overriding RDM permissions
# from .rdm_permissions import TUGRAZRDMRecordServiceConfig # from .rdm_permissions import IformRDMRecordServiceConfig
# RDM_RECORDS_BIBLIOGRAPHIC_SERVICE_CONFIG = TUGRAZRDMRecordServiceConfig # RDM_RECORDS_BIBLIOGRAPHIC_SERVICE_CONFIG = IformRDMRecordServiceConfig
"""Access control configuration for records.""" """Access control configuration for records."""
# invenio-rdm-records # invenio-rdm-records

View File

@@ -2,13 +2,12 @@
# #
# Copyright (C) 2024 Graz University of Technology. # Copyright (C) 2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""Custom fields.""" """Custom fields."""
from invenio_records_resources.services.custom_fields import BooleanCF from invenio_records_resources.services.custom_fields import BooleanCF
ip_network = BooleanCF(name="ip_network") ip_network = BooleanCF(name="ip_network")

View File

@@ -2,11 +2,11 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""invenio module that adds tugraz configs.""" """invenio module that adds I-Form configs."""
from flask import Flask from flask import Flask
@@ -14,8 +14,8 @@ from . import config
from .custom_fields import ip_network, single_ip from .custom_fields import ip_network, single_ip
class InvenioConfigTugraz: class InvenioConfigIform:
"""invenio-config-tugraz extension.""" """invenio-config-iform extension."""
def __init__(self, app: Flask = None) -> None: def __init__(self, app: Flask = None) -> None:
"""Extension initialization.""" """Extension initialization."""
@@ -26,12 +26,12 @@ class InvenioConfigTugraz:
"""Flask application initialization.""" """Flask application initialization."""
self.init_config(app) self.init_config(app)
self.add_custom_fields(app) self.add_custom_fields(app)
app.extensions["invenio-config-tugraz"] = self app.extensions["invenio-config-iform"] = self
def init_config(self, app: Flask) -> None: def init_config(self, app: Flask) -> None:
"""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_IFORM_"):
app.config.setdefault(k, getattr(config, k)) app.config.setdefault(k, getattr(config, k))
def add_custom_fields(self, app: Flask) -> None: def add_custom_fields(self, app: Flask) -> None:
@@ -57,5 +57,5 @@ def rank_blueprint_higher(app: Flask) -> None:
""" """
bps = app.blueprints bps = app.blueprints
for blueprint_name in list(bps.keys()): for blueprint_name in list(bps.keys()):
if blueprint_name != "invenio_config_tugraz": if blueprint_name != "invenio_config_iform":
bps.update({blueprint_name: bps.pop(blueprint_name)}) bps.update({blueprint_name: bps.pop(blueprint_name)})

View File

@@ -2,12 +2,12 @@
# #
# Copyright (C) 2024 Graz University of Technology. # Copyright (C) 2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""Permission-policies and roles, based on `flask-principal`.""" """Permission-policies and roles, based on `flask-principal`."""
from .policies import TUGrazRDMRecordPermissionPolicy from .policies import IformRDMRecordPermissionPolicy
__all__ = ("TUGrazRDMRecordPermissionPolicy",) __all__ = ("IformRDMRecordPermissionPolicy",)

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
@@ -54,7 +54,7 @@ from invenio_access.permissions import any_user
from invenio_records_permissions.generators import Generator from invenio_records_permissions.generators import Generator
from invenio_search.engine import dsl from invenio_search.engine import dsl
from .roles import tugraz_authenticated_user from .roles import iform_authenticated_user
class RecordSingleIP(Generator): class RecordSingleIP(Generator):
@@ -65,12 +65,8 @@ class RecordSingleIP(Generator):
if record is None: if record is None:
return [] return []
# if record does not have singleip - return any_user
if not record.get("custom_fields", {}).get("single_ip", False):
return [any_user]
# if record has singleip, and the ip of the user matches the allowed ip # if record has singleip, and the ip of the user matches the allowed ip
if self.check_permission(): if record.get("custom_fields", {}).get("single_ip", False) and self.check_permission():
return [any_user] return [any_user]
# non of the above - return empty # non of the above - return empty
@@ -95,10 +91,7 @@ class RecordSingleIP(Generator):
Need provider is disallowed. Need provider is disallowed.
""" """
try: try:
if ( if kwargs["record"]["custom_fields"]["single_ip"] and not self.check_permission():
kwargs["record"]["custom_fields"]["single_ip"]
and not self.check_permission()
):
return [any_user] return [any_user]
except KeyError: except KeyError:
@@ -125,7 +118,7 @@ class RecordSingleIP(Generator):
except RuntimeError: except RuntimeError:
return False return False
single_ips = current_app.config["CONFIG_TUGRAZ_SINGLE_IPS"] single_ips = current_app.config["CONFIG_IFORM_SINGLE_IPS"]
return user_ip in single_ips return user_ip in single_ips
@@ -138,12 +131,8 @@ class AllowedFromIPNetwork(Generator):
if record is None: if record is None:
return [] return []
# if the record doesn't have set the ip range allowance
if not record.get("custom_fields", {}).get("ip_network", False):
return [any_user]
# if the record has set the ip_range allowance and is in the range # if the record has set the ip_range allowance and is in the range
if self.check_permission(): if record.get("custom_fields", {}).get("ip_network", False) and self.check_permission():
return [any_user] return [any_user]
# non of the above - return empty # non of the above - return empty
@@ -168,10 +157,7 @@ class AllowedFromIPNetwork(Generator):
Need provider is disallowed. Need provider is disallowed.
""" """
try: try:
if ( if kwargs["record"]["custom_fields"]["ip_network"] and not self.check_permission():
kwargs["record"]["custom_fields"]["ip_network"]
and not self.check_permission()
):
return [any_user] return [any_user]
except KeyError: except KeyError:
@@ -193,7 +179,7 @@ class AllowedFromIPNetwork(Generator):
except RuntimeError: except RuntimeError:
return False return False
network = current_app.config["CONFIG_TUGRAZ_IP_NETWORK"] network = current_app.config["CONFIG_IFORM_IP_NETWORK"]
try: try:
return ip_address(user_ip) in ip_network(network) return ip_address(user_ip) in ip_network(network)
@@ -201,9 +187,9 @@ class AllowedFromIPNetwork(Generator):
return False return False
class TUGrazAuthenticatedUser(Generator): class IformAuthenticatedUser(Generator):
"""Generates the `tugraz_authenticated_user` role-need.""" """Generates the `iform_authenticated_user` role-need."""
def needs(self, **__: dict) -> list[Need]: def needs(self, **__: dict) -> list[Need]:
"""Generate needs to be checked against current user identity.""" """Generate needs to be checked against current user identity."""
return [tugraz_authenticated_user] return [iform_authenticated_user]

View File

@@ -1,14 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# Copyright (C) 2025 I-Form Advanced Manufacturing Research Centre.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""TU Graz permission-policy for RDMRecordService. """I-Form permission-policy for RDMRecordService.
To use, set config-variable `RDM_PERMISSION_POLICY` to `TUGrazRDMRecordPermissionPolicy`. To use, set config-variable `RDM_PERMISSION_POLICY` to `IformRDMRecordPermissionPolicy`.
Policies list **what actions** can be done **by whom** Policies list **what actions** can be done **by whom**
over an implied category of objects (typically records). A Policy is over an implied category of objects (typically records). A Policy is
@@ -25,16 +26,17 @@ One can define any action as long as it follows that pattern and
is verified at the moment it is undertaken. is verified at the moment it is undertaken.
""" """
from invenio_administration.generators import Administration from invenio_administration.generators import Administration
from invenio_communities.generators import CommunityCurators from invenio_communities.generators import CommunityCurators
from invenio_rdm_records.services.generators import ( from invenio_rdm_records.services.generators import (
AccessGrant, AccessGrant,
CommunityInclusionReviewers, CommunityInclusionReviewers,
IfAtLeastOneCommunity,
IfDeleted, IfDeleted,
IfExternalDOIRecord, IfExternalDOIRecord,
IfFileIsLocal, IfFileIsLocal,
IfNewRecord, IfNewRecord,
IfOneCommunity,
IfRecordDeleted, IfRecordDeleted,
IfRestricted, IfRestricted,
RecordCommunitiesAction, RecordCommunitiesAction,
@@ -43,20 +45,15 @@ from invenio_rdm_records.services.generators import (
SecretLinks, SecretLinks,
SubmissionReviewer, SubmissionReviewer,
) )
from invenio_records_permissions.generators import ( from invenio_records_permissions.generators import AnyUser, Disable, IfConfig, SystemProcess
AnyUser,
Disable,
IfConfig,
SystemProcess,
)
from invenio_records_permissions.policies.records import RecordPermissionPolicy from invenio_records_permissions.policies.records import RecordPermissionPolicy
from invenio_users_resources.services.permissions import UserManager from invenio_users_resources.services.permissions import UserManager
from .generators import AllowedFromIPNetwork, RecordSingleIP, TUGrazAuthenticatedUser from .generators import AllowedFromIPNetwork, IformAuthenticatedUser, RecordSingleIP
class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy): class IformRDMRecordPermissionPolicy(RecordPermissionPolicy):
"""Overwrite authenticatedness to mean `tugraz_authenticated` rather than *signed up*.""" """Overwrite authenticatedness to mean `iform_authenticated` rather than *signed up*."""
NEED_LABEL_TO_ACTION = { NEED_LABEL_TO_ACTION = {
"bucket-update": "update_files", "bucket-update": "update_files",
@@ -73,6 +70,7 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
AccessGrant("manage"), AccessGrant("manage"),
SystemProcess(), SystemProcess(),
] ]
can_manage_internal = [SystemProcess()]
can_curate = can_manage + [AccessGrant("edit"), SecretLinks("edit")] can_curate = can_manage + [AccessGrant("edit"), SecretLinks("edit")]
can_review = can_curate + [SubmissionReviewer()] can_review = can_curate + [SubmissionReviewer()]
can_preview = can_curate + [ can_preview = can_curate + [
@@ -91,8 +89,8 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
RecordSingleIP(), RecordSingleIP(),
] ]
can_tugraz_authenticated = [TUGrazAuthenticatedUser(), SystemProcess()] can_iform_authenticated = [IformAuthenticatedUser(), SystemProcess()]
can_authenticated = can_tugraz_authenticated can_authenticated = can_iform_authenticated
can_all = [ can_all = [
AnyUser(), AnyUser(),
SystemProcess(), SystemProcess(),
@@ -112,6 +110,7 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
# Records - reading and creating # Records - reading and creating
# #
can_search = can_all can_search = can_all
can_search_revisions = [Administration()]
can_read = [IfRestricted("record", then_=can_view, else_=can_all)] can_read = [IfRestricted("record", then_=can_view, else_=can_all)]
can_read_deleted = [ can_read_deleted = [
@@ -126,12 +125,12 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
can_get_content_files = [ can_get_content_files = [
IfFileIsLocal(then_=can_read_files, else_=[SystemProcess()]), IfFileIsLocal(then_=can_read_files, else_=[SystemProcess()]),
] ]
can_create = can_tugraz_authenticated can_create = can_iform_authenticated
# #
# Drafts # Drafts
# #
can_search_drafts = can_tugraz_authenticated can_search_drafts = can_iform_authenticated
can_read_draft = can_preview can_read_draft = can_preview
can_draft_read_files = can_preview + [ResourceAccessToken("read")] can_draft_read_files = can_preview + [ResourceAccessToken("read")]
can_update_draft = can_review can_update_draft = can_review
@@ -148,14 +147,14 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
can_manage_files = [ can_manage_files = [
IfConfig( IfConfig(
"RDM_ALLOW_METADATA_ONLY_RECORDS", "RDM_ALLOW_METADATA_ONLY_RECORDS",
then_=[IfNewRecord(then_=can_tugraz_authenticated, else_=can_review)], then_=[IfNewRecord(then_=can_iform_authenticated, else_=can_review)],
else_=[], else_=[],
), ),
] ]
can_manage_record_access = [ can_manage_record_access = [
IfConfig( IfConfig(
"RDM_ALLOW_RESTRICTED_RECORDS", "RDM_ALLOW_RESTRICTED_RECORDS",
then_=[IfNewRecord(then_=can_tugraz_authenticated, else_=can_review)], then_=[IfNewRecord(then_=can_iform_authenticated, else_=can_review)],
else_=[], else_=[],
), ),
] ]
@@ -168,6 +167,7 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
can_pid_update = can_review can_pid_update = can_review
can_pid_discard = can_review can_pid_discard = can_review
can_pid_delete = can_review can_pid_delete = can_review
can_pid_manage = [SystemProcess()]
# #
# Actions # Actions
@@ -181,15 +181,38 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
else_=[IfExternalDOIRecord(then_=[Disable()], else_=can_curate)], else_=[IfExternalDOIRecord(then_=[Disable()], else_=can_curate)],
), ),
] ]
can_publish = can_review can_publish = [
IfConfig(
"RDM_COMMUNITY_REQUIRED_TO_PUBLISH",
then_=[
IfAtLeastOneCommunity(
then_=can_review,
else_=[Administration(), SystemProcess()],
),
],
else_=can_review,
),
]
can_lift_embargo = can_manage can_lift_embargo = can_manage
# #
# Record communities # Record communities
# #
can_add_community = can_manage can_add_community = can_manage
can_remove_community = [RecordOwners(), CommunityCurators(), SystemProcess()] can_remove_community_ = [RecordOwners(), CommunityCurators(), SystemProcess()]
can_remove_record = [CommunityCurators()] can_remove_community = [
IfConfig(
"RDM_COMMUNITY_REQUIRED_TO_PUBLISH",
then_=[
IfOneCommunity(
then_=[Administration(), SystemProcess()],
else_=can_remove_community_,
),
],
else_=can_remove_community_,
),
]
can_remove_record = [CommunityCurators(), Administration(), SystemProcess()]
can_bulk_add = [SystemProcess()] can_bulk_add = [SystemProcess()]
# #
@@ -250,4 +273,4 @@ class TUGrazRDMRecordPermissionPolicy(RecordPermissionPolicy):
# Used to hide at the moment the `parent.is_verified` field. It should be set to # Used to hide at the moment the `parent.is_verified` field. It should be set to
# correct permissions based on which the field will be exposed only to moderators # correct permissions based on which the field will be exposed only to moderators
can_moderate = [Disable()] can_moderate = [SystemProcess()]

View File

@@ -2,20 +2,20 @@
# #
# Copyright (C) 2024 Graz University of Technology. # Copyright (C) 2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""`RoleNeed`s for permission policies. """`RoleNeed`s for permission policies.
To use these roles, add them to the database via: To use these roles, add them to the database via:
`$ invenio roles create tugraz_authenticated --description "..."` `$ invenio roles create iform_authenticated --description "..."`
then add roles to users via: then add roles to users via:
`$ invenio roles add user@email.com tugraz_authenticated` `$ invenio roles add user@email.com iform_authenticated`
""" """
from flask_principal import RoleNeed from flask_principal import RoleNeed
# using `flask_principal.RoleNeed`` instead of `invenio_access.SystemRoleNeed`, # using `flask_principal.RoleNeed`` instead of `invenio_access.SystemRoleNeed`,
# because these roles are assigned by an admin rather than automatically by the system # because these roles are assigned by an admin rather than automatically by the system
tugraz_authenticated_user = RoleNeed("tugraz_authenticated") iform_authenticated_user = RoleNeed("iform_authenticated")

View File

@@ -4,10 +4,10 @@
{{ _('To help you get started, here are some useful links:') }} {{ _('To help you get started, here are some useful links:') }}
- {{ _('Guidelines:')}} {{ _('Repository Guide')}} ({{ _('how to upload files')}}) ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_tugraz.guide') }}) - {{ _('Guidelines:')}} {{ _('Repository Guide')}} ({{ _('how to upload files')}}) ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_iform.guide') }})
- {{ _('Search Guide')}} ({{ config.SITE_UI_URL }}{{url_for('invenio_app_rdm.help_search')}}) - {{ _('Search Guide')}} ({{ config.SITE_UI_URL }}{{url_for('invenio_app_rdm.help_search')}})
- {{ _('Terms And Conditions') }} ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_tugraz.terms') }}) - {{ _('Terms And Conditions') }} ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_iform.terms') }})
- {{ _('Data Protection Rights')}} ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_tugraz.gdpr') }}) - {{ _('Data Protection Rights')}} ({{ config.SITE_UI_URL }}{{ url_for('invenio_config_iform.gdpr') }})
{% if security.confirmable %} {% if security.confirmable %}
{{ _('You can confirm your email through the link below:') }} {{ _('You can confirm your email through the link below:') }}
{{ confirmation_link }}"> {{ confirmation_link }}">

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2022-2024 Graz University of Technology. # Copyright (C) 2022-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
@@ -38,8 +38,8 @@ def get_identity_from_user_by_email(email: str | None = None) -> Identity:
return identity return identity
def tugraz_account_setup_extension(user, account_info) -> None: # noqa: ANN001, ARG001 def iform_account_setup_extension(user, account_info) -> None: # noqa: ANN001, ARG001
"""Add tugraz_authenticated role to user after SAML-login was acknowledged. """Add iform_authenticated role to user after SAML-login was acknowledged.
To use, have `acs_handler_factory` call invenio_saml's `default_account_setup` first, To use, have `acs_handler_factory` call invenio_saml's `default_account_setup` first,
then this function second. then this function second.
@@ -49,25 +49,25 @@ def tugraz_account_setup_extension(user, account_info) -> None: # noqa: ANN001,
# invenio.cfg # invenio.cfg
from invenio_saml.handlers import default_account_setup, acs_handler_factory from invenio_saml.handlers import default_account_setup, acs_handler_factory
def tugraz_account_setup(user, account_info): def iform_account_setup(user, account_info):
# links external `account_info` with our database's `user` for future logins # links external `account_info` with our database's `user` for future logins
default_account_setup(user, account_info) default_account_setup(user, account_info)
tugraz_account_setup_extension(user, account_info) iform_account_setup_extension(user, account_info)
SSO_SAML_IDPS = { SSO_SAML_IDPS = {
"my-tugraz-idp": { "my-iform-idp": {
... ...
"acs_handler": acs_handler_factory( "acs_handler": acs_handler_factory(
"my-tugraz-idp", account_setup=tugraz_account_setup "my-iform-idp", account_setup=iform_account_setup
) )
} }
} }
For this to work, the role tugraz_authenticated must have been created For this to work, the role iform_authenticated must have been created
(e.g. via `invenio roles create tugraz_authenticated`). (e.g. via `invenio roles create iform_authenticated`).
""" """
user_email = account_info["user"]["email"] user_email = account_info["user"]["email"]
# NOTE: `datastore.commit`ing will be done by acs_handler that calls this func # NOTE: `datastore.commit`ing will be done by acs_handler that calls this func
# NOTE: this is a No-Op when user_email already has role tugraz_authenticated # NOTE: this is a No-Op when user_email already has role iform_authenticated
current_accounts.datastore.add_role_to_user(user_email, "tugraz_authenticated") current_accounts.datastore.add_role_to_user(user_email, "iform_authenticated")

View File

@@ -2,11 +2,11 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
"""invenio module for TUGRAZ config.""" """Invenio module for I-Form config."""
from flask import Blueprint, Flask, redirect, url_for from flask import Blueprint, Flask, redirect, url_for
from invenio_i18n import get_locale from invenio_i18n import get_locale
@@ -14,11 +14,11 @@ from werkzeug.wrappers import Response as BaseResponse
def ui_blueprint(app: Flask) -> Blueprint: def ui_blueprint(app: Flask) -> Blueprint:
"""Blueprint for the routes and resources provided by invenio-config-tugraz.""" """Blueprint for the routes and resources provided by invenio-config-iform."""
routes = app.config.get("CONFIG_TUGRAZ_ROUTES") routes = app.config.get("CONFIG_IFORM_ROUTES")
blueprint = Blueprint( blueprint = Blueprint(
"invenio_config_tugraz", "invenio_config_iform",
__name__, __name__,
template_folder="templates", template_folder="templates",
static_folder="static", static_folder="static",
@@ -32,12 +32,12 @@ def ui_blueprint(app: Flask) -> Blueprint:
def guide() -> BaseResponse: def guide() -> BaseResponse:
"""TUGraz_Repository_Guide.""" """I-Form_Repository_Guide."""
locale = get_locale() locale = get_locale()
return redirect( return redirect(
url_for( url_for(
"static", "static",
filename=f"documents/TUGraz_Repository_Guide_02.1_{locale}.pdf", filename=f"documents/I-Form_Repository_Guide_02.1_{locale}.pdf",
_external=True, _external=True,
), ),
) )
@@ -49,7 +49,7 @@ def terms() -> BaseResponse:
return redirect( return redirect(
url_for( url_for(
"static", "static",
filename=f"documents/TUGraz_Repository_Terms_And_Conditions_{locale}.pdf", filename=f"documents/I-Form_Repository_Terms_And_Conditions_{locale}.pdf",
_external=True, _external=True,
), ),
) )
@@ -61,7 +61,7 @@ def gdpr() -> BaseResponse:
return redirect( return redirect(
url_for( url_for(
"static", "static",
filename=f"documents/TUGraz_Repository_General_Data_Protection_Rights_{locale}.pdf", filename=f"documents/I-Form_Repository_General_Data_Protection_Rights_{locale}.pdf",
_external=True, _external=True,
), ),
) )

View File

@@ -1,22 +1,135 @@
[build-system] [project]
requires = ["setuptools", "wheel", "babel>2.8"] name = "invenio-config-iform"
build-backend = "setuptools.build_meta" dynamic = ["version"]
description = "Invenio module that adds I-Form configs."
readme = { file = "README.rst", content-type = "text/x-rst" }
license = "MIT"
authors = [
{ name = "I-Form Advanced Research Manufacturing Research Centre", email = "cian.hughes@dcu.ie" },
]
keywords = ["invenio", "config", "I-Form"]
classifiers = [
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Development Status :: 3 - Alpha",
]
requires-python = ">=3.10,<3.14"
dependencies = [
"invenio-cache>=1.1.1",
"invenio-i18n>=2.0.0",
"invenio-rdm-records>=4.0.0",
]
[project.urls]
Homepage = "https://github.com/Cian-H/invenio-config-iform"
Issues = "https://github.com/Cian-H/invenio-config-iform/issues"
[project.scripts]
test-docs = "scripts.test_docs:main"
test-code = "pytest:console_main"
test = "scripts.test:main"
[project.entry-points."invenio_base.apps"]
invenio_config_iform = "invenio_config_iform:InvenioConfigIform"
[project.entry-points."invenio_base.blueprints"]
invenio_config_iform = "invenio_config_iform.views:ui_blueprint"
[project.entry-points."invenio_i18n.translations"]
messages = "invenio_config_iform"
[project.entry-points."invenio_config.module"]
invenio_config_iform = "invenio_config_iform.config"
[project.entry-points."invenio_base.finalize_app"]
invenio_config_iform = "invenio_config_iform.ext:finalize_app"
[dependency-groups]
dev = [
"hatch>=1.14.1",
"pre-commit>=4.2.0",
"pydocstyle>=6.3.0",
"ruff>=0.11.7",
]
tests = [
"invenio-app>=1.5.0",
"invenio-search[opensearch2]>=2.1.0",
"pytest-invenio>=2.1.0",
"pytest-ruff>=0.4.1",
"ruff>=0.5.3",
"Sphinx>=4.5.0",
]
docs = [
"invenio-app>=1.5.0",
"invenio-search[opensearch2]>=2.1.0",
"Sphinx>=4.5.0",
]
[build-system]
requires = ["hatchling", "hatch-calver"]
build-backend = "hatchling.build"
[tool.hatch.version]
scheme = "calver"
path = "invenio_config_iform/__about__.py"
[tool.hatch.build]
include = ["invenio_config_iform"]
exclude = [".venv", "tests/*", "*/tests/*", "*.rst", "run-tests.sh"]
# Testing configuration
[tool.pytest]
addopts = "--ruff --ruff-format --pydocstyle --doctest-glob=\"*.rst\" --doctest-modules --cov=invenio_config_iform --cov-report=term-missing tests invenio_config_iform"
testpaths = ["tests", "invenio_config_iform"]
live_server_scope = "module"
[tool.pytest.ini_options]
addopts = "--ruff --ruff-format --pydocstyle --doctest-glob=\"*.rst\" --doctest-modules --cov=invenio_config_iform --cov-report=term-missing tests invenio_config_iform"
testpaths = ["tests", "invenio_config_iform"]
live_server_scope = "module"
# Code style tools configuration
[tool.ruff] [tool.ruff]
line-length = 100
target-version = "py313"
exclude = ["docs"] exclude = ["docs"]
[tool.ruff.lint] [tool.ruff.lint]
select = ["ALL"] select = ["ALL"]
ignore = [ ignore = [
"ANN101", "ANN102", "D203",
"D203", "D211", "D212", "D213", "D211",
"D212",
"D213",
"E501", "E501",
"ERA001", "ERA001",
"FA102", "FA102",
"FIX002", "FIX002",
"INP001", "INP001",
"RUF005", "RUF012", "RUF005",
"RUF012",
"S101", "S101",
"TD002", "TD003", "TD002",
"TD003",
"UP009", "UP009",
] ]
[tool.ruff.lint.isort]
force-sort-within-sections = true
lines-after-imports = -1
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "auto"
[tool.pydocstyle]
add_ignore = ["D401"]

View File

@@ -1,23 +0,0 @@
#!/usr/bin/env bash
# -*- coding: utf-8 -*-
#
# Copyright (C) 2019-2020 CERN.
# Copyright (C) 2019-2020 Northwestern University.
# Copyright (C) 2020-2024 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.
# Quit on errors
set -o errexit
# Quit on unbound symbols
set -o nounset
ruff check .
python -m check_manifest
python -m sphinx.cmd.build -qnN docs docs/_build/html
python -m pytest

View File

@@ -0,0 +1,126 @@
#!/usr/bin/env python
"""A Script for checking that the version number has been incremented between pushes."""
from pathlib import Path
import re
import shutil
import subprocess
import sys
import tomllib
ALLOWED_EXECUTABLES: list[str] = [
"git",
"uv",
]
def validate_command(command: str) -> list[str]:
"""Validate and guard command calls.
Args:
command (str): the command to be validated.
Returns:
str: the validated command
Raises:
FileNotFoundError: if the command was not found
"""
cmd: list[str] = command.split().copy()
if cmd[0] not in ALLOWED_EXECUTABLES:
msg = f"Command {cmd} is not allowed!"
raise PermissionError(msg)
call = shutil.which(cmd[0])
if not call:
msg = f"Command {call} not found!"
raise FileNotFoundError(msg)
cmd[0] = call
if cmd[0] == "uv" and cmd[1] == "run":
cmd = [cmd[0], cmd[1], *validate_command("".join(cmd[2:]))]
return cmd
def run_command(command: str) -> str:
"""Run a command and get its output as a string.
Args:
command (str): The command to run.
Returns:
The output returned on stdout.
"""
cmd = validate_command(command)
return subprocess.run( # noqa: S603
cmd,
capture_output=True,
text=True,
check=True,
).stdout.strip()
def get_version_file_from_pyproject() -> str:
"""Get the path to the version file from the pyproject file.
Returns:
str: the path to the project version file
Raises:
FileNotFoundError: the pyproject file is not found
KeyError: the pyproject file does not reference a version file
"""
try:
with Path("pyproject.toml").open("rb") as f:
return tomllib.load(f)["tool"]["hatch"]["version"]["path"]
except FileNotFoundError as e:
msg = "Project has no pyproject.toml file!"
raise FileNotFoundError(msg) from e
except KeyError as e:
msg = "Attribute `tool.hatch.version.path` not found in pyproject.toml"
raise KeyError(msg) from e
def get_remote_version(remote: str, branch: str, version_file: str) -> str:
"""Get the version from the repository remote.
Args:
remote (str): The remote to fetch the version string from.
branch (str): The branch to fetch the version string from.
version_file (str): The file to fetch the version string from.
Returns:
str: The version string.
Raises:
AttributeError: NO `__version__` attribute was found in `version_file`.
"""
remote_file = f"{remote}/{branch}:{version_file}"
match = re.search(
r"__version__\s*=\s*['\"]([^'\"]+)['\"]",
run_command(f"git show {remote_file}"),
)
if match:
return match.group(1)
msg = f"No `__version__` attribute found in {remote_file}"
raise AttributeError(msg)
def main() -> None:
"""Entrypoint for this script."""
version_file = get_version_file_from_pyproject()
branch = run_command("git rev-parse --abbrev-ref HEAD")
remote = sys.argv[1] if len(sys.argv) > 1 else "origin"
current_version = run_command("uv run hatch version")
remote_version = get_remote_version(remote, branch, version_file)
assert current_version != remote_version, (
"Version has not been incremented! Please update the version before pushing."
)
if __name__ == "__main__":
main()

19
scripts/test.py Normal file
View File

@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2025 I-Form Advanced Manufacturing Research Centre.
#
# invenio-config-iform is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""Run all tests for this module consecutively."""
import pytest
from . import test_docs
def main() -> None:
"""Run tests for this module."""
test_docs.main()
pytest.console_main()

16
scripts/test_docs.py Normal file
View File

@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2025 I-Form Advanced Manufacturing Research Centre.
#
# invenio-config-iform is free software; you can redistribute it and/or
# modify it under the terms of the MIT License; see LICENSE file for more
# details.
"""A script for testing sphinx documentation building."""
from sphinx.cmd.build import main as build_docs
def main() -> None:
"""Attempt to build documentation."""
build_docs(["-nN", "docs", "docs/_build/html"])

100
setup.cfg
View File

@@ -1,100 +0,0 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2024 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.
[metadata]
name = invenio-config-tugraz
version = attr: invenio_config_tugraz.__version__
description = "Invenio module that adds tugraz configs."
long_description = file: README.rst, CHANGES.rst
keywords = invenio config TU-Graz
license = MIT
author = "Graz University of Technology"
author_email = info@tugraz.at
platforms = any
url = https://github.com/tu-graz-library/invenio-config-tugraz
classifiers =
Environment :: Web Environment
Intended Audience :: Developers
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Programming Language :: Python
Topic :: Internet :: WWW/HTTP :: Dynamic Content
Topic :: Software Development :: Libraries :: Python Modules
Programming Language :: Python :: 3.12
Development Status :: 3 - Alpha
[options]
include_package_data = True
packages = find:
python_requires = >=3.12
zip_safe = False
install_requires =
invenio-cache>=1.1.1
invenio-i18n>=2.0.0
invenio-rdm-records>=4.0.0
[options.extras_require]
tests =
invenio-app>=1.5.0
invenio-search[opensearch2]>=2.1.0,<3.0.0
pytest-black-ng>=0.4.0
pytest-invenio>=2.1.0,<3.0.0
ruff>=0.5.3
Sphinx>=4.5.0
[options.entry_points]
invenio_base.apps =
invenio_config_tugraz = invenio_config_tugraz:InvenioConfigTugraz
invenio_base.blueprints =
invenio_config_tugraz = invenio_config_tugraz.views:ui_blueprint
invenio_i18n.translations =
messages = invenio_config_tugraz
invenio_config.module =
invenio_config_tugraz = invenio_config_tugraz.config
invenio_base.finalize_app =
invenio_config_tugraz = invenio_config_tugraz.ext:finalize_app
[aliases]
test = pytest
[build_sphinx]
source-dir = docs/
build-dir = docs/_build
all_files = 1
[bdist_wheel]
universal = 1
[compile_catalog]
directory = invenio_config_tugraz/translations/
[extract_messages]
copyright_holder = Graz University of Technology
msgid_bugs_address = mojib.wali@tugraz.at
mapping-file = babel.ini
output-file = invenio_config_tugraz/translations/messages.pot
add-comments = NOTE
[init_catalog]
input-file = invenio_config_tugraz/translations/messages.pot
output-dir = invenio_config_tugraz/translations/
[update_catalog]
input-file = invenio_config_tugraz/translations/messages.pot
output-dir = invenio_config_tugraz/translations/
[isort]
profile=black
[check-manifest]
ignore = *-requirements.txt
[tool:pytest]
addopts = --black --cov=invenio_config_tugraz --cov-report=term-missing
testpaths = tests invenio_config_tugraz
live_server_scope = module

View File

@@ -1,13 +0,0 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2022 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 that adds tugraz configs."""
from setuptools import setup
setup()

View File

@@ -3,7 +3,7 @@
# Copyright (C) 2020 Mojib Wali. # Copyright (C) 2020 Mojib Wali.
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
@@ -13,11 +13,10 @@ See https://pytest-invenio.readthedocs.io/ for documentation on which test
fixtures are available. fixtures are available.
""" """
import pytest
from flask import Flask from flask import Flask
import pytest
from invenio_config_tugraz import InvenioConfigTugraz from invenio_config_iform import InvenioConfigIform
@pytest.fixture(scope="module") @pytest.fixture(scope="module")
@@ -27,7 +26,7 @@ def create_app(instance_path: str) -> Flask:
def factory(**config: str) -> Flask: def factory(**config: str) -> Flask:
app = Flask("testapp", instance_path=instance_path) app = Flask("testapp", instance_path=instance_path)
app.config.update(**config) app.config.update(**config)
InvenioConfigTugraz(app) InvenioConfigIform(app)
return app return app
return factory return factory

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2020-2024 Graz University of Technology. # Copyright (C) 2020-2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
@@ -10,12 +10,12 @@
from flask import Flask from flask import Flask
from invenio_config_tugraz import InvenioConfigTugraz from invenio_config_iform import InvenioConfigIform
def test_version() -> None: def test_version() -> None:
"""Test version import.""" """Test version import."""
from invenio_config_tugraz import __version__ from invenio_config_iform import __version__
assert __version__ assert __version__
@@ -23,11 +23,11 @@ def test_version() -> None:
def test_init() -> None: def test_init() -> None:
"""Test extension initialization.""" """Test extension initialization."""
app = Flask("testapp") app = Flask("testapp")
ext = InvenioConfigTugraz(app) ext = InvenioConfigIform(app)
assert "invenio-config-tugraz" in app.extensions assert "invenio-config-iform" in app.extensions
app = Flask("testapp") app = Flask("testapp")
ext = InvenioConfigTugraz() ext = InvenioConfigIform()
assert "invenio-config-tugraz" not in app.extensions assert "invenio-config-iform" not in app.extensions
ext.init_app(app) ext.init_app(app)
assert "invenio-config-tugraz" in app.extensions assert "invenio-config-iform" in app.extensions

View File

@@ -2,7 +2,7 @@
# #
# Copyright (C) 2024 Graz University of Technology. # Copyright (C) 2024 Graz University of Technology.
# #
# invenio-config-tugraz is free software; you can redistribute it and/or # invenio-config-iform 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.
@@ -10,24 +10,24 @@
from invenio_rdm_records.services.permissions import RDMRecordPermissionPolicy from invenio_rdm_records.services.permissions import RDMRecordPermissionPolicy
from invenio_config_tugraz.permissions.policies import TUGrazRDMRecordPermissionPolicy from invenio_config_iform.permissions.policies import IformRDMRecordPermissionPolicy
ALLOWED_DIFFERENCES = { ALLOWED_DIFFERENCES = {
"can_all",
"can_authenticated", "can_authenticated",
"can_create", "can_create",
"can_iform_authenticated",
"can_search", "can_search",
"can_view",
"can_all",
"can_search_drafts", "can_search_drafts",
"can_tugraz_authenticated", "can_view",
} }
def test_policies_synced() -> None: def test_policies_synced() -> None:
"""Make sure our permission-policy stays synced with invenio's.""" """Make sure our permission-policy stays synced with invenio's."""
tugraz_cans = { iform_cans = {
name: getattr(TUGrazRDMRecordPermissionPolicy, name) name: getattr(IformRDMRecordPermissionPolicy, name)
for name in dir(TUGrazRDMRecordPermissionPolicy) for name in dir(IformRDMRecordPermissionPolicy)
if name.startswith("can_") if name.startswith("can_")
} }
rdm_cans = { rdm_cans = {
@@ -37,52 +37,52 @@ def test_policies_synced() -> None:
} }
# check whether same set of `can_<action>`s` # check whether same set of `can_<action>`s`
if extras := set(tugraz_cans) - set(rdm_cans) - ALLOWED_DIFFERENCES: if extras := set(iform_cans) - set(rdm_cans) - ALLOWED_DIFFERENCES:
msg = f""" msg = f"""
TU Graz's permission-policy has additional fields over invenio-rdm's:{extras} I-Form's permission-policy has additional fields over invenio-rdm's:{extras}
if this is intentional, add to ALLOWED_DIFFERENCES in test-file if this is intentional, add to ALLOWED_DIFFERENCES in test-file
otherwise remove extraneous fields from TUGrazRDMRecordPermissionPolicy otherwise remove extraneous fields from IformRDMRecordPermissionPolicy
""" """
raise KeyError(msg) raise KeyError(msg)
if missing := set(rdm_cans) - set(tugraz_cans): if missing := set(rdm_cans) - set(iform_cans):
msg = f""" msg = f"""
invenio-rdm's permission-policy has fields unhandled by TU Graz's: {missing} invenio-rdm's permission-policy has fields unhandled by I-Form's: {missing}
if this is intentional, add to ALLOWED_DIFFERENCES if this is intentional, add to ALLOWED_DIFFERENCES
otherwise set the corresponding fields in TUGrazRDMRecordPermissionPolicy otherwise set the corresponding fields in IformRDMRecordPermissionPolicy
""" """
raise KeyError(msg) raise KeyError(msg)
# check whether same permission-generators used for same `can_<action>` # check whether same permission-generators used for same `can_<action>`
for can_name in rdm_cans.keys() & tugraz_cans.keys(): for can_name in rdm_cans.keys() & iform_cans.keys():
if can_name in ALLOWED_DIFFERENCES: if can_name in ALLOWED_DIFFERENCES:
continue continue
tugraz_can = tugraz_cans[can_name] iform_can = iform_cans[can_name]
rdm_can = rdm_cans[can_name] rdm_can = rdm_cans[can_name]
# permission-Generators don't implement equality checks for their instances # permission-Generators don't implement equality checks for their instances
# we can however compare which types (classes) of Generators are used... # we can however compare which types (classes) of Generators are used...
if {type(gen) for gen in tugraz_can} != {type(gen) for gen in rdm_can}: if {type(gen) for gen in iform_can} != {type(gen) for gen in rdm_can}:
msg = f""" msg = f"""
permission-policy for `{can_name}` differs between TU-Graz and invenio-rdm permission-policy for `{can_name}` differs between I-Form and invenio-rdm
if this is intentional, add to ALLOWED_DIFFERENCES in test-file if this is intentional, add to ALLOWED_DIFFERENCES in test-file
otherwise fix TUGrazRDMRecordPermissionPolicy otherwise fix IformRDMRecordPermissionPolicy
""" """
raise ValueError(msg) raise ValueError(msg)
# check whether same `NEED_LABEL_TO_ACTION` # check whether same `NEED_LABEL_TO_ACTION`
tugraz_label_to_action = TUGrazRDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION iform_label_to_action = IformRDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION
rdm_label_to_action = RDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION rdm_label_to_action = RDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION
for label in tugraz_label_to_action.keys() & rdm_label_to_action.keys(): for label in iform_label_to_action.keys() & rdm_label_to_action.keys():
if label in ALLOWED_DIFFERENCES: if label in ALLOWED_DIFFERENCES:
continue continue
if tugraz_label_to_action.get(label) != rdm_label_to_action.get(label): if iform_label_to_action.get(label) != rdm_label_to_action.get(label):
msg = f""" msg = f"""
invenio-rdm's NEED_LABEL_TO_ACTION differs from TU Graz's in {label} invenio-rdm's NEED_LABEL_TO_ACTION differs from I-Form's in {label}
if this is intentional, add to ALLOWED_DIFFERENCES in test-file if this is intentional, add to ALLOWED_DIFFERENCES in test-file
otherwise fix TUGrazRDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION otherwise fix IformRDMRecordPermissionPolicy.NEED_LABEL_TO_ACTION
""" """
raise ValueError(msg) raise ValueError(msg)

5366
uv.lock generated Normal file

File diff suppressed because it is too large Load Diff