Skip to content

Commit 65dd73e

Browse files
committedFeb 19, 2025
Updated SDK version
Updated imports for the latest sdk version Added grpcConnection pooling Added resend welcome email method
1 parent 5555164 commit 65dd73e

29 files changed

+906
-396
lines changed
 

‎.vscode/settings.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"[python]": {
3+
"editor.defaultFormatter": "ms-python.autopep8"
4+
},
5+
"python.formatting.provider": "none"
6+
}

‎coupons/create-campaign.py

+22-9
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,37 @@
11
import grpc
2-
import io.single_use_coupons.campaign_pb2 as campaign_pb2
3-
import io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
2+
import passkit_io.single_use_coupons.campaign_pb2 as campaign_pb2
3+
import passkit_io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
44

55

66
def create_campaign():
7-
# Create channel credentials
7+
# Read the CA, certificate, and private key files
8+
with open('../certs/ca-chain.pem', 'rb') as ca_file:
9+
root_certificates = ca_file.read()
10+
11+
with open('../certs/certificate.pem', 'rb') as cert_file:
12+
certificate_chain = cert_file.read()
13+
14+
with open('../certs/key.pem', 'rb') as key_file:
15+
private_key = key_file.read()
16+
17+
# Create SSL credentials for gRPC
818
credentials = grpc.ssl_channel_credentials(
9-
root_certificates='certs/certificate.pem', private_key_file='certs/key.pem', certificate_chain_file='certs/ca-chain.pem')
19+
root_certificates=root_certificates,
20+
private_key=private_key,
21+
certificate_chain=certificate_chain
22+
)
1023

11-
# Create a secure channel
12-
channel = grpc.secure_channel(
13-
'grpc.pub1.passkit.io' + ':' + '443', credentials)
24+
# Create a secure gRPC channel
25+
channel = grpc.secure_channel('grpc.pub1.passkit.io:443', credentials)
1426

1527
# Create a stub
1628
couponsStub = a_rpc_pb2_grpc.SingleUseCouponsStub(channel)
1729

1830
# Create campaign
1931
campaign = campaign_pb2.CouponCampaign()
20-
campaign.Name = "Quickstart Campaign"
21-
campaign.Status = [1, 4]
32+
campaign.name = "Quickstart Campaign"
33+
campaign.status.append("PROJECT_ACTIVE_FOR_OBJECT_CREATION")
34+
campaign.status.append("PROJECT_DRAFT")
2235
response = couponsStub.createCouponCampaign(campaign)
2336
print(response)
2437

‎coupons/create-coupon.py

+28-15
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,45 @@
11
import grpc
2-
import io.single_use_coupons.coupon_pb2 as coupon_pb2
3-
import io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
4-
import io.common.personal_pb2 as personal_pb2
2+
import passkit_io.single_use_coupons.coupon_pb2 as coupon_pb2
3+
import passkit_io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
4+
from passkit_io.common.personal_pb2 import Person
55

66

77
def create_coupon():
8-
# Create channel credentials
8+
# Read the CA, certificate, and private key files
9+
with open('../certs/ca-chain.pem', 'rb') as ca_file:
10+
root_certificates = ca_file.read()
11+
12+
with open('../certs/certificate.pem', 'rb') as cert_file:
13+
certificate_chain = cert_file.read()
14+
15+
with open('../certs/key.pem', 'rb') as key_file:
16+
private_key = key_file.read()
17+
18+
# Create SSL credentials for gRPC
919
credentials = grpc.ssl_channel_credentials(
10-
root_certificates='certs/certificate.pem', private_key_file='certs/key.pem', certificate_chain_file='certs/ca-chain.pem')
20+
root_certificates=root_certificates,
21+
private_key=private_key,
22+
certificate_chain=certificate_chain
23+
)
1124

12-
# Create a secure channel
13-
channel = grpc.secure_channel(
14-
'grpc.pub1.passkit.io' + ':' + '443', credentials)
25+
# Create a secure gRPC channel
26+
channel = grpc.secure_channel('grpc.pub1.passkit.io:443', credentials)
1527

1628
# Create a stub
1729
couponsStub = a_rpc_pb2_grpc.SingleUseCouponsStub(channel)
1830

1931
# Create coupon
2032
coupon = coupon_pb2.Coupon()
21-
coupon.OfferId = "" # Get offerId from createOffer call or dashboard
22-
coupon.CampaignId = "" # Get campaignId from createCampaign call or dashboard
23-
coupon.Sku = ""
33+
coupon.offerId = "" # Get offerId from createOffer call or dashboard
34+
coupon.campaignId = "" # Get campaignId from createCampaign call or dashboard
2435

25-
person = personal_pb2.Person()
26-
person.DisplayName = "Loyal Larry"
27-
person.EmailAddress = ""
36+
person = Person()
37+
person.displayName = "Percy PassKit"
38+
person.surname = "PassKit"
39+
person.forename = "Percy"
40+
person.emailAddress = ""
2841

29-
coupon.Person = person
42+
coupon.person.CopyFrom(person)
3043
response = couponsStub.createCoupon(coupon)
3144
print(response)
3245

‎coupons/create-offer.py

+63-45
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,32 @@
11
import grpc
2-
import io.single_use_coupons.offer_pb2 as offer_pb2
3-
import io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
4-
import io.core.a_rpc_templates_pb2_grpc as a_rpc_templates_pb2_grpc
5-
import io.common.template_pb2 as template_pb2
2+
import passkit_io.single_use_coupons.offer_pb2 as offer_pb2
3+
import passkit_io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
4+
import passkit_io.core.a_rpc_templates_pb2_grpc as a_rpc_templates_pb2_grpc
5+
import passkit_io.common.template_pb2 as template_pb2
66
import google.protobuf.timestamp_pb2 as timestamp_pb2
77
import datetime
88

99

1010
def create_offer():
11-
# Create channel credentials
11+
# Read the CA, certificate, and private key files
12+
with open('../certs/ca-chain.pem', 'rb') as ca_file:
13+
root_certificates = ca_file.read()
14+
15+
with open('../certs/certificate.pem', 'rb') as cert_file:
16+
certificate_chain = cert_file.read()
17+
18+
with open('../certs/key.pem', 'rb') as key_file:
19+
private_key = key_file.read()
20+
21+
# Create SSL credentials for gRPC
1222
credentials = grpc.ssl_channel_credentials(
13-
root_certificates='certs/certificate.pem', private_key_file='certs/key.pem', certificate_chain_file='certs/ca-chain.pem')
23+
root_certificates=root_certificates,
24+
private_key=private_key,
25+
certificate_chain=certificate_chain
26+
)
1427

15-
# Create a secure channel
16-
channel = grpc.secure_channel(
17-
'grpc.pub1.passkit.io' + ':' + '443', credentials)
28+
# Create a secure gRPC channel
29+
channel = grpc.secure_channel('grpc.pub1.passkit.io:443', credentials)
1830

1931
# Create a stub
2032
couponsStub = a_rpc_pb2_grpc.SingleUseCouponsStub(channel)
@@ -24,50 +36,56 @@ def create_offer():
2436

2537
# Create template
2638
templateRequest = template_pb2.DefaultTemplateRequest()
27-
templateRequest.Protocol = "SINGLE_USE_COUPON"
28-
templateRequest.Revision = 1
39+
templateRequest.protocol = "SINGLE_USE_COUPON"
40+
templateRequest.revision = 1
2941

3042
template = templatesStub.getDefaultTemplate(templateRequest)
3143

32-
template.Name = "Quickstart Base Offer"
33-
template.Description = "Quickstart Base Offer Pass"
34-
template.Timezone = "Europe/London"
44+
template.name = "Quickstart Base Offer"
45+
template.description = "Quickstart Base Offer Pass"
46+
template.timezone = "Europe/London"
3547

36-
templateId = templatesStub.createTemplate(template)
48+
try:
49+
response = templatesStub.createTemplate(template)
50+
print("Template " + response.id + " successfully created")
51+
except grpc.RpcError as e:
52+
print("Failed to create template", e.details())
3753

3854
# Create offer
3955
offer = offer_pb2.CouponOffer()
40-
offer.Id = "Base Offer"
41-
offer.OfferTitle = "Base Offer Title"
42-
offer.OfferShortTitle = "Base Offer"
43-
offer.OfferDetails = "Base Offer Details"
44-
offer.OfferFinePrint = "Base Offer fine print"
45-
offer.BeforeRedeemPassTemplateId(templateId.Id)
46-
47-
issueStartDate = datetime.datetime.strptime(
48-
"10/9/2023", "%d/%m/%Y").timestamp()
49-
issueEndDate = datetime.datetime.strptime(
50-
"10/11/2023", "%d/%m/%Y").timestamp()
51-
redemptionStartDate = datetime.datetime.strptime(
52-
"10/9/2023", "%d/%m/%Y").timestamp()
53-
redemptionEndDate = datetime.datetime.strptime(
54-
"10/11/2023", "%d/%m/%Y").timestamp()
55-
56+
offer.id = "Base Offer"
57+
offer.offerTitle = "Base Offer Title"
58+
offer.offerShortTitle = "Base Offer"
59+
offer.offerDetails = "Base Offer Details"
60+
offer.offerFinePrint = "Base Offer fine print"
61+
offer.beforeRedeemPassTemplateId = response.id
62+
63+
# Get current UTC time as timezone-aware datetime
64+
issueStartDate = datetime.datetime.now(datetime.timezone.utc)
65+
issueEndDate = datetime.datetime.now(datetime.timezone.utc)
66+
redemptionStartDate = datetime.datetime.now(datetime.timezone.utc)
67+
redemptionEndDate = datetime.datetime.now(datetime.timezone.utc)
68+
69+
# Convert the datetime objects to Timestamp
5670
redemptionSettings = offer_pb2.RedemptionSettings()
57-
redemptionSettings.RedemptionStartDate = timestamp_pb2.Timestamp(
58-
redemptionStartDate)
59-
redemptionSettings.RedemptionEndDate = timestamp_pb2.Timestamp(
60-
redemptionEndDate)
61-
62-
couponExpirySettings = offer_pb2.CouponExpirySettings
63-
couponExpirySettings.CouponExpiryType = "AUTO_EXPIRE_REDEMPTION_END_DATE"
64-
65-
offer.IssueStartDate = timestamp_pb2.Timestamp(issueStartDate)
66-
offer.IssueEndDate = timestamp_pb2.Timestamp(issueEndDate)
67-
offer.RedemptionSettings = redemptionSettings
68-
offer.CouponExpirySettings = couponExpirySettings
69-
offer.CampaignId = "" # Get from campaignId from createCampaign call or dashboard
70-
offer.IanaTimezone = "Europe/London"
71+
redemptionSettings.redemptionStartDate = redemptionStartDate
72+
73+
redemptionSettings.redemptionEndDate = redemptionEndDate
74+
75+
couponExpirySettings = offer_pb2.CouponExpirySettings()
76+
couponExpirySettings.couponExpiryType = "AUTO_EXPIRE_REDEMPTION_END_DATE"
77+
78+
offer.issueStartDate = issueStartDate
79+
80+
offer.issueEndDate = issueEndDate
81+
82+
# Assign settings
83+
offer.redemptionSettings.CopyFrom(redemptionSettings)
84+
offer.couponExpirySettings.CopyFrom(couponExpirySettings)
85+
offer.campaignId = "" # Get from campaignId from createCampaign call or dashboard
86+
offer.ianaTimezone = "Europe/London"
87+
88+
# Create coupon offer
7189
response = couponsStub.createCouponOffer(offer)
7290
print(response)
7391

‎coupons/list-coupons.py

+32-11
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,47 @@
11
import grpc
2-
import io.single_use_coupons.coupon_pb2 as coupon_pb2
3-
import io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
2+
import passkit_io.single_use_coupons.coupon_pb2 as coupon_pb2
3+
import passkit_io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
44

55

66
def list_coupons():
7-
# Create channel credentials
7+
# Read the CA, certificate, and private key files
8+
with open('../certs/ca-chain.pem', 'rb') as ca_file:
9+
root_certificates = ca_file.read()
10+
11+
with open('../certs/certificate.pem', 'rb') as cert_file:
12+
certificate_chain = cert_file.read()
13+
14+
with open('../certs/key.pem', 'rb') as key_file:
15+
private_key = key_file.read()
16+
17+
# Create SSL credentials for gRPC
818
credentials = grpc.ssl_channel_credentials(
9-
root_certificates='certs/certificate.pem', private_key_file='certs/key.pem', certificate_chain_file='certs/ca-chain.pem')
19+
root_certificates=root_certificates,
20+
private_key=private_key,
21+
certificate_chain=certificate_chain
22+
)
1023

11-
# Create a secure channel
12-
channel = grpc.secure_channel(
13-
'grpc.pub1.passkit.io' + ':' + '443', credentials)
24+
# Create a secure gRPC channel
25+
channel = grpc.secure_channel('grpc.pub1.passkit.io:443', credentials)
1426

1527
# Create a stub
1628
couponsStub = a_rpc_pb2_grpc.SingleUseCouponsStub(channel)
1729

1830
# List coupons by campaignId
1931
listCouponRequest = coupon_pb2.ListRequest()
20-
listCouponRequest.CouponCampaignId = "" # Campaign Id of coupons to list
21-
22-
response = couponsStub.listCouponsByCouponCampaign(listCouponRequest)
23-
print(response)
32+
listCouponRequest.couponCampaignId = "0S5FnxW9i2e0fBa8chRhBw" # Campaign Id of coupons to list
33+
34+
try:
35+
couponsList = couponsStub.listCouponsByCouponCampaign(listCouponRequest, timeout=30)
36+
for data in couponsList:
37+
# This will print each member data received from the stream
38+
print("Received:", data)
39+
40+
print("Stream ended successfully.")
41+
except grpc.RpcError as e:
42+
print(f"gRPC Error: {e.code()} - {e.details()}")
43+
except Exception as e:
44+
print(f"Error: {e}")
2445

2546

2647
list_coupons()

‎coupons/redeem-coupon.py

+21-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,36 @@
11
import grpc
2-
import io.single_use_coupons.coupon_pb2 as coupon_pb2
3-
import io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
2+
import passkit_io.single_use_coupons.coupon_pb2 as coupon_pb2
3+
import passkit_io.single_use_coupons.a_rpc_pb2_grpc as a_rpc_pb2_grpc
44

55

66
def redeem_coupon():
7-
# Create channel credentials
7+
# Read the CA, certificate, and private key files
8+
with open('../certs/ca-chain.pem', 'rb') as ca_file:
9+
root_certificates = ca_file.read()
10+
11+
with open('../certs/certificate.pem', 'rb') as cert_file:
12+
certificate_chain = cert_file.read()
13+
14+
with open('../certs/key.pem', 'rb') as key_file:
15+
private_key = key_file.read()
16+
17+
# Create SSL credentials for gRPC
818
credentials = grpc.ssl_channel_credentials(
9-
root_certificates='certs/certificate.pem', private_key_file='certs/key.pem', certificate_chain_file='certs/ca-chain.pem')
19+
root_certificates=root_certificates,
20+
private_key=private_key,
21+
certificate_chain=certificate_chain
22+
)
1023

11-
# Create a secure channel
12-
channel = grpc.secure_channel(
13-
'grpc.pub1.passkit.io' + ':' + '443', credentials)
24+
# Create a secure gRPC channel
25+
channel = grpc.secure_channel('grpc.pub1.passkit.io:443', credentials)
1426

1527
# Create a stub
1628
couponsStub = a_rpc_pb2_grpc.SingleUseCouponsStub(channel)
1729

1830
# Redeem coupon
1931
coupon = coupon_pb2.Coupon()
20-
coupon.Id = "" # Id of coupon to void
21-
coupon.CampaignId = "" # Get campaignId from createCampaign call or dashboard
22-
coupon.Status = 1
32+
coupon.id = "" # Id of coupon to void
33+
coupon.campaignId = "" # Get campaignId from createCampaign call or dashboard
2334

2435
response = couponsStub.redeemCoupon(coupon)
2536
print(response)

0 commit comments

Comments
 (0)
Please sign in to comment.