Skip to content

Commit d2d240c

Browse files
committed
Add Required metadata template field to admin pages
1 parent ffaebd0 commit d2d240c

File tree

8 files changed

+171
-93
lines changed

8 files changed

+171
-93
lines changed

admin/base/utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
22
Utility functions and classes
33
"""
4-
from osf.models import Subject, NodeLicense, Brand
4+
from osf.models import Subject, NodeLicense, Brand, CedarMetadataTemplate
55

66
from django.core.exceptions import ValidationError, PermissionDenied
77
from django.urls import reverse
@@ -116,6 +116,11 @@ def get_brand_choices():
116116
brands = Brand.objects.all()
117117
return [no_default] + [(brand.id, brand.name) for brand in brands]
118118

119+
def get_cedar_template_choices():
120+
no_default = ('', '---------')
121+
templates = CedarMetadataTemplate.objects.filter(active=True)
122+
return [no_default] + [(t.id, t.schema_name) for t in templates]
123+
119124
def get_toplevel_subjects():
120125
return Subject.objects.filter(parent__isnull=True, provider___id='osf').values_list('id', 'text')
121126

admin/collection_providers/forms.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from framework.utils import sanitize_html
66
from osf.models import CollectionProvider
7-
from admin.base.utils import get_nodelicense_choices, get_defaultlicense_choices, validate_slug
7+
from admin.base.utils import get_nodelicense_choices, get_defaultlicense_choices, validate_slug, get_cedar_template_choices
88

99

1010
class CollectionProviderForm(forms.ModelForm):
@@ -37,9 +37,11 @@ class Meta:
3737
def __init__(self, *args, **kwargs):
3838
nodelicense_choices = get_nodelicense_choices()
3939
defaultlicense_choices = get_defaultlicense_choices()
40+
cedar_template_choices = get_cedar_template_choices()
4041
super().__init__(*args, **kwargs)
4142
self.fields['licenses_acceptable'].choices = nodelicense_choices
4243
self.fields['default_license'].choices = defaultlicense_choices
44+
self.fields['required_metadata_template'].choices = cedar_template_choices
4345

4446
def clean_description(self, *args, **kwargs):
4547
if not self.data.get('description'):

admin/collection_providers/views.py

Lines changed: 41 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -132,127 +132,78 @@ def get_context_data(self, *args, **kwargs):
132132
licenses_html += '</ul>'
133133
collection_provider_attributes['licenses_acceptable'] = licenses_html
134134

135-
primary_collection = collection_provider.primary_collection
136-
# compile html list of collected_type_choices
137-
collected_type_choices_html = '<ul>'
138-
for choice in primary_collection.collected_type_choices:
139-
collected_type_choices_html += f'<li>{choice}</li>'
140-
collected_type_choices_html += '</ul>'
141-
kwargs['collected_type_choices'] = collected_type_choices_html
142-
143-
# compile html list of status_choices
144-
status_choices_html = '<ul>'
145-
for choice in primary_collection.status_choices:
146-
status_choices_html += f'<li>{choice}</li>'
147-
status_choices_html += '</ul>'
148-
kwargs['status_choices'] = status_choices_html
149-
150-
# compile html list of volume_choices
151-
volume_choices_html = '<ul>'
152-
for choice in primary_collection.volume_choices:
153-
volume_choices_html += f'<li>{choice}</li>'
154-
volume_choices_html += '</ul>'
155-
kwargs['volume_choices'] = volume_choices_html
156-
157-
# compile html list of issue_choices
158-
issue_choices_html = '<ul>'
159-
for choice in primary_collection.issue_choices:
160-
issue_choices_html += f'<li>{choice}</li>'
161-
issue_choices_html += '</ul>'
162-
kwargs['issue_choices'] = issue_choices_html
163-
164-
# compile html list of program_area_choices
165-
program_area_choices_html = '<ul>'
166-
for choice in primary_collection.program_area_choices:
167-
program_area_choices_html += f'<li>{choice}</li>'
168-
program_area_choices_html += '</ul>'
169-
kwargs['program_area_choices'] = program_area_choices_html
170-
171-
# compile html list of school_type_choices
172-
school_type_choices_html = '<ul>{choices}</ul>'.format(choices=''.join(
173-
f'<li>{choice}</li>' for choice in primary_collection.school_type_choices
174-
))
175-
kwargs['school_type_choices'] = school_type_choices_html
176-
177-
# compile html list of study_design_choices
178-
study_design_choices_html = '<ul>{choices}</ul>'.format(choices=''.join(
179-
f'<li>{choice}</li>' for choice in primary_collection.study_design_choices
180-
))
181-
kwargs['study_design_choices'] = study_design_choices_html
182-
183-
disease_choices_html = '<ul>{choices}</ul>'.format(choices=''.join(
184-
f'<li>{choice}</li>' for choice in primary_collection.disease_choices
185-
))
186-
kwargs['disease_choices'] = disease_choices_html
187-
188-
data_type_choices_html = '<ul>{choices}</ul>'.format(choices=''.join(
189-
f'<li>{choice}</li>' for choice in primary_collection.data_type_choices
190-
))
191-
kwargs['data_type_choices'] = data_type_choices_html
192-
193-
grade_levels_choices_html = '<ul>{choices}</ul>'.format(choices=''.join(
194-
f'<li>{choice}</li>' for choice in primary_collection.grade_levels_choices
195-
))
196-
kwargs['grade_levels_choices'] = grade_levels_choices_html
197-
198-
# get a dict of model fields so that we can set the initial value for the update form
199135
fields = model_to_dict(collection_provider)
200-
fields['collected_type_choices'] = json.dumps(primary_collection.collected_type_choices)
201-
fields['status_choices'] = json.dumps(primary_collection.status_choices)
202-
fields['volume_choices'] = json.dumps(primary_collection.volume_choices)
203-
fields['issue_choices'] = json.dumps(primary_collection.issue_choices)
204-
fields['program_area_choices'] = json.dumps(primary_collection.program_area_choices)
205136

206-
fields = model_to_dict(collection_provider)
207-
208-
fields['school_type_choices'] = json.dumps(primary_collection.school_type_choices)
209-
fields['study_design_choices'] = json.dumps(primary_collection.study_design_choices)
210-
fields['data_type_choices'] = json.dumps(primary_collection.data_type_choices)
211-
fields['disease_choices'] = json.dumps(primary_collection.disease_choices)
212-
fields['grade_levels_choices'] = json.dumps(primary_collection.grade_levels_choices)
213-
214-
# compile html list of collected_type_choices
215137
if collection_provider.primary_collection:
138+
primary_collection = collection_provider.primary_collection
139+
140+
# compile html list of collected_type_choices
216141
collected_type_choices_html = '<ul>'
217-
for choice in collection_provider.primary_collection.collected_type_choices:
142+
for choice in primary_collection.collected_type_choices:
218143
collected_type_choices_html += f'<li>{choice}</li>'
219144
collected_type_choices_html += '</ul>'
220145
kwargs['collected_type_choices'] = collected_type_choices_html
221146

222147
# compile html list of status_choices
223148
status_choices_html = '<ul>'
224-
for choice in collection_provider.primary_collection.status_choices:
149+
for choice in primary_collection.status_choices:
225150
status_choices_html += f'<li>{choice}</li>'
226151
status_choices_html += '</ul>'
227152
kwargs['status_choices'] = status_choices_html
228153

229154
# compile html list of volume_choices
230155
volume_choices_html = '<ul>'
231-
for choice in collection_provider.primary_collection.volume_choices:
156+
for choice in primary_collection.volume_choices:
232157
volume_choices_html += f'<li>{choice}</li>'
233158
volume_choices_html += '</ul>'
234159
kwargs['volume_choices'] = volume_choices_html
235160

236161
# compile html list of issue_choices
237162
issue_choices_html = '<ul>'
238-
for choice in collection_provider.primary_collection.issue_choices:
163+
for choice in primary_collection.issue_choices:
239164
issue_choices_html += f'<li>{choice}</li>'
240165
issue_choices_html += '</ul>'
241166
kwargs['issue_choices'] = issue_choices_html
242167

243168
# compile html list of program_area_choices
244169
program_area_choices_html = '<ul>'
245-
for choice in collection_provider.primary_collection.program_area_choices:
170+
for choice in primary_collection.program_area_choices:
246171
program_area_choices_html += f'<li>{choice}</li>'
247172
program_area_choices_html += '</ul>'
248173
kwargs['program_area_choices'] = program_area_choices_html
249174

250-
# get a dict of model fields so that we can set the initial value for the update form
251-
fields['collected_type_choices'] = json.dumps(collection_provider.primary_collection.collected_type_choices)
252-
fields['status_choices'] = json.dumps(collection_provider.primary_collection.status_choices)
253-
fields['volume_choices'] = json.dumps(collection_provider.primary_collection.volume_choices)
254-
fields['issue_choices'] = json.dumps(collection_provider.primary_collection.issue_choices)
255-
fields['program_area_choices'] = json.dumps(collection_provider.primary_collection.program_area_choices)
175+
# compile html list of school_type_choices
176+
kwargs['school_type_choices'] = '<ul>{choices}</ul>'.format(choices=''.join(
177+
f'<li>{choice}</li>' for choice in primary_collection.school_type_choices
178+
))
179+
180+
# compile html list of study_design_choices
181+
kwargs['study_design_choices'] = '<ul>{choices}</ul>'.format(choices=''.join(
182+
f'<li>{choice}</li>' for choice in primary_collection.study_design_choices
183+
))
184+
185+
kwargs['disease_choices'] = '<ul>{choices}</ul>'.format(choices=''.join(
186+
f'<li>{choice}</li>' for choice in primary_collection.disease_choices
187+
))
188+
189+
kwargs['data_type_choices'] = '<ul>{choices}</ul>'.format(choices=''.join(
190+
f'<li>{choice}</li>' for choice in primary_collection.data_type_choices
191+
))
192+
193+
kwargs['grade_levels_choices'] = '<ul>{choices}</ul>'.format(choices=''.join(
194+
f'<li>{choice}</li>' for choice in primary_collection.grade_levels_choices
195+
))
196+
197+
fields['collected_type_choices'] = json.dumps(primary_collection.collected_type_choices)
198+
fields['status_choices'] = json.dumps(primary_collection.status_choices)
199+
fields['volume_choices'] = json.dumps(primary_collection.volume_choices)
200+
fields['issue_choices'] = json.dumps(primary_collection.issue_choices)
201+
fields['program_area_choices'] = json.dumps(primary_collection.program_area_choices)
202+
fields['school_type_choices'] = json.dumps(primary_collection.school_type_choices)
203+
fields['study_design_choices'] = json.dumps(primary_collection.study_design_choices)
204+
fields['data_type_choices'] = json.dumps(primary_collection.data_type_choices)
205+
fields['disease_choices'] = json.dumps(primary_collection.disease_choices)
206+
fields['grade_levels_choices'] = json.dumps(primary_collection.grade_levels_choices)
256207

257208
kwargs['form'] = CollectionProviderForm(initial=fields)
258209

@@ -272,7 +223,7 @@ def form_valid(self, form):
272223
if self.object.primary_collection:
273224
for choices_name in ['collected_type', 'status', 'issue', 'volume', 'program_area', 'school_type', 'study_design', 'data_type', 'disease', 'grade_levels']:
274225
_process_collection_choices(self.object, choices_name, form)
275-
self.object.primary_collection.save()
226+
self.object.primary_collection.save()
276227
return super().form_valid(form)
277228

278229
def form_invalid(self, form):

admin/preprint_providers/forms.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
Subject
99
)
1010
from admin.base.utils import (get_subject_rules, get_toplevel_subjects,
11-
get_nodelicense_choices, get_defaultlicense_choices, validate_slug)
11+
get_nodelicense_choices, get_defaultlicense_choices, validate_slug,
12+
get_cedar_template_choices)
1213

1314

1415
class PreprintProviderForm(forms.ModelForm):
@@ -42,10 +43,12 @@ def __init__(self, *args, **kwargs):
4243
toplevel_choices = get_toplevel_subjects()
4344
nodelicense_choices = get_nodelicense_choices()
4445
defaultlicense_choices = get_defaultlicense_choices()
46+
cedar_template_choices = get_cedar_template_choices()
4547
super().__init__(*args, **kwargs)
4648
self.fields['toplevel_subjects'].choices = toplevel_choices
4749
self.fields['licenses_acceptable'].choices = nodelicense_choices
4850
self.fields['default_license'].choices = defaultlicense_choices
51+
self.fields['required_metadata_template'].choices = cedar_template_choices
4952

5053
def clean_subjects_acceptable(self, *args, **kwargs):
5154
subject_ids = [_f for _f in self.data['subjects_chosen'].split(', ') if _f]

admin/registration_providers/forms.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
get_defaultlicense_choices,
88
validate_slug,
99
get_brand_choices,
10+
get_cedar_template_choices,
1011
)
1112

1213

@@ -41,10 +42,12 @@ def __init__(self, *args, **kwargs):
4142
nodelicense_choices = get_nodelicense_choices()
4243
defaultlicense_choices = get_defaultlicense_choices()
4344
brand_choices = get_brand_choices()
45+
cedar_template_choices = get_cedar_template_choices()
4446
super().__init__(*args, **kwargs)
4547
self.fields['licenses_acceptable'].choices = nodelicense_choices
4648
self.fields['default_license'].choices = defaultlicense_choices
4749
self.fields['brand'].choices = brand_choices
50+
self.fields['required_metadata_template'].choices = cedar_template_choices
4851
if kwargs.get('initial', None) and kwargs.get('initial').get('_id', None):
4952
provider = RegistrationProvider.load(kwargs.get('initial').get('_id'))
5053
self.fields['default_schema'].choices = provider.schemas.filter(visible=True, active=True).values_list('id', 'name')

api_tests/providers/collections/views/test_collection_provider_detail.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from api.base.settings.defaults import API_BASE
44
from api_tests.providers.mixins import ProviderExistsMixin
5+
from osf.models import CedarMetadataTemplate
56
from osf_tests.factories import (
67
CollectionProviderFactory,
78
BrandFactory,
@@ -55,3 +56,40 @@ def test_registration_provider_with_special_fields(self, app, provider_with_bran
5556
data = res.json['data']
5657

5758
assert data['relationships']['brand']['data']['id'] == str(brand.id)
59+
60+
61+
@pytest.mark.django_db
62+
class TestCollectionProviderRequiredMetadataTemplate:
63+
64+
@pytest.fixture()
65+
def provider(self):
66+
return CollectionProviderFactory()
67+
68+
@pytest.fixture()
69+
def provider_url(self, provider):
70+
return f'/{API_BASE}providers/collections/{provider._id}/?version=2.20'
71+
72+
@pytest.fixture()
73+
def cedar_template(self):
74+
return CedarMetadataTemplate.objects.create(
75+
schema_name='Test Schema',
76+
cedar_id='https://repo.metadatacenter.org/templates/test',
77+
template_version=1,
78+
template={},
79+
active=True,
80+
)
81+
82+
def test_required_metadata_template_is_null_by_default(self, app, provider, provider_url):
83+
res = app.get(provider_url)
84+
assert res.status_code == 200
85+
assert res.json['data']['relationships']['required_metadata_template']['data'] is None
86+
87+
def test_required_metadata_template_when_set(self, app, provider, provider_url, cedar_template):
88+
provider.required_metadata_template = cedar_template
89+
provider.save()
90+
91+
res = app.get(provider_url)
92+
assert res.status_code == 200
93+
rel = res.json['data']['relationships']['required_metadata_template']
94+
assert rel['data']['id'] == cedar_template._id
95+
assert rel['data']['type'] == 'cedar-metadata-templates'

api_tests/providers/preprints/views/test_preprint_provider_detail.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from api.base.settings.defaults import API_BASE
44
from api.base.settings import REST_FRAMEWORK
55
from api_tests.providers.mixins import ProviderExistsMixin
6+
from osf.models import CedarMetadataTemplate
67
from osf_tests.factories import (
78
PreprintProviderFactory,
89
ProviderAssetFileFactory,
@@ -216,3 +217,40 @@ def test_asset_attribute_correct(self, app, provider_one, provider_two, provider
216217

217218
res = app.get(provider_two_url)
218219
assert res.json['data']['attributes']['assets'][provider_asset_two.name] == provider_asset_two.file.url
220+
221+
222+
@pytest.mark.django_db
223+
class TestPreprintProviderRequiredMetadataTemplate:
224+
225+
@pytest.fixture()
226+
def provider(self):
227+
return PreprintProviderFactory()
228+
229+
@pytest.fixture()
230+
def provider_url(self, provider):
231+
return f'/{API_BASE}providers/preprints/{provider._id}/?version=2.20'
232+
233+
@pytest.fixture()
234+
def cedar_template(self):
235+
return CedarMetadataTemplate.objects.create(
236+
schema_name='Test Schema',
237+
cedar_id='https://repo.metadatacenter.org/templates/test',
238+
template_version=1,
239+
template={},
240+
active=True,
241+
)
242+
243+
def test_required_metadata_template_is_null_by_default(self, app, provider, provider_url):
244+
res = app.get(provider_url)
245+
assert res.status_code == 200
246+
assert res.json['data']['relationships']['required_metadata_template']['data'] is None
247+
248+
def test_required_metadata_template_when_set(self, app, provider, provider_url, cedar_template):
249+
provider.required_metadata_template = cedar_template
250+
provider.save()
251+
252+
res = app.get(provider_url)
253+
assert res.status_code == 200
254+
rel = res.json['data']['relationships']['required_metadata_template']
255+
assert rel['data']['id'] == cedar_template._id
256+
assert rel['data']['type'] == 'cedar-metadata-templates'

0 commit comments

Comments
 (0)