From 97f12875cb434529dd86d3128dc59988b66f9177 Mon Sep 17 00:00:00 2001 From: mahdavi Date: Fri, 13 Dec 2019 17:43:13 +0330 Subject: [PATCH] get application --- .gitignore | 1 - Pipfile | 1 - Pipfile.lock | 200 ++++++++++++++++++ apps/transactions/admin.py | 6 +- .../0002_transaction_application_id.py | 18 ++ apps/transactions/models.py | 6 +- apps/transactions/serializers.py | 4 +- apps/transactions/views.py | 8 +- client.py | 30 +++ deploy.sh | 2 + 10 files changed, 268 insertions(+), 8 deletions(-) create mode 100644 Pipfile.lock create mode 100644 apps/transactions/migrations/0002_transaction_application_id.py diff --git a/.gitignore b/.gitignore index 7c9917a..eaf3a0b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .idea media/* delme*.py -Pipfile.lock static *.pyc .env diff --git a/Pipfile b/Pipfile index 0e0c4c9..352b63c 100644 --- a/Pipfile +++ b/Pipfile @@ -14,7 +14,6 @@ django-filter = "*" django-cors-middleware = "*" pillow = "*" django-model-utils = "*" -gunicorn = "*" mysqlclient = "*" django-mysql = "*" python-decouple = "*" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..96bcd9d --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,200 @@ +{ + "_meta": { + "hash": { + "sha256": "22ecb352f2ea0c572bef44b919bf830243068a64c19f8f13c4d8ce21df36b3da" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "asgiref": { + "hashes": [ + "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0", + "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5" + ], + "version": "==3.2.3" + }, + "certifi": { + "hashes": [ + "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", + "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" + ], + "version": "==2019.11.28" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "django": { + "hashes": [ + "sha256:6f857bd4e574442ba35a7172f1397b303167dae964cf18e53db5e85fe248d000", + "sha256:d98c9b6e5eed147bc51f47c014ff6826bd1ab50b166956776ee13db5a58804ae" + ], + "index": "pypi", + "version": "==3.0" + }, + "django-cors-middleware": { + "hashes": [ + "sha256:85904a3401e7bc0c86502ff2b01d726917af3aaa7dafb77799b27ace637e8c92", + "sha256:bca8888ed33a94ba5472bde37ed71ec3d08231d6817fd4d799296b016073da95" + ], + "index": "pypi", + "version": "==1.4.0" + }, + "django-filter": { + "hashes": [ + "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b", + "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14" + ], + "index": "pypi", + "version": "==2.2.0" + }, + "django-model-utils": { + "hashes": [ + "sha256:3f130a262e45d73e0950d2be76af4bf4ee86804dd60e5f90afc5cd948fcfe760", + "sha256:682f58c1de330cedcda58cc85d5232c5b47a9e2cb67bef4541fb43fdaeb18e96" + ], + "index": "pypi", + "version": "==3.2.0" + }, + "django-mysql": { + "hashes": [ + "sha256:5ed13e3c4e4dc1671255bfc5a9f943320079af626a0c4d1a7f8baf276f5b9de2", + "sha256:6a6d3b2b4b094418d67cc064b110d8ac31ca98a67b535568cf829bf052c718db" + ], + "index": "pypi", + "version": "==3.2.0" + }, + "django-oauth-toolkit": { + "hashes": [ + "sha256:ad1b76275950ebbff708222cec57bbdb879f89bac7df6b9dee0f4b9db485c264" + ], + "index": "pypi", + "version": "==1.2.0" + }, + "djangorestframework": { + "hashes": [ + "sha256:5488aed8f8df5ec1d70f04b2114abc52ae6729748a176c453313834a9ee179c8", + "sha256:dc81cbf9775c6898a580f6f1f387c4777d12bd87abf0f5406018d32ccae71090" + ], + "index": "pypi", + "version": "==3.10.3" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "markdown": { + "hashes": [ + "sha256:2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a", + "sha256:56a46ac655704b91e5b7e6326ce43d5ef72411376588afa1dd90e881b83c7e8c" + ], + "index": "pypi", + "version": "==3.1.1" + }, + "mysqlclient": { + "hashes": [ + "sha256:4c82187dd6ab3607150fbb1fa5ef4643118f3da122b8ba31c3149ddd9cf0cb39", + "sha256:9e6080a7aee4cc6a06b58b59239f20f1d259c1d2fddf68ddeed242d2311c7087", + "sha256:f3fdaa9a38752a3b214a6fe79d7cae3653731a53e577821f9187e67cbecb2e16", + "sha256:f646f8d17d02be0872291f258cce3813497bc7888cd4712a577fd1e719b2f213" + ], + "index": "pypi", + "version": "==1.4.6" + }, + "oauthlib": { + "hashes": [ + "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889", + "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea" + ], + "version": "==3.1.0" + }, + "pillow": { + "hashes": [ + "sha256:047d9473cf68af50ac85f8ee5d5f21a60f849bc17d348da7fc85711287a75031", + "sha256:0f66dc6c8a3cc319561a633b6aa82c44107f12594643efa37210d8c924fc1c71", + "sha256:12c9169c4e8fe0a7329e8658c7e488001f6b4c8e88740e76292c2b857af2e94c", + "sha256:248cffc168896982f125f5c13e9317c059f74fffdb4152893339f3be62a01340", + "sha256:27faf0552bf8c260a5cee21a76e031acaea68babb64daf7e8f2e2540745082aa", + "sha256:285edafad9bc60d96978ed24d77cdc0b91dace88e5da8c548ba5937c425bca8b", + "sha256:384b12c9aa8ef95558abdcb50aada56d74bc7cc131dd62d28c2d0e4d3aadd573", + "sha256:38950b3a707f6cef09cd3cbb142474357ad1a985ceb44d921bdf7b4647b3e13e", + "sha256:4aad1b88933fd6dc2846552b89ad0c74ddbba2f0884e2c162aa368374bf5abab", + "sha256:4ac6148008c169603070c092e81f88738f1a0c511e07bd2bb0f9ef542d375da9", + "sha256:4deb1d2a45861ae6f0b12ea0a786a03d19d29edcc7e05775b85ec2877cb54c5e", + "sha256:59aa2c124df72cc75ed72c8d6005c442d4685691a30c55321e00ed915ad1a291", + "sha256:5a47d2123a9ec86660fe0e8d0ebf0aa6bc6a17edc63f338b73ea20ba11713f12", + "sha256:5cc901c2ab9409b4b7ac7b5bcc3e86ac14548627062463da0af3b6b7c555a871", + "sha256:6c1db03e8dff7b9f955a0fb9907eb9ca5da75b5ce056c0c93d33100a35050281", + "sha256:7ce80c0a65a6ea90ef9c1f63c8593fcd2929448613fc8da0adf3e6bfad669d08", + "sha256:809c19241c14433c5d6135e1b6c72da4e3b56d5c865ad5736ab99af8896b8f41", + "sha256:83792cb4e0b5af480588601467c0764242b9a483caea71ef12d22a0d0d6bdce2", + "sha256:846fa202bd7ee0f6215c897a1d33238ef071b50766339186687bd9b7a6d26ac5", + "sha256:9f5529fc02009f96ba95bea48870173426879dc19eec49ca8e08cd63ecd82ddb", + "sha256:a423c2ea001c6265ed28700df056f75e26215fd28c001e93ef4380b0f05f9547", + "sha256:ac4428094b42907aba5879c7c000d01c8278d451a3b7cccd2103e21f6397ea75", + "sha256:b1ae48d87f10d1384e5beecd169c77502fcc04a2c00a4c02b85f0a94b419e5f9", + "sha256:bf4e972a88f8841d8fdc6db1a75e0f8d763e66e3754b03006cbc3854d89f1cb1", + "sha256:c6414f6aad598364aaf81068cabb077894eb88fed99c6a65e6e8217bab62ae7a", + "sha256:c710fcb7ee32f67baf25aa9ffede4795fd5d93b163ce95fdc724383e38c9df96", + "sha256:c7be4b8a09852291c3c48d3c25d1b876d2494a0a674980089ac9d5e0d78bd132", + "sha256:c9e5ffb910b14f090ac9c38599063e354887a5f6d7e6d26795e916b4514f2c1a", + "sha256:e0697b826da6c2472bb6488db4c0a7fa8af0d52fa08833ceb3681358914b14e5", + "sha256:e9a3edd5f714229d41057d56ac0f39ad9bdba6767e8c888c951869f0bdd129b0" + ], + "index": "pypi", + "version": "==6.2.1" + }, + "python-decouple": { + "hashes": [ + "sha256:55c546b85b0c47a15a47a4312d451a437f7344a9be3e001660bccd93b637de95" + ], + "index": "pypi", + "version": "==3.3" + }, + "pytz": { + "hashes": [ + "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d", + "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be" + ], + "version": "==2019.3" + }, + "requests": { + "hashes": [ + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + ], + "version": "==2.22.0" + }, + "sqlparse": { + "hashes": [ + "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177", + "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873" + ], + "version": "==0.3.0" + }, + "urllib3": { + "hashes": [ + "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293", + "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745" + ], + "version": "==1.25.7" + } + }, + "develop": {} +} diff --git a/apps/transactions/admin.py b/apps/transactions/admin.py index c6dec7d..c00b2ba 100755 --- a/apps/transactions/admin.py +++ b/apps/transactions/admin.py @@ -11,9 +11,11 @@ class TransactionAdmin(admin.ModelAdmin): 'create', 'last_update', 'state', - 'delay' + 'delay', + 'detail_id', + 'application_id' ] - readonly_fields = ['last_update', 'create'] + readonly_fields = ['last_update', 'create', 'detail_id', 'application_id'] admin.site.register(Transaction, TransactionAdmin) diff --git a/apps/transactions/migrations/0002_transaction_application_id.py b/apps/transactions/migrations/0002_transaction_application_id.py new file mode 100644 index 0000000..d9de4b7 --- /dev/null +++ b/apps/transactions/migrations/0002_transaction_application_id.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2019-12-13 13:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('transactions', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='transaction', + name='application_id', + field=models.IntegerField(blank=True, null=True, verbose_name='application ID'), + ), + ] diff --git a/apps/transactions/models.py b/apps/transactions/models.py index c647e6e..a52ef00 100755 --- a/apps/transactions/models.py +++ b/apps/transactions/models.py @@ -17,6 +17,7 @@ class TransactionManager(models.Manager): payer: User = None, delay=0, detail_id=None, + application_id=None, state=None): if not (isinstance(payer, User) or payer is None): raise ValidationError('payer type not valid') @@ -31,7 +32,8 @@ class TransactionManager(models.Manager): payee=payee, amount=amount, delay=delay, - detail_id=detail_id + detail_id=detail_id, + application_id=application_id ) if state: transaction.state = state @@ -58,7 +60,7 @@ class Transaction(models.Model): state = models.IntegerField(choices=STATE_CHOICES, default=STATE_CHOICES.created) create = models.DateTimeField(_('create'), blank=True, null=True, auto_now=True) last_update = models.DateTimeField(_('last update'), blank=True, null=True, auto_now=True) - type = None # invoice, charge, etc. it may be redundant + application_id = models.IntegerField("application ID", blank=True, null=True) detail_id = models.IntegerField(null=True, blank=True, unique=True) # or better detail url or res number objects = TransactionManager() diff --git a/apps/transactions/serializers.py b/apps/transactions/serializers.py index d7d7d07..80cfbe4 100755 --- a/apps/transactions/serializers.py +++ b/apps/transactions/serializers.py @@ -8,6 +8,7 @@ from .models import Transaction class TransactionSerializer(serializers.ModelSerializer): payer = PublicUserSerializer(required=False) payee = PublicUserSerializer(required=False, read_only=True) + application_id = serializers.IntegerField(required=False, read_only=True) class Meta: model = Transaction @@ -19,7 +20,8 @@ class TransactionSerializer(serializers.ModelSerializer): 'amount', 'delay', 'last_update', - 'detail_id' + 'detail_id', + 'application_id' ) read_only_fields = ['last_update', 'code', 'state', 'create', 'detail_id'] diff --git a/apps/transactions/views.py b/apps/transactions/views.py index 103469b..5d10b20 100755 --- a/apps/transactions/views.py +++ b/apps/transactions/views.py @@ -18,8 +18,14 @@ class TransactionList(generics.ListCreateAPIView): return Transaction.objects.filter(Q(payee_id=user.id) | Q(payer_id=user.id)).all() def perform_create(self, serializer): + try: + application = self.request.auth.application + application_id = application.id + except: + application_id = None + user = self.request.user - serializer.save(payee=user) + serializer.save(payee=user, application_id=application_id) class TransactionDetail(generics.RetrieveAPIView): diff --git a/client.py b/client.py index 5225c31..f2e74a8 100644 --- a/client.py +++ b/client.py @@ -115,3 +115,33 @@ class ApiClient(): path = f'users/{code}/' result = self._request(path=path) return result + + def get_transactions(self, page=None): + path = 'transactions/' + if page: + page = int(page) + path = f'{path}?page={page}' + + return self._request(path=path) + + def get_transaction(self, code): + path = f'transactions/{code}' + return self._request(path=path) + + def create_transaction(self, amount, delay, payer=None): + data = { + 'delay': delay, + 'amount': amount + } + if payer: + data.setdefault('payer', {'code': payer}) + response = self._request('transactions/', method='post', data=data) + return response and 'code' in response, response + + def pay_transaction(self, code): + path = f'transactions/{code}/pay' + return self._request(path=path) + + def receipt_transaction(self, code): + path = f'transactions/{code}/receipt' + return self._request(path=path) diff --git a/deploy.sh b/deploy.sh index fa4fa4e..3d19968 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,3 +1,5 @@ #!/usr/bin/env bash # Deployment script sudo apt-get install libmariadbclient-dev + +python manage.py migrate