File: checkpreferences.py

package info (click to toggle)
django-dynamic-preferences 1.17.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 476 kB
  • sloc: python: 3,040; makefile: 3
file content (76 lines) | stat: -rw-r--r-- 2,702 bytes parent folder | download
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()