Skip to content

Commit

Permalink
Fix models for receipt format #13
Browse files Browse the repository at this point in the history
  • Loading branch information
nnsnodnb committed Jun 5, 2018
1 parent 0246cf1 commit 1dcdc5b
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 152 deletions.
10 changes: 1 addition & 9 deletions storekit/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.contrib import admin
from .models import InApp, Receipt, Response, Purchase
from .models import InApp, Receipt, Response


class InAppAdmin(admin.ModelAdmin):
Expand Down Expand Up @@ -36,11 +36,3 @@ class ResponseAdmin(admin.ModelAdmin):


admin.site.register(Response, ResponseAdmin)


class PurchaseAdmin(admin.ModelAdmin):
list_display = ('transaction_id', 'product_id', 'quantity', 'purchased_at', 'response')
list_display_links = ('transaction_id', 'product_id', 'quantity', 'purchased_at', 'response')


admin.site.register(Purchase, PurchaseAdmin)
15 changes: 6 additions & 9 deletions storekit/appstore.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from requests.exceptions import RequestException
from .errors import AppValidationError
from .models import Purchase
from .models import Response
import requests


Expand Down Expand Up @@ -40,12 +39,10 @@ def validate(self, receipt, password=None):
error = AppValidationError(api_result_errors.get(status, 'Unknown API status'), api_response)
raise error

response = api_response['response']
purchases = self._parse_receipt(api_response, response)
purchases = self._parse_receipt(api_response)
return purchases

def _parse_receipt(self, api_response, response):
if self.bundle_id != response['receipt']['bundle_id']:
error = AppValidationError('Bundle id mismatch', api_response)
raise error
return [Purchase.parser(api_response, response, in_app) for in_app in response['receipt']['in_app']]
def _parse_receipt(self, api_response):
if self.bundle_id != api_response['receipt']['bundle_id']:
raise AppValidationError('Bundle ID mismatch', api_response)
return [Response.parser(api_response, in_app) for in_app in api_response['receipt']['in_app']]
36 changes: 0 additions & 36 deletions storekit/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,39 +164,3 @@ def parser(cls, json, in_app, is_save=True):
if is_save:
obj.save()
return obj


class Purchase(models.Model):
transaction_id = models.IntegerField(blank=True)
product_id = models.CharField(blank=False, default='', max_length=255)
quantity = models.IntegerField(blank=False, default=0)
purchased_at = models.CharField(blank=False, default='', max_length=255)
response = models.ForeignKey(Response, blank=True, on_delete=models.CASCADE)

def __init__(self, transaction_id, product_id, quantity, purchased_at, response):
models.Model.__init__(self)
self.transaction_id = transaction_id
self.product_id = product_id
self.quantity = quantity
self.purchased_at = purchased_at
self.response = response

def __str__(self):
return 'Purchase: ' + str(self.transaction_id)

def __repr__(self):
return '{} <ID: {}>: "{}"'.format(self.product_id, self.id, self.__class__.__name__)

@classmethod
def parser(cls, receipt, response, in_app, is_save=True):
purchase = {
'transaction_id': receipt['transaction_id'],
'product_id': receipt['product_id'],
'quantity': int(receipt['quantity']),
'purchased_at': receipt['purchased_at'],
'response': Response.parser(response, in_app)
}
obj = cls(**purchase)
if is_save:
obj.save()
return obj
1 change: 0 additions & 1 deletion storekit/receipt.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from django.conf import settings
from .appstore import AppStoreValidator
from .errors import AppValidationError
from .models import Purchase
import logging


Expand Down
91 changes: 49 additions & 42 deletions storekit/tests/response.json
Original file line number Diff line number Diff line change
@@ -1,44 +1,51 @@
{
"transaction_id": "000000000000000",
"product_id": "com.example.test.product_1",
"quantity": "1",
"purchased_at": "2017-12-18 00:00:00 Etc/GMT",
"response": {
"status": 0,
"environment": "Sandbox",
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "com.example.test",
"application_version": "1.0.0",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2017-12-18 00:00:00 Etc/GMT",
"receipt_creation_date_ms": "0000000000000",
"receipt_creation_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"request_date": "2017-12-18 00:00:00 Etc/GMT",
"request_date_ms": "0000000000000",
"request_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_purchase_date": "2017-12-12 00:00:00 Etc/GMT",
"original_purchase_date_ms": "0000000000000",
"original_purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_application_version": "1.0",
"in_app": [
{
"quantity": "1",
"product_id": "com.example.test.product_1",
"transaction_id": "000000000000000",
"original_transaction_id": "000000000000000",
"purchase_date": "2017-12-18 00:00:00 Etc/GMT",
"purchase_date_ms": "0000000000000",
"purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_purchase_date": "2017-12-18 00:00:00 Etc/GMT",
"original_purchase_date_ms": "0000000000000",
"original_purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"is_trial_period": "false"
}
]
}
"status": 0,
"environment": "Sandbox",
"receipt": {
"receipt_type": "ProductionSandbox",
"adam_id": 0,
"app_item_id": 0,
"bundle_id": "com.example.test",
"application_version": "1.0.0",
"download_id": 0,
"version_external_identifier": 0,
"receipt_creation_date": "2017-12-18 00:00:00 Etc/GMT",
"receipt_creation_date_ms": "0000000000000",
"receipt_creation_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"request_date": "2017-12-18 00:00:00 Etc/GMT",
"request_date_ms": "0000000000000",
"request_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_purchase_date": "2017-12-12 00:00:00 Etc/GMT",
"original_purchase_date_ms": "0000000000000",
"original_purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_application_version": "1.0",
"in_app": [
{
"quantity": "1",
"product_id": "com.example.test.product_1",
"transaction_id": "000000000000000",
"original_transaction_id": "000000000000000",
"purchase_date": "2017-12-18 00:00:00 Etc/GMT",
"purchase_date_ms": "0000000000000",
"purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_purchase_date": "2017-12-18 00:00:00 Etc/GMT",
"original_purchase_date_ms": "0000000000000",
"original_purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"is_trial_period": "false"
},
{
"quantity": "1",
"product_id": "com.example.test.product_2",
"transaction_id": "000000000000000",
"original_transaction_id": "000000000000000",
"purchase_date": "2017-12-19 00:00:00 Etc/GMT",
"purchase_date_ms": "0000000000000",
"purchase_date_pst": "2017-12-16 16:00:00 America/Los_Angeles",
"original_purchase_date": "2017-12-19 00:00:00 Etc/GMT",
"original_purchase_date_ms": "0000000000000",
"original_purchase_date_pst": "2017-19-16 16:00:00 America/Los_Angeles",
"is_trial_period": "false"
}
]
}
}
}
2 changes: 1 addition & 1 deletion storekit/tests/test_appstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def test_validate_success(self):
self.assertTrue(AppStoreValidator(self.bundle_id).validate(''))

def test_validate_status_error(self):
self.response['response']['status'] = 1
self.response['status'] = 1
with mock.patch('requests.post') as mock_post:
mock_json = mock.Mock()
mock_json.json.return_value = self.response
Expand Down
56 changes: 4 additions & 52 deletions storekit/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from unittest import TestCase
from storekit.models import InApp, Receipt, Response, Purchase
from storekit.models import InApp, Receipt, Response

import json
import os.path
Expand All @@ -12,7 +12,7 @@ class InAppTest(TestCase):

def setUp(self):
with open(JSON_FILE_PATH, 'r') as f:
self.response = json.loads(f.read())['response']['receipt']['in_app'][0]
self.response = json.loads(f.read())['receipt']['in_app'][0]

def tearDown(self):
self.response = None
Expand Down Expand Up @@ -48,7 +48,7 @@ class ReceiptTest(TestCase):

def setUp(self):
with open(JSON_FILE_PATH, 'r') as f:
self.response = json.loads(f.read())['response']['receipt']
self.response = json.loads(f.read())['receipt']
self.in_app = self.response['in_app'][0]

def tearDown(self):
Expand Down Expand Up @@ -91,7 +91,7 @@ class ResponseTest(TestCase):

def setUp(self):
with open(JSON_FILE_PATH, 'r') as f:
self.response = json.loads(f.read())['response']
self.response = json.loads(f.read())
self.in_app = self.response['receipt']['in_app'][0]

def tearDown(self):
Expand Down Expand Up @@ -128,51 +128,3 @@ def test_repr(self):
)
self.assertEqual(repr(response),
'<ID: {}>: "{}"'.format(response.id, response.__class__.__name__))


class PurchaseTest(TestCase):

def setUp(self):
with open(JSON_FILE_PATH, 'r') as f:
self.receipt = json.loads(f.read())
self.response = self.receipt['response']
self.in_app = self.response['receipt']['in_app'][0]

def tearDown(self):
self.response = None
self.in_app = None

def test_new_data_save_true(self):
purchase = Purchase.parser(
self.receipt,
self.response,
in_app=self.in_app
)
self.assertTrue(purchase)

def test_new_data_save_false(self):
purchase = Purchase.parser(
self.receipt,
self.response,
in_app=self.in_app,
is_save=False
)
self.assertTrue(purchase)

def test_str(self):
purchase = Purchase.parser(
self.receipt,
self.response,
in_app=self.in_app
)
self.assertEqual(str(purchase),
'Purchase: ' + str(purchase.transaction_id))

def test_repr(self):
purchase = Purchase.parser(
self.receipt,
self.response,
in_app=self.in_app
)
self.assertEqual(repr(purchase),
'{} <ID: {}>: "{}"'.format(purchase.product_id, purchase.id, purchase.__class__.__name__))
4 changes: 2 additions & 2 deletions storekit/tests/test_receipt.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def test_success(self):
self.assertTrue(normal_receipt(receipt='', sandbox=self.sandbox))

def test_failure_status_code(self):
self.response['response']['status'] = 1
self.response['status'] = 1
with mock.patch('requests.post') as mock_post:
mock_json = mock.Mock()
mock_json.json.return_value = self.response
Expand Down Expand Up @@ -64,7 +64,7 @@ def test_success(self):
self.assertTrue(subscribe_receipt(receipt='', sandbox=self.sandbox))

def test_failure_status_code(self):
self.response['response']['status'] = 1
self.response['status'] = 1
with mock.patch('requests.post') as mock_post:
mock_json = mock.Mock()
mock_json.json.return_value = self.response
Expand Down

0 comments on commit 1dcdc5b

Please sign in to comment.