Skip to content

Commit 4574334

Browse files
authored
Add Customer.subscriptions and mark CustomerSubscription.list_imported as deprecated (#125)
* Add Customer.subscriptions method * Add deprecation warning and update docs
1 parent 560efdc commit 4574334

4 files changed

Lines changed: 108 additions & 9 deletions

File tree

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,27 +149,28 @@ chartmogul.Customer.modify(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4c
149149
"state": "CA",
150150
})
151151
chartmogul.Customer.destroy(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4cb')
152+
chartmogul.Customer.subscriptions(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4cb')
152153
chartmogul.Customer.connectSubscriptions(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4cb', data={
153154
'subscriptions': [
154155
{
155156
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
156-
"external_id": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0"
157+
"uuid": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0"
157158
},
158159
{
159160
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
160-
"external_id": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4"
161+
"uuid": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4"
161162
}
162163
]
163164
})
164165
chartmogul.Customer.disconnectSubscriptions(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4cb', data={
165166
'subscriptions': [
166167
{
167168
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
168-
"external_id": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0"
169+
"uuid": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0"
169170
},
170171
{
171172
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
172-
"external_id": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4"
173+
"uuid": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4"
173174
}
174175
]
175176
})
@@ -351,6 +352,7 @@ chartmogul.SubscriptionEvent.destroy_with_params(config, data={
351352
```python
352353
import chartmogul
353354

355+
# DEPRECATED: use chartmogul.Customer.subscriptions() instead
354356
chartmogul.Subscription.list_imported(config, uuid='cus_5915ee5a-babd-406b-b8ce-d207133fb4cb')
355357
chartmogul.Subscription.cancel(config, uuid='sub_3995ee5a-bbdb-406b-a8ca-d207133fb9bb' data={'cancelled_at': ''})
356358
chartmogul.Subscription.modify(config, uuid='sub_3995ee5a-bbdb-406b-a8ca-d207133fb9bb' data={'cancellation_dates': []})

chartmogul/api/customer.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .customer_note import CustomerNote
1414
from .opportunity import Opportunity
1515
from .task import Task
16+
from .customers.subscription import CustomerSubscription
1617

1718

1819
class Address(DataObject):
@@ -80,6 +81,9 @@ def make(self, data, **kwargs):
8081
Customer.search = Customer._method("all", "get", "/customers/search")
8182
Customer.merge = Customer._method("merge", "post", "/customers/merges")
8283
Customer.unmerge = Customer._method("unmerge", "post", "/customers/unmerges")
84+
Customer.subscriptions = CustomerSubscription._method(
85+
"all", "get", "/customers/{uuid}/subscriptions", useCallerClass=True
86+
)
8387
Customer.connectSubscriptions = Customer._method(
8488
"create", "post", "/customers/{uuid}/connect_subscriptions"
8589
)

chartmogul/api/customers/subscription.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from marshmallow import Schema, fields, post_load, EXCLUDE
22
from chartmogul.resource import Resource
33
from collections import namedtuple
4+
import warnings
45

56

67
class CustomerSubscription(Resource):
@@ -61,9 +62,22 @@ def _loadJSON(cls, jsonObj):
6162

6263

6364
# /import namespace
64-
CustomerSubscription.list_imported = CustomerSubscription._method(
65+
_original_list_imported = CustomerSubscription._method(
6566
"list_imported", "get", "/import/customers{/uuid}/subscriptions"
6667
)
68+
69+
70+
@classmethod
71+
def _deprecated_list_imported(cls, config, **kwargs):
72+
warnings.warn(
73+
"CustomerSubscription.list_imported() is deprecated. Use Customer.subscriptions() instead.",
74+
DeprecationWarning,
75+
stacklevel=2
76+
)
77+
return _original_list_imported.__func__(cls, config, **kwargs)
78+
79+
80+
CustomerSubscription.list_imported = _deprecated_list_imported
6781
CustomerSubscription.cancel = CustomerSubscription._method(
6882
"cancel", "patch", "/import/subscriptions{/uuid}"
6983
)

test/api/test_customer.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
22
from chartmogul import Customer, Contact, Config, CustomerNote, Opportunity, Task
33
from chartmogul.api.customer import Attributes, Address
4+
from chartmogul.api.customers.subscription import CustomerSubscription
45
from datetime import datetime
56
from chartmogul import APIError
67
import requests_mock
@@ -394,6 +395,66 @@
394395

395396
allTasks = {"entries": [taskEntry], "cursor": "cursor==", "has_more": False}
396397

398+
allSubscriptions = {
399+
"entries": [
400+
{
401+
"id": 5322874574,
402+
"external_id": "cbdemo_ZpbKpmKUbu83EsNv",
403+
"subscription_set_external_id": "cbdemo_ZpbKpmKUbu83EsNv",
404+
"quantity": 1,
405+
"uuid": "8d80f275-a494-4957-8968-6cb68acdcfab",
406+
"mrr": 18100,
407+
"arr": 217200,
408+
"status": "active",
409+
"plan": "Professional Suite Annual(cbdemo_omnisupport-solutions)",
410+
"billing-cycle": "year",
411+
"billing-cycle-count": 1,
412+
"start-date": "2024-11-22T17:51:46+00:00",
413+
"end-date": "2026-11-23T17:51:44+00:00",
414+
"currency": "PLN",
415+
"currency-sign": "zł"
416+
},
417+
{
418+
"id": 5322874575,
419+
"external_id": "cbdemo_ZpbKpmKUbu83EsNv_cbdemo_workforce-optimizer-addon-annual",
420+
"subscription_set_external_id": "cbdemo_ZpbKpmKUbu83EsNv",
421+
"quantity": 1,
422+
"uuid": "77867070-2435-4da1-8bde-014f6817bd49",
423+
"mrr": 9048,
424+
"arr": 108576,
425+
"status": "active",
426+
"plan": "Workforce Optimizer Add-on Annual(cbdemo_omnisupport-solutions)",
427+
"billing-cycle": "year",
428+
"billing-cycle-count": 1,
429+
"start-date": "2024-11-22T17:51:46+00:00",
430+
"end-date": "2026-11-23T17:51:44+00:00",
431+
"currency": "PLN",
432+
"currency-sign": "zł"
433+
},
434+
{
435+
"id": 5322874576,
436+
"external_id": "169vEGV551MI2J0",
437+
"subscription_set_external_id": "169vEGV551MI2J0",
438+
"quantity": 1,
439+
"uuid": "a8640a5a-0d43-41c7-803e-76fc042267b0",
440+
"mrr": 19432,
441+
"arr": 233184,
442+
"status": "active",
443+
"plan": "Professional Suite Monthly(cbdemo_omnisupport-solutions)",
444+
"billing-cycle": "month",
445+
"billing-cycle-count": 1,
446+
"start-date": "2025-12-11T14:09:32+00:00",
447+
"end-date": "2026-01-11T14:09:32+00:00",
448+
"currency": "PLN",
449+
"currency-sign": "zł"
450+
}
451+
],
452+
"has_more": False,
453+
"per_page": 200,
454+
"page": 1,
455+
"cursor": "c3Vic2NyaXB0aW9uc19uZXh0X3BhZ2U9Mg=="
456+
}
457+
397458

398459
class CustomerTestCase(unittest.TestCase):
399460
"""
@@ -506,6 +567,24 @@ def test_unmerge(self, mock_requests):
506567
self.assertEqual(mock_requests.last_request.json(), jsonRequest)
507568
self.assertEqual(result, None)
508569

570+
@requests_mock.mock()
571+
def test_subscriptions(self, mock_requests):
572+
mock_requests.register_uri(
573+
"GET",
574+
"https://api.chartmogul.com/v1/customers/cus_5915ee5a-babd-406b-b8ce-d207133fb4cb/subscriptions",
575+
status_code=200,
576+
json=allSubscriptions,
577+
)
578+
579+
config = Config("token")
580+
result = Customer.subscriptions(
581+
config, uuid="cus_5915ee5a-babd-406b-b8ce-d207133fb4cb"
582+
).get()
583+
self.assertEqual(mock_requests.call_count, 1, "expected call")
584+
self.assertEqual(mock_requests.last_request.qs, {})
585+
self.assertEqual(mock_requests.last_request.text, None)
586+
self.assertTrue(isinstance(result, CustomerSubscription._many))
587+
509588
@requests_mock.mock()
510589
def test_connectSubscriptions(self, mock_requests):
511590
mock_requests.register_uri(
@@ -518,11 +597,11 @@ def test_connectSubscriptions(self, mock_requests):
518597
"subscriptions": [
519598
{
520599
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
521-
"external_id": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0",
600+
"uuid": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0",
522601
},
523602
{
524603
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
525-
"external_id": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4",
604+
"uuid": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4",
526605
},
527606
]
528607
}
@@ -547,11 +626,11 @@ def test_disconnectSubscriptions(self, mock_requests):
547626
"subscriptions": [
548627
{
549628
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
550-
"external_id": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0",
629+
"uuid": "d1c0c885-add0-48db-8fa9-0bdf5017d6b0",
551630
},
552631
{
553632
"data_source_uuid": "ds_ade45e52-47a4-231a-1ed2-eb6b9e541213",
554-
"external_id": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4",
633+
"uuid": "9db5f4a1-1695-44c0-8bd4-de7ce4d0f1d4",
555634
},
556635
]
557636
}

0 commit comments

Comments
 (0)