11import xml .etree .ElementTree as ET
2- from .property_decorators import property_is_enum , property_not_empty
2+ from .property_decorators import property_is_enum , property_not_empty , property_not_nullable
3+ from ..datetime_helpers import parse_datetime
34
45
56class ProjectItem (object ):
@@ -8,11 +9,16 @@ class ContentPermissions:
89 ManagedByOwner = 'ManagedByOwner'
910
1011 def __init__ (self , name , description = None , content_permissions = None , parent_id = None ):
11- self ._content_permissions = None
12+ self ._created_at = None
1213 self ._id = None
14+ self ._owner_id = None
15+ self ._owner_name = None
16+ self ._top_level_project = None
17+ self ._updated_at = None
18+
19+ self .content_permissions = content_permissions
1320 self .description = description
1421 self .name = name
15- self .content_permissions = content_permissions
1622 self .parent_id = parent_id
1723
1824 @property
@@ -24,6 +30,18 @@ def content_permissions(self):
2430 def content_permissions (self , value ):
2531 self ._content_permissions = value
2632
33+ @property
34+ def created_at (self ):
35+ return self ._created_at
36+
37+ @property
38+ def description (self ):
39+ return self ._description
40+
41+ @description .setter
42+ def description (self , value ):
43+ self ._description = value
44+
2745 @property
2846 def id (self ):
2947 return self ._id
@@ -34,32 +52,62 @@ def name(self):
3452
3553 @name .setter
3654 @property_not_empty
55+ @property_not_nullable
3756 def name (self , value ):
3857 self ._name = value
3958
59+ @property
60+ def owner_id (self ):
61+ return self ._owner_id
62+
63+ @property
64+ def owner_name (self ):
65+ return self ._owner_name
66+
67+ @property
68+ def parent_id (self ):
69+ return self ._parent_id
70+
71+ @parent_id .setter
72+ def parent_id (self , value ):
73+ self ._parent_id = value
74+
75+ @property
76+ def top_level_project (self ):
77+ return self ._top_level_project
78+
79+ @property
80+ def updated_at (self ):
81+ return self ._updated_at
82+
4083 def is_default (self ):
4184 return self .name .lower () == 'default'
4285
43- def _parse_common_tags (self , project_xml ):
44- if not isinstance (project_xml , ET .Element ):
45- project_xml = ET .fromstring (project_xml ).find ('.//t:project' , namespaces = NAMESPACE )
46-
47- if project_xml is not None :
48- (_ , name , description , content_permissions , parent_id ) = self ._parse_element (project_xml )
49- self ._set_values (None , name , description , content_permissions , parent_id )
50- return self
51-
52- def _set_values (self , project_id , name , description , content_permissions , parent_id ):
53- if project_id is not None :
54- self ._id = project_id
55- if name :
56- self ._name = name
57- if description :
58- self .description = description
59- if content_permissions :
60- self ._content_permissions = content_permissions
61- if parent_id :
62- self .parent_id = parent_id
86+ def _set_values (self , project_fields ):
87+ if 'contentPermissions' in project_fields :
88+ self ._content_permissions = project_fields ['contentPermissions' ]
89+ if 'createdAt' in project_fields :
90+ self ._created_at = parse_datetime (project_fields ['createdAt' ])
91+ if 'description' in project_fields :
92+ self ._description = project_fields ['description' ]
93+ if 'id' in project_fields :
94+ self ._id = project_fields ['id' ]
95+ if 'name' in project_fields :
96+ self ._name = project_fields ['name' ]
97+ if 'parentProjectId' in project_fields :
98+ self ._parent_id = project_fields ['parentProjectId' ]
99+ if 'topLevelProject' in project_fields :
100+ self ._top_level_project = string_to_bool (project_fields ['topLevelProject' ])
101+ if 'updatedAt' in project_fields :
102+ self ._updated_at = parse_datetime (project_fields ['updatedAt' ])
103+ if 'owner' in project_fields :
104+ owner_fields = project_fields ['owner' ]
105+ if 'id' in owner_fields :
106+ self ._owner_id = owner_fields ['id' ]
107+ if 'name' in owner_fields :
108+ self ._owner_name = owner_fields ['name' ]
109+ if self .parent_id is not None :
110+ self ._top_level_project = False
63111
64112 @classmethod
65113 def from_response (cls , resp , ns ):
@@ -68,18 +116,23 @@ def from_response(cls, resp, ns):
68116 all_project_xml = parsed_response .findall ('.//t:project' , namespaces = ns )
69117
70118 for project_xml in all_project_xml :
71- ( id , name , description , content_permissions , parent_id ) = cls ._parse_element (project_xml )
72- project_item = cls (name )
73- project_item ._set_values (id , name , description , content_permissions , parent_id )
119+ project_fields = cls ._parse_element (project_xml , ns )
120+ project_item = cls (project_fields [ ' name' ] )
121+ project_item ._set_values (project_fields )
74122 all_project_items .append (project_item )
75123 return all_project_items
76124
77125 @staticmethod
78- def _parse_element (project_xml ):
79- id = project_xml .get ('id' , None )
80- name = project_xml .get ('name' , None )
81- description = project_xml .get ('description' , None )
82- content_permissions = project_xml .get ('contentPermissions' , None )
83- parent_id = project_xml .get ('parentProjectId' , None )
84-
85- return id , name , description , content_permissions , parent_id
126+ def _parse_element (project_xml , ns ):
127+ project_fields = project_xml .attrib
128+ owner_elem = project_xml .find ('.//t:owner' , namespaces = ns )
129+ if owner_elem is not None :
130+ owner_fields = owner_elem .attrib
131+ project_fields ['owner' ] = owner_fields
132+
133+ return project_fields
134+
135+
136+ # Used to convert string represented boolean to a boolean type
137+ def string_to_bool (s ):
138+ return s .lower () == 'true'
0 commit comments