@@ -82,6 +82,7 @@ <h3>All API Docs</h3>
82
82
83
83
< h1 > Source code for gcloud.datastore.helpers</ h1 > < div class ="highlight "> < pre >
84
84
< span class ="sd "> """Helper methods for dealing with Cloud Datastore's Protobuf API."""</ span >
85
+ < span class ="kn "> import</ span > < span class ="nn "> calendar</ span >
85
86
< span class ="kn "> from</ span > < span class ="nn "> datetime</ span > < span class ="kn "> import</ span > < span class ="n "> datetime</ span >
86
87
87
88
< span class ="kn "> import</ span > < span class ="nn "> pytz</ span >
@@ -119,7 +120,15 @@ <h1>Source code for gcloud.datastore.helpers</h1><div class="highlight"><pre>
119
120
< span class ="sd "> """</ span >
120
121
121
122
< span class ="k "> if</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> val</ span > < span class ="p "> ,</ span > < span class ="n "> datetime</ span > < span class ="p "> ):</ span >
122
- < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> value</ span > < span class ="o "> =</ span > < span class ="s "> 'timestamp_microseconds'</ span > < span class ="p "> ,</ span > < span class ="n "> time</ span > < span class ="o "> .</ span > < span class ="n "> mktime</ span > < span class ="p "> (</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> timetuple</ span > < span class ="p "> ())</ span >
123
+ < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="s "> 'timestamp_microseconds'</ span >
124
+ < span class ="c "> # If the datetime is naive (no timezone), consider that it was</ span >
125
+ < span class ="c "> # intended to be UTC and replace the tzinfo to that effect.</ span >
126
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> tzinfo</ span > < span class ="p "> :</ span >
127
+ < span class ="n "> val</ span > < span class ="o "> =</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> replace</ span > < span class ="p "> (</ span > < span class ="n "> tzinfo</ span > < span class ="o "> =</ span > < span class ="n "> pytz</ span > < span class ="o "> .</ span > < span class ="n "> utc</ span > < span class ="p "> )</ span >
128
+ < span class ="c "> # Regardless of what timezone is on the value, convert it to UTC.</ span >
129
+ < span class ="n "> val</ span > < span class ="o "> =</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> astimezone</ span > < span class ="p "> (</ span > < span class ="n "> pytz</ span > < span class ="o "> .</ span > < span class ="n "> utc</ span > < span class ="p "> )</ span >
130
+ < span class ="c "> # Convert the datetime to a microsecond timestamp.</ span >
131
+ < span class ="n "> value</ span > < span class ="o "> =</ span > < span class ="nb "> long</ span > < span class ="p "> (</ span > < span class ="n "> calendar</ span > < span class ="o "> .</ span > < span class ="n "> timegm</ span > < span class ="p "> (</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> timetuple</ span > < span class ="p "> ())</ span > < span class ="o "> *</ span > < span class ="mf "> 1e6</ span > < span class ="p "> )</ span > < span class ="o "> +</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> microsecond</ span >
123
132
< span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> val</ span > < span class ="p "> ,</ span > < span class ="n "> Key</ span > < span class ="p "> ):</ span >
124
133
< span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> value</ span > < span class ="o "> =</ span > < span class ="s "> 'key'</ span > < span class ="p "> ,</ span > < span class ="n "> val</ span > < span class ="o "> .</ span > < span class ="n "> to_protobuf</ span > < span class ="p "> ()</ span >
125
134
< span class ="k "> elif</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> val</ span > < span class ="p "> ,</ span > < span class ="nb "> bool</ span > < span class ="p "> ):</ span >
@@ -151,8 +160,9 @@ <h1>Source code for gcloud.datastore.helpers</h1><div class="highlight"><pre>
151
160
< span class ="sd "> """</ span >
152
161
153
162
< span class ="k "> if</ span > < span class ="n "> pb</ span > < span class ="o "> .</ span > < span class ="n "> value</ span > < span class ="o "> .</ span > < span class ="n "> HasField</ span > < span class ="p "> (</ span > < span class ="s "> 'timestamp_microseconds_value'</ span > < span class ="p "> ):</ span >
154
- < span class ="n "> timestamp</ span > < span class ="o "> =</ span > < span class ="n "> pb</ span > < span class ="o "> .</ span > < span class ="n "> value</ span > < span class ="o "> .</ span > < span class ="n "> timestamp_microseconds_value</ span > < span class ="o "> /</ span > < span class ="mf "> 1e6</ span >
155
- < span class ="k "> return</ span > < span class ="n "> datetime</ span > < span class ="o "> .</ span > < span class ="n "> fromtimestamp</ span > < span class ="p "> (</ span > < span class ="n "> timestamp</ span > < span class ="p "> )</ span > < span class ="o "> .</ span > < span class ="n "> replace</ span > < span class ="p "> (</ span > < span class ="n "> tzinfo</ span > < span class ="o "> =</ span > < span class ="n "> pytz</ span > < span class ="o "> .</ span > < span class ="n "> utc</ span > < span class ="p "> )</ span >
163
+ < span class ="n "> microseconds</ span > < span class ="o "> =</ span > < span class ="n "> pb</ span > < span class ="o "> .</ span > < span class ="n "> value</ span > < span class ="o "> .</ span > < span class ="n "> timestamp_microseconds_value</ span >
164
+ < span class ="k "> return</ span > < span class ="p "> (</ span > < span class ="n "> datetime</ span > < span class ="o "> .</ span > < span class ="n "> utcfromtimestamp</ span > < span class ="p "> (</ span > < span class ="mi "> 0</ span > < span class ="p "> )</ span > < span class ="o "> +</ span >
165
+ < span class ="n "> datetime</ span > < span class ="o "> .</ span > < span class ="n "> timedelta</ span > < span class ="p "> (</ span > < span class ="n "> microseconds</ span > < span class ="o "> =</ span > < span class ="n "> microseconds</ span > < span class ="p "> ))</ span >
156
166
157
167
< span class ="k "> elif</ span > < span class ="n "> pb</ span > < span class ="o "> .</ span > < span class ="n "> value</ span > < span class ="o "> .</ span > < span class ="n "> HasField</ span > < span class ="p "> (</ span > < span class ="s "> 'key_value'</ span > < span class ="p "> ):</ span >
158
168
< span class ="k "> return</ span > < span class ="n "> Key</ span > < span class ="o "> .</ span > < span class ="n "> from_protobuf</ span > < span class ="p "> (</ span > < span class ="n "> pb</ span > < span class ="o "> .</ span > < span class ="n "> value</ span > < span class ="o "> .</ span > < span class ="n "> key_value</ span > < span class ="p "> )</ span >
0 commit comments