Simple app to add configuration options to a Django project.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

version 1.0

+102 -9
+6 -1
HISTORY.rst
··· 3 3 History 4 4 ------- 5 5 6 + 1.0 (2018-10-2) 7 + +++++++++++++++++ 8 + 9 + * Added model for user's custom options. 10 + 6 11 1.0a3 (2018-8-29) 7 12 +++++++++++++++++ 8 13 9 - * Fixed dependency with GeoDejango 14 + * Fixed dependency with GeoDejango. 10 15 11 16 1.0a2 (2017-2-20) 12 17 +++++++++++++++++
+1 -1
options/__init__.py
··· 14 14 15 15 default_app_config = 'options.apps.ConfigurationsConfig' 16 16 17 - VERSION = (1, 0, 0, 'alpha', 3) 17 + VERSION = (1, 0, 0, 'final', 0) 18 18 19 19 __version__ = get_version(VERSION)
+20 -1
options/managers.py
··· 2 2 from __future__ import unicode_literals, print_function, division, absolute_import 3 3 4 4 from django.db import models 5 - 5 + from options.settings import DEFAULT_EXCLUDE_USER_OPTIONS 6 6 7 7 class OptionManager(models.Manager): 8 8 """Manager for options.""" ··· 15 15 except self.model.DoesNotExist: 16 16 return default 17 17 18 + 19 + class UserOptionManager(models.Manager): 20 + """Manager to handle user's custom options.""" 21 + 22 + def filter_user_customizable(self): 23 + """Returns option that the user can customize himself.""" 24 + return self.exclude(name__in=DEFAULT_EXCLUDE_USER_OPTIONS) 25 + 26 + def get_value(self, name, user=None, default=None): 27 + """Gets the value with the proper type.""" 28 + from options.models import Option 29 + 30 + if user is None: 31 + return Option.objects.get_value(name=name, default=default) 32 + try: 33 + option = self.model.objects.get(user=user, name=name) 34 + return option.get_value() 35 + except self.model.DoesNotExist: 36 + return Option.objects.get_value(name=name, default=default)
+39
options/migrations/0002_auto_20181002_0254.py
··· 1 + # Generated by Django 2.1 on 2018-10-02 07:54 2 + 3 + from django.conf import settings 4 + from django.db import migrations, models 5 + import django.db.models.deletion 6 + 7 + 8 + class Migration(migrations.Migration): 9 + 10 + dependencies = [ 11 + migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 + ('options', '0001_initial'), 13 + ] 14 + 15 + operations = [ 16 + migrations.CreateModel( 17 + name='UserOption', 18 + fields=[ 19 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 + ('public_name', models.CharField(db_index=True, max_length=255, verbose_name='Public name of the parameter')), 21 + ('type', models.PositiveIntegerField(choices=[(0, 'Float'), (1, 'Integer'), (2, 'String')], default=2)), 22 + ('value', models.CharField(blank=True, default=None, max_length=256, null=True, verbose_name='Value')), 23 + ('is_list', models.BooleanField(default=False)), 24 + ('name', models.CharField(max_length=255, verbose_name='Parameter')), 25 + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to=settings.AUTH_USER_MODEL)), 26 + ], 27 + options={ 28 + 'ordering': ['public_name'], 29 + }, 30 + ), 31 + migrations.AlterModelOptions( 32 + name='option', 33 + options={'ordering': ['public_name']}, 34 + ), 35 + migrations.AlterUniqueTogether( 36 + name='useroption', 37 + unique_together={('user', 'name')}, 38 + ), 39 + ]
+33 -6
options/models.py
··· 2 2 from __future__ import unicode_literals, print_function, division, absolute_import 3 3 4 4 import six 5 + from django.conf import settings 5 6 from django.db import models 6 7 from django.utils.encoding import python_2_unicode_compatible 7 8 from django.utils.translation import ugettext_lazy as _ 8 9 9 10 from options import STRING, TYPE_CHOICES, INT, FLOAT 10 - from options.managers import OptionManager 11 - 11 + from options.managers import OptionManager, UserOptionManager 12 12 13 13 @python_2_unicode_compatible 14 - class Option(models.Model): 15 - """System options and configurations.""" 14 + class BaseOption(models.Model): 15 + """Base model for system options and configurations.""" 16 16 17 17 name = models.CharField( 18 18 verbose_name=_("Parameter"), ··· 37 37 max_length=256, 38 38 verbose_name=_("Value") 39 39 ) 40 - 41 40 is_list = models.BooleanField(default=False) 42 41 43 - objects = OptionManager() 42 + class Meta: 43 + abstract = True 44 44 45 45 def __str__(self): 46 46 return "%s" % self.public_name ··· 57 57 else: 58 58 values = self.value.split(",") 59 59 return list(map(lambda item: converter.get(self.type, six.text_type)(item), values)) 60 + 61 + 62 + 63 + class Option(BaseOption): 64 + """System options and configurations.""" 65 + 66 + objects = OptionManager() 67 + 68 + class Meta: 69 + ordering = ["public_name"] 70 + 71 + 72 + 73 + class UserOption(BaseOption): 74 + """Custom option for a user.""" 75 + 76 + user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="options", on_delete=models.CASCADE) 77 + name = models.CharField( 78 + verbose_name=_("Parameter"), 79 + max_length=255, 80 + ) 81 + 82 + objects = UserOptionManager() 83 + 84 + class Meta: 85 + unique_together = ["user", "name"] 86 + ordering = ["public_name"]
+3
options/settings.py
··· 17 17 # } 18 18 # 19 19 DEFAULT_OPTIONS = getattr(settings, "CONFIGURATION_DEFAULT_OPTIONS", {}) 20 + 21 + # Set the list of options that the user can't customize. 22 + DEFAULT_EXCLUDE_USER_OPTIONS = getattr(settings, "EXCLUDE_USER_OPTIONS", tuple())