parent
448748285d
commit
8b4bf99dd4
4 changed files with 136 additions and 11 deletions
@ -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', |
||||||
|
), |
||||||
|
] |
||||||
@ -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='Пользователь'), |
||||||
|
), |
||||||
|
] |
||||||
@ -1,15 +1,52 @@ |
|||||||
from django.db import models |
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): |
from apps.course.models import Course |
||||||
COMPLETE = 'COMPLETE' |
from apps.school.models import SchoolSchedule |
||||||
CHARGEBACK = 'CHARGEBACK' |
|
||||||
REFUNDED = 'REFUNDED' |
|
||||||
ERROR = 'ERROR' |
|
||||||
PENDING = 'PENDING' |
|
||||||
|
|
||||||
transaction_id = models.PositiveIntegerField() |
User = get_user_model() |
||||||
status = models.CharField(max_length=50) |
|
||||||
product_id = models.PositiveIntegerField() |
|
||||||
created_at = models.DateTimeField(auto_now_add=True) |
class Payment(PolymorphicModel): |
||||||
updated_at = models.DateTimeField(auto_now=True) |
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 = 'Платежи за курсы' |
||||||
|
|||||||
@ -0,0 +1 @@ |
|||||||
|
Subproject commit 1b1f6c04088f5e7ab089c2179f3ab19ff8d81078 |
||||||
Loading…
Reference in new issue