@@ -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