# -*- coding: utf-8 -*- from datetime import timedelta from decimal import Decimal from django import forms from django.core.exceptions import ValidationError from django.db import models from djconfig import config from djconfig.forms import ConfigForm from .models import Account class KFetConfig(object): """kfet app configuration. Enhance isolation with backend used to store config. Usable after DjConfig middleware was called. """ prefix = 'kfet_' def __getattr__(self, key): if key == 'subvention_cof': # Allows accessing to the reduction as a subvention # Other reason: backward compatibility reduction_mult = 1 - self.reduction_cof / 100 return (1 / reduction_mult - 1) * 100 return getattr(config, self._get_dj_key(key)) def list(self): """Get list of kfet app configuration. Returns: (key, value) for each configuration entry as list. """ return [(field.label, getattr(config, name), ) for name, field in KFetConfigForm.base_fields.items()] def _get_dj_key(self, key): return '{}{}'.format(self.prefix, key) def set(self, **kwargs): """Update configuration value(s). Args: **kwargs: Keyword arguments. Keys must be in kfet config. Config entries are updated to given values. """ # get old config new_cfg = KFetConfigForm().initial # update to new config for key, value in kwargs.items(): dj_key = self._get_dj_key(key) if isinstance(value, models.Model): new_cfg[dj_key] = value.pk else: new_cfg[dj_key] = value # save new config cfg_form = KFetConfigForm(new_cfg) if cfg_form.is_valid(): cfg_form.save() else: raise ValidationError( 'Invalid values in kfet_config.set: %(fields)s', params={'fields': list(cfg_form.errors)}) kfet_config = KFetConfig() class KFetConfigForm(ConfigForm): kfet_reduction_cof = forms.DecimalField( label='Réduction COF', initial=Decimal('20'), max_digits=6, decimal_places=2, help_text="Réduction, à donner en pourcentage, appliquée lors d'un " "achat par un-e membre du COF sur le montant en euros.", ) kfet_addcost_amount = forms.DecimalField( label='Montant de la majoration (en €)', initial=Decimal('0'), required=False, max_digits=6, decimal_places=2, ) kfet_addcost_for = forms.ModelChoiceField( label='Destinataire de la majoration', initial=None, required=False, help_text='Laissez vide pour désactiver la majoration.', queryset=(Account.objects .select_related('cofprofile', 'cofprofile__user') .all()), ) kfet_overdraft_duration = forms.DurationField( label='Durée du découvert autorisé par défaut', initial=timedelta(days=1), ) kfet_overdraft_amount = forms.DecimalField( label='Montant du découvert autorisé par défaut (en €)', initial=Decimal('20'), max_digits=6, decimal_places=2, ) kfet_cancel_duration = forms.DurationField( label='Durée pour annuler une commande sans mot de passe', initial=timedelta(minutes=5), )