summaryrefslogtreecommitdiff
path: root/ishtar_common/management
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-08-19 16:36:08 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-08-19 16:36:08 +0200
commitb3a9fec98dbd751a499005955e72afd5a7023243 (patch)
treebfd3a6a4484750ba846d1991a8d51c21b55a9a7f /ishtar_common/management
parentf6bbf6c90672393a9881280896ff4766445c050f (diff)
downloadIshtar-b3a9fec98dbd751a499005955e72afd5a7023243.tar.bz2
Ishtar-b3a9fec98dbd751a499005955e72afd5a7023243.zip
Command: regenerate external id
Diffstat (limited to 'ishtar_common/management')
-rw-r--r--ishtar_common/management/commands/regenerate_external_id.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/ishtar_common/management/commands/regenerate_external_id.py b/ishtar_common/management/commands/regenerate_external_id.py
new file mode 100644
index 000000000..2b2440a5a
--- /dev/null
+++ b/ishtar_common/management/commands/regenerate_external_id.py
@@ -0,0 +1,69 @@
+#!/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, CommandError
+
+from django.apps import apps
+
+
+class Command(BaseCommand):
+ help = 'Regenerate external id.'
+
+ def add_arguments(self, parser):
+ parser.add_argument('model', nargs='+')
+
+ def handle(self, *args, **options):
+ for app_model_name in options['model']:
+ try:
+ capp, model_name = app_model_name.split(".")
+ except ValueError:
+ raise CommandError(
+ "Model argument must be \"app_name.model_name\". Example: "
+ "archaeological_operations.Operation"
+ )
+ ok = False
+ for app in ['ishtar_common', 'archaeological_operations',
+ 'archaeological_context_records',
+ 'archaeological_finds', 'archaeological_warehouse']:
+ if capp != app:
+ continue
+ for model in apps.get_app_config(app).get_models():
+ if model.__name__ != model_name:
+ continue
+ if not bool(
+ [k for k in dir(model) if k == "external_id"]):
+ continue
+ msg = u"* processing {} - {}:".format(
+ app, model._meta.verbose_name)
+ ln = model.objects.count()
+ for idx, object in enumerate(model.objects.all()):
+ object.skip_history_when_saving = True
+ object.external_id = None
+ cmsg = u"\r{} {}/{}".format(msg, idx + 1, ln)
+ sys.stdout.write(cmsg)
+ sys.stdout.flush()
+ object.save()
+ sys.stdout.write("\n")
+ ok = True
+ if not ok:
+ raise CommandError(
+ "{} not found or have no external ID".format(
+ app_model_name))