diff --git a/apps/payment/migrations/0002_delete_purchase.py b/apps/payment/migrations/0002_delete_purchase.py new file mode 100644 index 00000000..047341e8 --- /dev/null +++ b/apps/payment/migrations/0002_delete_purchase.py @@ -0,0 +1,16 @@ +# Generated by Django 2.0.2 on 2018-02-20 17:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Purchase', + ), + ] diff --git a/apps/payment/migrations/0003_auto_20180220_1912.py b/apps/payment/migrations/0003_auto_20180220_1912.py new file mode 100644 index 00000000..34fec381 --- /dev/null +++ b/apps/payment/migrations/0003_auto_20180220_1912.py @@ -0,0 +1,71 @@ +# Generated by Django 2.0.2 on 2018-02-20 19:12 + +from django.conf import settings +import django.contrib.postgres.fields +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('course', '0034_auto_20180215_1503'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), + ('payment', '0002_delete_purchase'), + ] + + operations = [ + migrations.CreateModel( + name='Payment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='Итого')), + ('status', models.PositiveSmallIntegerField(choices=[(0, 'regular'), (1, 'goodwill'), (2, 'negative'), (200, 'risk under review'), (201, 'risk reviewed accepted'), (202, 'risk reviewed declined'), (203, 'risk authorization voided'), (12, 'subscription cancelation'), (13, 'subscription expired'), (14, 'subscription payment failed')], verbose_name='Статус платежа')), + ('data', django.contrib.postgres.fields.jsonb.JSONField(default={}, verbose_name='Данные платежа от провайдера')), + ], + options={ + 'verbose_name': 'Платеж', + 'verbose_name_plural': 'Платежи', + }, + ), + migrations.CreateModel( + name='CoursePayment', + fields=[ + ('payment_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='payment.Payment')), + ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Course', verbose_name='Курс')), + ], + options={ + 'verbose_name': 'Платеж за курс', + 'verbose_name_plural': 'Платежи за курсы', + }, + bases=('payment.payment',), + ), + migrations.CreateModel( + name='SchoolPayment', + fields=[ + ('payment_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='payment.Payment')), + ('weekdays', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), size=7, verbose_name='Дни недели')), + ('date_start', models.DateField(verbose_name='Дата начала подписки')), + ('date_end', models.DateField(verbose_name='Дата окончания подписки')), + ], + options={ + 'verbose_name': 'Платеж за курс', + 'verbose_name_plural': 'Платежи за курсы', + }, + bases=('payment.payment',), + ), + migrations.AddField( + model_name='payment', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_payment.payment_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='payment', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Пользователь'), + ), + ] diff --git a/apps/payment/models.py b/apps/payment/models.py index 1eaa1c6f..841ea792 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -1,15 +1,52 @@ from django.db import models +from django.contrib.auth import get_user_model +from django.contrib.postgres.fields import ArrayField, JSONField +from paymentwall import Pingback +from polymorphic.models import PolymorphicModel -class Purchase(models.Model): - COMPLETE = 'COMPLETE' - CHARGEBACK = 'CHARGEBACK' - REFUNDED = 'REFUNDED' - ERROR = 'ERROR' - PENDING = 'PENDING' +from apps.course.models import Course +from apps.school.models import SchoolSchedule - transaction_id = models.PositiveIntegerField() - status = models.CharField(max_length=50) - product_id = models.PositiveIntegerField() - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) +User = get_user_model() + + +class Payment(PolymorphicModel): + PW_STATUS_CHOICES = ( + (Pingback.PINGBACK_TYPE_REGULAR, 'regular',), + (Pingback.PINGBACK_TYPE_GOODWILL, 'goodwill',), + (Pingback.PINGBACK_TYPE_NEGATIVE, 'negative',), + (Pingback.PINGBACK_TYPE_RISK_UNDER_REVIEW, 'risk under review',), + (Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, 'risk reviewed accepted',), + (Pingback.PINGBACK_TYPE_RISK_REVIEWED_DECLINED, 'risk reviewed declined',), + (Pingback.PINGBACK_TYPE_RISK_AUTHORIZATION_VOIDED, 'risk authorization voided',), + (Pingback.PINGBACK_TYPE_SUBSCRIPTION_CANCELLATION, 'subscription cancelation',), + (Pingback.PINGBACK_TYPE_SUBSCRIPTION_EXPIRED, 'subscription expired',), + (Pingback.PINGBACK_TYPE_SUBSCRIPTION_PAYMENT_FAILED, 'subscription payment failed',), + ) + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Пользователь') + amount = models.DecimalField('Итого', max_digits=8, decimal_places=2, default=0) + status = models.PositiveSmallIntegerField('Статус платежа', choices=PW_STATUS_CHOICES) + data = JSONField('Данные платежа от провайдера', default={}) + + class Meta: + verbose_name = 'Платеж' + verbose_name_plural = 'Платежи' + + +class CoursePayment(Payment): + course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс') + + class Meta: + verbose_name = 'Платеж за курс' + verbose_name_plural = 'Платежи за курсы' + + +class SchoolPayment(Payment): + weekdays = ArrayField(models.IntegerField(), size=7, verbose_name='Дни недели') + date_start = models.DateField('Дата начала подписки') + date_end = models.DateField('Дата окончания подписки') + + class Meta: + verbose_name = 'Платеж за курс' + verbose_name_plural = 'Платежи за курсы' diff --git a/src/paymentwall b/src/paymentwall new file mode 160000 index 00000000..1b1f6c04 --- /dev/null +++ b/src/paymentwall @@ -0,0 +1 @@ +Subproject commit 1b1f6c04088f5e7ab089c2179f3ab19ff8d81078