Skip to content

Commit 29f6f9a

Browse files
committed
zenodo: metadata
Signed-off-by: Ilias Koutsakis <[email protected]>
1 parent e281248 commit 29f6f9a

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed
+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# This file is part of CERN Analysis Preservation Framework.
4+
# Copyright (C) 2020 CERN.
5+
#
6+
# CERN Analysis Preservation Framework is free software; you can redistribute
7+
# it and/or modify it under the terms of the GNU General Public License as
8+
# published by the Free Software Foundation; either version 2 of the
9+
# License, or (at your option) any later version.
10+
#
11+
# CERN Analysis Preservation Framework is distributed in the hope that it will
12+
# be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
# General Public License for more details.
15+
#
16+
# You should have received a copy of the GNU General Public License
17+
# along with CERN Analysis Preservation Framework; if not, write to the
18+
# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
19+
# MA 02111-1307, USA.
20+
#
21+
# In applying this license, CERN does not
22+
# waive the privileges and immunities granted to it by virtue of its status
23+
# as an Intergovernmental Organization or submit itself to any jurisdiction.
24+
# or submit itself to any jurisdiction.
25+
26+
from marshmallow import Schema, fields, ValidationError, \
27+
validate, validates, validates_schema
28+
from pprint import pprint
29+
import arrow
30+
31+
UPLOAD_TYPES = [
32+
'publication',
33+
'poster',
34+
'presentation',
35+
'dataset',
36+
'image',
37+
'video',
38+
'software',
39+
'lesson',
40+
'physicalobject',
41+
'other'
42+
]
43+
LICENSES = [
44+
'CC-BY-4.0',
45+
'CC-BY-1.0',
46+
'CC-BY-2.0',
47+
'CC-BY-3.0'
48+
]
49+
ACCESS_RIGHTS = [
50+
'open',
51+
'',
52+
'',
53+
'closed'
54+
]
55+
56+
57+
class ZenodoCreatorsSchema(Schema):
58+
name = fields.String(required=True)
59+
affiliation = fields.String()
60+
orcid = fields.String()
61+
62+
63+
class ZenodoDepositMetadataSchema(Schema):
64+
title = fields.String(required=True)
65+
description = fields.String(required=True)
66+
publication_date = fields.String(required=True)
67+
version = fields.String()
68+
69+
keywords = fields.List(fields.String())
70+
creators = fields.List(fields.Nested(ZenodoCreatorsSchema), required=True)
71+
72+
upload_type = fields.String(required=True,
73+
validate=validate.OneOf(UPLOAD_TYPES))
74+
license = fields.String(required=True,
75+
validate=validate.OneOf(LICENSES))
76+
access_right = fields.String(required=True,
77+
validate=validate.OneOf(ACCESS_RIGHTS))
78+
79+
@validates('publication_date')
80+
def validate_date(self, value):
81+
return True
82+
83+
@validates('access_right')
84+
def validate_access(self, value):
85+
return True
86+
87+
@validates('embargo_date')
88+
def validate_embargo_date(self, value):
89+
"""Validate that embargo date is in the future."""
90+
if arrow.get(value).date() <= arrow.utcnow().date():
91+
raise ValidationError(
92+
'Embargo date must be in the future.',
93+
field_names=['embargo_date']
94+
)
95+
96+
@validates_schema()
97+
def validate_license(self, data):
98+
"""Validate license."""
99+
# acc = data.get('access_right')
100+
# if acc in [AccessRight.OPEN, AccessRight.EMBARGOED] and \
101+
# 'license' not in data:
102+
# raise ValidationError(
103+
# _('Required when access right is open or embargoed.'),
104+
# field_names=['license']
105+
# )
106+
# if acc == AccessRight.EMBARGOED and 'embargo_date' not in data:
107+
# raise ValidationError(
108+
# _('Required when access right is embargoed.'),
109+
# field_names=['embargo_date']
110+
# )
111+
# if acc == AccessRight.RESTRICTED and 'access_conditions' not in data:
112+
# raise ValidationError(
113+
# _('Required when access right is restricted.'),
114+
# field_names=['access_conditions']
115+
# )
116+
117+
118+
class ZenodoUploadSchema(Schema):
119+
files = fields.List(fields.String, required=True)
120+
data = fields.Nested(ZenodoDepositMetadataSchema, default=dict())
121+
bucket = fields.String(required=True)
122+
123+
@validates('files')
124+
def validate(self, value):
125+
for _file in value:
126+
if _file not in ['b', 'c']:
127+
raise ValidationError('FILE ERROR')
128+
129+
130+
xx = {
131+
'data': {
132+
'title': 'My first upload yoohoo',
133+
'upload_type': 'poster',
134+
'description': 'This is my first upload',
135+
'creators': [
136+
{'name': 'Ilias KoKoKo', 'affiliation': 'Zenodo CAP'}
137+
],
138+
'access_right': 'lolo'
139+
},
140+
'files': ['a'],
141+
'bucket': 'bucket'
142+
}
143+
144+
try:
145+
lol = ZenodoUploadSchema().load(xx)
146+
pprint(lol)
147+
except ValidationError as err:
148+
pprint(err.messages)

0 commit comments

Comments
 (0)