class ValidatedMoneyModel(models.Model): money = MoneyField( max_digits=10, decimal_places=2, validators=[ MinMoneyValidator({"EUR": 100, "USD": 50}), MaxMoneyValidator({"EUR": 1000, "USD": 500}), MinMoneyValidator(Money(500, "NOK")), MaxMoneyValidator(Money(900, "NOK")), MinMoneyValidator(10), MaxMoneyValidator(1500), ], )
class Transaction(models.Model): balance = models.ForeignKey(Balance, on_delete=models.CASCADE) amount = MoneyField(max_digits=14, decimal_places=2, default_currency='USD', validators=[ MinMoneyValidator(0), MaxMoneyValidator(100000), MinMoneyValidator({'USD': 0}), MaxMoneyValidator({'USD': 100000}), ]) details = models.CharField(max_length=50) date_time = models.DateTimeField(auto_now=True)
class ValidatedMoneyModel(models.Model): money = MoneyField(max_digits=10, decimal_places=2, validators=[ MinMoneyValidator({ 'EUR': 100, 'USD': 50 }), MaxMoneyValidator({ 'EUR': 1000, 'USD': 500 }), MinMoneyValidator(Money(500, 'NOK')), MaxMoneyValidator(Money(900, 'NOK')), MinMoneyValidator(10), MaxMoneyValidator(1500), ])
def __init__(self, *args, **kwargs): self.default_currency = kwargs.pop("default_currency", None) super(MoneyField, self).__init__(*args, **kwargs) # Rest Framework converts `min_value` / `max_value` to validators, that are not aware about `Money` class # We need to adjust them for idx, validator in enumerate(self.validators): if isinstance(validator, MinValueValidator): self.validators[idx] = MinMoneyValidator(self.min_value) elif isinstance(validator, MaxValueValidator): self.validators[idx] = MaxMoneyValidator(self.max_value)
class UserProfile(models.Model): user = models.OneToOneField(User, related_name='user', on_delete=models.PROTECT) photo = models.ImageField(upload_to='profile_image', blank=True) website = models.URLField(default='', blank=True) bio = models.TextField(default='', blank=True) phone = models.CharField(max_length=20, blank=True, default='') city = models.CharField(max_length=100, default='', blank=True) country = models.CharField(max_length=100, default='', blank=True) organization = models.CharField(max_length=100, default='', blank=True) Credit = MoneyField( max_digits=10, decimal_places=2, validators=[ MinMoneyValidator(0), MaxMoneyValidator(1500), MinMoneyValidator(Money(0, 'NOK')), MaxMoneyValidator(Money(900, 'NOK')), MinMoneyValidator({'EUR': 100, 'USD': 0}), MaxMoneyValidator({'EUR': 1000, 'USD': 500}), ]) def __str__(self): return str(self.user)
class PettycashReimbursementRequest(models.Model): dst = models.ForeignKey( User, help_text="Person to reemburse (usually you, yourself)", on_delete=models.CASCADE, related_name="isReimbursedTo", ) date = models.DateField(help_text="Date of expense", default=timezone.now) submitted = models.DateTimeField( help_text="Date the request was submitted", default=timezone.now, ) amount = MoneyField( max_digits=8, decimal_places=2, default_currency="EUR", validators=[ MinMoneyValidator(0), MaxMoneyValidator(settings.MAX_PAY_REIMBURSE.amount), ], help_text= "This system will only accept reimbursement up to %s. Above that; contact the trustees directly (%s)" % (settings.MAX_PAY_REIMBURSE.amount, settings.TRUSTEES), ) viaTheBank = models.BooleanField( default=False, help_text= "Check this box if you want to be paid via a IBAN/SEPA transfer; otherwise the amount will be credited to your Makerspace petty cash acount", ) description = models.CharField( max_length=300, help_text="Description / omschrijving van waarvoor deze betaling is", ) scan = StdImageField( upload_to=upload_to_pattern, delete_orphans=True, variations=settings.IMG_VARIATIONS, validators=settings.IMG_VALIDATORS, blank=True, null=True, help_text="Scan, photo or similar of the receipt", ) history = HistoricalRecords()
class Transaction(models.Model): STATUS = (('SUCCESS', 'Success'), ('FAILED', 'Failed'), ('PENDING', 'Pending')) SERVICES = ( ('P2P', 'Pochi to Pochi'), ('DEPOSIT', 'Deposit'), ('WITHDRAW', 'Withdraw'), ('BONUS', 'Bonus'), ('FEES', 'Fees'), ) full_timestamp = models.DateTimeField(auto_now_add=True) profile_id = models.CharField(max_length=10, db_index=True) account = models.CharField(max_length=13, db_index=True) msisdn = models.CharField(max_length=10, db_index=True, default='NA') trans_id = models.CharField(max_length=25, default='NA') service = models.CharField(max_length=8, db_index=True, choices=SERVICES) channel = models.CharField(max_length=25, db_index=True, default='NA') mode = models.CharField(max_length=6, db_index=True, choices=MODES, default='POCHI') dst_account = models.CharField(max_length=25, db_index=True, default='NA') amount = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS', validators=[ MinMoneyValidator({ 'TZS': 1000, 'USD': 50 }), MaxMoneyValidator({ 'TZS': 1000000000, 'USD': 1000000 }), ]) charge = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS') reference = models.CharField(max_length=15, db_index=True, default='NA') status = models.CharField(max_length=7, choices=STATUS, default='PENDING') result_code = models.CharField(max_length=3, default='111', db_index=True) message = models.TextField(max_length=1024, default='NA') processed_timestamp = models.DateTimeField(null=True)
class CashOut(models.Model): STATUS = (('SUCCESS', 'Success'), ('FAILED', 'Failed'), ('PENDING', 'Pending')) ext_entity = models.CharField(max_length=100) ext_acc_no = models.CharField(max_length=30, default='NA') amount = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS', validators=[ MinMoneyValidator({ 'TZS': 1000, 'USD': 50 }), MaxMoneyValidator({ 'TZS': 1000000000, 'USD': 1000000 }), ]) status = models.CharField(max_length=8, choices=STATUS, default='PENDING') result = models.CharField(max_length=3, default='111', db_index=True) message = models.TextField(max_length=1024, default='NA') reference = models.CharField(max_length=15, db_index=True, default='NA') ext_trans_id = models.CharField(max_length=25, default='NA')
class Ledger(models.Model): TYPES = (('DEBIT', 'Debit'), ('CREDIT', 'Credit')) full_timestamp = models.DateTimeField(auto_now_add=True) profile_id = models.CharField(max_length=10, db_index=True) account = models.CharField(max_length=13, db_index=True) trans_type = models.CharField(max_length=10, choices=TYPES) mode = models.CharField(max_length=6, db_index=True, choices=MODES, default='POCHI') amount = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS', validators=[ MinMoneyValidator({ 'TZS': 1000, 'USD': 50 }), MaxMoneyValidator({ 'TZS': 1000000000, 'USD': 1000000 }), ]) trans_id = models.CharField(max_length=25, default='NA') reference = models.CharField(max_length=15, db_index=True, default='NA') available_o_bal = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS') available_c_bal = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS') current_o_bal = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS') current_c_bal = MoneyField(max_digits=10, decimal_places=2, default_currency='TZS')
class Ride(models.Model): # id = serial number postedTime = models.DateTimeField('Posted Date') rideDate = models.DateField('Ride Date') rideTime = models.TimeField('Ride Departure Time:') rideStartLoc = LocationField('Departure location', map_attrs={ 'center': [38.034887, -78.504832], 'marker_color': 'blue', 'placeholder': 'Pick a location below' }, null=True) startAddress = models.CharField('Start location', max_length=500, default='') rideEndLoc = LocationField('Destination', map_attrs={ 'center': [38.034887, -78.504832], 'marker_color': 'blue' }, null=True) endAddress = models.CharField(max_length=500, default='') generalDest = models.CharField(max_length=500, default='') riderRequests = models.ManyToManyField(Rider, related_name='+') riderList = models.ManyToManyField(Rider, related_name='+') spacesAvailable = models.IntegerField('Spaces Available', default=0) cost = MoneyField( decimal_places=2, default=0, max_digits=5, default_currency='USD', validators=[MinMoneyValidator(0), MaxMoneyValidator(1000)]) details = models.TextField('Additional details for riders (optional)', blank=True, default='') driver = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True) #feedback = models.ManyToManyField("self") def feedback_list(self): return list(self.feedback.all()) def was_published_recently(self): return self.postedTime >= timezone.now() - datetime.timedelta(days=1) def has_rideDate(self): return self.rideDate != None def has_rideTime(self): return self.rideTime != None def has_rideTime(self): return self.rideTime != None def in_past(self): return (self.rideDate < datetime.date.today()) def is_current(self): return (self.rideDate > datetime.date.today() or (self.rideTime > datetime.datetime.now().time() and self.rideDate == datetime.date.today())) def has_space(self): return (self.spacesAvailable > 0) def has_endLoc(self): return self.rideEndLoc != None def __str__(self): # __unicode__ on Python 2 return (self.generalDest)