1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
from django.core.management.base import BaseCommand
from dynamic_preferences.exceptions import NotFoundInRegistry
from dynamic_preferences.models import GlobalPreferenceModel
from dynamic_preferences.registries import (
global_preferences_registry,
preference_models,
)
from dynamic_preferences.settings import preferences_settings
def delete_preferences(queryset):
"""
Delete preferences objects if they are not present in registry.
Return a list of deleted objects
"""
deleted = []
# Iterate through preferences. If an error is raised when accessing
# preference object, just delete it
for p in queryset:
try:
p.registry.get(section=p.section, name=p.name, fallback=False)
except NotFoundInRegistry:
p.delete()
deleted.append(p)
return deleted
class Command(BaseCommand):
help = (
"Find and delete preferences from database if they don't exist in "
"registries. Create preferences that are not present in database"
"(except when invoked with --skip_create)."
)
def add_arguments(self, parser):
parser.add_argument(
"--skip_create",
action="store_true",
help="Forces to skip the creation step for missing preferences",
)
def handle(self, *args, **options):
skip_create = options["skip_create"]
# Create needed preferences
# Global
if not skip_create:
self.stdout.write("Creating missing global preferences...")
manager = global_preferences_registry.manager()
manager.all()
deleted = delete_preferences(GlobalPreferenceModel.objects.all())
message = "Deleted {deleted} global preferences".format(deleted=len(deleted))
self.stdout.write(message)
for preference_model, registry in preference_models.items():
deleted = delete_preferences(preference_model.objects.all())
message = "Deleted {deleted} {model} preferences".format(
deleted=len(deleted),
model=preference_model.__name__,
)
self.stdout.write(message)
if not hasattr(preference_model, "get_instance_model"):
continue
if skip_create:
continue
message = "Creating missing preferences for {model} model...".format(
model=preference_model.get_instance_model().__name__,
)
self.stdout.write(message)
for instance in preference_model.get_instance_model().objects.all():
getattr(instance, preferences_settings.MANAGER_ATTRIBUTE).all()
|