summaryrefslogtreecommitdiff
path: root/ishtar_common/management/commands/fix_missing_cached_labels.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-11-14 17:49:34 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-11-14 17:49:34 +0100
commitc565d396c657abb2a9baa0b72dcbea67e3ddf69b (patch)
tree5e2ebffad9983bf98bac5b374a83eda862939817 /ishtar_common/management/commands/fix_missing_cached_labels.py
parentdcc0fac9b42d92c10c51d450940ceb8be284f710 (diff)
downloadIshtar-c565d396c657abb2a9baa0b72dcbea67e3ddf69b.tar.bz2
Ishtar-c565d396c657abb2a9baa0b72dcbea67e3ddf69b.zip
Command to regenerate missing labels (and only them)
Diffstat (limited to 'ishtar_common/management/commands/fix_missing_cached_labels.py')
-rw-r--r--ishtar_common/management/commands/fix_missing_cached_labels.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/ishtar_common/management/commands/fix_missing_cached_labels.py b/ishtar_common/management/commands/fix_missing_cached_labels.py
new file mode 100644
index 000000000..5b71bb899
--- /dev/null
+++ b/ishtar_common/management/commands/fix_missing_cached_labels.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013-2018 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# See the file COPYING for details.
+
+import sys
+
+from django.core.management.base import BaseCommand
+
+from django.apps import apps
+from django.db.models import Q
+
+
+APPS = ['ishtar_common', 'archaeological_operations',
+ 'archaeological_context_records', 'archaeological_finds',
+ 'archaeological_warehouse']
+
+
+class Command(BaseCommand):
+ args = ''
+ help = 'Regenerate cached labels and search vectors'
+
+ def add_arguments(self, parser):
+ parser.add_argument('app_name', nargs='?', default=None,
+ choices=APPS)
+ parser.add_argument('model_name', nargs='?', default=None)
+ parser.add_argument(
+ '--quiet', dest='quiet', action='store_true',
+ help='Quiet output')
+
+ def handle(self, *args, **options):
+ quiet = options['quiet']
+ limit = options['app_name']
+ model_name = options['model_name']
+ if model_name:
+ model_name = model_name.lower()
+ for app in APPS:
+ if limit and app != limit:
+ continue
+ if not quiet:
+ print(u"* app: {}".format(app))
+ for model in apps.get_app_config(app).get_models():
+ if model_name and model.__name__.lower() != model_name:
+ continue
+ if model.__name__.startswith('Historical'):
+ continue
+ if not bool(
+ [k for k in dir(model)
+ if k.startswith('_generate_') or
+ k == "search_vector"]):
+ continue
+ q = model.objects
+ if hasattr(model, "CACHED_LABELS") and model.CACHED_LABELS:
+ cached_keys = model.CACHED_LABELS
+ elif hasattr(model, "cached_label"):
+ cached_keys = ["cached_label"]
+ else:
+ continue
+ query = None
+ for cached in cached_keys:
+ subquery = Q(**{cached + "__isnull": True})
+ subquery |= Q(**{cached: ""})
+ if not query:
+ query = subquery
+ else:
+ query |= subquery
+ q = q.filter(query)
+ msg = u"-> processing {}: ".format(model._meta.verbose_name)
+ ln = q.count()
+ for idx, obj_id in enumerate(q.values('pk').all()):
+ obj = model.objects.get(pk=obj_id['pk'])
+ obj.skip_history_when_saving = True
+ obj._no_move = True
+ cmsg = u"\r{} {}/{}".format(msg, idx + 1, ln)
+ if not quiet:
+ sys.stdout.write(cmsg)
+ sys.stdout.flush()
+ obj.save()
+ if not quiet and ln:
+ sys.stdout.write("\n")