Skip to content

Commit 14820c1

Browse files
WIP bonares metadata schema implementation
1 parent f3985fd commit 14820c1

27 files changed

+738
-155
lines changed

.devcontainer/.env

+1-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ ASYNC_SIGNALS=True
4343
SITEURL=http://localhost:8000/
4444

4545
ALLOWED_HOSTS="['django', '*']"
46-
PORXY_URL=""
4746

4847
# Data Uploader
4948
DEFAULT_BACKEND_UPLOADER=geonode.importer
@@ -165,7 +164,7 @@ SECRET_KEY='myv-y4#7j-d*p-__@j#*3z@!y24fz8%^z2v6atuy4bo9vqr1_a'
165164
# GEOIP_PATH=/mnt/volumes/statics/geoip.db
166165

167166
CACHE_BUSTING_STATIC_ENABLED=False
168-
PROXY_URL=""
167+
169168
MEMCACHED_ENABLED=False
170169
MEMCACHED_BACKEND=django.core.cache.backends.memcached.MemcachedCache
171170
MEMCACHED_LOCATION=127.0.0.1:11211

entrypoint.sh

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ invoke () {
1616

1717
# Start cron && memcached services
1818
service cron restart
19-
service memcached restart
2019

2120
echo $"\n\n\n"
2221
echo "-----------------------------------------------------"
@@ -64,8 +63,8 @@ else
6463
invoke statics
6564
invoke waitforgeoserver
6665
invoke geoserverfixture
66+
6767
echo "Executing UWSGI server $cmd for Production"
68-
#invoke initzalf
6968
fi
7069

7170
echo "-----------------------------------------------------"

examples/create_funder.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# create funder example
2+
3+
import sys, os, django
4+
sys.path.append("/") #here store is root folder(means parent).
5+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "store.settings")
6+
django.setup()
7+
8+
from geonode.base.models import FundingReference, Funder, ResourceBase
9+
10+
fr = FundingReference.objects.all()[0]
11+
f = Funder( funding_reference=fr,
12+
award_number="25132",
13+
award_uri="http://cordis.europa.eu/project/rcn/100180_en.html",
14+
award_title="The human readable title of the award (grant). (e.g. MOTivational strength of ecosystem service)")
15+
16+
r = ResourceBase.objects.all()[0]
17+
r.funders.add(f)
18+
r.save()
19+

examples/create_related_identifier.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
import sys, os, django
3+
sys.path.append("/") #here store is root folder(means parent).
4+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "store.settings")
5+
django.setup()
6+
7+
from geonode.base.models import RelationType, RelatedIdentifier, ResourceBase, RelatedIdentifierType
8+
9+
rt = RelationType.objects.all()[0]
10+
rit = RelatedIdentifierType.objects.all()[0]
11+
ri = RelatedIdentifier.objects.create(related_identifier="test",
12+
related_identifier_type=rit,
13+
relation_type=rt
14+
)
15+
rb = ResourceBase.objects.all()[0]
16+
rb.related_identifier.add(ri)

examples/test_rest.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys, os, django
2+
sys.path.append("/") #here store is root folder(means parent).
3+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "store.settings")
4+
django.setup()
5+
6+
import io
7+
from rest_framework.renderers import JSONRenderer
8+
from geonode.base.models import ResourceBase
9+
from geonode.base.api.serializers import ResourceBaseSerializer
10+
from rest_framework.parsers import JSONParser
11+
12+
r = ResourceBase.objects.all()[0]
13+
s = ResourceBaseSerializer(r)
14+
json = JSONRenderer().render(s.data)
15+
stream = io.BytesIO(json)
16+
data = JSONParser().parse(stream)
17+
se = ResourceBaseSerializer(data=data)
18+
se.is_valid()

geonode/base/api/fields.py

+17-22
Original file line numberDiff line numberDiff line change
@@ -23,50 +23,45 @@
2323
from rest_framework.exceptions import ParseError
2424
from dynamic_rest.fields.fields import DynamicRelationField
2525

26-
from geonode.base.models import (
27-
RelatedIdentifierType,
28-
RelationType,
29-
RelatedIdentifier,
30-
FundingReference,
31-
Funder
32-
)
26+
from geonode.base.models import RelatedIdentifierType, RelationType, RelatedIdentifier, FundingReference, Funder
3327

34-
class RelatedIdentifierDynamicRelationField(DynamicRelationField):
3528

29+
class RelatedIdentifierDynamicRelationField(DynamicRelationField):
3630
def to_internal_value_single(self, data, serializer):
3731
try:
38-
rit = RelatedIdentifierType.objects.get(**data['related_identifier_type'])
39-
rt = RelationType.objects.get(**data['relation_type'])
40-
RelatedIdentifier.objects.get_or_create(related_identifier=data['related_identifier'],
41-
related_identifier_type=rit,
42-
relation_type=rt)[0].save()
43-
r = RelatedIdentifier.objects.get(related_identifier=data['related_identifier'], related_identifier_type=rit, relation_type=rt)
32+
rit = RelatedIdentifierType.objects.get(**data["related_identifier_type"])
33+
rt = RelationType.objects.get(**data["relation_type"])
34+
RelatedIdentifier.objects.get_or_create(
35+
related_identifier=data["related_identifier"], related_identifier_type=rit, relation_type=rt
36+
)[0].save()
37+
r = RelatedIdentifier.objects.get(
38+
related_identifier=data["related_identifier"], related_identifier_type=rit, relation_type=rt
39+
)
4440
except TypeError:
4541
raise ParseError(detail="Could not convert related_identifier to internal object ...", code=400)
46-
return r
42+
return r
4743

48-
class FundersDynamicRelationField(DynamicRelationField):
4944

45+
class FundersDynamicRelationField(DynamicRelationField):
5046
def to_internal_value_single(self, data, serializer):
5147
try:
52-
funding_reference = FundingReference.objects.get(**data['funding_reference'])
53-
data['funding_reference'] = funding_reference
48+
funding_reference = FundingReference.objects.get(**data["funding_reference"])
49+
data["funding_reference"] = funding_reference
5450
except TypeError:
5551
raise ParseError(detail="Missing funding_reference object in funders ...", code=400)
5652
try:
5753
funder = Funder.objects.get_or_create(**data)
5854
except TypeError:
5955
raise ParseError(detail="Could not convert related_identifier to internal object ...", code=400)
6056
return funder
61-
57+
6258

6359
class ComplexDynamicRelationField(DynamicRelationField):
64-
6560
def to_internal_value_single(self, data, serializer):
6661
"""Overwrite of DynamicRelationField implementation to handle complex data structure initialization
6762
6863
Args:
69-
data (Union[str, Dict]}): serialized or deserialized data from http calls (POST, GET ...),
64+
data (Union[str, Dict]}): serialized or deserialized data from http calls (POST, GET ...),
7065
if content-type application/json is used, data shows up as dict
7166
serializer (DynamicModelSerializer): Serializer for the given data
7267
@@ -81,7 +76,7 @@ def to_internal_value_single(self, data, serializer):
8176
data = json.loads(data)
8277
except ValueError:
8378
return super().to_internal_value_single(data, serializer)
84-
79+
8580
if isinstance(data, dict):
8681
try:
8782
if hasattr(serializer, "many") and serializer.many is True:

geonode/base/api/serializers.py

+64-17
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@
5757
Funder,
5858
)
5959
from geonode.groups.models import GroupCategory, GroupProfile
60-
from geonode.base.api.fields import ComplexDynamicRelationField, RelatedIdentifierDynamicRelationField, FundersDynamicRelationField
60+
from geonode.base.api.fields import (
61+
ComplexDynamicRelationField,
62+
RelatedIdentifierDynamicRelationField,
63+
FundersDynamicRelationField,
64+
)
6165
from geonode.utils import build_absolute_uri
6266
from geonode.security.utils import get_resources_with_perms
6367
from geonode.resource.models import ExecutionRequest
@@ -66,6 +70,7 @@
6670

6771
logger = logging.getLogger(__name__)
6872

73+
6974
class BaseDynamicModelSerializer(DynamicModelSerializer):
7075
def to_representation(self, instance):
7176
data = super().to_representation(instance)
@@ -159,7 +164,6 @@ def to_representation(self, value):
159164
return {"name": value.name, "slug": value.slug}
160165

161166

162-
163167
class _ThesaurusKeywordSerializerMixIn:
164168
def to_representation(self, value):
165169
_i18n = {}
@@ -183,7 +187,7 @@ class Meta:
183187
model = ThesaurusKeyword
184188
name = "ThesaurusKeyword"
185189
fields = ("alt_label",)
186-
190+
187191

188192
class SimpleRegionSerializer(DynamicModelSerializer):
189193
class Meta:
@@ -197,7 +201,7 @@ class Meta:
197201
model = RelatedIdentifierType
198202
name = "RelatedIdentifierType"
199203
fields = ("label", "description")
200-
204+
201205

202206
class SimpleRelationType(DynamicModelSerializer):
203207
class Meta:
@@ -214,8 +218,8 @@ class Meta:
214218

215219
related_identifier_type = DynamicRelationField(SimpleRelatedIdentifierType, embed=True, many=False)
216220
relation_type = DynamicRelationField(SimpleRelationType, embed=True, many=False)
217-
218-
221+
222+
219223
class FundingReferenceSerializer(DynamicModelSerializer):
220224
class Meta:
221225
model = FundingReference
@@ -236,7 +240,14 @@ class SimpleRelatedProjectSerializer(DynamicModelSerializer):
236240
class Meta:
237241
model = RelatedProject
238242
name = "RelatedProject"
239-
fields = ("label","display_name")
243+
fields = ("label", "display_name")
244+
245+
246+
class SimpleResourceSerializer(DynamicModelSerializer):
247+
class Meta:
248+
model = ResourceBase
249+
name = "resource"
250+
fields = ("pk", "title") # TODO add UUID
240251

241252

242253
class SimpleTopicCategorySerializer(DynamicModelSerializer):
@@ -357,7 +368,7 @@ class Meta:
357368
model = get_user_model()
358369
name = "user"
359370
view_name = "users-list"
360-
fields = ("pk", "username", "first_name", "last_name", "avatar", "perms", "is_superuser", "is_staff")
371+
fields = ("pk", "username", "first_name", "last_name", "avatar", "perms", "is_superuser", "is_staff", "orcid_identifier")
361372

362373
@classmethod
363374
def setup_eager_loading(cls, queryset):
@@ -483,6 +494,7 @@ def __init__(self, *args, **kwargs):
483494
self.fields["title_translated"] = serializers.CharField()
484495

485496
self.fields["abstract"] = serializers.CharField(required=False)
497+
# BONARES ELEMENTS
486498
self.fields["abstract_translated"] = serializers.CharField(required=False)
487499

488500
self.fields["subtitle"] = serializers.CharField(required=False)
@@ -493,13 +505,30 @@ def __init__(self, *args, **kwargs):
493505
self.fields["other_description"] = serializers.CharField(required=False)
494506

495507
self.fields["related_identifier"] = RelatedIdentifierDynamicRelationField(
496-
SimpleRelatedIdentifierSerializer, embed=True, many=True)
497-
self.fields["funders"] = FundersDynamicRelationField(
498-
SimpleFunderSerializer, embed=True, many=True)
508+
SimpleRelatedIdentifierSerializer, embed=True, many=True
509+
)
510+
self.fields["funders"] = FundersDynamicRelationField(SimpleFunderSerializer, embed=True, many=True)
499511
self.fields["related_projects"] = ComplexDynamicRelationField(
500-
SimpleRelatedProjectSerializer, embed=True, many=True)
512+
SimpleRelatedProjectSerializer, embed=True, many=True
513+
)
514+
self.fields["conformity_results"] = serializers.CharField(required=False)
515+
self.fields["conformity_explanation"] = serializers.CharField(required=False)
516+
self.fields["parent_identifier"] = ComplexDynamicRelationField(
517+
SimpleResourceSerializer, embed=True, many=False, required=False
518+
)
519+
self.fields["date_available"] = serializers.DateField(required=True)
520+
self.fields["date_updated"] = serializers.DateField(required=True)
521+
self.fields["date_created"] = serializers.DateField(required=True)
522+
self.fields["date_issued"] = serializers.DateField(required=True)
523+
524+
self.fields["date_accepted"] = serializers.DateField(required=False)
525+
self.fields["date_collected"] = serializers.DateField(required=False)
526+
self.fields["date_copyrighted"] = serializers.DateField(required=False)
527+
self.fields["date_submitted"] = serializers.DateField(required=False)
528+
self.fields["date_valid"] = serializers.DateField(required=False)
501529

502-
530+
self.fields["metadata_standard_name"] = serializers.CharField(read_only=True)
531+
self.fields["metadata_standard_version"] = serializers.CharField(read_only=True)
503532

504533
self.fields["attribution"] = serializers.CharField(required=False)
505534
self.fields["doi"] = serializers.CharField(required=False)
@@ -540,7 +569,9 @@ def __init__(self, *args, **kwargs):
540569

541570
self.fields["embed_url"] = EmbedUrlField(required=False)
542571
self.fields["thumbnail_url"] = ThumbnailUrlField(read_only=True)
543-
self.fields["keywords"] = ComplexDynamicRelationField(SimpleHierarchicalKeywordSerializer, embed=False, many=True)
572+
self.fields["keywords"] = ComplexDynamicRelationField(
573+
SimpleHierarchicalKeywordSerializer, embed=False, many=True
574+
)
544575
self.fields["tkeywords"] = ComplexDynamicRelationField(SimpleThesaurusKeywordSerializer, embed=False, many=True)
545576
self.fields["regions"] = DynamicRelationField(SimpleRegionSerializer, embed=True, many=True, read_only=True)
546577
self.fields["category"] = ComplexDynamicRelationField(SimpleTopicCategorySerializer, embed=True, many=False)
@@ -552,7 +583,7 @@ def __init__(self, *args, **kwargs):
552583
)
553584
self.fields["license"] = ComplexDynamicRelationField(LicenseSerializer, embed=True, many=False)
554585
self.fields["spatial_representation_type"] = ComplexDynamicRelationField(
555-
SpatialRepresentationTypeSerializer, embed=True, many=False
586+
SpatialRepresentationTypeSerializer, embed=True, many=False
556587
)
557588
self.fields["blob"] = serializers.JSONField(required=False, write_only=True)
558589
self.fields["is_copyable"] = serializers.BooleanField(read_only=True)
@@ -594,6 +625,20 @@ class Meta:
594625
"other_description",
595626
"related_identifier",
596627
"funders",
628+
"conformity_results",
629+
"conformity_explanation",
630+
"parent_identifier",
631+
"date_accepted",
632+
"date_available",
633+
"date_collected",
634+
"date_copyrighted",
635+
"date_created",
636+
"date_issued",
637+
"date_submitted",
638+
"date_updated",
639+
"date_valid",
640+
"metadata_standard_name",
641+
"metadata_standard_version",
597642
"doi",
598643
"bbox_polygon",
599644
"ll_bbox_polygon",
@@ -782,8 +827,8 @@ class Meta:
782827
count_type = "category"
783828
view_name = "categories-list"
784829
fields = "__all__"
785-
786-
830+
831+
787832
class RelationTypeSerializer(DynamicModelSerializer):
788833
class Meta:
789834
name = "relationtypes"
@@ -807,13 +852,15 @@ class Meta:
807852
count_type = "fundingreferences"
808853
fields = "__all__"
809854

855+
810856
class RelatedProjectSerializer(DynamicModelSerializer):
811857
class Meta:
812858
name = "relatedprojects"
813859
model = RelatedProject
814860
count_type = "relatedprojects"
815861
fields = "__all__"
816862

863+
817864
class OwnerSerializer(BaseResourceCountSerializer):
818865
class Meta:
819866
name = "owners"

0 commit comments

Comments
 (0)