diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-14 19:41:59 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-16 12:11:20 +0200 | 
| commit | 9cbbd92a15d169825ac5bacd7f0a3d41c4601b07 (patch) | |
| tree | b789de27120d29dbc90e15755761f1434c4bcd5a /ishtar_common/management/commands/relations_update_cache_tables.py | |
| parent | 839bb85c66e952368f4ed18c8544249b832adc45 (diff) | |
| download | Ishtar-9cbbd92a15d169825ac5bacd7f0a3d41c4601b07.tar.bz2 Ishtar-9cbbd92a15d169825ac5bacd7f0a3d41c4601b07.zip | |
WIP - optimize record relations
Diffstat (limited to 'ishtar_common/management/commands/relations_update_cache_tables.py')
| -rw-r--r-- | ishtar_common/management/commands/relations_update_cache_tables.py | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/ishtar_common/management/commands/relations_update_cache_tables.py b/ishtar_common/management/commands/relations_update_cache_tables.py new file mode 100644 index 000000000..ab7f134ff --- /dev/null +++ b/ishtar_common/management/commands/relations_update_cache_tables.py @@ -0,0 +1,83 @@ +#!/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 + + +APPS = ['ishtar_common', 'archaeological_operations', +        'archaeological_context_records', 'archaeological_finds', +        'archaeological_warehouse'] + + +class Command(BaseCommand): +    args = '' +    help = 'Regenerate geo, 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("* 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 +                msg = "-> processing {}: ".format(model._meta.verbose_name) +                ln = model.objects.count() +                for idx, obj_id in enumerate(model.objects.values('pk').all()): +                    obj = model.objects.get(pk=obj_id['pk']) +                    obj.skip_history_when_saving = True +                    obj._no_move = True +                    if hasattr(obj, "point_source") and obj.point_source in ( +                            "M", "T"): +                        obj.point = None +                        obj.point_2d = None +                        obj.x = None +                        obj.y = None +                    cmsg = "\r{} {}/{}".format(msg, idx + 1, ln) +                    if not quiet: +                        sys.stdout.write(cmsg) +                        sys.stdout.flush() +                    obj.save() +                if not quiet: +                    sys.stdout.write("\n") | 
