You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.6 KiB
76 lines
2.6 KiB
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()
|