File: invalidate.py

package info (click to toggle)
django-cacheops 7.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 404 kB
  • sloc: python: 3,189; sh: 7; makefile: 4
file content (55 lines) | stat: -rw-r--r-- 1,948 bytes parent folder | download | duplicates (2)
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
from django.core.management.base import LabelCommand, CommandError
from django.apps import apps

from cacheops.invalidation import *


class Command(LabelCommand):
    help = 'Invalidates cache for entire app, model or particular instance'
    args = '(all | <app> | <app>.<model> | <app>.<model>.<pk>) +'
    label = 'app or model or object'

    def handle_label(self, label, **options):
        if label == 'all':
            self.handle_all()
        else:
            app_n_model = label.split('.')
            if len(app_n_model) == 1:
                self.handle_app(app_n_model[0])
            elif len(app_n_model) == 2:
                self.handle_model(*app_n_model)
            elif len(app_n_model) == 3:
                self.handle_obj(*app_n_model)
            else:
                raise CommandError('Wrong model/app name syntax: %s\n'
                                   'Type <app_name> or <app_name>.<model_name>' % label)

    def handle_all(self):
        invalidate_all()

    def handle_app(self, app_name):
        for model in self.get_app(app_name).get_models(include_auto_created=True):
            invalidate_model(model)

    def handle_model(self, app_name, model_name):
        invalidate_model(self.get_model(app_name, model_name))

    def handle_obj(self, app_name, model_name, obj_pk):
        model = self.get_model(app_name, model_name)
        try:
            obj = model.objects.get(pk=obj_pk)
        except model.DoesNotExist:
            raise CommandError('No %s.%s with pk = %s' % (app_name, model_name, obj_pk))
        invalidate_obj(obj)

    def get_app(self, app_name):
        try:
            return apps.get_app_config(app_name)
        except LookupError as e:
            raise CommandError(e)

    def get_model(self, app_name, model_name):
        try:
            return apps.get_app_config(app_name).get_model(model_name)
        except LookupError as e:
            raise CommandError(e)