Source code for richy.staking.models
import shutil
from datetime import date
from pathlib import Path
from django.conf import settings
from django.db import models
from django.template.defaultfilters import date as date_filter
from ..core.models import (
Item,
UserRelatedManager,
UserRelatedModel,
UserRelatedQuerySet,
)
from ..transactions.models import AttachmentMixin, Exchange, Transaction
def get_staking_attachment_dir(instance, filename):
return Path("staking") / str(instance.staking.pk) / filename
[docs]
class StakingQuerySet(UserRelatedQuerySet):
def open(self):
return self.filter(end__gte=date.today())
def closed(self):
return self.filter(end__lt=date.today())
def sold(self):
return self.filter(is_sold=True)
def not_sold(self):
return self.filter(is_sold=False)
[docs]
class StakingManager(UserRelatedManager):
def get_queryset(self):
return StakingQuerySet(self.model, using=self._db)
def open(self):
return self.get_queryset().filter(end__gte=date.today())
def closed(self):
return self.get_queryset().filter(end__lt=date.today())
def sold(self):
return self.get_queryset().filter(is_sold=True)
def not_sold(self):
return self.get_queryset().filter(is_sold=False)
[docs]
class Staking(UserRelatedModel):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
exchange = models.ForeignKey(Exchange, on_delete=models.PROTECT)
start = models.DateField()
end = models.DateField()
amount = models.FloatField()
reward_amount = models.FloatField()
# TODO: Should be mandatory once gifts are introduced.
transaction = models.ForeignKey(
Transaction, on_delete=models.CASCADE, blank=True, null=True
)
note = models.TextField(blank=True, null=True)
is_sold = models.BooleanField(default=False)
objects = StakingManager()
def __str__(self):
return f"{date_filter(self.start)} - {date_filter(self.end)}, {self.amount} {self.item.symbol} ({self.exchange})"
[docs]
def delete(self, *args, **kwargs):
"""
Removes whole attachments dir.
"""
shutil.rmtree(
Path(settings.MEDIA_ROOT) / "staking" / str(self.pk),
ignore_errors=True,
)
return super().delete(*args, **kwargs)
[docs]
class Attachment(models.Model, AttachmentMixin):
staking = models.ForeignKey(Staking, on_delete=models.CASCADE)
file = models.FileField(upload_to=get_staking_attachment_dir)
def __str__(self):
return self.file.name