Source code for djconfig.forms

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.utils import timezone
from django.apps import apps

from . import conf
from . import utils


[docs]class ConfigForm(conf._ConfigFormBase): """ Base class for every registered config form.\ It behaves like a regular form. Inherits from :py:class:`django.forms.Form`.\ The :py:attr:`initial` attr will be updated with the\ config values if any. All form fields implementing this, should have a unique\ name to avoid clashing with other registered forms,\ prefixing them with the app name is a good practice. :param args: Positional parameters passed to parent class :param kwargs: Keyword parameters passed to parent class """ def __init__(self, *args, **kwargs): super(ConfigForm, self).__init__(*args, **kwargs) self.initial.update({ name: getattr(conf.config, name) for name in self.fields if hasattr(conf.config, name)})
[docs] def save(self): """ Save the config with the cleaned data,\ update the last modified date so\ the config is reloaded on other process/nodes.\ Reload the config so it can be called right away. """ assert self.__class__ in conf.config._registry,\ '%(class_name)s is not registered' % { 'class_name': self.__class__.__name__ } ConfigModel = apps.get_model('djconfig.Config') for field_name, value in self.cleaned_data.items(): value = utils.serialize( value=value, field=self.fields.get(field_name, None)) # TODO: use update_or_create count = (ConfigModel.objects .filter(key=field_name) .update(value=value)) if not count: ConfigModel.objects.create( key=field_name, value=value) count = (ConfigModel.objects .filter(key='_updated_at') .update(value=str(timezone.now()))) if not count: ConfigModel.objects.create( key='_updated_at', value=str(timezone.now())) conf.config._reload()