diff --git a/pymongo/objectid.py b/pymongo/objectid.py index 36a463e1a..0196e8eec 100644 --- a/pymongo/objectid.py +++ b/pymongo/objectid.py @@ -65,6 +65,25 @@ class ObjectId(object): else: raise TypeError("id must be an instance of (str, ObjectId), not %s" % type(oid)) + def url_encode(self): + """Get a string representation of this ObjectId safe for use in a url. + + The reverse can be achieved using `url_decode()`. + """ + return self.__id.encode("hex") + + @classmethod + def url_decode(cls, encoded_oid): + """Create an ObjectId from an encoded hex string. + + The reverse can be achieved using `url_encode()`. + + :Parameters: + - `encoded_oid`: string encoding of an ObjectId (as created + by `url_encode()`) + """ + return cls(encoded_oid.decode("hex")) + def __str__(self): return self.__id diff --git a/test/test_objectid.py b/test/test_objectid.py index 10f0555ca..b3869dab7 100644 --- a/test/test_objectid.py +++ b/test/test_objectid.py @@ -50,5 +50,14 @@ class TestObjectId(unittest.TestCase): self.assertNotEqual(ObjectId(), ObjectId()) self.assertNotEqual(ObjectId("123456789012"), "123456789012") + def test_url(self): + a = ObjectId("123456789012") + self.assertEqual(a.url_encode(), "313233343536373839303132") + self.assertEqual(a, ObjectId.url_decode("313233343536373839303132")) + + b = ObjectId() + encoded = b.url_encode() + self.assertEqual(b, ObjectId.url_decode(encoded)) + if __name__ == "__main__": unittest.main()