Skip to content

Commit

Permalink
Merge pull request #786 from aaxelb/eng-2650--nonbroken-web-ui
Browse files Browse the repository at this point in the history
[ENG-2650] give the frontend enough to display something useful for each suid
  • Loading branch information
aaxelb committed Apr 15, 2021
2 parents 4a2f392 + 0c99be4 commit 2b80058
Show file tree
Hide file tree
Showing 17 changed files with 150 additions and 10 deletions.
2 changes: 1 addition & 1 deletion api/banners/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@


router = SimpleRouter()
router.register(r'site_banners', views.SiteBannerViewSet, base_name='site_banners')
router.register(r'^site_?banners', views.SiteBannerViewSet, base_name='site_banners')
urlpatterns = router.urls
19 changes: 19 additions & 0 deletions api/formattedmetadatarecords/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from share import models

from api.base import ShareSerializer
from api.fields import ShareIdentityField


class FormattedMetadataRecordSerializer(ShareSerializer):
# link to self
url = ShareIdentityField(view_name='api:formattedmetadatarecord-detail')

class Meta:
model = models.FormattedMetadataRecord
fields = (
'suid',
'record_format',
'date_modified',
'formatted_metadata',
'url',
)
7 changes: 7 additions & 0 deletions api/formattedmetadatarecords/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from rest_framework.routers import SimpleRouter
from api.formattedmetadatarecords import views


router = SimpleRouter()
router.register(r'formattedmetadatarecords', views.FormattedMetadataRecordViewSet, base_name='formattedmetadatarecord')
urlpatterns = router.urls
15 changes: 15 additions & 0 deletions api/formattedmetadatarecords/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from rest_framework import viewsets

from api.formattedmetadatarecords.serializers import FormattedMetadataRecordSerializer
from api.base import ShareViewSet

from share.models import FormattedMetadataRecord


class FormattedMetadataRecordViewSet(ShareViewSet, viewsets.ReadOnlyModelViewSet):
serializer_class = FormattedMetadataRecordSerializer

ordering = ('id', )

def get_queryset(self):
return FormattedMetadataRecord.objects.all()
4 changes: 4 additions & 0 deletions api/normalizeddata/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
from django.db import transaction
from django.urls import reverse

Expand All @@ -20,6 +21,9 @@
from api.permissions import ReadOnlyOrTokenHasScopeOrIsAuthenticated


logger = logging.getLogger(__name__)


class NormalizedDataViewSet(ShareViewSet, generics.ListCreateAPIView, generics.RetrieveAPIView):
"""View showing all normalized data in the SHARE Dataset.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
from api.base import ShareSerializer


# TODO make an endpoint for SourceConfigs
class SourceConfigSerializer(ShareSerializer):
class Meta:
model = models.SourceConfig
fields = ('label',)
fields = (
'label',
'source',
'disabled',
)
7 changes: 7 additions & 0 deletions api/sourceconfigs/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from rest_framework.routers import SimpleRouter
from api.sourceconfigs import views


router = SimpleRouter()
router.register(r'sourceconfigs', views.SourceConfigViewSet, base_name='sourceconfig')
urlpatterns = router.urls
15 changes: 15 additions & 0 deletions api/sourceconfigs/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from rest_framework import viewsets

from api.sourceconfigs.serializers import SourceConfigSerializer
from api.base import ShareViewSet

from share.models import SourceConfig


class SourceConfigViewSet(ShareViewSet, viewsets.ReadOnlyModelViewSet):
serializer_class = SourceConfigSerializer

ordering = ('id', )

def get_queryset(self):
return SourceConfig.objects.all()
9 changes: 8 additions & 1 deletion api/sources/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,14 @@ class ReadonlySourceSerializer(ShareSerializer):

class Meta:
model = models.Source
fields = ('name', 'home_page', 'long_title', 'icon', 'url')
fields = (
'name',
'home_page',
'long_title',
'icon',
'url',
'source_configs',
)
read_only_fields = fields


Expand Down
25 changes: 25 additions & 0 deletions api/suids/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from share import models

from api.base import ShareSerializer
from api.fields import ShareIdentityField
from api.sourceconfigs.serializers import SourceConfigSerializer
from api.formattedmetadatarecords.serializers import FormattedMetadataRecordSerializer


class SuidSerializer(ShareSerializer):
included_serializers = {
'source_config': SourceConfigSerializer,
'formattedmetadatarecord_set': FormattedMetadataRecordSerializer,
}

# link to self
url = ShareIdentityField(view_name='api:suid-detail')

class Meta:
model = models.SourceUniqueIdentifier
fields = (
'identifier',
'source_config',
'url',
'formattedmetadatarecord_set',
)
7 changes: 7 additions & 0 deletions api/suids/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from rest_framework.routers import SimpleRouter
from api.suids import views


router = SimpleRouter()
router.register(r'suids', views.SuidViewSet, base_name='suid')
urlpatterns = router.urls
15 changes: 15 additions & 0 deletions api/suids/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from rest_framework import viewsets

from api.suids.serializers import SuidSerializer
from api.base import ShareViewSet

from share.models import SourceUniqueIdentifier


class SuidViewSet(ShareViewSet, viewsets.ReadOnlyModelViewSet):
serializer_class = SuidSerializer

ordering = ('id', )

def get_queryset(self):
return SourceUniqueIdentifier.objects.all()
3 changes: 3 additions & 0 deletions api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,15 @@
urlpatterns = [
url('^$', RootView.as_view()),
url('^', include('api.banners.urls')),
url('^', include('api.formattedmetadatarecords.urls')),
url('^', include('api.ingestjobs.urls')),
url('^', include('api.normalizeddata.urls')),
url('^', include('api.rawdata.urls')),
url('^', include('api.shareobjects.urls')),
url('^', include('api.sourceregistrations.urls')),
url('^', include('api.sourceconfigs.urls')),
url('^', include('api.sources.urls')),
url('^', include('api.suids.urls')),
url('^', include('api.users.urls')),

url('^schemas?/', include('api.schemas.urls'), name='schema'),
Expand Down
3 changes: 3 additions & 0 deletions share/models/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,9 @@ class FormattedMetadataRecord(models.Model):
date_modified = models.DateTimeField(auto_now=True)
formatted_metadata = models.TextField() # could be JSON, XML, or whatever

class JSONAPIMeta(BaseJSONAPIMeta):
pass

class Meta:
unique_together = ('suid', 'record_format')

Expand Down
3 changes: 3 additions & 0 deletions share/models/ingest.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,9 @@ class SourceUniqueIdentifier(models.Model):
identifier = models.TextField()
source_config = models.ForeignKey('SourceConfig', on_delete=models.CASCADE)

class JSONAPIMeta(BaseJSONAPIMeta):
pass

class Meta:
unique_together = ('identifier', 'source_config')

Expand Down
8 changes: 3 additions & 5 deletions share/models/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,9 @@ def validator_for(self, share_schema_type):


def is_valid_iri(iri):
try:
IRILink().execute(iri)
except InvalidIRI:
return False
# raises InvalidIRI if invalid
IRILink().execute(iri)
return True


draft4_format_checker.checks('uri', raises=ValueError)(is_valid_iri)
draft4_format_checker.checks('uri', raises=InvalidIRI)(is_valid_iri)
11 changes: 10 additions & 1 deletion share/transform/chain/links.py
Original file line number Diff line number Diff line change
Expand Up @@ -802,12 +802,15 @@ class URLLink(AbstractIRILink):
IMPLICIT_PORTS = {80, 443}
IP_RE = re.compile(r'\b({schemes})://(\d{{1,3}}.){{4}}(?:\d{{2,5}})\b([-a-z0-9@:%_\+.~#?&//=]*)'.format(schemes='|'.join(SCHEMES)), flags=re.I)
URL_RE = re.compile(r'\b({schemes})://[-a-z0-9@:%._\+~#=]{{2,256}}\.[a-z]{{2,6}}\b([-a-z0-9@:%_\+.~#?&//=]*)'.format(schemes='|'.join(SCHEMES)), flags=re.I)
LOCAL_URL_RE = re.compile(r'\b({schemes})://localhost:[0-9]{{2,5}}\b([-a-z0-9@:%_\+.~#?&//=]*)'.format(schemes='|'.join(SCHEMES)), flags=re.I)

@classmethod
def hint(cls, obj):
# BePress double escapes in OAI feeds
obj = obj.replace('&', '&')

if settings.DEBUG and cls.LOCAL_URL_RE.search(obj) is not None:
return 0.25
if cls.URL_RE.search(obj) is not None:
return 0.25
if cls.IP_RE.search(obj) is not None:
Expand All @@ -819,10 +822,16 @@ def hint(cls, obj):
def _parse(self, obj):
# BePress double escapes in OAI feeds
obj = obj.replace('&', '&')
match = None
if settings.DEBUG:
match = self.LOCAL_URL_RE.search(obj)

if not match:
match = self.URL_RE.search(obj) or self.IP_RE.search(obj)

match = self.URL_RE.search(obj) or self.IP_RE.search(obj)
if not match and obj.lower().startswith(self.SCHEMELESS_STARTS):
match = self.URL_RE.search('http://{}'.format(obj))

return super(URLLink, self)._parse(match.group(0))

def _process_scheme(self, scheme):
Expand Down

0 comments on commit 2b80058

Please sign in to comment.