1from django.core.management.base import LabelCommand, CommandError
2from django.apps import apps
3
4from cacheops.invalidation import *
5
6
7class Command(LabelCommand):
8    help = 'Invalidates cache for entire app, model or particular instance'
9    args = '(all | <app> | <app>.<model> | <app>.<model>.<pk>) +'
10    label = 'app or model or object'
11
12    def handle_label(self, label, **options):
13        if label == 'all':
14            self.handle_all()
15        else:
16            app_n_model = label.split('.')
17            if len(app_n_model) == 1:
18                self.handle_app(app_n_model[0])
19            elif len(app_n_model) == 2:
20                self.handle_model(*app_n_model)
21            elif len(app_n_model) == 3:
22                self.handle_obj(*app_n_model)
23            else:
24                raise CommandError('Wrong model/app name syntax: %s\n'
25                                   'Type <app_name> or <app_name>.<model_name>' % label)
26
27    def handle_all(self):
28        invalidate_all()
29
30    def handle_app(self, app_name):
31        for model in self.get_app(app_name).get_models(include_auto_created=True):
32            invalidate_model(model)
33
34    def handle_model(self, app_name, model_name):
35        invalidate_model(self.get_model(app_name, model_name))
36
37    def handle_obj(self, app_name, model_name, obj_pk):
38        model = self.get_model(app_name, model_name)
39        try:
40            obj = model.objects.get(pk=obj_pk)
41        except model.DoesNotExist:
42            raise CommandError('No %s.%s with pk = %s' % (app_name, model_name, obj_pk))
43        invalidate_obj(obj)
44
45    def get_app(self, app_name):
46        try:
47            return apps.get_app_config(app_name)
48        except LookupError as e:
49            raise CommandError(e)
50
51    def get_model(self, app_name, model_name):
52        try:
53            return apps.get_app_config(app_name).get_model(model_name)
54        except LookupError as e:
55            raise CommandError(e)
56