forked from uncloud/uncloud
		
	[BREAKING] make Order a stand-alone version
I think that while the idea of an Orderrecord is good, we might get away / have a simpler implementation if we only use orders and reference them where needed. I saved the previous Order model for easy rollback, if my assumption is wrong.
This commit is contained in:
		
					parent
					
						
							
								028f1ebe6e
							
						
					
				
			
			
				commit
				
					
						c835c874d5
					
				
			
		
					 2 changed files with 110 additions and 2 deletions
				
			
		| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					# Generated by Django 3.0.5 on 2020-05-02 20:47
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					import django.core.validators
 | 
				
			||||||
 | 
					from django.db import migrations, models
 | 
				
			||||||
 | 
					import django.db.models.deletion
 | 
				
			||||||
 | 
					import django.utils.timezone
 | 
				
			||||||
 | 
					import uuid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
 | 
				
			||||||
 | 
					        ('uncloud_pay', '0008_auto_20200502_1921'),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='order',
 | 
				
			||||||
 | 
					            name='one_time_price',
 | 
				
			||||||
 | 
					            field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='order',
 | 
				
			||||||
 | 
					            name='recurring_price',
 | 
				
			||||||
 | 
					            field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, validators=[django.core.validators.MinValueValidator(0)]),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.AddField(
 | 
				
			||||||
 | 
					            model_name='order',
 | 
				
			||||||
 | 
					            name='replaced_by',
 | 
				
			||||||
 | 
					            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='uncloud_pay.Order'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					        migrations.CreateModel(
 | 
				
			||||||
 | 
					            name='OrderTimothee',
 | 
				
			||||||
 | 
					            fields=[
 | 
				
			||||||
 | 
					                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
 | 
				
			||||||
 | 
					                ('creation_date', models.DateTimeField(auto_now_add=True)),
 | 
				
			||||||
 | 
					                ('starting_date', models.DateTimeField(default=django.utils.timezone.now)),
 | 
				
			||||||
 | 
					                ('ending_date', models.DateTimeField(blank=True, null=True)),
 | 
				
			||||||
 | 
					                ('recurring_period', models.CharField(choices=[('ONCE', 'Onetime'), ('YEAR', 'Per Year'), ('MONTH', 'Per Month'), ('WEEK', 'Per Week'), ('DAY', 'Per Day'), ('HOUR', 'Per Hour'), ('MINUTE', 'Per Minute'), ('SECOND', 'Per Second')], default='MONTH', max_length=32)),
 | 
				
			||||||
 | 
					                ('bill', models.ManyToManyField(blank=True, editable=False, to='uncloud_pay.Bill')),
 | 
				
			||||||
 | 
					                ('billing_address', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='uncloud_pay.BillingAddress')),
 | 
				
			||||||
 | 
					                ('owner', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
| 
						 | 
					@ -809,6 +809,64 @@ class Order(models.Model):
 | 
				
			||||||
                              editable=False)
 | 
					                              editable=False)
 | 
				
			||||||
    billing_address = models.ForeignKey(BillingAddress, on_delete=models.CASCADE)
 | 
					    billing_address = models.ForeignKey(BillingAddress, on_delete=models.CASCADE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # TODO: enforce ending_date - starting_date to be larger than recurring_period.
 | 
				
			||||||
 | 
					    creation_date = models.DateTimeField(auto_now_add=True)
 | 
				
			||||||
 | 
					    starting_date = models.DateTimeField(default=timezone.now)
 | 
				
			||||||
 | 
					    ending_date = models.DateTimeField(blank=True,
 | 
				
			||||||
 | 
					                                       null=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bill = models.ManyToManyField(Bill,
 | 
				
			||||||
 | 
					                                  editable=False,
 | 
				
			||||||
 | 
					                                  blank=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    recurring_period = models.CharField(max_length=32,
 | 
				
			||||||
 | 
					                              choices = RecurringPeriod.choices,
 | 
				
			||||||
 | 
					                              default = RecurringPeriod.PER_MONTH)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    one_time_price = models.DecimalField(default=0.0,
 | 
				
			||||||
 | 
					            max_digits=AMOUNT_MAX_DIGITS,
 | 
				
			||||||
 | 
					            decimal_places=AMOUNT_DECIMALS,
 | 
				
			||||||
 | 
					            validators=[MinValueValidator(0)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    recurring_price = models.DecimalField(default=0.0,
 | 
				
			||||||
 | 
					            max_digits=AMOUNT_MAX_DIGITS,
 | 
				
			||||||
 | 
					            decimal_places=AMOUNT_DECIMALS,
 | 
				
			||||||
 | 
					            validators=[MinValueValidator(0)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    replaced_by = models.ForeignKey('self',
 | 
				
			||||||
 | 
					                                    on_delete=models.PROTECT,
 | 
				
			||||||
 | 
					                                    blank=True,
 | 
				
			||||||
 | 
					                                    null=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Trigger initial bill generation at order creation.
 | 
				
			||||||
 | 
					    def save(self, *args, **kwargs):
 | 
				
			||||||
 | 
					        if self.ending_date and self.ending_date < self.starting_date:
 | 
				
			||||||
 | 
					            raise ValidationError("End date cannot be before starting date")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        super().save(*args, **kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Bill.generate_for(self.starting_date.year, self.starting_date.month, self.owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Used by uncloud_pay tests.
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def bills(self):
 | 
				
			||||||
 | 
					        return Bill.objects.filter(order=self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __str__(self):
 | 
				
			||||||
 | 
					        return "Order {} created at {}, {}->{}, recurring period {}. Price one time {}, recurring {}".format(
 | 
				
			||||||
 | 
					            self.uuid, self.creation_date,
 | 
				
			||||||
 | 
					            self.starting_date, self.ending_date,
 | 
				
			||||||
 | 
					            self.recurring_period,
 | 
				
			||||||
 | 
					            self.one_time_price,
 | 
				
			||||||
 | 
					            self.recurring_price)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OrderTimothee(models.Model):
 | 
				
			||||||
 | 
					    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
 | 
				
			||||||
 | 
					    owner = models.ForeignKey(get_user_model(),
 | 
				
			||||||
 | 
					                              on_delete=models.CASCADE,
 | 
				
			||||||
 | 
					                              editable=False)
 | 
				
			||||||
 | 
					    billing_address = models.ForeignKey(BillingAddress, on_delete=models.CASCADE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO: enforce ending_date - starting_date to be larger than recurring_period.
 | 
					    # TODO: enforce ending_date - starting_date to be larger than recurring_period.
 | 
				
			||||||
    creation_date = models.DateTimeField(auto_now_add=True)
 | 
					    creation_date = models.DateTimeField(auto_now_add=True)
 | 
				
			||||||
    starting_date = models.DateTimeField(default=timezone.now)
 | 
					    starting_date = models.DateTimeField(default=timezone.now)
 | 
				
			||||||
| 
						 | 
					@ -856,10 +914,13 @@ class Order(models.Model):
 | 
				
			||||||
              description=description)
 | 
					              description=description)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __str__(self):
 | 
					    def __str__(self):
 | 
				
			||||||
        return "Order {} created at {}, {}->{}, recurring period {}".format(
 | 
					        return "Order {} created at {}, {}->{}, recurring period {}. Price one time {}, recurring {}".format(
 | 
				
			||||||
            self.uuid, self.creation_date,
 | 
					            self.uuid, self.creation_date,
 | 
				
			||||||
            self.starting_date, self.ending_date,
 | 
					            self.starting_date, self.ending_date,
 | 
				
			||||||
            self.recurring_period)
 | 
					            self.recurring_period,
 | 
				
			||||||
 | 
					            self.one_time_price,
 | 
				
			||||||
 | 
					            self.recurring_price)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class OrderRecord(models.Model):
 | 
					class OrderRecord(models.Model):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue