From 1ff50d0dc6cea7f561760c4cc14fba6ab4501e2b Mon Sep 17 00:00:00 2001
From: Ivan Tyagov <ivan@nexedi.com>
Date: Wed, 11 Nov 2009 13:06:22 +0000
Subject: [PATCH] Add alarms and support check script that will periodically
 (if enabled) check Localizers's MessageCatalog instances ratio of not
 translated messages. Add script that can delete not translated ones.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@30505 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../ERP5Administration.py                     |  31 ++++
 .../Alarm_checkLocalizer.xml                  | 159 ++++++++++++++++++
 ...Catalog_deleteNotTranslatedMessageDict.xml |  31 ++++
 .../MessageCatalog_getMessageDict.xml         |  31 ++++
 ...ageCatalog_getNotTranslatedMessageDict.xml |  31 ++++
 bt5/erp5_administration/bt/revision           |   2 +-
 6 files changed, 284 insertions(+), 1 deletion(-)
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_checkLocalizer.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_deleteNotTranslatedMessageDict.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getMessageDict.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getNotTranslatedMessageDict.xml

diff --git a/bt5/erp5_administration/ExtensionTemplateItem/ERP5Administration.py b/bt5/erp5_administration/ExtensionTemplateItem/ERP5Administration.py
index a049c9153e..969944d355 100644
--- a/bt5/erp5_administration/ExtensionTemplateItem/ERP5Administration.py
+++ b/bt5/erp5_administration/ExtensionTemplateItem/ERP5Administration.py
@@ -59,3 +59,34 @@ def checkFolderHandler(self, fixit=0, **kw):
     error_list.append(message)
     LOG('checkFolderHandler', INFO, message)
   return error_list
+
+
+def MessageCatalog_getMessageDict(self):
+  """
+    Get Localizer's MessageCatalog instance messages.
+  """
+  d = {}
+  for k,v in self._messages.iteritems():
+    d[k] = v
+  return d
+
+def MessageCatalog_getNotTranslatedMessageDict(self):
+  """
+    Get Localizer's MessageCatalog instance messages that are NOT translated.
+  """
+  not_translated_message_dict = {}
+  messages = MessageCatalog_getMessageDict(self)
+  for k,v in messages.iteritems():
+    if not len(v):
+      not_translated_message_dict[k] = v
+  return not_translated_message_dict
+
+def MessageCatalog_deleteNotTranslatedMessageDict(self):
+  """
+    Delete from  Localizer's MessageCatalog instance messages that are NOT translated.
+  """
+  not_translated_message_dict = MessageCatalog_getNotTranslatedMessageDict(self)
+  for k,v in not_translated_message_dict.iteritems():
+    # delete message from dict
+    del(self._messages[k])
+  return len(not_translated_message_dict.keys())
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_checkLocalizer.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_checkLocalizer.xml
new file mode 100644
index 0000000000..bfaf51e5d0
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Alarm_checkLocalizer.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_body</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+"""\n
+  Check that number of untranslated messages for a Localizer MessageCatalog instance\n
+  doesn\'t exceed a fixed alarm_warn_ratio.\n
+"""\n
+alarm_warn_ratio = 0.25\n
+\n
+localizer = context.Localizer\n
+for message_catalog in localizer.objectValues(\'MessageCatalog\'):\n
+  all = len(message_catalog.MessageCatalog_getMessageDict().keys())\n
+  not_translated = len(message_catalog.MessageCatalog_getNotTranslatedMessageDict().keys())\n
+  enable_warning = not_translated > all*alarm_warn_ratio\n
+  if enable_warning:\n
+    # we have more than allowed number of untranslated messages,\n
+    # fire alarm\n
+    context.log("Too many untranslated Localizer messages for %s %s/%s" %(message_catalog, all, not_translated))\n
+    return True\n
+\n
+return False\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>_code</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>activity_count=1, bundle_object_count=100, **kw</string> </value>
+        </item>
+        <item>
+            <key> <string>errors</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>func_code</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>co_argcount</string> </key>
+                        <value> <int>2</int> </value>
+                    </item>
+                    <item>
+                        <key> <string>co_varnames</string> </key>
+                        <value>
+                          <tuple>
+                            <string>activity_count</string>
+                            <string>bundle_object_count</string>
+                            <string>kw</string>
+                            <string>alarm_warn_ratio</string>
+                            <string>_getattr_</string>
+                            <string>context</string>
+                            <string>localizer</string>
+                            <string>_getiter_</string>
+                            <string>message_catalog</string>
+                            <string>len</string>
+                            <string>all</string>
+                            <string>not_translated</string>
+                            <string>enable_warning</string>
+                            <string>True</string>
+                            <string>False</string>
+                          </tuple>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>func_defaults</string> </key>
+            <value>
+              <tuple>
+                <int>1</int>
+                <int>100</int>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Alarm_checkLocalizer</string> </value>
+        </item>
+        <item>
+            <key> <string>warnings</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_deleteNotTranslatedMessageDict.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_deleteNotTranslatedMessageDict.xml
new file mode 100644
index 0000000000..2415c9e44c
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_deleteNotTranslatedMessageDict.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_function</string> </key>
+            <value> <string>MessageCatalog_deleteNotTranslatedMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>_module</string> </key>
+            <value> <string>ERP5Administration</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>MessageCatalog_deleteNotTranslatedMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Delete from  Localizer\'s MessageCatalog instance messages that are NOT translated.</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getMessageDict.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getMessageDict.xml
new file mode 100644
index 0000000000..ac5b193679
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getMessageDict.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_function</string> </key>
+            <value> <string>MessageCatalog_getMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>_module</string> </key>
+            <value> <string>ERP5Administration</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>MessageCatalog_getMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getNotTranslatedMessageDict.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getNotTranslatedMessageDict.xml
new file mode 100644
index 0000000000..ee05635380
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/MessageCatalog_getNotTranslatedMessageDict.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <tuple>
+        <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
+        <tuple/>
+      </tuple>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_function</string> </key>
+            <value> <string>MessageCatalog_getNotTranslatedMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>_module</string> </key>
+            <value> <string>ERP5Administration</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>MessageCatalog_getNotTranslatedMessageDict</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/bt/revision b/bt5/erp5_administration/bt/revision
index 2fb681e3f9..9cd72aa941 100644
--- a/bt5/erp5_administration/bt/revision
+++ b/bt5/erp5_administration/bt/revision
@@ -1 +1 @@
-71
\ No newline at end of file
+72
\ No newline at end of file
-- 
2.30.9