-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathadmin.py
94 lines (77 loc) · 2.37 KB
/
admin.py
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
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2015-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Admin model views for PersistentIdentifier."""
import uuid
from flask import current_app, url_for
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.sqla.filters import FilterEqual
from markupsafe import Markup
from .models import PersistentIdentifier, PIDStatus
def _(x):
"""Identity function for string extraction."""
return x
def object_formatter(v, c, m, p):
"""Format object view link."""
endpoint = current_app.config["PIDSTORE_OBJECT_ENDPOINTS"].get(m.object_type)
if endpoint and m.object_uuid:
return Markup(
'<a href="{0}">{1}</a>'.format(
url_for(endpoint, id=m.object_uuid), _("View")
)
)
return ""
class FilterUUID(FilterEqual):
"""UUID aware filter."""
def apply(self, query, value, alias):
"""Convert UUID."""
return query.filter(self.column == uuid.UUID(value))
class PersistentIdentifierModelView(ModelView):
"""ModelView for the PersistentIdentifier."""
can_create = False
can_edit = False
can_delete = False
can_view_details = True
column_display_all_relations = True
column_list = (
"pid_type",
"pid_value",
"status",
"object_type",
"object_uuid",
"created",
"updated",
"object",
)
column_labels = dict(
pid_type=_("PID Type"),
pid_value=_("PID"),
pid_provider=_("Provider"),
status=_("Status"),
object_type=_("Object Type"),
object_uuid=_("Object UUID"),
)
column_filters = (
"pid_type",
"pid_value",
"object_type",
FilterUUID(PersistentIdentifier.object_uuid, _("Object UUID")),
FilterEqual(
PersistentIdentifier.status,
_("Status"),
options=[(s.value, s.title) for s in PIDStatus],
),
)
column_searchable_list = ("pid_value",)
column_default_sort = ("updated", True)
column_formatters = dict(object=object_formatter)
page_size = 25
pid_adminview = dict(
modelview=PersistentIdentifierModelView,
model=PersistentIdentifier,
category=_("Records"),
)