Skip to content

Commit c3ab869

Browse files
committed
Support api-objects which don't have id in api response.
1 parent 221f418 commit c3ab869

File tree

1 file changed

+25
-7
lines changed

1 file changed

+25
-7
lines changed

gitlab.py

+25-7
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,11 @@ def list(self, obj_class, **kwargs):
221221
cls = obj_class
222222
if obj_class._returnClass:
223223
cls = obj_class._returnClass
224-
224+
225+
# Add _created manually, because we are not creating objects
226+
# through normal path
227+
cls_kwargs['_created'] = True
228+
225229
# Remove parameters from kwargs before passing it to constructor
226230
cls_kwargs = kwargs.copy()
227231
for key in ['page', 'per_page']:
@@ -486,6 +490,8 @@ class GitlabObject(object):
486490
_url = None
487491
_returnClass = None
488492
_constructorTypes = None
493+
# Tells if _getListOrObject should return list or object when id is None
494+
getListWhenNoId = True
489495
canGet = True
490496
canList = True
491497
canCreate = True
@@ -509,16 +515,18 @@ def list(cls, gl, **kwargs):
509515
return gl.list(cls, **kwargs)
510516

511517
def _getListOrObject(self, cls, id, **kwargs):
512-
if id is None:
518+
if id is None and cls.getListWhenNoId:
513519
if not cls.canList:
514-
raise GitlabGetError
520+
raise GitlabListError
515521
return cls.list(self.gitlab, **kwargs)
516-
522+
elif id is None and not cls.getListWhenNoId:
523+
if not cls.canGet:
524+
raise GitlabGetError
525+
return cls(self.gitlab, id, **kwargs)
517526
elif isinstance(id, dict):
518527
if not cls.canCreate:
519528
raise GitlabCreateError
520529
return cls(self.gitlab, id, **kwargs)
521-
522530
else:
523531
if not cls.canGet:
524532
raise GitlabGetError
@@ -547,6 +555,7 @@ def _create(self):
547555

548556
json = self.gitlab.create(self)
549557
self._setFromDict(json)
558+
self._created = True
550559

551560
def _update(self):
552561
if not self.canUpdate:
@@ -556,7 +565,7 @@ def _update(self):
556565
self._setFromDict(json)
557566

558567
def save(self):
559-
if hasattr(self, 'id'):
568+
if self._created:
560569
self._update()
561570
else:
562571
self._create()
@@ -565,23 +574,32 @@ def delete(self):
565574
if not self.canDelete:
566575
raise NotImplementedError
567576

568-
if not hasattr(self, 'id'):
577+
if not self._created:
569578
raise GitlabDeleteError
570579

571580
return self.gitlab.delete(self)
572581

573582
def __init__(self, gl, data=None, **kwargs):
583+
self._created = False
574584
self.gitlab = gl
575585

576586
if data is None or type(data) in [int, str, unicode]:
577587
data = self.gitlab.get(self.__class__, data, **kwargs)
588+
# Object is created because we got it from api
589+
self._created = True
578590

579591
self._setFromDict(data)
580592

581593
if kwargs:
582594
for k, v in kwargs.items():
583595
self.__dict__[k] = v
584596

597+
# Special handling for api-objects that don't have id-number in api
598+
# responses. Currently only Labels and Files
599+
if not hasattr(self, "id"):
600+
self.id = None
601+
602+
585603
def __str__(self):
586604
return '%s => %s' % (type(self), str(self.__dict__))
587605

0 commit comments

Comments
 (0)