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