diff --git a/orchestra/contrib/services/helpers.py b/orchestra/contrib/services/helpers.py index 3146dbb3..2e359d2d 100644 --- a/orchestra/contrib/services/helpers.py +++ b/orchestra/contrib/services/helpers.py @@ -1,3 +1,7 @@ +from django.utils.text import format_lazy +from django.utils.translation import ugettext_lazy + + def get_chunks(porders, ini, end, ix=0): if ix >= len(porders): return [[ini, end, []]] @@ -41,10 +45,10 @@ class Interval(object): self.ini = ini self.end = end self.order = order - + def __len__(self): return max((self.end-self.ini).days, 0) - + def __sub__(self, other): remaining = [] if self.ini < other.ini: @@ -52,13 +56,13 @@ class Interval(object): if self.end > other.end: remaining.append(Interval(max(self.ini,other.end), self.end, self.order)) return remaining - + def __repr__(self): return "".format( ini=self.ini.strftime('%Y-%-m-%-d'), end=self.end.strftime('%Y-%-m-%-d') ) - + def intersect(self, other, remaining_self=None, remaining_other=None): if remaining_self is not None: remaining_self += (self - other) @@ -69,7 +73,7 @@ class Interval(object): return result else: return None - + def intersect_set(self, others, remaining_self=None, remaining_other=None): intersections = [] for interval in others: @@ -130,3 +134,16 @@ def compensate(order, compensations): for __, compensation in ordered_intersections: remaining_compensations.append(compensation) return remaining_compensations, applied_compensations + + +def get_rate_methods_help_text(rate_class): + method_help_texts = [ + format_lazy('{}' * 4, *['
  ', method.verbose_name, ': ', method.help_text]) + for method in rate_class.get_methods().values() + ] + prefix = ugettext_lazy("Algorithm used to interprete the rating table.") + help_text_items = [prefix] + method_help_texts + return format_lazy( + '{}' * len(help_text_items), + *help_text_items + ) diff --git a/orchestra/contrib/services/models.py b/orchestra/contrib/services/models.py index 961c5c6b..5dffcb48 100644 --- a/orchestra/contrib/services/models.py +++ b/orchestra/contrib/services/models.py @@ -1,18 +1,20 @@ import calendar import decimal +from orchestra.contrib.services import helpers from django.contrib.contenttypes.models import ContentType from django.db import models from django.apps import apps from django.utils.functional import cached_property from django.utils.module_loading import autodiscover_modules -from django.utils.translation import string_concat, ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _ from orchestra.core import caches, validators from orchestra.utils.python import import_class from . import settings from .handlers import ServiceHandler +from .helpers import get_rate_methods_help_text autodiscover_modules('handlers') @@ -145,13 +147,12 @@ class Service(models.Model): (ANUAL, _("Anual data")), ), default=BILLING_PERIOD) - rate_algorithm = models.CharField(_("rate algorithm"), max_length=64, + rate_algorithm = models.CharField( + _("rate algorithm"), max_length=64, choices=rate_class.get_choices(), default=rate_class.get_default(), - help_text=string_concat(_("Algorithm used to interprete the rating table."), *[ - string_concat('
  ', method.verbose_name, ': ', method.help_text) - for name, method in rate_class.get_methods().items() - ])) + help_text=get_rate_methods_help_text(rate_class), + ) on_cancel = models.CharField(_("on cancel"), max_length=16, help_text=_("Defines the cancellation behaviour of this service."), choices=( diff --git a/orchestra/core/__init__.py b/orchestra/core/__init__.py index db2cd978..9d540eee 100644 --- a/orchestra/core/__init__.py +++ b/orchestra/core/__init__.py @@ -1,4 +1,4 @@ -from django.utils.translation import string_concat +from django.utils.text import format_lazy from ..utils.python import AttrDict @@ -7,16 +7,16 @@ class Register(object): def __init__(self, verbose_name=None): self._registry = {} self.verbose_name = verbose_name - + def __contains__(self, key): return key in self._registry - + def __getitem__(self, key): return self._registry[key] - + def __iter__(self): return iter(self._registry.values()) - + def register(self, model, **kwargs): if model in self._registry: raise KeyError("%s already registered" % model) @@ -31,14 +31,15 @@ class Register(object): } defaults.update(kwargs) self._registry[model] = AttrDict(**defaults) - + def register_view(self, view_name, **kwargs): if 'verbose_name' not in kwargs: raise KeyError("%s verbose_name is required for views" % view_name) if 'verbose_name_plural' not in kwargs: - kwargs['verbose_name_plural'] = string_concat(kwargs['verbose_name'], 's') + kwargs['verbose_name_plural'] = format_lazy('{}' * 2, *[kwargs['verbose_name'], 's']) + self.register(view_name, **kwargs) - + def get(self, *args): if args: return self._registry[args[0]]