Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 27 additions & 8 deletions gitlab.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,14 @@ def list(self, obj_class, **kwargs):
cls = obj_class
if obj_class._returnClass:
cls = obj_class._returnClass

# Remove parameters from kwargs before passing it to constructor

cls_kwargs = kwargs.copy()

# Add _created manually, because we are not creating objects
# through normal path
cls_kwargs['_created'] = True

# Remove parameters from kwargs before passing it to constructor
for key in ['page', 'per_page']:
if key in cls_kwargs:
del cls_kwargs[key]
Expand Down Expand Up @@ -486,6 +491,8 @@ class GitlabObject(object):
_url = None
_returnClass = None
_constructorTypes = None
# Tells if _getListOrObject should return list or object when id is None
getListWhenNoId = True
canGet = True
canList = True
canCreate = True
Expand All @@ -509,16 +516,18 @@ def list(cls, gl, **kwargs):
return gl.list(cls, **kwargs)

def _getListOrObject(self, cls, id, **kwargs):
if id is None:
if id is None and cls.getListWhenNoId:
if not cls.canList:
raise GitlabGetError
raise GitlabListError
return cls.list(self.gitlab, **kwargs)

elif id is None and not cls.getListWhenNoId:
if not cls.canGet:
raise GitlabGetError
return cls(self.gitlab, id, **kwargs)
elif isinstance(id, dict):
if not cls.canCreate:
raise GitlabCreateError
return cls(self.gitlab, id, **kwargs)

else:
if not cls.canGet:
raise GitlabGetError
Expand Down Expand Up @@ -547,6 +556,7 @@ def _create(self):

json = self.gitlab.create(self)
self._setFromDict(json)
self._created = True

def _update(self):
if not self.canUpdate:
Expand All @@ -556,7 +566,7 @@ def _update(self):
self._setFromDict(json)

def save(self):
if hasattr(self, 'id'):
if self._created:
self._update()
else:
self._create()
Expand All @@ -565,23 +575,32 @@ def delete(self):
if not self.canDelete:
raise NotImplementedError

if not hasattr(self, 'id'):
if not self._created:
raise GitlabDeleteError

return self.gitlab.delete(self)

def __init__(self, gl, data=None, **kwargs):
self._created = False
self.gitlab = gl

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

self._setFromDict(data)

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

# Special handling for api-objects that don't have id-number in api
# responses. Currently only Labels and Files
if not hasattr(self, "id"):
self.id = None


def __str__(self):
return '%s => %s' % (type(self), str(self.__dict__))

Expand Down