4747 REDIRECT_TYPE_MIRROR ,
4848 REDIRECT_TYPE_EXTERNAL ,
4949 REDIRECT_TYPE_INTERNAL ,
50- REDIRECT_TYPE_ALICDN )
50+ REDIRECT_TYPE_ALICDN ,
51+ NoncurrentVersionStorageTransition ,
52+ NoncurrentVersionExpiration )
5153
5254from .select_params import (SelectJsonTypes , SelectParameters )
5355
@@ -583,6 +585,10 @@ def parse_lifecycle_expiration(expiration_node):
583585 expiration .days = _find_int (expiration_node , 'Days' )
584586 elif expiration_node .find ('Date' ) is not None :
585587 expiration .date = iso8601_to_date (_find_tag (expiration_node , 'Date' ))
588+ elif expiration_node .find ('CreatedBeforeDate' ) is not None :
589+ expiration .created_before_date = iso8601_to_date (_find_tag (expiration_node , 'CreatedBeforeDate' ))
590+ elif expiration_node .find ('ExpiredObjectDeleteMarker' ) is not None :
591+ expiration .expired_detete_marker = _find_bool (expiration_node , 'ExpiredObjectDeleteMarker' )
586592
587593 return expiration
588594
@@ -629,6 +635,25 @@ def parse_lifecycle_object_taggings(lifecycle_tagging_nodes):
629635
630636 return Tagging (tagging_rule )
631637
638+ def parse_lifecycle_version_expiration (version_expiration_node ):
639+ if version_expiration_node is None :
640+ return None
641+
642+ noncurrent_days = _find_int (version_expiration_node , 'NoncurrentDays' )
643+ expiration = NoncurrentVersionExpiration (noncurrent_days )
644+
645+ return expiration
646+
647+ def parse_lifecycle_verison_storage_transitions (version_storage_transition_nodes ):
648+ version_storage_transitions = []
649+ for transition_node in version_storage_transition_nodes :
650+ storage_class = _find_tag (transition_node , 'StorageClass' )
651+ non_crurrent_days = _find_int (transition_node , 'NoncurrentDays' )
652+ version_storage_transition = NoncurrentVersionStorageTransition (non_crurrent_days , storage_class )
653+ version_storage_transitions .append (version_storage_transition )
654+
655+ return version_storage_transitions
656+
632657def parse_get_bucket_lifecycle (result , body ):
633658
634659 root = ElementTree .fromstring (body )
@@ -639,14 +664,19 @@ def parse_get_bucket_lifecycle(result, body):
639664 abort_multipart_upload = parse_lifecycle_abort_multipart_upload (rule_node .find ('AbortMultipartUpload' ))
640665 storage_transitions = parse_lifecycle_storage_transitions (rule_node .findall ('Transition' ))
641666 tagging = parse_lifecycle_object_taggings (rule_node .findall ('Tag' ))
667+ noncurrent_version_expiration = parse_lifecycle_version_expiration (rule_node .find ('NoncurrentVersionExpiration' ))
668+ noncurrent_version_sotrage_transitions = parse_lifecycle_verison_storage_transitions (rule_node .findall ('NoncurrentVersionTransition' ))
669+
642670 rule = LifecycleRule (
643671 _find_tag (rule_node , 'ID' ),
644672 _find_tag (rule_node , 'Prefix' ),
645673 status = _find_tag (rule_node , 'Status' ),
646674 expiration = expiration ,
647675 abort_multipart_upload = abort_multipart_upload ,
648676 storage_transitions = storage_transitions ,
649- tagging = tagging
677+ tagging = tagging ,
678+ noncurrent_version_expiration = noncurrent_version_expiration ,
679+ noncurrent_version_sotrage_transitions = noncurrent_version_sotrage_transitions
650680 )
651681 result .rules .append (rule )
652682
@@ -852,6 +882,8 @@ def to_put_bucket_lifecycle(bucket_lifecycle):
852882 _add_text_child (expiration_node , 'Date' , date_to_iso8601 (expiration .date ))
853883 elif expiration .created_before_date is not None :
854884 _add_text_child (expiration_node , 'CreatedBeforeDate' , date_to_iso8601 (expiration .created_before_date ))
885+ elif expiration .expired_detete_marker is not None :
886+ _add_text_child (expiration_node , 'ExpiredObjectDeleteMarker' , str (expiration .expired_detete_marker ))
855887
856888 abort_multipart_upload = rule .abort_multipart_upload
857889 if abort_multipart_upload :
@@ -880,6 +912,19 @@ def to_put_bucket_lifecycle(bucket_lifecycle):
880912 tag_node = ElementTree .SubElement (rule_node , 'Tag' )
881913 _add_text_child (tag_node , 'Key' , key )
882914 _add_text_child (tag_node , 'Value' , tagging_rule [key ])
915+
916+ noncurrent_version_expiration = rule .noncurrent_version_expiration
917+ if noncurrent_version_expiration is not None :
918+ version_expiration_node = ElementTree .SubElement (rule_node , 'NoncurrentVersionExpiration' )
919+ _add_text_child (version_expiration_node , 'NoncurrentDays' , str (noncurrent_version_expiration .noncurrent_days ))
920+
921+ noncurrent_version_sotrage_transitions = rule .noncurrent_version_sotrage_transitions
922+ if noncurrent_version_sotrage_transitions is not None :
923+ for noncurrent_version_sotrage_transition in noncurrent_version_sotrage_transitions :
924+ version_transition_node = ElementTree .SubElement (rule_node , 'NoncurrentVersionTransition' )
925+ _add_text_child (version_transition_node , 'NoncurrentDays' , str (noncurrent_version_sotrage_transition .noncurrent_days ))
926+ _add_text_child (version_transition_node , 'StorageClass' , str (noncurrent_version_sotrage_transition .storage_class ))
927+
883928 return _node_to_string (root )
884929
885930
0 commit comments