Move KFetConfigForm to kfet.config

Import in `ready` method of kfet app config of `kfet.forms` may be
annoying because it starts executing `__init__` methods of fields.
Causing failures if these methods does DB calls, as `ready` may be
called before applying migrations.
This commit is contained in:
Aurélien Delobelle 2017-10-12 13:53:48 +02:00
parent e6fab703ee
commit df7594a105
7 changed files with 51 additions and 63 deletions

View file

@ -1,11 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import (absolute_import, division,
print_function, unicode_literals)
from builtins import *
from django.apps import AppConfig from django.apps import AppConfig
class KFetConfig(AppConfig): class KFetConfig(AppConfig):
name = 'kfet' name = 'kfet'
verbose_name = "Application K-Fêt" verbose_name = "Application K-Fêt"
@ -15,5 +11,5 @@ class KFetConfig(AppConfig):
def register_config(self): def register_config(self):
import djconfig import djconfig
from kfet.forms import KFetConfigForm from .config import KFetConfigForm
djconfig.register(KFetConfigForm) djconfig.register(KFetConfigForm)

View file

@ -1,9 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import timedelta
from decimal import Decimal
from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from djconfig import config from djconfig import config
from djconfig.forms import ConfigForm
from .models import Account
class KFetConfig(object): class KFetConfig(object):
@ -19,8 +25,8 @@ class KFetConfig(object):
if key == 'subvention_cof': if key == 'subvention_cof':
# Allows accessing to the reduction as a subvention # Allows accessing to the reduction as a subvention
# Other reason: backward compatibility # Other reason: backward compatibility
reduction_mult = 1 - self.reduction_cof/100 reduction_mult = 1 - self.reduction_cof / 100
return (1/reduction_mult - 1) * 100 return (1 / reduction_mult - 1) * 100
return getattr(config, self._get_dj_key(key)) return getattr(config, self._get_dj_key(key))
def list(self): def list(self):
@ -30,8 +36,6 @@ class KFetConfig(object):
(key, value) for each configuration entry as list. (key, value) for each configuration entry as list.
""" """
# prevent circular imports
from kfet.forms import KFetConfigForm
return [(field.label, getattr(config, name), ) return [(field.label, getattr(config, name), )
for name, field in KFetConfigForm.base_fields.items()] for name, field in KFetConfigForm.base_fields.items()]
@ -46,9 +50,6 @@ class KFetConfig(object):
Config entries are updated to given values. Config entries are updated to given values.
""" """
# prevent circular imports
from kfet.forms import KFetConfigForm
# get old config # get old config
new_cfg = KFetConfigForm().initial new_cfg = KFetConfigForm().initial
# update to new config # update to new config
@ -69,3 +70,38 @@ class KFetConfig(object):
kfet_config = KFetConfig() 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),
)

View file

@ -1,6 +1,4 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import timedelta
from decimal import Decimal from decimal import Decimal
from django import forms from django import forms
@ -9,8 +7,6 @@ from django.contrib.auth.models import User
from django.forms import modelformset_factory from django.forms import modelformset_factory
from django.utils import timezone from django.utils import timezone
from djconfig.forms import ConfigForm
from kfet.models import ( from kfet.models import (
Account, Checkout, Article, OperationGroup, Operation, Account, Checkout, Article, OperationGroup, Operation,
CheckoutStatement, ArticleCategory, AccountNegative, Transfer, CheckoutStatement, ArticleCategory, AccountNegative, Transfer,
@ -370,46 +366,6 @@ class AddcostForm(forms.Form):
super(AddcostForm, self).clean() super(AddcostForm, self).clean()
# -----
# Settings forms
# -----
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),
)
class FilterHistoryForm(forms.Form): class FilterHistoryForm(forms.Form):
checkouts = forms.ModelMultipleChoiceField(queryset=Checkout.objects.all()) checkouts = forms.ModelMultipleChoiceField(queryset=Checkout.objects.all())
accounts = forms.ModelMultipleChoiceField(queryset=Account.objects.all()) accounts = forms.ModelMultipleChoiceField(queryset=Account.objects.all())

View file

@ -4,7 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
from kfet.forms import KFetConfigForm from kfet.config import KFetConfigForm
def adapt_settings(apps, schema_editor): def adapt_settings(apps, schema_editor):

View file

@ -16,7 +16,6 @@ import re
from .auth import KFET_GENERIC_TRIGRAMME from .auth import KFET_GENERIC_TRIGRAMME
from .auth.models import GenericTeamToken, Group, Permission # noqa from .auth.models import GenericTeamToken, Group, Permission # noqa
from .config import kfet_config
from .utils import to_ukf from .utils import to_ukf
def choices_length(choices): def choices_length(choices):
@ -165,6 +164,7 @@ class Account(models.Model):
return data return data
def perms_to_perform_operation(self, amount): def perms_to_perform_operation(self, amount):
from .config import kfet_config
overdraft_duration_max = kfet_config.overdraft_duration overdraft_duration_max = kfet_config.overdraft_duration
overdraft_amount_max = kfet_config.overdraft_amount overdraft_amount_max = kfet_config.overdraft_amount
perms = set() perms = set()
@ -335,6 +335,7 @@ class AccountNegative(models.Model):
@property @property
def until_default(self): def until_default(self):
from .config import kfet_config
return self.start + kfet_config.overdraft_duration return self.start + kfet_config.overdraft_duration

View file

@ -7,11 +7,10 @@ from django.core.serializers.json import DjangoJSONEncoder
from channels.channel import Group from channels.channel import Group
from channels.generic.websockets import JsonWebsocketConsumer from channels.generic.websockets import JsonWebsocketConsumer
from .config import kfet_config
def to_ukf(balance, is_cof=False): def to_ukf(balance, is_cof=False):
"""Convert euro to UKF.""" """Convert euro to UKF."""
from .config import kfet_config
subvention = kfet_config.subvention_cof subvention = kfet_config.subvention_cof
grant = (1 + subvention / 100) if is_cof else 1 grant = (1 + subvention / 100) if is_cof else 1
return math.floor(balance * 10 * grant) return math.floor(balance * 10 * grant)

View file

@ -24,7 +24,7 @@ from django.utils.decorators import method_decorator
from gestioncof.models import CofProfile from gestioncof.models import CofProfile
from kfet.config import kfet_config from kfet.config import KFetConfigForm, kfet_config
from kfet.decorators import teamkfet_required from kfet.decorators import teamkfet_required
from kfet.models import ( from kfet.models import (
Account, Checkout, Article, AccountNegative, Account, Checkout, Article, AccountNegative,
@ -40,7 +40,7 @@ from kfet.forms import (
KPsulOperationGroupForm, KPsulAccountForm, KPsulCheckoutForm, KPsulOperationGroupForm, KPsulAccountForm, KPsulCheckoutForm,
KPsulOperationFormSet, AddcostForm, FilterHistoryForm, KPsulOperationFormSet, AddcostForm, FilterHistoryForm,
TransferFormSet, InventoryArticleForm, OrderArticleForm, TransferFormSet, InventoryArticleForm, OrderArticleForm,
OrderArticleToInventoryForm, CategoryForm, KFetConfigForm OrderArticleToInventoryForm, CategoryForm,
) )
from collections import defaultdict from collections import defaultdict
from kfet import consumers from kfet import consumers