From c8615a9c019c4c94891705099919e9d1cbf57c64 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Tue, 7 Jan 2014 12:59:34 -0500 Subject: [PATCH 01/25] Nurturing API appears to be gone, as part of deprecation of Leads API http://developers.hubspot.com/docs/methods/contacts/migration_overview --- hapi/nurturing.py | 25 --------------------- hapi/test/test_nurturing.py | 44 ------------------------------------- 2 files changed, 69 deletions(-) delete mode 100644 hapi/nurturing.py delete mode 100644 hapi/test/test_nurturing.py diff --git a/hapi/nurturing.py b/hapi/nurturing.py deleted file mode 100644 index 87889de..0000000 --- a/hapi/nurturing.py +++ /dev/null @@ -1,25 +0,0 @@ -from base import BaseClient - -NURTURING_API_VERSION = '1' - -class NurturingClient(BaseClient): - - def _get_path(self, subpath): - return 'nurture/v%s/%s' % (NURTURING_API_VERSION, subpath) - - def get_campaigns(self, **options): - return self._call('campaigns', **options) - - def get_leads(self, campaign_guid, **options): - return self._call('campaign/%s/list' % campaign_guid, **options) - - def get_history(self, lead_guid, **options): - return self._call('lead/%s' % lead_guid, **options) - - def enroll_lead(self, campaign_guid, lead_guid, **options): - return self._call('campaign/%s/add' % campaign_guid, data=lead_guid, method='POST', **options) - - def unenroll_lead(self, campaign_guid, lead_guid, **options): - return self._call('campaign/%s/remove' % campaign_guid, data=lead_guid, method='POST', **options) - - diff --git a/hapi/test/test_nurturing.py b/hapi/test/test_nurturing.py deleted file mode 100644 index d1897a4..0000000 --- a/hapi/test/test_nurturing.py +++ /dev/null @@ -1,44 +0,0 @@ -import unittest2 -import helper -from nose.plugins.attrib import attr -from hapi.nurturing import NurturingClient -from hapi.mixins.threading import PyCurlMixin - -class NurturingClientTest(unittest2.TestCase): - def setUp(self): - self.client = NurturingClient(**helper.get_options()) - - def tearDown(self): - pass - - @attr('api') - def test_get_campaigns(self): - campaigns = self.client.get_campaigns() - self._check_result(campaigns) - - def test_parallel_get_campaigns(self): - # Because the client established in setup does not have PyCurlMixin, - # make another client to handle parallel get campaigns. - # All the options are the same, except mixins is PyCurlMixin - opts = helper.get_options() - - opts['mixins'] = [PyCurlMixin] - - self.parallel_client = NurturingClient(**opts) - - self.parallel_client.get_campaigns() - self.parallel_client.get_campaigns() - - results = self.parallel_client.process_queue() - for result in results: - self.assertTrue('data' in result) - self.assertTrue('code' in result) - self._check_result(result['data']) - - def _check_result(self, campaigns): - print "\n\n------ current lead nurturing campaigns ------" - print "%s\n" % '\n'.join([str(c) for c in campaigns]) - self.assertTrue(len(campaigns)) - -if __name__ == "__main__": - unittest2.main() From 5906e01b0686a486d7e0cc7437a03611b9ea6603 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Tue, 7 Jan 2014 13:25:28 -0500 Subject: [PATCH 02/25] COS Blog API - Blogs --- hapi/cos_blog.py | 28 ++++++++++++++++++++ hapi/test/test_cos_blog.py | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 hapi/cos_blog.py create mode 100644 hapi/test/test_cos_blog.py diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py new file mode 100644 index 0000000..951ac60 --- /dev/null +++ b/hapi/cos_blog.py @@ -0,0 +1,28 @@ +from base import BaseClient +import simplejson as json + +BLOG_API_VERSION = '2' + +class COSBlogClient(BaseClient): + + # Blogs + def _get_path(self, subpath): + return 'content/api/v%s/%s' % (BLOG_API_VERSION, subpath) + + def get_blogs(self, **options): + return self._call('blogs', **options) + + def get_blog(self, blog_id, **options): + return self._call('blogs/%s' % blog_id, **options) + + def get_blog_versions(self, blog_id, **options): + return self._call('blogs/%s/versions' % blog_id, **options) + + def get_blog_version(self, blog_id, version_id, **options): + return self._call('blogs/%s/versions/%s' % (blog_id, version_id), **options) + + # Blog Posts + + # Blog Authors + + # Topics diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py new file mode 100644 index 0000000..66339f8 --- /dev/null +++ b/hapi/test/test_cos_blog.py @@ -0,0 +1,52 @@ +import unittest2 +import helper +import logger +from pprint import pprint +import simplejson as json +from hapi.cos_blog import COSBlogClient +from nose.plugins.attrib import attr + +class BlogClientTest(unittest2.TestCase): + """ + Unit tests for the HubSpot Blog API Python wrapper (hapipy) client. + + This file contains some unittest tests for the Blog API. + + Questions, comments, etc: http://docs.hubapi.com/wiki/Discussion_Group + """ + BLOG_ID = 351076997 + VERSION_ID = 12926383 + + def setUp(self): + self.client = COSBlogClient(**helper.get_options()) + + def tearDown(self): + pass + + @attr('api') + def test_get_blogs(self): + blogs = self.client.get_blogs() + self.assertTrue(len(blogs)) + pprint(blogs) + + @attr('api') + def test_get_blog(self): + blog = self.client.get_blog(self.BLOG_ID) + self.assertTrue(blog) + self.assertTrue(blog['id'] == self.BLOG_ID) + pprint(blog) + + @attr('api') + def test_get_blog_versions(self): + versions = self.client.get_blog_versions(self.BLOG_ID) + self.assertTrue(versions) + pprint(versions) + + @attr('api') + def test_get_blog_version(self): + version = self.client.get_blog_version(self.BLOG_ID, self.VERSION_ID) + self.assertTrue(version) + pprint(version) + +if __name__ == "__main__": + unittest2.main() From 8528f2d15a381284fba7b177bdcab7c7077a6aaf Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 11:35:29 -0500 Subject: [PATCH 03/25] COS Blogs API - Blog Posts - Create, List --- hapi/cos_blog.py | 48 ++++++++++++++++++++++++++++++++++++++ hapi/test/test_cos_blog.py | 14 +++++++++++ 2 files changed, 62 insertions(+) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 951ac60..a77e872 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -1,5 +1,6 @@ from base import BaseClient import simplejson as json +from urllib import urlencode BLOG_API_VERSION = '2' @@ -22,7 +23,54 @@ def get_blog_version(self, blog_id, version_id, **options): return self._call('blogs/%s/versions/%s' % (blog_id, version_id), **options) # Blog Posts + def create_post(self, content_group_id, name, blog_author_id=None, + campaign=None, campaign_name=None, footer_html=None, head_html=None, + is_draft=None, meta_description=None, meta_keyworks=None, + post_body=None, post_summary=None, publish_date=None, + publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + allowed_fields = ('blog_author_id', 'campaign', 'campaign_name', 'content_group_id', + 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keyworks', + 'name', 'post_body', 'post_summary', 'publish_date', 'publish_immediately', + 'slug', 'topic_ids', 'widgets') + + data = {} + for k in allowed_fields: + if locals().get(k) is not None: + data[k] = locals().get(k) + return self._call('blog-posts', data=json.dumps(data), method='POST', + content_type='application/json',**options) + + def get_posts(self, query={}, **options): + return self._call('blog-posts', query=urlencode(query), **options) + + # Update Blog Post + # Delete Blog Post + # Get Blog Post by ID + # Update Auto-Save Buffer + # Get Auto-Save Buffer + # Clone Blog Post + # Has Auto-Save Buffered Changes + # Publish/Unpublish Blog Post + # Push Auto-Save Buffer to Live + # Undelete Blog Post + # Validate Auto-Save Buffer Version + # List Previous Versions of Blog Post + # Restore Previous Version of Blog Post # Blog Authors + # ------------ + # Create Author + # List Authors + # Update Author + # Delete Author + # Get Author + # Undelete Author # Topics + # ------ + # Create Topic + # List Topics + # Update Topic + # Delete Topic + # Get Topic + # Undelete Topic diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 66339f8..8ee6ab4 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -23,6 +23,7 @@ def setUp(self): def tearDown(self): pass + # Blogs @attr('api') def test_get_blogs(self): blogs = self.client.get_blogs() @@ -48,5 +49,18 @@ def test_get_blog_version(self): self.assertTrue(version) pprint(version) + # Blog Posts + @attr('api') + def test_create_post(self): + post = self.client.create_post(content_group_id=self.BLOG_ID, name="Test Blog Post") + pprint(post) + self.assertTrue(post) + + @attr('api') + def test_get_posts(self): + posts = self.client.get_posts(query={'name': 'Demonstration Blog Post'}) + pprint(posts) + self.assertTrue(posts) + if __name__ == "__main__": unittest2.main() From 4b5b83e77b129a1ac8e6fe64e7cb990d9520e167 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 11:56:30 -0500 Subject: [PATCH 04/25] COS Blogs API - Blog Posts - Update --- hapi/cos_blog.py | 30 ++++++++++++++++++++++-------- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index a77e872..e4a2527 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -23,11 +23,8 @@ def get_blog_version(self, blog_id, version_id, **options): return self._call('blogs/%s/versions/%s' % (blog_id, version_id), **options) # Blog Posts - def create_post(self, content_group_id, name, blog_author_id=None, - campaign=None, campaign_name=None, footer_html=None, head_html=None, - is_draft=None, meta_description=None, meta_keyworks=None, - post_body=None, post_summary=None, publish_date=None, - publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + @staticmethod + def _post_data(**kwargs): allowed_fields = ('blog_author_id', 'campaign', 'campaign_name', 'content_group_id', 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keyworks', 'name', 'post_body', 'post_summary', 'publish_date', 'publish_immediately', @@ -35,15 +32,32 @@ def create_post(self, content_group_id, name, blog_author_id=None, data = {} for k in allowed_fields: - if locals().get(k) is not None: - data[k] = locals().get(k) + if kwargs.get(k) is not None: + data[k] = kwargs.get(k) + return data + + def create_post(self, content_group_id, name, blog_author_id=None, + campaign=None, campaign_name=None, footer_html=None, head_html=None, + is_draft=None, meta_description=None, meta_keyworks=None, + post_body=None, post_summary=None, publish_date=None, + publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + + data = self._post_data(**locals()) return self._call('blog-posts', data=json.dumps(data), method='POST', content_type='application/json',**options) def get_posts(self, query={}, **options): return self._call('blog-posts', query=urlencode(query), **options) - # Update Blog Post + def update_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, + campaign=None, campaign_name=None, footer_html=None, head_html=None, + is_draft=None, meta_description=None, meta_keyworks=None, + post_body=None, post_summary=None, publish_date=None, + publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + data = self._post_data(**locals()) + return self._call('blog-posts/%s' % blog_post_id, data=json.dumps(data), method='PUT', + content_type='application/json',**options) + # Delete Blog Post # Get Blog Post by ID # Update Auto-Save Buffer diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 8ee6ab4..cbc7676 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -62,5 +62,11 @@ def test_get_posts(self): pprint(posts) self.assertTrue(posts) + @attr('api') + def test_update_post(self): + post = self.client.update_post(blog_post_id=348109414, name="Updated Test Blog Post") + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From fd2dc7cc4689ba851ed95bfe66b7f3614af44800 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 12:03:19 -0500 Subject: [PATCH 05/25] COS Blogs API - Blog Posts - Delete --- hapi/cos_blog.py | 4 +++- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index e4a2527..5f7f357 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -58,7 +58,9 @@ def update_post(self, blog_post_id, content_group_id=None, name=None, blog_autho return self._call('blog-posts/%s' % blog_post_id, data=json.dumps(data), method='PUT', content_type='application/json',**options) - # Delete Blog Post + def delete_post(self, blog_post_id, **options): + return self._call('blog-posts/%s' % blog_post_id, method='DELETE', **options) + # Get Blog Post by ID # Update Auto-Save Buffer # Get Auto-Save Buffer diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index cbc7676..3b21935 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -68,5 +68,11 @@ def test_update_post(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_delete_post(self): + post = self.client.delete_post(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From 9c79a574950f9be64f76ffebafeed5c15e08b417 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:10:50 -0500 Subject: [PATCH 06/25] COS Blogs API - Blog Posts - Get Post, Undelete --- hapi/cos_blog.py | 7 +++++-- hapi/test/test_cos_blog.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 5f7f357..ffda2e8 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -61,14 +61,17 @@ def update_post(self, blog_post_id, content_group_id=None, name=None, blog_autho def delete_post(self, blog_post_id, **options): return self._call('blog-posts/%s' % blog_post_id, method='DELETE', **options) - # Get Blog Post by ID + def get_post(self, blog_post_id, **options): + return self._call('blog-posts/%s' % blog_post_id, **options) + # Update Auto-Save Buffer # Get Auto-Save Buffer # Clone Blog Post # Has Auto-Save Buffered Changes # Publish/Unpublish Blog Post # Push Auto-Save Buffer to Live - # Undelete Blog Post + def undelete_post(self, blog_post_id, **options): + return self._call('blog-posts/%s/restore-deleted' % blog_post_id, method='POST', **options) # Validate Auto-Save Buffer Version # List Previous Versions of Blog Post # Restore Previous Version of Blog Post diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 3b21935..ff46b6a 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -73,6 +73,21 @@ def test_delete_post(self): post = self.client.delete_post(blog_post_id=348109414) pprint(post) self.assertTrue(post) + post = self.client.undelete_post(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + + @attr('api') + def test_undelete_post(self): + post = self.client.undelete_post(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + + @attr('api') + def test_get_post(self): + post = self.client.get_post(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) if __name__ == "__main__": unittest2.main() From c7035ccce5c3932016a599236fc3e2928a8c7743 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:18:07 -0500 Subject: [PATCH 07/25] COS Blogs API - Blog Posts - Update/Get Auto-Save Buffer --- hapi/cos_blog.py | 13 ++++++++++++- hapi/test/test_cos_blog.py | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index ffda2e8..9819ad4 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -64,7 +64,18 @@ def delete_post(self, blog_post_id, **options): def get_post(self, blog_post_id, **options): return self._call('blog-posts/%s' % blog_post_id, **options) - # Update Auto-Save Buffer + def update_auto_save_buffer(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, + campaign=None, campaign_name=None, footer_html=None, head_html=None, + is_draft=None, meta_description=None, meta_keyworks=None, + post_body=None, post_summary=None, publish_date=None, + publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + data = self._post_data(**locals()) + return self._call('blog-posts/%s/buffer' % blog_post_id, data=json.dumps(data), method='PUT', + content_type='application/json',**options) + + def get_auto_save_buffer(self, blog_post_id, **options): + return self._call('blog-posts/%s/buffer' % blog_post_id, **options) + # Get Auto-Save Buffer # Clone Blog Post # Has Auto-Save Buffered Changes diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index ff46b6a..f32314c 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -89,5 +89,17 @@ def test_get_post(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_update_auto_save_buffer(self): + post = self.client.update_auto_save_buffer(blog_post_id=348109414, name="Updated Test Post Buffer") + pprint(post) + self.assertTrue(post) + + @attr('api') + def test_get_auto_save_buffer(self): + post = self.client.get_auto_save_buffer(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From 959c93bc5b0d8b98bcfa5d179ada179a1a076c29 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:23:14 -0500 Subject: [PATCH 08/25] COS Blogs API - Blog Posts - Clone Blog Post --- hapi/cos_blog.py | 11 +++++++++-- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 9819ad4..961d900 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -76,8 +76,15 @@ def update_auto_save_buffer(self, blog_post_id, content_group_id=None, name=None def get_auto_save_buffer(self, blog_post_id, **options): return self._call('blog-posts/%s/buffer' % blog_post_id, **options) - # Get Auto-Save Buffer - # Clone Blog Post + def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, + campaign=None, campaign_name=None, footer_html=None, head_html=None, + is_draft=None, meta_description=None, meta_keyworks=None, + post_body=None, post_summary=None, publish_date=None, + publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + data = self._post_data(**locals()) + return self._call('blog-posts/%s/clone' % blog_post_id, data=json.dumps(data), method='POST', + content_type='application/json',**options) + # Has Auto-Save Buffered Changes # Publish/Unpublish Blog Post # Push Auto-Save Buffer to Live diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index f32314c..035245e 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -101,5 +101,11 @@ def test_get_auto_save_buffer(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_clone_post(self): + post = self.client.clone_post(blog_post_id=348109414, name="Cloned Blog Post") + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From db90948a2764ef36cb6647bd2a21c7c082e0229b Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:25:19 -0500 Subject: [PATCH 09/25] COS Blogs API - Blog Posts - Has Buffered Changes --- hapi/cos_blog.py | 4 +++- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 961d900..b1c91a6 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -85,7 +85,9 @@ def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author return self._call('blog-posts/%s/clone' % blog_post_id, data=json.dumps(data), method='POST', content_type='application/json',**options) - # Has Auto-Save Buffered Changes + def get_buffered_changes(self, blog_post_id, **options): + return self._call('blog-posts/%s/has-buffered-changes' % blog_post_id, **options) + # Publish/Unpublish Blog Post # Push Auto-Save Buffer to Live def undelete_post(self, blog_post_id, **options): diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 035245e..d872ada 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -107,5 +107,11 @@ def test_clone_post(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_get_buffered_changes(self): + post = self.client.get_buffered_changes(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From 5045d9e653e00c76a5bc0fa57ec04817ced785bf Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:42:15 -0500 Subject: [PATCH 10/25] COS Blogs API - Blog Posts - Publish Post --- hapi/cos_blog.py | 7 ++++++- hapi/test/test_cos_blog.py | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index b1c91a6..1c7a3b2 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -88,7 +88,12 @@ def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author def get_buffered_changes(self, blog_post_id, **options): return self._call('blog-posts/%s/has-buffered-changes' % blog_post_id, **options) - # Publish/Unpublish Blog Post + def publish_post(self, blog_post_id, action, **options): + if action not in ('push-buffer-live', 'schedule-publish', 'cancel-publish'): + raise ValueError('%s is not a valid action' % action) + data = {'action': action} + return self._call('blog-posts/%s/publish-action' % blog_post_id, data=json.dumps(data), method='POST', **options) + # Push Auto-Save Buffer to Live def undelete_post(self, blog_post_id, **options): return self._call('blog-posts/%s/restore-deleted' % blog_post_id, method='POST', **options) diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index d872ada..c6044f9 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -1,11 +1,13 @@ +from __future__ import with_statement import unittest2 import helper import logger from pprint import pprint import simplejson as json -from hapi.cos_blog import COSBlogClient from nose.plugins.attrib import attr +from hapi.cos_blog import COSBlogClient + class BlogClientTest(unittest2.TestCase): """ Unit tests for the HubSpot Blog API Python wrapper (hapipy) client. @@ -113,5 +115,19 @@ def test_get_buffered_changes(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_publish_post(self): + post = self.client.publish_post(blog_post_id=348109414, action='schedule-publish') + pprint(post) + self.assertTrue(post) + post = self.client.publish_post(blog_post_id=348109414, action='push-buffer-live') + pprint(post) + self.assertTrue(post) + post = self.client.publish_post(blog_post_id=348109414, action='cancel-publish') + pprint(post) + self.assertTrue(post) + with self.assertRaises(ValueError): + self.client.publish_post(blog_post_id=348109414, action='invalid-action') + if __name__ == "__main__": unittest2.main() From 2955b8de53718c4e53929f3cd1cf98d1a2a09bde Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:45:55 -0500 Subject: [PATCH 11/25] COS Blogs API - Blog Posts - Push Buffer Live --- hapi/cos_blog.py | 4 +++- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 1c7a3b2..c5bfe91 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -94,7 +94,9 @@ def publish_post(self, blog_post_id, action, **options): data = {'action': action} return self._call('blog-posts/%s/publish-action' % blog_post_id, data=json.dumps(data), method='POST', **options) - # Push Auto-Save Buffer to Live + def push_buffer_live(self, blog_post_id, **options): + return self._call('blog-posts/%s/push-buffer-live' % blog_post_id, method='POST', **options) + def undelete_post(self, blog_post_id, **options): return self._call('blog-posts/%s/restore-deleted' % blog_post_id, method='POST', **options) # Validate Auto-Save Buffer Version diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index c6044f9..d75899d 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -129,5 +129,11 @@ def test_publish_post(self): with self.assertRaises(ValueError): self.client.publish_post(blog_post_id=348109414, action='invalid-action') + @attr('api') + def test_push_buffer_live(self): + post = self.client.push_buffer_live(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From f0bd6c2b3e155a91b616d681902e239daf9e23f9 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:48:32 -0500 Subject: [PATCH 12/25] COS Blogs API - Blog Posts - Validate Buffer --- hapi/cos_blog.py | 5 ++++- hapi/test/test_cos_blog.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index c5bfe91..d572ead 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -99,8 +99,11 @@ def push_buffer_live(self, blog_post_id, **options): def undelete_post(self, blog_post_id, **options): return self._call('blog-posts/%s/restore-deleted' % blog_post_id, method='POST', **options) - # Validate Auto-Save Buffer Version + + def validate_buffer(self, blog_post_id, **options): + return self._call('blog-posts/%s/validate-buffer' % blog_post_id, method='POST', **options) # List Previous Versions of Blog Post + # Get Previous Version of Blog Post # Restore Previous Version of Blog Post # Blog Authors diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index d75899d..527d837 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -135,5 +135,11 @@ def test_push_buffer_live(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_validate_buffer(self): + post = self.client.validate_buffer(blog_post_id=348109414) + pprint(post) + self.assertTrue(post) + if __name__ == "__main__": unittest2.main() From 80341f4e1f16f11fa505e07e1a234e647f8c7e9b Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 13:58:59 -0500 Subject: [PATCH 13/25] COS Blogs API - Blog Posts - Versioning --- hapi/cos_blog.py | 14 +++++++++++--- hapi/test/test_cos_blog.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index d572ead..3f0ea26 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -102,9 +102,17 @@ def undelete_post(self, blog_post_id, **options): def validate_buffer(self, blog_post_id, **options): return self._call('blog-posts/%s/validate-buffer' % blog_post_id, method='POST', **options) - # List Previous Versions of Blog Post - # Get Previous Version of Blog Post - # Restore Previous Version of Blog Post + + def get_post_versions(self, blog_post_id, **options): + return self._call('blog-posts/%s/versions' % blog_post_id, **options) + + def get_post_version(self, blog_post_id, version_id, **options): + return self._call('blog-posts/%s/versions/%s' % (blog_post_id, version_id), **options) + + def restore_post_version(self, blog_post_id, version_id, **options): + data = {'version_id': version_id} + return self._call('blog-posts/%s/versions/restore' % blog_post_id, data=json.dumps(data), method='POST', **options) + # Blog Authors # ------------ diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 527d837..1a85f1a 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -141,5 +141,21 @@ def test_validate_buffer(self): pprint(post) self.assertTrue(post) + @attr('api') + def test_get_post_versions(self): + response = self.client.get_post_versions(blog_post_id=348109414) + pprint(response) + self.assertTrue(response) + + version_id = response[0]['version_id'] + response = self.client.get_post_version(blog_post_id=348109414, version_id=version_id) + pprint(response) + self.assertTrue(response) + + response = self.client.restore_post_version(blog_post_id=348109414, version_id=version_id) + pprint(response) + self.assertTrue(response) + + if __name__ == "__main__": unittest2.main() From 90f58bf1623a096f77268b6a29b2fcc4508410cf Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 14:08:53 -0500 Subject: [PATCH 14/25] COS Blog API - Blogs, Blog Posts DocStrings --- hapi/cos_blog.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 3f0ea26..31e0686 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -11,15 +11,19 @@ def _get_path(self, subpath): return 'content/api/v%s/%s' % (BLOG_API_VERSION, subpath) def get_blogs(self, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blogs''' return self._call('blogs', **options) def get_blog(self, blog_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blogs_blog_id''' return self._call('blogs/%s' % blog_id, **options) def get_blog_versions(self, blog_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blogs_blog_id_versions''' return self._call('blogs/%s/versions' % blog_id, **options) def get_blog_version(self, blog_id, version_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blogs_blog_id_versions_version_id''' return self._call('blogs/%s/versions/%s' % (blog_id, version_id), **options) # Blog Posts @@ -41,12 +45,13 @@ def create_post(self, content_group_id, name, blog_author_id=None, is_draft=None, meta_description=None, meta_keyworks=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): - + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts''' data = self._post_data(**locals()) return self._call('blog-posts', data=json.dumps(data), method='POST', content_type='application/json',**options) def get_posts(self, query={}, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts''' return self._call('blog-posts', query=urlencode(query), **options) def update_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, @@ -54,14 +59,17 @@ def update_post(self, blog_post_id, content_group_id=None, name=None, blog_autho is_draft=None, meta_description=None, meta_keyworks=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_posts_blog_post_id''' data = self._post_data(**locals()) return self._call('blog-posts/%s' % blog_post_id, data=json.dumps(data), method='PUT', content_type='application/json',**options) def delete_post(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/delete_blog_posts_blog_post_id''' return self._call('blog-posts/%s' % blog_post_id, method='DELETE', **options) def get_post(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts_blog_post_id''' return self._call('blog-posts/%s' % blog_post_id, **options) def update_auto_save_buffer(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, @@ -69,11 +77,13 @@ def update_auto_save_buffer(self, blog_post_id, content_group_id=None, name=None is_draft=None, meta_description=None, meta_keyworks=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_posts_blog_post_id_buffer''' data = self._post_data(**locals()) return self._call('blog-posts/%s/buffer' % blog_post_id, data=json.dumps(data), method='PUT', content_type='application/json',**options) def get_auto_save_buffer(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts_blog_post_id_buffer''' return self._call('blog-posts/%s/buffer' % blog_post_id, **options) def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, @@ -81,35 +91,44 @@ def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author is_draft=None, meta_description=None, meta_keyworks=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_clone''' data = self._post_data(**locals()) return self._call('blog-posts/%s/clone' % blog_post_id, data=json.dumps(data), method='POST', content_type='application/json',**options) def get_buffered_changes(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts_blog_post_id_has_buffered_changes''' return self._call('blog-posts/%s/has-buffered-changes' % blog_post_id, **options) def publish_post(self, blog_post_id, action, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_publish_action''' if action not in ('push-buffer-live', 'schedule-publish', 'cancel-publish'): raise ValueError('%s is not a valid action' % action) data = {'action': action} return self._call('blog-posts/%s/publish-action' % blog_post_id, data=json.dumps(data), method='POST', **options) def push_buffer_live(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_push_buffer_live''' return self._call('blog-posts/%s/push-buffer-live' % blog_post_id, method='POST', **options) def undelete_post(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_restore_deleted''' return self._call('blog-posts/%s/restore-deleted' % blog_post_id, method='POST', **options) def validate_buffer(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_validate_buffer''' return self._call('blog-posts/%s/validate-buffer' % blog_post_id, method='POST', **options) def get_post_versions(self, blog_post_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts_blog_post_id_versions''' return self._call('blog-posts/%s/versions' % blog_post_id, **options) def get_post_version(self, blog_post_id, version_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_posts_blog_post_id_versions_version_id''' return self._call('blog-posts/%s/versions/%s' % (blog_post_id, version_id), **options) def restore_post_version(self, blog_post_id, version_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_versions_restore''' data = {'version_id': version_id} return self._call('blog-posts/%s/versions/restore' % blog_post_id, data=json.dumps(data), method='POST', **options) From 1f7fc279c420616933c54927bdb82b03fba94ed0 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 15:27:03 -0500 Subject: [PATCH 15/25] COS Blog API - Authors --- hapi/cos_blog.py | 53 ++++++++++++++++++++++++++++---------- hapi/test/test_cos_blog.py | 25 ++++++++++++++++++ 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 31e0686..df6617e 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -28,18 +28,21 @@ def get_blog_version(self, blog_id, version_id, **options): # Blog Posts @staticmethod - def _post_data(**kwargs): - allowed_fields = ('blog_author_id', 'campaign', 'campaign_name', 'content_group_id', - 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keyworks', - 'name', 'post_body', 'post_summary', 'publish_date', 'publish_immediately', - 'slug', 'topic_ids', 'widgets') - + def _args_to_dict(allowed_fields, **kwargs): data = {} for k in allowed_fields: if kwargs.get(k) is not None: data[k] = kwargs.get(k) return data + @classmethod + def _post_data(cls, **kwargs): + allowed_fields = ('blog_author_id', 'campaign', 'campaign_name', 'content_group_id', + 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keyworks', + 'name', 'post_body', 'post_summary', 'publish_date', 'publish_immediately', + 'slug', 'topic_ids', 'widgets') + return cls._args_to_dict(allowed_fields, **kwargs) + def create_post(self, content_group_id, name, blog_author_id=None, campaign=None, campaign_name=None, footer_html=None, head_html=None, is_draft=None, meta_description=None, meta_keyworks=None, @@ -134,13 +137,37 @@ def restore_post_version(self, blog_post_id, version_id, **options): # Blog Authors - # ------------ - # Create Author - # List Authors - # Update Author - # Delete Author - # Get Author - # Undelete Author + def create_author(self, email, full_name, user_id=None, username=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_authors''' + data = { + 'email': email, + 'full_name': full_name, + 'user_id': user_id, + 'username': username + } + return self._call('blog-authors', data=json.dumps(data), method='POST', content_type='application/json', **options) + + def get_authors(self, query={}, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_authors''' + return self._call('blog-authors', query=urlencode(query), **options) + + def update_author(self, author_id, email=None, full_name=None, user_id=None, username=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_authors_blog_author_id''' + data = cls._args_to_dict(('email', 'full_name', 'user_id', 'username'), **locals()) + return self._call('blog-authors/%s' % author_id, data=json.dumps(data), + method='PUT', content_type='application/json', **options) + + def delete_author(self, author_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/delete_blog_authors_blog_author_id''' + return self._call('blog-authors/%s' % author_id, method='DELETE', **options) + + def get_author(self, author_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_blog_authors_blog_author_id''' + return self._call('blog-authors/%s' % author_id, **options) + + def undelete_author(self, author_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_authors_blog_author_id_restore_deleted''' + return self._call('blog-authors/%s/restore-deleted' % author_id, method='POST', **options) # Topics # ------ diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index 1a85f1a..ad91fe2 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -156,6 +156,31 @@ def test_get_post_versions(self): pprint(response) self.assertTrue(response) + @attr('api') + def test_create_delete_author(self): + response = self.client.create_author(email='test@example.com', full_name="Another Test Author 3") + pprint(response) + self.assertTrue(response) + + author_id = response['id'] + + response = self.client.delete_author(author_id=author_id) + pprint(response) + self.assertTrue(response) + + authors = self.client.undelete_author(author_id=author_id) + pprint(authors) + self.assertTrue(authors) + + response = self.client.delete_author(author_id=author_id) + pprint(response) + self.assertTrue(response) + + @attr('api') + def test_get_authors(self): + authors = self.client.get_authors(query={'full_name': 'Hub Spot'}) + pprint(authors) + self.assertTrue(authors) if __name__ == "__main__": unittest2.main() From 997fb7701609315947384401ba6b911123bbe010 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 16:12:16 -0500 Subject: [PATCH 16/25] COS Blog API - Topics --- hapi/cos_blog.py | 36 +++++++++++++++++++------ hapi/test/test_cos_blog.py | 55 +++++++++++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index df6617e..959aa0a 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -153,7 +153,7 @@ def get_authors(self, query={}, **options): def update_author(self, author_id, email=None, full_name=None, user_id=None, username=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_authors_blog_author_id''' - data = cls._args_to_dict(('email', 'full_name', 'user_id', 'username'), **locals()) + data = self._args_to_dict(('email', 'full_name', 'user_id', 'username'), **locals()) return self._call('blog-authors/%s' % author_id, data=json.dumps(data), method='PUT', content_type='application/json', **options) @@ -170,10 +170,30 @@ def undelete_author(self, author_id, **options): return self._call('blog-authors/%s/restore-deleted' % author_id, method='POST', **options) # Topics - # ------ - # Create Topic - # List Topics - # Update Topic - # Delete Topic - # Get Topic - # Undelete Topic + def create_topic(self, name, slug, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_topics''' + data = {'name': name, 'slug': slug} + return self._call('topics', data=json.dumps(data), method='POST', **options) + + def get_topics(self, query={}, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_topics''' + return self._call('topics', query=urlencode(query), **options) + + def update_topic(self, topic_id, name=None, slug=None, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/put_topics_topic_id''' + data = self._args_to_dict(('name', 'slug'), **locals()) + return self._call('topics/%s' % topic_id, data=json.dumps(data), + method='PUT', content_type='application/json', **options) + + def delete_topic(self, topic_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/delete_topics_topic_id''' + return self._call('topics/%s' % topic_id, method='DELETE', **options) + + def get_topic(self, topic_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/get_topics_topic_id''' + return self._call('topics/%s' % topic_id, **options) + + def undelete_topic(self, topic_id, **options): + '''https://developers.hubspot.com/docs/methods/blogv2/post_topics_topic_id_restore_deleted''' + return self._call('topics/%s/restore-deleted' % topic_id, method='POST', **options) + diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index ad91fe2..c4ac7ef 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -5,6 +5,7 @@ from pprint import pprint import simplejson as json from nose.plugins.attrib import attr +from datetime import datetime from hapi.cos_blog import COSBlogClient @@ -158,12 +159,17 @@ def test_get_post_versions(self): @attr('api') def test_create_delete_author(self): - response = self.client.create_author(email='test@example.com', full_name="Another Test Author 3") + full_name = "Test Author " + datetime.now().strftime('%Y%m%d%H%M%S') + response = self.client.create_author(email='test@example.com', full_name=full_name) pprint(response) self.assertTrue(response) author_id = response['id'] + response = self.client.update_author(author_id=author_id, email="new-email@example.com") + pprint(response) + self.assertTrue(response) + response = self.client.delete_author(author_id=author_id) pprint(response) self.assertTrue(response) @@ -178,9 +184,50 @@ def test_create_delete_author(self): @attr('api') def test_get_authors(self): - authors = self.client.get_authors(query={'full_name': 'Hub Spot'}) - pprint(authors) - self.assertTrue(authors) + response = self.client.get_authors(query={'full_name': 'Hub Spot'}) + pprint(response) + self.assertTrue(response) + + author = self.client.get_author(author_id=response['objects'][0]['id']) + pprint(author) + self.assertTrue(author) + + @attr('api') + def test_get_topics(self): + response = self.client.get_topics() + pprint(response) + self.assertTrue(response) + + topic_id = response['objects'][0]['id'] + response = self.client.get_topic(topic_id=topic_id) + pprint(response) + self.assertTrue(response) + + @attr('api') + def test_create_update_delete_undelete_topic(self): + name = "Test Topic " + datetime.now().strftime('%Y%m%d%H%M%S') + response = self.client.create_topic(name=name, slug='test-topic') + pprint(response) + self.assertTrue(response) + + topic_id = response['id'] + + name = "New " + name + response = self.client.update_topic(topic_id=topic_id, name=name) + pprint(response) + self.assertTrue(response) + + response = self.client.delete_topic(topic_id=topic_id) + pprint(response) + self.assertTrue(response) + + response = self.client.undelete_topic(topic_id=topic_id) + pprint(response) + self.assertTrue(response) + + response = self.client.delete_topic(topic_id=topic_id) + pprint(response) + self.assertTrue(response) if __name__ == "__main__": unittest2.main() From dcfeda47ccea055bc3b351b536e9779665f93091 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Fri, 10 Jan 2014 16:35:23 -0500 Subject: [PATCH 17/25] Tweak the version number. Not sure if this is needed --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 4db4c28..1d89ed8 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='hapipy', - version='2.10.3', + version='2.10.3-curata-0', description="A python wrapper around HubSpot's APIs", long_description=open('README.md').read(), author='HubSpot Dev Team', From b2b36411707ddf3aa770600a3b08a311d9e86e42 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Mon, 13 Jan 2014 10:40:06 -0500 Subject: [PATCH 18/25] Download URL may have been preventing a proper GitHub install --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1d89ed8..cdd3502 100755 --- a/setup.py +++ b/setup.py @@ -8,8 +8,7 @@ long_description=open('README.md').read(), author='HubSpot Dev Team', author_email='devteam+hapi@hubspot.com', - url='https://github.com/HubSpot/hapipy', - download_url='https://github.com/HubSpot/hapipy/tarball/v2.10.3', + url='https://github.com/CurataEng/hapipy', license='LICENSE.txt', packages=['hapi', 'hapi.mixins'], install_requires=[ From 1d544c2417bdae33e6b59985e02794653b0135ef Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Wed, 15 Jan 2014 13:12:39 -0500 Subject: [PATCH 19/25] s/keyworks/keywords/g --- hapi/cos_blog.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 959aa0a..a33f8dd 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -38,14 +38,14 @@ def _args_to_dict(allowed_fields, **kwargs): @classmethod def _post_data(cls, **kwargs): allowed_fields = ('blog_author_id', 'campaign', 'campaign_name', 'content_group_id', - 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keyworks', + 'footer_html', 'head_html', 'is_draft', 'meta_description', 'meta_keywords', 'name', 'post_body', 'post_summary', 'publish_date', 'publish_immediately', 'slug', 'topic_ids', 'widgets') return cls._args_to_dict(allowed_fields, **kwargs) def create_post(self, content_group_id, name, blog_author_id=None, campaign=None, campaign_name=None, footer_html=None, head_html=None, - is_draft=None, meta_description=None, meta_keyworks=None, + is_draft=None, meta_description=None, meta_keywords=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts''' @@ -59,7 +59,7 @@ def get_posts(self, query={}, **options): def update_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, campaign=None, campaign_name=None, footer_html=None, head_html=None, - is_draft=None, meta_description=None, meta_keyworks=None, + is_draft=None, meta_description=None, meta_keywords=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_posts_blog_post_id''' @@ -77,7 +77,7 @@ def get_post(self, blog_post_id, **options): def update_auto_save_buffer(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, campaign=None, campaign_name=None, footer_html=None, head_html=None, - is_draft=None, meta_description=None, meta_keyworks=None, + is_draft=None, meta_description=None, meta_keywords=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_posts_blog_post_id_buffer''' @@ -91,7 +91,7 @@ def get_auto_save_buffer(self, blog_post_id, **options): def clone_post(self, blog_post_id, content_group_id=None, name=None, blog_author_id=None, campaign=None, campaign_name=None, footer_html=None, head_html=None, - is_draft=None, meta_description=None, meta_keyworks=None, + is_draft=None, meta_description=None, meta_keywords=None, post_body=None, post_summary=None, publish_date=None, publish_immediately=None, slug=None, topic_ids=None, widgets=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_posts_blog_post_id_clone''' From 5db674c1f105e2ea5ab337a7d57b612c93d79fd8 Mon Sep 17 00:00:00 2001 From: Dan Craig Date: Wed, 15 Jan 2014 17:46:57 -0500 Subject: [PATCH 20/25] Slug may not actually be required --- hapi/cos_blog.py | 6 ++++-- hapi/test/test_cos_blog.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index a33f8dd..659eec6 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -170,9 +170,11 @@ def undelete_author(self, author_id, **options): return self._call('blog-authors/%s/restore-deleted' % author_id, method='POST', **options) # Topics - def create_topic(self, name, slug, **options): + def create_topic(self, name, slug=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/post_topics''' - data = {'name': name, 'slug': slug} + data = {'name': name} + if slug: + data['slug'] = slug return self._call('topics', data=json.dumps(data), method='POST', **options) def get_topics(self, query={}, **options): diff --git a/hapi/test/test_cos_blog.py b/hapi/test/test_cos_blog.py index c4ac7ef..8bc1a54 100644 --- a/hapi/test/test_cos_blog.py +++ b/hapi/test/test_cos_blog.py @@ -206,7 +206,7 @@ def test_get_topics(self): @attr('api') def test_create_update_delete_undelete_topic(self): name = "Test Topic " + datetime.now().strftime('%Y%m%d%H%M%S') - response = self.client.create_topic(name=name, slug='test-topic') + response = self.client.create_topic(name=name) pprint(response) self.assertTrue(response) From a137f1cd52f55a23bcde55b4b9409a5a1ce8ecaa Mon Sep 17 00:00:00 2001 From: Rick Petithory Date: Thu, 30 Jul 2015 13:09:41 -0400 Subject: [PATCH 21/25] Add override for blog-authors API call path --- hapi/cos_blog.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 659eec6..f90c4da 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -5,9 +5,16 @@ BLOG_API_VERSION = '2' class COSBlogClient(BaseClient): - + # Blogs def _get_path(self, subpath): + path_overrides = { + 'blog-authors': '/blogs/v3/blog-authors' + } + + if subpath in path_overrides: + return path_overrides.get(subpath) + return 'content/api/v%s/%s' % (BLOG_API_VERSION, subpath) def get_blogs(self, **options): From 745486914bafd3fe6842729a6db9201a071e3176 Mon Sep 17 00:00:00 2001 From: Rick Petithory Date: Thu, 30 Jul 2015 14:08:50 -0400 Subject: [PATCH 22/25] Bump version # --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index cdd3502..3fef9ec 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='hapipy', - version='2.10.3-curata-0', + version='2.10.4-curata-0', description="A python wrapper around HubSpot's APIs", long_description=open('README.md').read(), author='HubSpot Dev Team', From 0508ff2c1c7a63fea55b2a221f9342d336f4234f Mon Sep 17 00:00:00 2001 From: Rick Petithory Date: Thu, 30 Jul 2015 14:42:28 -0400 Subject: [PATCH 23/25] Switch to camelcase for v3 params --- hapi/cos_blog.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index f90c4da..752c230 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -148,8 +148,8 @@ def create_author(self, email, full_name, user_id=None, username=None, **options '''https://developers.hubspot.com/docs/methods/blogv2/post_blog_authors''' data = { 'email': email, - 'full_name': full_name, - 'user_id': user_id, + 'fullName': full_name, + 'userId': user_id, 'username': username } return self._call('blog-authors', data=json.dumps(data), method='POST', content_type='application/json', **options) @@ -160,7 +160,7 @@ def get_authors(self, query={}, **options): def update_author(self, author_id, email=None, full_name=None, user_id=None, username=None, **options): '''https://developers.hubspot.com/docs/methods/blogv2/put_blog_authors_blog_author_id''' - data = self._args_to_dict(('email', 'full_name', 'user_id', 'username'), **locals()) + data = self._args_to_dict(('email', 'fullName', 'userId', 'username'), **locals()) return self._call('blog-authors/%s' % author_id, data=json.dumps(data), method='PUT', content_type='application/json', **options) From 4166038354e2d7ed3515ebac81a6762994857e9d Mon Sep 17 00:00:00 2001 From: Rick Petithory Date: Thu, 30 Jul 2015 14:49:15 -0400 Subject: [PATCH 24/25] Update version again --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index cdd3502..08b7ca5 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='hapipy', - version='2.10.3-curata-0', + version='2.10.5-curata-0', description="A python wrapper around HubSpot's APIs", long_description=open('README.md').read(), author='HubSpot Dev Team', From dc10034927b6c9efa3c3d597bf5b9d426c76f392 Mon Sep 17 00:00:00 2001 From: Rick Petithory Date: Thu, 30 Jul 2015 15:16:07 -0400 Subject: [PATCH 25/25] Use v3 API for topics as well --- hapi/cos_blog.py | 3 ++- setup.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hapi/cos_blog.py b/hapi/cos_blog.py index 752c230..4cb5bd6 100644 --- a/hapi/cos_blog.py +++ b/hapi/cos_blog.py @@ -9,7 +9,8 @@ class COSBlogClient(BaseClient): # Blogs def _get_path(self, subpath): path_overrides = { - 'blog-authors': '/blogs/v3/blog-authors' + 'blog-authors': 'blogs/v3/blog-authors', + 'topics': 'blogs/v3/topics' } if subpath in path_overrides: diff --git a/setup.py b/setup.py index 08b7ca5..e4804ed 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='hapipy', - version='2.10.5-curata-0', + version='2.10.6-curata-0', description="A python wrapper around HubSpot's APIs", long_description=open('README.md').read(), author='HubSpot Dev Team',