Skip to content

Commit 53fffe9

Browse files
committed
Refactor models.py classes
* Streamline class __init__ methods to follow more concise pattern * DSpaceObject __init__ method is also updated to prevent overwriting of links attribute if instantiated from dso param * Remove duplicative setting of links attribute from api_resource param by DSpaceObject since it is already set in the base HALResource class * Remove unnecessary __init__ methods that only call super().__init__(api_resource) * Remove unnecessary as_dict methods that do not add any fields beyond the base class fields
1 parent 80ff4aa commit 53fffe9

1 file changed

Lines changed: 59 additions & 191 deletions

File tree

dspace_rest_client/models.py

Lines changed: 59 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,9 @@ def __init__(self, api_resource=None):
2828
Default constructor
2929
@param api_resource: optional API resource (JSON) from a GET response or successful POST can populate instance
3030
"""
31-
self.links = {}
32-
self.embedded = {}
33-
34-
if api_resource is not None:
35-
self.links = api_resource.get('_links', {}).copy()
36-
self.embedded = api_resource.get('_embedded', {}).copy()
37-
else:
38-
self.links = {'self': {'href': None}}
31+
links_default = {'self': {'href': None}}
32+
self.links = api_resource.get('_links', {}).copy() if api_resource else links_default
33+
self.embedded = api_resource.get('_embedded', {}).copy() if api_resource else {}
3934

4035
def as_dict(self) -> dict[str, Any]:
4136
return {'type': self.type}
@@ -46,10 +41,7 @@ class AddressableHALResource(HALResource):
4641
"""
4742
def __init__(self, api_resource=None):
4843
super().__init__(api_resource)
49-
self.id = None
50-
51-
if api_resource is not None:
52-
self.id = api_resource.get('id')
44+
self.id = api_resource.get('id') if api_resource else None
5345

5446
def as_dict(self):
5547
parent_dict = super().as_dict()
@@ -74,16 +66,10 @@ def __init__(self, api_resource=None):
7466
@param api_resource: optional API resource (JSON) from a GET response or successful POST can populate instance
7567
"""
7668
super().__init__(api_resource)
77-
self.display = None
78-
self.value = None
79-
self.externalSource = None
80-
self.metadata = {}
81-
82-
if api_resource is not None:
83-
self.display = api_resource.get('display')
84-
self.value = api_resource.get('value')
85-
self.externalSource = api_resource.get('externalSource')
86-
self.metadata = api_resource.get('metadata').copy()
69+
self.display = api_resource.get('display') if api_resource else None
70+
self.value = api_resource.get('value') if api_resource else None
71+
self.externalSource = api_resource.get('externalSource') if api_resource else None
72+
self.metadata = api_resource.get('metadata').copy() if api_resource else {}
8773

8874
def get_metadata_values(self, field):
8975
"""
@@ -119,29 +105,22 @@ def __init__(self, api_resource=None, dso=None):
119105
Default constructor
120106
@param api_resource: optional API resource (JSON) from a GET response or successful POST can populate instance
121107
"""
108+
if dso is not None:
109+
api_resource = dso.as_dict()
110+
122111
super().__init__(api_resource)
123-
self.uuid = None
124-
self.name = None
125-
self.handle = None
126-
self.lastModified = None
112+
self.uuid = api_resource.get('uuid') if api_resource else None
113+
self.name = api_resource.get('name') if api_resource else None
114+
self.handle = api_resource.get('handle') if api_resource else None
115+
self.lastModified = api_resource.get('lastModified') if api_resource else None
127116
self.parent = None
128-
self.metadata = {}
117+
self.metadata = api_resource.get('metadata', {}).copy() if api_resource else {}
129118

119+
# This is run after super().__init__(api_resource) to preserve any links already
120+
# set in the dso object used for instantiation.
130121
if dso is not None:
131-
api_resource = dso.as_dict()
132122
self.links = dso.links.copy()
133123

134-
if api_resource is not None:
135-
self.id = api_resource.get('id')
136-
self.uuid = api_resource.get('uuid')
137-
self.name = api_resource.get('name')
138-
self.handle = api_resource.get('handle')
139-
self.metadata = api_resource.get('metadata', {}).copy()
140-
self.lastModified = api_resource.get('lastModified')
141-
# Python interprets _ prefix as private so for now, renaming this and handling it separately
142-
# alternatively - each item could implement getters, or a public method to return links
143-
self.links = api_resource.get('_links', {}).copy()
144-
145124
def get_metadata_values(self, field):
146125
"""
147126
Return metadata values as simple list of strings
@@ -239,20 +218,10 @@ def __init__(self, api_resource=None, dso=None):
239218
Default constructor. Call DSpaceObject init then set item-specific attributes
240219
@param api_resource: API result object to use as initial data
241220
"""
242-
self.inArchive = False
243-
self.discoverable = False
244-
self.withdrawn = False
245-
self.metadata = {}
246-
if dso is not None:
247-
api_resource = dso.as_dict()
248-
super().__init__(dso=dso)
249-
else:
250-
super().__init__(api_resource)
251-
252-
if api_resource is not None:
253-
self.inArchive = api_resource.get('inArchive', True)
254-
self.discoverable = api_resource.get('discoverable', False)
255-
self.withdrawn = api_resource.get('withdrawn', False)
221+
super().__init__(api_resource=api_resource, dso=dso)
222+
self.inArchive = api_resource.get('inArchive', True) if api_resource else False
223+
self.discoverable = api_resource.get('discoverable', False) if api_resource else False
224+
self.withdrawn = api_resource.get('withdrawn', False) if api_resource else False
256225

257226

258227

@@ -282,13 +251,6 @@ class Community(SimpleDSpaceObject):
282251
"""
283252
type = 'community'
284253

285-
def __init__(self, api_resource=None):
286-
"""
287-
Default constructor. Call DSpaceObject init then set item-specific attributes
288-
@param api_resource: API result object to use as initial data
289-
"""
290-
super().__init__(api_resource)
291-
292254
def as_dict(self):
293255
"""
294256
Return a dict representation of this Community, based on super with community-specific attributes added
@@ -308,22 +270,6 @@ class Collection(SimpleDSpaceObject):
308270
"""
309271
type = "collection"
310272

311-
def __init__(self, api_resource=None):
312-
"""
313-
Default constructor. Call DSpaceObject init then set collection-specific attributes
314-
@param api_resource: API result object to use as initial data
315-
"""
316-
super().__init__(api_resource)
317-
318-
def as_dict(self):
319-
"""
320-
Return a dict representation of this Collection, based on super with collection-specific attributes added
321-
@return: dict of Item for API use
322-
"""
323-
dso_dict = super().as_dict()
324-
collection_dict = {}
325-
return {**dso_dict, **collection_dict}
326-
327273

328274
class Bundle(DSpaceObject):
329275
"""
@@ -333,22 +279,6 @@ class Bundle(DSpaceObject):
333279
"""
334280
type = "bundle"
335281

336-
def __init__(self, api_resource=None):
337-
"""
338-
Default constructor. Call DSpaceObject init then set bundle-specific attributes
339-
@param api_resource: API result object to use as initial data
340-
"""
341-
super().__init__(api_resource)
342-
343-
def as_dict(self):
344-
"""
345-
Return a dict representation of this Bundle, based on super with bundle-specific attributes added
346-
@return: dict of Bundle for API use
347-
"""
348-
dso_dict = super().as_dict()
349-
bundle_dict = {}
350-
return {**dso_dict, **bundle_dict}
351-
352282

353283
class Bitstream(DSpaceObject):
354284
"""
@@ -364,20 +294,12 @@ def __init__(self, api_resource=None):
364294
@param api_resource: API result object to use as initial data
365295
"""
366296
super().__init__(api_resource)
297+
checksum_default = {'checkSumAlgorithm': 'MD5', 'value': None}
367298
# Bitstream has a few extra fields specific to file storage
368-
self.bundleName = None
369-
self.sizeBytes = None
370-
self.checkSum = {
371-
'checkSumAlgorithm': 'MD5',
372-
'value': None
373-
}
374-
self.sequenceId = None
375-
376-
if api_resource is not None:
377-
self.bundleName = api_resource.get('bundleName')
378-
self.sizeBytes = api_resource.get('sizeBytes')
379-
self.checkSum = api_resource.get('checkSum', self.checkSum)
380-
self.sequenceId = api_resource.get('sequenceId')
299+
self.bundleName = api_resource.get('bundleName') if api_resource else None
300+
self.sizeBytes = api_resource.get('sizeBytes') if api_resource else None
301+
self.checkSum = api_resource.get('checkSum', checksum_default) if api_resource else checksum_default
302+
self.sequenceId = api_resource.get('sequenceId') if api_resource else None
381303

382304
def as_dict(self):
383305
"""
@@ -401,20 +323,12 @@ class BitstreamFormat(AddressableHALResource):
401323

402324
def __init__(self, api_resource):
403325
super(BitstreamFormat, self).__init__(api_resource)
404-
self.shortDescription = None
405-
self.description = None
406-
self.mimetype = None
407-
self.supportLevel = None
408-
self.internal = False
409-
self.extensions = []
410-
411-
if api_resource is not None:
412-
self.shortDescription = api_resource.get('shortDescription')
413-
self.description = api_resource.get('description')
414-
self.mimetype = api_resource.get('mimetype')
415-
self.supportLevel = api_resource.get('supportLevel')
416-
self.internal = api_resource.get('internal')
417-
self.extensions = api_resource.get('extensions', {}).copy()
326+
self.shortDescription = api_resource.get('shortDescription') if api_resource else None
327+
self.description = api_resource.get('description') if api_resource else None
328+
self.mimetype = api_resource.get('mimetype') if api_resource else None
329+
self.supportLevel = api_resource.get('supportLevel') if api_resource else None
330+
self.internal = api_resource.get('internal') if api_resource else False
331+
self.extensions = api_resource.get('extensions', {}).copy() if api_resource else []
418332

419333
def as_dict(self):
420334
parent_dict = super(BitstreamFormat, self).as_dict()
@@ -438,16 +352,10 @@ class Version(AddressableHALResource):
438352

439353
def __init__(self, api_resource=None):
440354
super().__init__(api_resource)
441-
self.version = None
442-
self.created = None
443-
self.summary = None
444-
self.submitterName = None
445-
446-
if api_resource is not None:
447-
self.version = api_resource.get('version')
448-
self.created = api_resource.get('created')
449-
self.summary = api_resource.get('summary')
450-
self.submitterName = api_resource.get('submitterName')
355+
self.version = api_resource.get('version') if api_resource else None
356+
self.created = api_resource.get('created') if api_resource else None
357+
self.summary = api_resource.get('summary') if api_resource else None
358+
self.submitterName = api_resource.get('submitterName') if api_resource else None
451359

452360
def as_dict(self):
453361
"""
@@ -478,12 +386,8 @@ def __init__(self, api_resource=None):
478386
@param api_resource: API result object to use as initial data
479387
"""
480388
super().__init__(api_resource)
481-
self.name = None
482-
self.permanent = False
483-
484-
if api_resource is not None:
485-
self.name = api_resource.get('name')
486-
self.permanent = api_resource.get('permanent')
389+
self.name = api_resource.get('name') if api_resource else None
390+
self.permanent = api_resource.get('permanent') if api_resource else False
487391

488392
def as_dict(self):
489393
"""
@@ -513,22 +417,13 @@ def __init__(self, api_resource=None):
513417
@param api_resource: API result object to use as initial data
514418
"""
515419
super().__init__(api_resource)
516-
self.name = None
517-
self.netid = None
518-
self.lastActive = None
519-
self.canLogIn = False
520-
self.email = None
521-
self.requireCertificate = False
522-
self.selfRegistered = False
523-
524-
if api_resource is not None:
525-
self.name = api_resource.get('name')
526-
self.netid = api_resource.get('netid')
527-
self.lastActive = api_resource.get('lastActive')
528-
self.canLogIn = api_resource.get('canLogIn')
529-
self.email = api_resource.get('email')
530-
self.requireCertificate = api_resource.get('requireCertificate')
531-
self.selfRegistered = api_resource.get('selfRegistered')
420+
self.name = api_resource.get('name') if api_resource else None
421+
self.netid = api_resource.get('netid') if api_resource else None
422+
self.lastActive = api_resource.get('lastActive') if api_resource else None
423+
self.canLogIn = api_resource.get('canLogIn') if api_resource else False
424+
self.email = api_resource.get('email') if api_resource else None
425+
self.requireCertificate = api_resource.get('requireCertificate') if api_resource else False
426+
self.selfRegistered = api_resource.get('selfRegistered') if api_resource else False
532427

533428
def as_dict(self):
534429
"""
@@ -554,14 +449,9 @@ class InProgressSubmission(AddressableHALResource):
554449

555450
def __init__(self, api_resource):
556451
super().__init__(api_resource)
557-
self.lastModified = None
558-
self.step = None
559-
self.sections = {}
560-
561-
if api_resource is not None:
562-
self.lastModified = api_resource.get('lastModified')
563-
self.step = api_resource.get('step')
564-
self.sections = api_resource.get('sections', {}).copy()
452+
self.lastModified = api_resource.get('lastModified') if api_resource else None
453+
self.step = api_resource.get('step') if api_resource else None
454+
self.sections = api_resource.get('sections', {}).copy() if api_resource else {}
565455

566456
def as_dict(self):
567457
parent_dict = super().as_dict()
@@ -582,12 +472,6 @@ class WorkspaceItem(InProgressSubmission):
582472
"""
583473
type = 'workspaceitem'
584474

585-
def __init__(self, api_resource):
586-
super().__init__(api_resource)
587-
588-
def as_dict(self):
589-
return super().as_dict()
590-
591475
class EntityType(AddressableHALResource):
592476
"""
593477
Extends Addressable HAL Resource to model an entity type (aka item type) used in entities and relationships.
@@ -601,10 +485,7 @@ class EntityType(AddressableHALResource):
601485

602486
def __init__(self, api_resource):
603487
super().__init__(api_resource)
604-
self.label = None
605-
606-
if api_resource is not None:
607-
self.label = api_resource.get('label')
488+
self.label = api_resource.get('label') if api_resource else None
608489

609490
class RelationshipType(AddressableHALResource):
610491
"""
@@ -633,14 +514,9 @@ class SearchResult(HALResource):
633514

634515
def __init__(self, api_resource):
635516
super().__init__(api_resource)
636-
self.query = None
637-
self.scope = None
638-
self.appliedFilters = []
639-
640-
if api_resource is not None:
641-
self.query = api_resource.get('query')
642-
self.scope = api_resource.get('scope')
643-
self.appliedFilters = api_resource.get('appliedFilters', []).copy()
517+
self.query = api_resource.get('query') if api_resource else None
518+
self.scope = api_resource.get('scope') if api_resource else None
519+
self.appliedFilters = api_resource.get('appliedFilters', []).copy() if api_resource else []
644520

645521
def as_dict(self):
646522
parent_dict = super().as_dict()
@@ -663,20 +539,12 @@ class ResourcePolicy(AddressableHALResource):
663539

664540
def __init__(self, api_resource):
665541
super().__init__(api_resource)
666-
self.name = None
667-
self.description = None
668-
self.policyType = None
669-
self.action = None
670-
self.startDate = None
671-
self.endDate = None
672-
673-
if api_resource is not None:
674-
self.name = api_resource.get('name')
675-
self.description = api_resource.get('description')
676-
self.policyType = api_resource.get('policyType')
677-
self.action = api_resource.get('action')
678-
self.startDate = api_resource.get('startDate')
679-
self.endDate = api_resource.get('endDate')
542+
self.name = api_resource.get('name') if api_resource else None
543+
self.description = api_resource.get('description') if api_resource else None
544+
self.policyType = api_resource.get('policyType') if api_resource else None
545+
self.action = api_resource.get('action') if api_resource else None
546+
self.startDate = api_resource.get('startDate') if api_resource else None
547+
self.endDate = api_resource.get('endDate') if api_resource else None
680548

681549
def as_dict(self):
682550
hal_dict = super().as_dict()

0 commit comments

Comments
 (0)