Source code for debits.debits_base.base

import logging
from composite_field import CompositeField
from dateutil.relativedelta import relativedelta
from django.db import models
from django.utils.translation import ugettext_lazy as _


logger = logging.getLogger('debits')
"""The logger used by Debits."""


[docs]class Period(CompositeField): """Period (for example of recurring payment or of a trial subscription). It may be expressed in days, weeks, months, or years. Several units cannot be mixed: for example, it cannot be 2 months and 13 days.""" UNIT_DAYS = 1 UNIT_WEEKS = 2 UNIT_MONTHS = 3 UNIT_YEARS = 4 period_choices = ((UNIT_DAYS, _("days")), # different processors may support a part of it (UNIT_WEEKS, _("weeks")), (UNIT_MONTHS, _("months")), (UNIT_YEARS, _("years"))) """For Django :class:`~django.forms.ChoiceField`.""" unit = models.SmallIntegerField() """days, weeks, months, or years.""" count = models.SmallIntegerField() """The number of the units""" def __init__(self, unit=None, count=None): super().__init__() if unit is not None: self['unit'].default = unit if count is not None: self['count'].default = count
# The following functions do not work as a method, because # CompositeField is replaced with composite_field.base.CompositeField.Proxy:
[docs]def period_to_string(period): """Human readable description of a period. Args: period: `Period` field. Returns: A human readable string.""" hash = {e[0]: e[1] for e in Period.period_choices} return "%d %s" % (period.count, hash[period.unit])
[docs]def period_to_delta(period): """Convert :class:`Period` to :class:`relativedelta`.""" return { Period.UNIT_DAYS: lambda: relativedelta(days=period.count), Period.UNIT_WEEKS: lambda: relativedelta(weeks=period.count), Period.UNIT_MONTHS: lambda: relativedelta(months=period.count), Period.UNIT_YEARS: lambda: relativedelta(years=period.count), }[period.unit]()