Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-2024 TU Wien.
#
# Invenio-Theme-TUW is free software; you can redistribute it and/or modify
# it under the terms of the MIT License; see LICENSE file for more details.
"""Utility functions for Invenio-Theme-TUW."""
from invenio_accounts.models import User
from invenio_accounts.proxies import current_datastore
from invenio_db import db
from invenio_rdm_records.proxies import current_rdm_records_service as rec_service
from invenio_rdm_records.resources.serializers import UIJSONSerializer
from sqlalchemy.exc import NoResultFound
def resolve_record(recid):
"""Resolve the record with the given recid into an API class object."""
try:
return rec_service.record_cls.pid.resolve(recid, registered_only=False)
except NoResultFound:
# if no record can be found for the ID, let's try if we can find a draft
# (e.g. in the case of a draft preview)
#
# note: `invenio_pidstore.errors` contains further exceptions that could
# be raised during the PID resolution
return rec_service.draft_cls.pid.resolve(recid, registered_only=False)
def resolve_user_owner(record):
"""Resolve the first user-type owner of the record.
The record is expected to be an API-class object, and the result will be a User
model object.
"""
owner = record.parent.access.owner
if not owner or owner.owner_type != "user":
return None
return owner.resolve()
def fetch_user_infos():
"""Fetch information about each user for our hacky user info list."""
user_infos = []
trusted_user_role = current_datastore.find_role("trusted-user")
for user in db.session.query(User).order_by(User.id).all():
# check if the user has given us consent for record curation
curation_consent = (user.preferences or {}).get("curation_consent", False)
# check if the user can upload datasets
trusted = user.has_role(trusted_user_role)
info = {
"user": user,
"tiss_id": (user.user_profile or {}).get("tiss_id", None),
"curation_consent": curation_consent,
"trusted": trusted,
}
user_infos.append(info)
return user_infos
def toggle_user_trust(user_id):
"""Add the "trusted-user" role to the user or remove it."""
trusted_user_role = current_datastore.find_role("trusted-user")
user = current_datastore.find_user(id=user_id)
if not user.has_role(trusted_user_role):
current_datastore.add_role_to_user(user, trusted_user_role)
verb = "Trusted"
else:
current_datastore.remove_role_from_user(user, trusted_user_role)
verb = "Untrusted"
db.session.commit()
user_name = user.user_profile.get("full_name") if user.user_profile else "N/A"
return f"{verb} user #{user_id} ({user_name or 'N/A'})"
def records_serializer(records=None):
"""Serialize list of records."""
record_list = []
for record in records or []:
record_list.append(UIJSONSerializer().dump_obj(record.to_dict()))
return record_list
def get_admin_mail_addresses(app):
"""Get the configured email addresses for administrators."""
addresses = app.config.get(
"APP_RDM_ADMIN_EMAIL_RECIPIENT", app.config.get("MAIL_ADMIN")
)
# the config variable is expected to be either a list or a string
if addresses and isinstance(addresses, str):
addresses = [addresses]
return addresses