@@ -40,6 +40,10 @@ class GitlabConnectionError(Exception):
4040 pass
4141
4242
43+ class GitlabListError (Exception ):
44+ pass
45+
46+
4347class GitlabGetError (Exception ):
4448 pass
4549
@@ -166,6 +170,14 @@ def rawPut(self, path, with_token=False):
166170 return r
167171
168172 def list (self , obj_class , ** kwargs ):
173+ missing = []
174+ for k in obj_class .requiredListAttrs :
175+ if k not in kwargs :
176+ missing .append (k )
177+ if missing :
178+ raise GitlabListError ('Missing attribute(s): %s' % \
179+ ", " .join (missing ))
180+
169181 url = obj_class ._url
170182 if kwargs :
171183 url = obj_class ._url % kwargs
@@ -198,6 +210,14 @@ def list(self, obj_class, **kwargs):
198210 raise GitlabGetError ('%d: %s' % (r .status_code , r .text ))
199211
200212 def get (self , obj_class , id = None , ** kwargs ):
213+ missing = []
214+ for k in obj_class .requiredGetAttrs :
215+ if k not in kwargs :
216+ missing .append (k )
217+ if missing :
218+ raise GitlabListError ('Missing attribute(s): %s' % \
219+ ", " .join (missing ))
220+
201221 url = obj_class ._url
202222 if kwargs :
203223 url = obj_class ._url % kwargs
@@ -370,6 +390,8 @@ class GitlabObject(object):
370390 canCreate = True
371391 canUpdate = True
372392 canDelete = True
393+ requiredListAttrs = []
394+ requiredGetAttrs = []
373395 requiredCreateAttrs = []
374396 optionalCreateAttrs = []
375397
@@ -541,6 +563,8 @@ class ProjectBranch(GitlabObject):
541563 canDelete = False
542564 canUpdate = False
543565 canCreate = False
566+ requiredGetAttrs = ['project_id' ]
567+ requiredListAttrs = ['project_id' ]
544568
545569 def protect (self , protect = True ):
546570 url = self ._url % {'project_id' : self .project_id }
@@ -568,16 +592,21 @@ class ProjectCommit(GitlabObject):
568592 canDelete = False
569593 canUpdate = False
570594 canCreate = False
595+ requiredListAttrs = ['project_id' ]
571596
572597
573598class ProjectKey (GitlabObject ):
574599 _url = '/projects/%(project_id)s/keys'
575600 canUpdate = False
601+ requiredListAttrs = ['project_id' ]
602+ requiredGetAttrs = ['project_id' ]
576603 requiredCreateAttrs = ['project_id' , 'title' , 'key' ]
577604
578605
579606class ProjectHook (GitlabObject ):
580607 _url = '/projects/%(project_id)s/hooks'
608+ requiredListAttrs = ['project_id' ]
609+ requiredGetAttrs = ['project_id' ]
581610 requiredCreateAttrs = ['project_id' , 'url' ]
582611
583612
@@ -586,6 +615,8 @@ class ProjectIssueNote(GitlabObject):
586615 _constructorTypes = {'author' : 'User' }
587616 canUpdate = False
588617 canDelete = False
618+ requiredListAttrs = ['project_id' , 'issue_id' ]
619+ requiredGetAttrs = ['project_id' , 'issue_id' ]
589620 requiredCreateAttrs = ['project_id' , 'body' ]
590621
591622
@@ -594,6 +625,8 @@ class ProjectIssue(GitlabObject):
594625 _constructorTypes = {'author' : 'User' , 'assignee' : 'User' ,
595626 'milestone' : 'ProjectMilestone' }
596627 canDelete = False
628+ requiredListAttrs = ['project_id' ]
629+ requiredGetAttrs = ['project_id' ]
597630 requiredCreateAttrs = ['project_id' , 'title' ]
598631 optionalCreateAttrs = ['description' , 'assignee_id' , 'milestone_id' ,
599632 'labels' ]
@@ -608,6 +641,8 @@ def Note(self, id=None, **kwargs):
608641class ProjectMember (GitlabObject ):
609642 _url = '/projects/%(project_id)s/members'
610643 _returnClass = User
644+ requiredListAttrs = ['project_id' ]
645+ requiredGetAttrs = ['project_id' ]
611646 requiredCreateAttrs = ['project_id' , 'user_id' , 'access_level' ]
612647
613648
@@ -616,6 +651,8 @@ class ProjectNote(GitlabObject):
616651 _constructorTypes = {'author' : 'User' }
617652 canUpdate = False
618653 canDelete = False
654+ requiredListAttrs = ['project_id' ]
655+ requiredGetAttrs = ['project_id' ]
619656 requiredCreateAttrs = ['project_id' , 'body' ]
620657
621658
@@ -625,6 +662,7 @@ class ProjectTag(GitlabObject):
625662 canDelete = False
626663 canUpdate = False
627664 canCreate = False
665+ requiredListAttrs = ['project_id' ]
628666
629667
630668class ProjectMergeRequestNote (GitlabObject ):
@@ -634,12 +672,15 @@ class ProjectMergeRequestNote(GitlabObject):
634672 canCreate = False
635673 canUpdate = False
636674 canDelete = False
675+ requiredListAttrs = ['project_id' , 'merge_request_id' ]
637676
638677
639678class ProjectMergeRequest (GitlabObject ):
640679 _url = '/projects/%(project_id)s/merge_request'
641680 _constructorTypes = {'author' : 'User' , 'assignee' : 'User' }
642681 canDelete = False
682+ requiredListAttrs = ['project_id' ]
683+ requiredGetAttrs = ['project_id' ]
643684 requiredCreateAttrs = ['project_id' , 'source_branch' , 'target_branch' , 'title' ]
644685 optionalCreateAttrs = ['assignee_id' ]
645686
@@ -653,6 +694,8 @@ def Note(self, id=None, **kwargs):
653694class ProjectMilestone (GitlabObject ):
654695 _url = '/projects/%(project_id)s/milestones'
655696 canDelete = False
697+ requiredListAttrs = ['project_id' ]
698+ requiredGetAttrs = ['project_id' ]
656699 requiredCreateAttrs = ['project_id' , 'title' ]
657700 optionalCreateAttrs = ['description' , 'due_date' ]
658701
@@ -662,12 +705,16 @@ class ProjectSnippetNote(GitlabObject):
662705 _constructorTypes = {'author' : 'User' }
663706 canUpdate = False
664707 canDelete = False
708+ requiredListAttrs = ['project_id' , 'snippet_id' ]
709+ requiredGetAttrs = ['project_id' , 'snippet_id' ]
665710 requiredCreateAttrs = ['project_id' , 'snippet_id' , 'body' ]
666711
667712
668713class ProjectSnippet (GitlabObject ):
669714 _url = '/projects/%(project_id)s/snippets'
670715 _constructorTypes = {'author' : 'User' }
716+ requiredListAttrs = ['project_id' ]
717+ requiredGetAttrs = ['project_id' ]
671718 requiredCreateAttrs = ['project_id' , 'title' , 'file_name' , 'code' ]
672719 optionalCreateAttrs = ['lifetime' ]
673720
0 commit comments