Rearrange source to src dir.
[redakcja.git] / src / toolbar / management / commands / fixbuttons.py
diff --git a/src/toolbar/management/commands/fixbuttons.py b/src/toolbar/management/commands/fixbuttons.py
new file mode 100644 (file)
index 0000000..de48ced
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+
+from django.core.management.base import NoArgsCommand
+from toolbar.models import Button, ButtonGroup
+import json
+import re
+
+
+class Command(NoArgsCommand):
+
+    def handle_noargs(self, **options):
+        buttons = Button.objects.all()
+        print "Validating parameters... "
+        for b in buttons:
+            params = b.params
+            try:
+                v = json.loads(b.params)
+            except ValueError, e:
+                print 'Trying to fix button "%s" ...' % b.slug
+                if params[0] == u'(':
+                    params = params[1:]
+                if params[-1] == u')':
+                    params = params[:-1]
+                try:
+                    v = son.loads(re.sub(u'([\\w-]+)\\s*:', u'"\\1": ', params).encode('utf-8'))
+                except ValueError, e:
+                    print "Unable to fix '%s' " % b.params
+                    print "Try to fix this button manually and rerun the script."
+                    return False
+
+            # resave
+            b.params = json.dumps(v)
+            b.save()
+
+        print "Merge duplicate buttons (if any)..."
+        hash = {}
+        for b in buttons:
+            if b.slug not in hash:
+                hash[b.slug] = b
+                continue
+
+            # duplicate button
+            print "Found duplicate of '%s'" % b.slug
+            a = hash[b.slug]
+
+            remove_duplicate = True
+            if a.params != b.params:
+                print "Conflicting params for duplicate of '%s'." % b.slug
+                print "Groups will be joined, but won't remove duplicates."
+                remove_duplicate = False
+
+            for g in b.group.all():
+                a.group.add(g)
+
+            b.group.clear()
+
+            a.save()
+            if remove_duplicate:
+                b.delete()
+
+        print "Searching for empty groups and orphaned buttons:"
+        for g in ButtonGroup.objects.all():
+            if len(g.button_set.all()) == 0:
+                print "Empty group: '%s'" % g.slug
+
+        for b in Button.objects.all():
+            if len(b.group.all()) == 0:
+                print "orphan: '%s'" % b.slug