From 0048d09c1f94046336dc16fc8cb8b7345a44ffc8 Mon Sep 17 00:00:00 2001
From: Kazuhiko SHIOZAKI <kazuhiko@nexedi.com>
Date: Wed, 21 Sep 2022 11:30:22 +0200
Subject: [PATCH] py2/py3: stop using deprecated has_key().

---
 .../cloudooo_web/WebSite_logout.py            |  2 +-
 .../Account_hashGapItemList.py                |  4 +-
 .../ERP5Site_checkCatalogTable.py             |  2 +-
 .../Resource_addToShoppingCart.py             |  2 +-
 .../erp5_advanced_ecommerce/WebSite_logout.py |  2 +-
 ...stFieldPropertyDictListForAdvancedTrade.py |  2 +-
 .../ApparelFabricItem_fastInput.py            |  6 +--
 .../test.erp5.testApparelModel.py             |  6 +--
 .../erp5_archive/Archive_createInventory.py   |  4 +-
 .../document.erp5.MovementGroup.py            |  2 +-
 .../mixin.erp5.BuilderMixin.py                |  2 +-
 ...erson_getPersonDetailedContributionList.py | 10 ++--
 .../BudgetLine_hashVariationCategoryList.py   |  2 +-
 .../Budget_hashVariationCategoryList.py       |  2 +-
 .../Resource_addToShoppingCart.py             |  2 +-
 .../WebSection_getProductList.py              |  8 ++--
 .../WebSite_getProductList.py                 |  2 +-
 .../document.erp5.BusinessConfiguration.py    |  4 +-
 ...teDocumentAnalysisDocumentDecisionItems.py |  2 +-
 ...s_generateDocumentAnalysisDocumentItems.py |  2 +-
 ...is_generateDocumentAnalysisLexiconItems.py |  2 +-
 .../FastInput_generateObjectStructure.py      |  2 +-
 ...stInput_generateTwoLevelObjectStructure.py |  4 +-
 .../TestCase_generateTestCaseActorList.py     |  2 +-
 .../TestCase_generateTestCaseStepList.py      |  2 +-
 .../UseCase_generateUseCaseActorList.py       |  2 +-
 .../UseCase_generateUseCaseScenarioList.py    |  4 +-
 .../Base_editContentTranslationMessage.py     |  2 +-
 .../test.erp5.testCookieCrumbler.py           |  4 +-
 .../test.erp5.testERP5Category.py             | 32 ++++++-------
 .../test.erp5.testERP5Type.py                 |  2 +-
 .../Event_getAttachmentFastInputList.py       |  2 +-
 .../Event_getPropertyDictFromContent.py       |  2 +-
 .../portal_components/test.erp5.testCRM.py    |  2 +-
 .../test.erp5.testCrmReports.py               | 14 +++---
 .../erp5_csv_core/Base_importCsvLine.py       |  2 +-
 .../DiscussionThread_getContextPostList.py    |  2 +-
 .../DiscussionThread_getContextThreadList.py  |  2 +-
 .../erp5_dms/Base_assembleSearchString.py     |  2 +-
 ...stionMessage_getPropertyDictFromContent.py |  2 +-
 .../erp5_dms/Document_hashBaseCategoryList.py |  2 +-
 .../CategoryTool_generateTranslationFile.py   |  4 +-
 ...lossaryModule_getBusinessFieldFieldList.py |  2 +-
 ...saryModule_getBusinessFieldWorkflowList.py |  2 +-
 ...aryModule_getTermDictListFromPortalType.py |  2 +-
 ...ssaryModule_getTermDictListFromWorkflow.py |  2 +-
 .../BusinessTemplate_renameProxyField.py      |  6 +--
 .../ERP5Site_showAllUsedSelectionNames.py     |  2 +-
 .../Base_callDialogMethod.py                  |  2 +-
 .../erp5_hal_json_style/Base_edit.py          |  6 +--
 .../ERP5Document_getHateoas.py                |  4 +-
 .../test.erp5.testHalJsonStyle.py             |  2 +-
 .../test.erp5.testImmobilisation.py           |  2 +-
 .../ContributionTool_countMyContentList.py    |  2 +-
 .../ContributionTool_getMyContentList.py      |  2 +-
 ...ibutionTool_getPropertyDictFromFilename.py |  2 +-
 .../module.erp5.TestInvoiceMixin.py           |  2 +-
 .../ItemModule_createDeliveryLine.py          |  2 +-
 .../DeliveryLine_createItemList.py            |  2 +-
 .../erp5_km/WebSite_getWorklistSettingsFor.py |  2 +-
 ...ite_getWebSectionPredicateMapAndUidList.py |  2 +-
 .../KnowledgeBox_baseEdit.py                  |  2 +-
 .../Base_getReportResultList.py               |  2 +-
 .../erp5_ooo_import/Base_importFile.py        |  4 +-
 .../document.erp5.PaypalService.py            |  2 +-
 .../document.erp5.PaySheetTransaction.py      |  2 +-
 ...etTransaction_createAllPaySheetLineList.py |  2 +-
 ...etTransaction_getEditableObjectLineList.py |  8 ++--
 .../PaySheetTransaction_getMovementList.py    |  8 ++--
 ...ansaction_viewPaySheetTransactionAsText.py |  4 +-
 .../test.erp5.testPayroll.py                  |  8 ++--
 .../Amount_hashVariationCategoryItemList.py   |  2 +-
 .../Transformation_getReportSectionList.py    |  2 +-
 ...dResource_hashVariationCategoryItemList.py |  2 +-
 .../erp5_project/ProjectLine_generateTasks.py |  2 +-
 .../Project_generateMonthDomain.py            |  6 +--
 .../Project_generateQuantityReport.py         |  4 +-
 .../Project_getMonthlyObjectList.py           |  2 +-
 .../Project_getMonthlyReportSectionList.py    |  4 +-
 ...Project_getSourceProjectRelatedTaskList.py |  6 +--
 ...t_getSourceProjectRelatedTaskReportList.py |  6 +--
 .../Requirement_generateRequirements.py       |  4 +-
 .../TaskReport_getSourceTaskReportList.py     |  2 +-
 .../erp5_project/Task_isSimpleTask.py         |  2 +-
 .../test.erp5.testProject.py                  |  8 ++--
 .../test.erp5.testTaskReporting.py            | 18 ++++----
 ...test.erp5.testResearchItemSummaryReport.py |  6 +--
 .../TestPageModule_createChapter.py           |  2 +-
 .../TestPageModule_getPreviousChapterList.py  |  2 +-
 .../test.erp5.testBPMCore.py                  |  2 +-
 .../document.erp5.SyncMLSubscription.py       |  4 +-
 .../module.erp5.ERP5ShopOrderConduit.py       | 46 +++++++++----------
 .../document.erp5.WebServiceRequest.py        |  4 +-
 .../module.erp5.TioSafeUtils.py               |  8 ++--
 ...egrationSite_setCategoryMappingLineList.py |  2 +-
 ...ationSite_updateCategoryMappingLineList.py |  4 +-
 .../OrderModule_getOrderStatList.py           | 20 ++++----
 .../OrderModule_processOrderStat.py           | 10 ++--
 .../test.erp5.testTradeReports.py             | 26 +++++------
 .../Zuite_generateFilename.py                 |  2 +-
 ...Zuite_viewZeleniumTestLauncherValidator.py |  6 +--
 .../document.erp5.WebSite.py                  |  2 +-
 .../portal_skins/erp5_web/WebSite_logout.py   |  2 +-
 .../erp5_web_renderjs_ui/WebSite_logout.py    |  2 +-
 .../WebSiteModule_resetWebZuite.py            | 14 +++---
 product/ERP5Type/tests/Python3StyleTest.py    |  2 +
 106 files changed, 245 insertions(+), 243 deletions(-)

diff --git a/bt5/cloudooo_web/SkinTemplateItem/portal_skins/cloudooo_web/WebSite_logout.py b/bt5/cloudooo_web/SkinTemplateItem/portal_skins/cloudooo_web/WebSite_logout.py
index d2d718fd28..a6cf6de7e8 100644
--- a/bt5/cloudooo_web/SkinTemplateItem/portal_skins/cloudooo_web/WebSite_logout.py
+++ b/bt5/cloudooo_web/SkinTemplateItem/portal_skins/cloudooo_web/WebSite_logout.py
@@ -6,7 +6,7 @@
 
 website = context.getWebSiteValue()
 REQUEST = context.REQUEST
-if REQUEST.has_key('portal_skin'):
+if 'portal_skin' in REQUEST:
    context.portal_skins.clearSkinCookie()
 
 #XXX get cookie name from key authentication plugin
diff --git a/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/Account_hashGapItemList.py b/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/Account_hashGapItemList.py
index d1dff4c774..3c63edb786 100644
--- a/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/Account_hashGapItemList.py
+++ b/bt5/erp5_accounting/SkinTemplateItem/portal_skins/erp5_accounting/Account_hashGapItemList.py
@@ -20,7 +20,7 @@ def getSubFieldDict():
       item_key = '/'.join(item_split[:split_depth])
 
       # Create a new subfield if necessary
-      if not sub_field_dict.has_key(item_key):
+      if item_key not in sub_field_dict:
         # Create property dict (key are field parameters)
         sub_field_property_dict = default_sub_field_property_dict.copy()
         sub_field_property_dict['key'] = item_key
@@ -57,7 +57,7 @@ for item_value in value_list:
     item_split = item_value.split('/')
     item_key = '/'.join(item_split[:split_depth])
     
-    if not sub_field_dict.has_key(item_key):
+    if item_key not in sub_field_dict:
       # This can only happens if an accounting plan have been uninstalled
       sub_field_property_dict = default_sub_field_property_dict.copy()
       sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/ERP5Site_checkCatalogTable.py b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/ERP5Site_checkCatalogTable.py
index 93c177b2fe..5fc440da32 100644
--- a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/ERP5Site_checkCatalogTable.py
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/ERP5Site_checkCatalogTable.py
@@ -142,7 +142,7 @@ else:
       reference_dict = getattr(context, property_override_method_id)(instance=actual_object)
     do_reindex = False
     for attribute_id in attribute_id_list:
-      if not reference_dict.has_key(attribute_id):
+      if attribute_id not in reference_dict:
         reference_value = actual_object.getProperty(attribute_id)
       else:
         reference_value = reference_dict[attribute_id]
diff --git a/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/Resource_addToShoppingCart.py b/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/Resource_addToShoppingCart.py
index b2b3c6118e..64bfd45c24 100644
--- a/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/Resource_addToShoppingCart.py
+++ b/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/Resource_addToShoppingCart.py
@@ -29,7 +29,7 @@ if form_id is not None:
     # Make sure editors are pushed back as values into the REQUEST object
     for f in form.get_fields():
       field_id = f.id
-      if request.has_key(field_id):
+      if field_id in request:
         value = request.get(field_id)
         if callable(value):
           value(request)
diff --git a/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/WebSite_logout.py b/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/WebSite_logout.py
index a722d5bf92..d947fe5dd8 100644
--- a/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/WebSite_logout.py
+++ b/bt5/erp5_advanced_ecommerce/SkinTemplateItem/portal_skins/erp5_advanced_ecommerce/WebSite_logout.py
@@ -3,7 +3,7 @@
 """
 website = context.getWebSiteValue()
 REQUEST = context.REQUEST
-if REQUEST.has_key('portal_skin'):
+if 'portal_skin' in REQUEST:
   context.portal_skins.clearSkinCookie()
 REQUEST.RESPONSE.expireCookie('__ac', path='/')
 REQUEST.RESPONSE.expireCookie('__ac_facebook_hash', path='/')
diff --git a/bt5/erp5_advanced_trade/SkinTemplateItem/portal_skins/erp5_advanced_trade/Base_getMultiListFieldPropertyDictListForAdvancedTrade.py b/bt5/erp5_advanced_trade/SkinTemplateItem/portal_skins/erp5_advanced_trade/Base_getMultiListFieldPropertyDictListForAdvancedTrade.py
index 7d1f736743..c0ad32f75c 100644
--- a/bt5/erp5_advanced_trade/SkinTemplateItem/portal_skins/erp5_advanced_trade/Base_getMultiListFieldPropertyDictListForAdvancedTrade.py
+++ b/bt5/erp5_advanced_trade/SkinTemplateItem/portal_skins/erp5_advanced_trade/Base_getMultiListFieldPropertyDictListForAdvancedTrade.py
@@ -10,7 +10,7 @@ for item in item_list:
   item_key = '/'.join(item_split[:split_depth])
   base_category = item_split[0]
   # Create a new subfield if necessary
-  if not sub_field_dict.has_key(item_key):
+  if item_key not in sub_field_dict:
     # Create property dict (key are field parameters)
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_apparel/SkinTemplateItem/portal_skins/erp5_apparel/ApparelFabricItem_fastInput.py b/bt5/erp5_apparel/SkinTemplateItem/portal_skins/erp5_apparel/ApparelFabricItem_fastInput.py
index c30b96a260..4353e909d2 100644
--- a/bt5/erp5_apparel/SkinTemplateItem/portal_skins/erp5_apparel/ApparelFabricItem_fastInput.py
+++ b/bt5/erp5_apparel/SkinTemplateItem/portal_skins/erp5_apparel/ApparelFabricItem_fastInput.py
@@ -86,7 +86,7 @@ try:
     bath = ''
     for item in created_item_list:
       bath = str(item.grouping_reference)
-      if bath_dict.has_key(bath):
+      if bath in bath_dict:
         bath_dict[str(bath)].extend([item])
       else:
         bath_dict[str(bath)] = [item]
@@ -142,7 +142,7 @@ try:
         new_movement = context.portal_simulation.solveMovement(movement, None, 'SplitQuantity', additional_parameters={'aggregate_list':apparel_bath_list}, start_date=start_date, stop_date=stop_date, quantity=quantity)
         movement_list.append(new_movement[0].getRelativeUrl())
     # update root movement if require
-    if bath_dict.has_key(movement_bath):
+    if movement_bath in bath_dict:
       items = bath_dict[movement_bath]
       quantity = 0
       for item in items:
@@ -181,7 +181,7 @@ try:
           if cell.getVariationText() == variation_text:
             # update aggregate list with items
             cell_aggregate_list = cell.getAggregateValueList()
-            if bath_dict.has_key(line_bath):
+            if line_bath in bath_dict:
               # new items on cell
               cell_item = bath_dict[line_bath]
               cell_aggregate_list.extend(cell_item)
diff --git a/bt5/erp5_apparel/TestTemplateItem/portal_components/test.erp5.testApparelModel.py b/bt5/erp5_apparel/TestTemplateItem/portal_components/test.erp5.testApparelModel.py
index da4171fccf..058acf7cfd 100644
--- a/bt5/erp5_apparel/TestTemplateItem/portal_components/test.erp5.testApparelModel.py
+++ b/bt5/erp5_apparel/TestTemplateItem/portal_components/test.erp5.testApparelModel.py
@@ -159,10 +159,10 @@ class TestApparelModel(ERP5TypeTestCase):
     self.assertEqual(elasthane.getProperty('quantity'), 0.12)
 
     # check indexes are present
-    self.assertTrue(apparel_model.index.has_key('composition'))
+    self.assertTrue('composition' in apparel_model.index)
     index = apparel_model.index['composition'][0]
-    self.assertTrue(index.has_key('composition/elasthane'))
-    self.assertTrue(index.has_key('composition/acrylique'))
+    self.assertTrue('composition/elasthane' in index)
+    self.assertTrue('composition/acrylique' in index)
 
   def test_checkCopyColourRangeVariation(self):
     '''
diff --git a/bt5/erp5_archive/SkinTemplateItem/portal_skins/erp5_archive/Archive_createInventory.py b/bt5/erp5_archive/SkinTemplateItem/portal_skins/erp5_archive/Archive_createInventory.py
index fe68e47685..ba6ee54d70 100644
--- a/bt5/erp5_archive/SkinTemplateItem/portal_skins/erp5_archive/Archive_createInventory.py
+++ b/bt5/erp5_archive/SkinTemplateItem/portal_skins/erp5_archive/Archive_createInventory.py
@@ -26,7 +26,7 @@ node_inventory_dict = {}
 activate_kw = {"tag": tag}
 for inventory in node_inventory_list:
   # Do only one inventory per node
-  if not node_inventory_dict.has_key(inventory.node_relative_url):
+  if inventory.node_relative_url not in node_inventory_dict:
     
     inv = inventory_module.newContent(portal_type="Archive Inventory",
                                       destination=inventory.node_relative_url,
@@ -99,7 +99,7 @@ for inv in node_inventory_dict.values():
 payment_inventory_dict = {}
 for inventory in payment_inventory_list:
   # Do only one inventory per payment
-  if not payment_inventory_dict.has_key(inventory.payment_uid):
+  if inventory.payment_uid not in payment_inventory_dict:
     
     inv = inventory_module.newContent(portal_type="Archive Inventory",
                                       destination=inventory.node_relative_url,
diff --git a/bt5/erp5_base/DocumentTemplateItem/portal_components/document.erp5.MovementGroup.py b/bt5/erp5_base/DocumentTemplateItem/portal_components/document.erp5.MovementGroup.py
index c3b8ecc379..b005f1f29f 100644
--- a/bt5/erp5_base/DocumentTemplateItem/portal_components/document.erp5.MovementGroup.py
+++ b/bt5/erp5_base/DocumentTemplateItem/portal_components/document.erp5.MovementGroup.py
@@ -96,7 +96,7 @@ class MovementGroup(XMLObject):
       # XXX it can be wrong. we need a good way to get hash value, or
       # we should compare for all pairs.
       key = repr(property_dict)
-      if tmp_dict.has_key(key):
+      if key in tmp_dict:
         tmp_dict[key][0].append(movement)
       else:
         tmp_dict[key] = [[movement], property_dict]
diff --git a/bt5/erp5_base/MixinTemplateItem/portal_components/mixin.erp5.BuilderMixin.py b/bt5/erp5_base/MixinTemplateItem/portal_components/mixin.erp5.BuilderMixin.py
index 99480763f6..0b177181d0 100644
--- a/bt5/erp5_base/MixinTemplateItem/portal_components/mixin.erp5.BuilderMixin.py
+++ b/bt5/erp5_base/MixinTemplateItem/portal_components/mixin.erp5.BuilderMixin.py
@@ -254,7 +254,7 @@ class BuilderMixin(XMLObject, Amount, Predicate):
           delta = inventory_item.inventory - min_stock
           node_uid = inventory_item.node_uid
           # if node_uid is provided, we have to look at all provided nodes
-          if kw.has_key('node_uid'):
+          if 'node_uid' in kw:
             node_uid = kw['node_uid']
           optimized_kw = {}
           if kw.get('group_by_variation', 1):
diff --git a/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Person_getPersonDetailedContributionList.py b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Person_getPersonDetailedContributionList.py
index b513242939..55a4b2a02f 100644
--- a/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Person_getPersonDetailedContributionList.py
+++ b/bt5/erp5_base/SkinTemplateItem/portal_skins/erp5_base/Person_getPersonDetailedContributionList.py
@@ -58,7 +58,7 @@ result_list = context.portal_catalog.countResults(select_dict={'date': 'DATE_FOR
 # build result dict per portal_type then period
 portal_type_count_dict = {}
 for result in result_list:
-  if portal_type_count_dict.has_key(result[2]):
+  if result[2] in portal_type_count_dict:
     portal_type_count_dict[result[2]][result[1]] = result[0]
   else:
     portal_type_count_dict[result[2]] = {result[1]:result[0]}
@@ -68,7 +68,7 @@ line_list = []
 append = line_list.append
 period_count_dict = {}
 for portal_type in portal_type_list:
-  if portal_type_count_dict.has_key(portal_type):
+  if portal_type in portal_type_count_dict:
     period_count = portal_type_count_dict[portal_type]
     obj = Object(uid="new_")
     obj["document_type"] = context.Base_translateString(portal_type)
@@ -76,10 +76,10 @@ for portal_type in portal_type_list:
     continue
   line_counter = 0
   for period in period_list:
-    if period_count.has_key(period):
+    if period in period_count:
       obj[period] = period_count[period]
       line_counter += period_count[period]
-      if period_count_dict.has_key(period):
+      if period in period_count_dict:
         period_count_dict[period] = period_count_dict[period] + period_count[period]
       else:
         period_count_dict[period] = period_count[period]
@@ -99,7 +99,7 @@ obj = Object(uid="new_")
 obj["document_type"] = 'Total'
 line_counter = 0
 for period in period_list:
-  if period_count_dict.has_key(period):
+  if period in period_count_dict:
     obj[period] = period_count_dict[period]
     line_counter += period_count_dict[period]
   else:
diff --git a/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/BudgetLine_hashVariationCategoryList.py b/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/BudgetLine_hashVariationCategoryList.py
index 752f05e731..37bc534047 100644
--- a/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/BudgetLine_hashVariationCategoryList.py
+++ b/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/BudgetLine_hashVariationCategoryList.py
@@ -43,7 +43,7 @@ for item in item_list:
   if item_key in line_level_variation_list:
     multi = False
 
-  if not sub_field_dict.has_key(item_key):
+  if item_key not in sub_field_dict:
     # Create property dict
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/Budget_hashVariationCategoryList.py b/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/Budget_hashVariationCategoryList.py
index ed3a277c55..ff91bb7994 100644
--- a/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/Budget_hashVariationCategoryList.py
+++ b/bt5/erp5_budget/SkinTemplateItem/portal_skins/erp5_budget/Budget_hashVariationCategoryList.py
@@ -35,7 +35,7 @@ for item in item_list:
   base_category = item_split[0]
   multi = False # XXX or now budget level are only single value.
 
-  if not sub_field_dict.has_key(item_key):
+  if item_key not in sub_field_dict:
     # Create property dict
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce/Resource_addToShoppingCart.py b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce/Resource_addToShoppingCart.py
index 0534c1a04c..554e450d2c 100644
--- a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce/Resource_addToShoppingCart.py
+++ b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce/Resource_addToShoppingCart.py
@@ -21,7 +21,7 @@ if form_id is not None:
     # Make sure editors are pushed back as values into the REQUEST object
     for f in form.get_fields():
       field_id = f.id
-      if request.has_key(field_id):
+      if field_id in request:
         value = request.get(field_id)
         if callable(value):
           value(request)
diff --git a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSection_getProductList.py b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSection_getProductList.py
index 550e166539..4346896f81 100644
--- a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSection_getProductList.py
+++ b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSection_getProductList.py
@@ -3,16 +3,16 @@
 current_web_section = context.REQUEST.get('current_web_section', context)
 product_list = []
 
-if not kw.has_key('portal_type'):
+if 'portal_type' not in kw:
   kw['portal_type'] = 'Product'
 		 
-if not kw.has_key('limit'):		 
+if 'limit' not in kw:		 
   kw['limit'] = limit		 
 		 
-if not kw.has_key('all_versions'):		 
+if 'all_versions' not in kw:		 
   kw['all_versions'] = 1		 
 		 
-if not kw.has_key('all_languages'):		 
+if 'all_languages' not in kw:		 
   kw['all_languages'] = 1		 
 		 
 for key in ['limit','all_versions','all_languages']:		 
diff --git a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSite_getProductList.py b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSite_getProductList.py
index 1db68391d2..f1ecb0ad12 100644
--- a/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSite_getProductList.py
+++ b/bt5/erp5_commerce/SkinTemplateItem/portal_skins/erp5_commerce_widget_library/WebSite_getProductList.py
@@ -5,7 +5,7 @@ from random import choice
 
 web_site = context.getWebSiteValue() or context.REQUEST.get('current_web_site')
 
-if not kw.has_key('portal_type'):	 	 
+if 'portal_type' not in kw:	 	 
   kw['portal_type'] = 'Product'
 
 # Getting all the products from all the visible Web Section.
diff --git a/bt5/erp5_configurator/DocumentTemplateItem/portal_components/document.erp5.BusinessConfiguration.py b/bt5/erp5_configurator/DocumentTemplateItem/portal_components/document.erp5.BusinessConfiguration.py
index e898c84ea9..de4ccfe2fa 100644
--- a/bt5/erp5_configurator/DocumentTemplateItem/portal_components/document.erp5.BusinessConfiguration.py
+++ b/bt5/erp5_configurator/DocumentTemplateItem/portal_components/document.erp5.BusinessConfiguration.py
@@ -74,7 +74,7 @@ def getWorkflowHistory(state, document, remove_undo=0, remove_not_displayed=0):
   else:
     result = []
     for x in wh:
-      if x.has_key('undo') and x['undo'] == 1:
+      if 'undo' in x and x['undo'] == 1:
         result.pop()
       else:
         result.append(x.copy())
@@ -95,7 +95,7 @@ def _updateWorkflowHistory(workflow, document, status_dict):
 
   # Add an entry for the workflow in the history
   workflow_key = workflow.getReference()
-  if not document.workflow_history.has_key(workflow_key):
+  if workflow_key not in document.workflow_history:
     document.workflow_history[workflow_key] = ()
 
   # Update history
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentDecisionItems.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentDecisionItems.py
index c1fe3016e8..78a39f8463 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentDecisionItems.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentDecisionItems.py
@@ -7,7 +7,7 @@ items = []
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['item_title'] not in ('', None):
+  if 'listbox_key' in line and line['item_title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentItems.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentItems.py
index 004a3350fd..06173507a1 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentItems.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisDocumentItems.py
@@ -7,7 +7,7 @@ items = []
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['item_title'] not in ('', None):
+  if 'listbox_key' in line and line['item_title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisLexiconItems.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisLexiconItems.py
index 455594ef46..13f0213929 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisLexiconItems.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/DocumentAnalysis_generateDocumentAnalysisLexiconItems.py
@@ -7,7 +7,7 @@ items = []
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['item_title'] not in ('', None):
+  if 'listbox_key' in line and line['item_title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateObjectStructure.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateObjectStructure.py
index 2ae60c9692..0d0f9f7774 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateObjectStructure.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateObjectStructure.py
@@ -50,7 +50,7 @@ fast_input_lines = []
 
 # get the fast input form datas
 for inputline in listbox:
-  if inputline.has_key('listbox_key'):
+  if 'listbox_key' in inputline:
     line = {}
     line['id'] = int(inputline['listbox_key'])
     for data_name in input_data_names:
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateTwoLevelObjectStructure.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateTwoLevelObjectStructure.py
index e9ce7c87ee..61e292e413 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateTwoLevelObjectStructure.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/FastInput_generateTwoLevelObjectStructure.py
@@ -34,7 +34,7 @@ fast_input_lines = []
 
 # get the fast input form datas
 for inputline in listbox:
-  if inputline.has_key('listbox_key'):
+  if 'listbox_key' in inputline:
     line = {}
     line['id'] = int(inputline['listbox_key'])
     for data_name in input_data_names:
@@ -75,7 +75,7 @@ for line in fast_input_lines:
     new_1st_level_sub_items.append(new_2nd_level_item)
 
   if has_1st_level == True:
-    if structured_input_data.has_key(new_1st_level_key):
+    if new_1st_level_key in structured_input_data:
       new_1st_level_sub_items = structured_input_data[new_1st_level_key][1] + new_1st_level_sub_items
     else:
       structured_input_data[new_1st_level_key] = [None, None]
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseActorList.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseActorList.py
index 5155116b82..f275b3c611 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseActorList.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseActorList.py
@@ -14,7 +14,7 @@ except:
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['title'] not in ('', None):
+  if 'listbox_key' in line and line['title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseStepList.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseStepList.py
index 9daa17f877..401fdd6d46 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseStepList.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/TestCase_generateTestCaseStepList.py
@@ -14,7 +14,7 @@ except: #XXX
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['title'] not in ('', None):
+  if 'listbox_key' in line and line['title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseActorList.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseActorList.py
index a8c94af761..2e0782b023 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseActorList.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseActorList.py
@@ -14,7 +14,7 @@ except:
 
 # get the user information
 for line in listbox:
-  if line.has_key('listbox_key') and line['title'] not in ('', None):
+  if 'listbox_key' in line and line['title'] not in ('', None):
     line_id = int(line['listbox_key'])
     item = {}
     item['id'] = line_id
diff --git a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseScenarioList.py b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseScenarioList.py
index 99d3de9cfa..06bb4635b8 100644
--- a/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseScenarioList.py
+++ b/bt5/erp5_consulting/SkinTemplateItem/portal_skins/erp5_consulting/UseCase_generateUseCaseScenarioList.py
@@ -10,7 +10,7 @@ items = []
 
 # get the user information
 for inputline in listbox:
-  if inputline.has_key('listbox_key'):
+  if 'listbox_key' in inputline:
     scenario = {}
     scenario['id'] = int(inputline['listbox_key'])
     scenario['title'] = inputline['scenario_title']
@@ -55,7 +55,7 @@ for item in items:
     new_1st_level_item.append(new_2nd_level_item)
 
   if has_1st_level == True:
-    if clean_input_lines.has_key(new_1st_level_key):
+    if new_1st_level_key in clean_input_lines:
       new_1st_level_item = clean_input_lines[new_1st_level_key] + new_1st_level_item
     clean_input_lines[new_1st_level_key] = new_1st_level_item
 
diff --git a/bt5/erp5_content_translation/SkinTemplateItem/portal_skins/erp5_content_translation/Base_editContentTranslationMessage.py b/bt5/erp5_content_translation/SkinTemplateItem/portal_skins/erp5_content_translation/Base_editContentTranslationMessage.py
index 34db40fc4e..a29be6b5df 100644
--- a/bt5/erp5_content_translation/SkinTemplateItem/portal_skins/erp5_content_translation/Base_editContentTranslationMessage.py
+++ b/bt5/erp5_content_translation/SkinTemplateItem/portal_skins/erp5_content_translation/Base_editContentTranslationMessage.py
@@ -36,7 +36,7 @@ except FormValidationError, validation_errors:
   # Make sure editors are pushed back as values into the REQUEST object
   for f in form.get_fields():
     field_id = f.id
-    if request.has_key(field_id):
+    if field_id in request:
       value = request.get(field_id)
       if callable(value):
         value(request)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCookieCrumbler.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCookieCrumbler.py
index 9e8f66effe..0dc5d2794b 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCookieCrumbler.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testCookieCrumbler.py
@@ -79,11 +79,11 @@ class ERP5CookieCrumblerTests (CookieCrumblerTests):
     self.req.cookies['__ac_password'] = long_pass
     self.req.traverse('/')
 
-    self.assert_(self.req.has_key('AUTHENTICATED_USER'))
+    self.assert_('AUTHENTICATED_USER' in self.req)
     self.assertEqual(self.req['AUTHENTICATED_USER'].getId(),
                          'abrahammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm')
     resp = self.req.response
-    self.assert_(resp.cookies.has_key('__ac'))
+    self.assert_('__ac' in resp.cookies)
     self.credentials = base64.encodestring('%s:%s' % (long_name, long_pass)).replace('\012', '')
     self.assertEqual(resp.cookies['__ac']['value'],
                          self.credentials)
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
index 9b3b4c371f..49ccb586a6 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Category.py
@@ -70,16 +70,16 @@ class TestERP5Category(ERP5TypeTestCase):
     bc = self.base_cat
     if bc not in portal_categories.objectIds():
       portal_categories.newContent(portal_type='Base Category', id=bc)
-    if not portal_categories[bc].has_key('1'):
+    if '1' not in portal_categories[bc]:
       portal_categories[bc].newContent(id='1', portal_type='Category')
     self.cat1 = portal_categories[bc]['1']
-    if not self.cat1.has_key('1'):
+    if '1' not in self.cat1:
       self.cat1.newContent(id='1', portal_type='Category')
     self.deep_cat1 = self.cat1['1']
-    if not portal_categories[bc].has_key('2'):
+    if '2' not in portal_categories[bc]:
       portal_categories[bc].newContent(id='2', portal_type='Category')
     self.cat2 = portal_categories[bc]['2']
-    if not self.cat2.has_key('1'):
+    if '1' not in self.cat2:
       self.cat2.newContent(id='1', portal_type='Category')
     self.deep_cat2 = self.cat2['1']
 
@@ -90,35 +90,35 @@ class TestERP5Category(ERP5TypeTestCase):
     self.commit()
 
     organisation_module = self.getOrganisationModule()
-    if not organisation_module.has_key('1'):
+    if '1' not in organisation_module:
       organisation_module.newContent(id='1', portal_type='Organisation')
     self.organisation = organisation_module['1']
-    if not self.organisation.has_key('1'):
+    if '1' not in self.organisation:
       self.organisation.newContent(id='1', portal_type='Telephone')
     self.telephone = self.organisation['1']
-    if not organisation_module.has_key('2'):
+    if '2' not in organisation_module:
       organisation_module.newContent(id='2', portal_type='Organisation')
     self.organisation2 = organisation_module['2']
-    if not self.organisation2.has_key('1'):
+    if '1' not in self.organisation2:
       self.organisation2.newContent(id='1', portal_type='Telephone')
     self.telephone2 = self.organisation2['1']
-    if not person_module.has_key('1'):
+    if '1' not in person_module:
       person_module.newContent(id='1', portal_type = 'Person')
     self.person = person_module['1']
 
     bc2 = self.base_cat2
     if bc2 not in portal_categories.objectIds():
       portal_categories.newContent(portal_type='Base Category', id=bc2)
-    if not portal_categories[bc2].has_key('1'):
+    if '1' not in portal_categories[bc2]:
       portal_categories[bc2].newContent(id='1', portal_type='Category')
     self.efg_l1 = portal_categories[bc2]['1']
-    if not self.efg_l1.has_key('11'):
+    if '11' not in self.efg_l1:
       self.efg_l1.newContent(id='11', portal_type='Category')
     self.efg_l2 = self.efg_l1['11']
-    if not self.efg_l2.has_key('111'):
+    if '111' not in self.efg_l2:
       self.efg_l2.newContent(id='111', portal_type='Category')
     self.efg_l3 = self.efg_l2['111']
-    if not self.efg_l3.has_key('1111'):
+    if '1111' not in self.efg_l3:
       self.efg_l3.newContent(id='1111',portal_type='Category')
     self.efg_l4 = self.efg_l3['1111']
 
@@ -128,7 +128,7 @@ class TestERP5Category(ERP5TypeTestCase):
     content_type_set = set(module_type.getTypeAllowedContentTypeList())
     content_type_set.add('Mapped Value')
     module_type._setTypeAllowedContentTypeList(tuple(content_type_set))
-    if not organisation_module.has_key('predicate'):
+    if 'predicate' not in organisation_module:
       organisation_module.newContent(id='predicate', portal_type='Mapped Value')
     predicate = organisation_module['predicate']
     predicate.setCriterion('quantity', identity=None, min=None, max=None)
@@ -139,7 +139,7 @@ class TestERP5Category(ERP5TypeTestCase):
 
   def beforeTearDown(self):
     portal_categories = self.getCategoryTool()
-    if portal_categories[self.base_cat].has_key('3'):
+    if '3' in portal_categories[self.base_cat]:
       portal_categories[self.base_cat].manage_delObjects('3')
       self.commitAndTic()
 
@@ -149,7 +149,7 @@ class TestERP5Category(ERP5TypeTestCase):
       self.commitAndTic()
 
     organisation_module = self.getOrganisationModule()
-    if organisation_module.has_key('new_id'):
+    if 'new_id' in organisation_module:
       organisation_module.manage_delObjects('new_id')
 
     self.commitAndTic()
diff --git a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Type.py b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Type.py
index f3b84cb1df..a5d68f1a60 100644
--- a/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Type.py
+++ b/bt5/erp5_core_test/TestTemplateItem/portal_components/test.erp5.testERP5Type.py
@@ -1758,7 +1758,7 @@ class TestERP5Type(PropertySheetTestCase, LogInterceptor):
     person_module = self.getPersonModule()
     person = person_module.newContent(portal_type='Person')
     self.assertFalse(person.hasTitle())
-    self.assertFalse(person.__dict__.has_key('title'))
+    self.assertFalse('title' in person.__dict__)
 
   def test_24_relatedValueAccessor(self):
     """
diff --git a/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getAttachmentFastInputList.py b/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getAttachmentFastInputList.py
index 24c3c5f28e..53152b997b 100644
--- a/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getAttachmentFastInputList.py
+++ b/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getAttachmentFastInputList.py
@@ -6,7 +6,7 @@ for attachment in context.getAttachmentInformationList():
   # Attachments
   if attachment['uid'] not in ['part_1', 'part_0']:
     filename  = context.getTitle()
-    if attachment.has_key("file_name"):
+    if "file_name" in attachment:
       filename=attachment["file_name"]
     pt = "File"
     temp_base_id = 'index_'.join([attachment["uid"], str(attachment["index"])])
diff --git a/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getPropertyDictFromContent.py b/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getPropertyDictFromContent.py
index 1a86c075bf..515d7fce81 100644
--- a/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getPropertyDictFromContent.py
+++ b/bt5/erp5_crm/SkinTemplateItem/portal_skins/erp5_crm/Event_getPropertyDictFromContent.py
@@ -29,7 +29,7 @@ text_search_list = []
 for text, prop_dict in context.getSearchableReferenceList():
   if text:
     text_search_list.append(text)
-  if prop_dict.has_key('reference'):
+  if 'reference' in prop_dict:
     reference_search_list.append(prop_dict['reference'])
 
 # Search reference ticket or project
diff --git a/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCRM.py b/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCRM.py
index dffe7ac754..f8ebe0fd1e 100644
--- a/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCRM.py
+++ b/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCRM.py
@@ -2007,7 +2007,7 @@ class TestCRMMailSend(BaseTestCRM):
       method_id='MailMessage_sendByActivity')
     self.commit()
     message_list = [i for i in portal_activities.getMessageList() \
-                    if i.kw.has_key("event_relative_url")]
+                    if "event_relative_url" in i.kw]
     try:
       # 5 recipients -> 5 activities
       self.assertEqual(5, len(message_list))
diff --git a/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCrmReports.py b/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCrmReports.py
index 207197561e..43c7fa5039 100644
--- a/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCrmReports.py
+++ b/bt5/erp5_crm/TestTemplateItem/portal_components/test.erp5.testCrmReports.py
@@ -193,44 +193,44 @@ class CrmTestCase(ERP5ReportTestCase):
     self.portal_categories = self.portal.portal_categories
 
     # create group category
-    if not self.portal_categories['group'].has_key('demo_group'):
+    if 'demo_group' not in self.portal_categories['group']:
       group=self.portal_categories.group
       group.newContent(portal_type='Category',
                                 title='demo_group',
                                 reference='demo_group',
                                 id='demo_group')
     # create users and organisations
-    if not self.person_module.has_key('Person_1'):
+    if 'Person_1' not in self.person_module:
       self.portal.person_module.newContent(
                               portal_type='Person',
                               reference='Person_1',
                               title='Person_1',
                               id='Person_1')
-    if not self.person_module.has_key('Person_2'):
+    if 'Person_2' not in self.person_module:
       self.portal.person_module.newContent(
                               portal_type='Person',
                               reference='Person_2',
                               title='Person_2',
                               id='Person_2')
-    if not self.person_module.has_key('Person_3'):
+    if 'Person_3' not in self.person_module:
       self.portal.person_module.newContent(
                               portal_type='Person',
                               reference='Person_3',
                               title='Person_3',
                               id='Person_3')
-    if not self.organisation_module.has_key('Organisation_1'):
+    if 'Organisation_1' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_1',
                               title='Organisation_1',
                               id='Organisation_1')
-    if not self.organisation_module.has_key('Organisation_2'):
+    if 'Organisation_2' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_2',
                               title='Organisation_2',
                               id='Organisation_2')
-    if not self.organisation_module.has_key('My_organisation'):
+    if 'My_organisation' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='My_organisation',
diff --git a/bt5/erp5_csv_style/SkinTemplateItem/portal_skins/erp5_csv_core/Base_importCsvLine.py b/bt5/erp5_csv_style/SkinTemplateItem/portal_skins/erp5_csv_core/Base_importCsvLine.py
index d99ed9e0fd..47eabf6d3c 100644
--- a/bt5/erp5_csv_style/SkinTemplateItem/portal_skins/erp5_csv_core/Base_importCsvLine.py
+++ b/bt5/erp5_csv_style/SkinTemplateItem/portal_skins/erp5_csv_core/Base_importCsvLine.py
@@ -8,7 +8,7 @@ if object == None:
 
 # activity doesn't support security rights yet...
 for key in ['uid','id']:
-  if object_property_dict.has_key(key):
+  if key in object_property_dict:
     object_property_dict.pop(key)
 
 object.edit(**object_property_dict)
diff --git a/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextPostList.py b/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextPostList.py
index 75c147b6eb..6a4e4c7709 100644
--- a/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextPostList.py
+++ b/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextPostList.py
@@ -12,7 +12,7 @@ else:
 if discussion == None:
   return []
 
-if kw.has_key("portal_type") == False:
+if ("portal_type" in kw) == False:
   kw['portal_type'] = "Discussion Post"
 
 return discussion.searchFolder(**kw)
diff --git a/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextThreadList.py b/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextThreadList.py
index 610c6b0aa9..709e243300 100644
--- a/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextThreadList.py
+++ b/bt5/erp5_discussion/SkinTemplateItem/portal_skins/erp5_discussion/DiscussionThread_getContextThreadList.py
@@ -1,7 +1,7 @@
 """This script returns the Discussion Thread list that is associated to this context.
 Need a proxy to work correctly with anonymous user"""
 
-if not kw.has_key('portal_type'):
+if 'portal_type' not in kw:
   kw["portal_type"] = "Discussion Thread"
 kw["follow_up_uid"] = context.getUid()
  
diff --git a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Base_assembleSearchString.py b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Base_assembleSearchString.py
index 18fcadadec..22b79a6d73 100644
--- a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Base_assembleSearchString.py
+++ b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Base_assembleSearchString.py
@@ -104,7 +104,7 @@ if newest not in BOOLEAN_MARKER:
 search_mode = kw.get('search_mode', request.get('search_mode', None))
 search_mode_map={'in_boolean_mode':'boolean',
                  'with_query_expansion':'expanded'}
-if search_mode not in MARKER and search_mode_map.has_key(search_mode):
+if search_mode not in MARKER and search_mode in search_mode_map:
   search_string += ' mode:%s' % search_mode_map[search_mode]
 
 return search_string
diff --git a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/DocumentIngestionMessage_getPropertyDictFromContent.py b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/DocumentIngestionMessage_getPropertyDictFromContent.py
index 277b26dd8b..d8ed861049 100644
--- a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/DocumentIngestionMessage_getPropertyDictFromContent.py
+++ b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/DocumentIngestionMessage_getPropertyDictFromContent.py
@@ -27,7 +27,7 @@ reference_search_list = []
 text_search_list = []
 for text, prop_dict in context.getSearchableReferenceList():
   if text: text_search_list.append(text)
-  if prop_dict.has_key('reference'): reference_search_list.append(prop_dict['reference'])
+  if 'reference' in prop_dict: reference_search_list.append(prop_dict['reference'])
 
 # Search reference ticket or project
 follow_up_type_list = context.getPortalProjectTypeList() + context.getPortalTicketTypeList()
diff --git a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_hashBaseCategoryList.py b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_hashBaseCategoryList.py
index 40bc65cc41..64126ec6ed 100644
--- a/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_hashBaseCategoryList.py
+++ b/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_hashBaseCategoryList.py
@@ -31,7 +31,7 @@ default_sub_field_property_dict['field_type'] = 'ListField'
 default_sub_field_property_dict['size'] = 1
 
 for base_category in item_list:
-  if not sub_field_dict.has_key(base_category):
+  if base_category not in sub_field_dict:
     basecatobject = context.portal_categories.resolveCategory(base_category)
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = base_category
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.py
index af45d8645c..2c16074c36 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.py
@@ -37,12 +37,12 @@ for category_list in category_list_mapping.values():
     #Take only needed attributes
     for attribute in translated_attributes_list:
       #Test attribute exist
-      if category.has_key(attribute) and category.has_key(translation_prefix+attribute):
+      if attribute in category and translation_prefix+attribute in category:
         initial_value = category.get(attribute,'').strip().replace('"',"'")
         if initial_value != '':
           translate_value = category.get(translation_prefix+attribute,'').strip().replace('"',"'")
           if translate_value != '':
-            if translation_dict.has_key(initial_value):
+            if initial_value in translation_dict:
               #Test any duplicate  translation ('car' can't be translated to 'voiture' and 'auto', 
               #user should be choice 'voiture' or 'car')
               if translation_dict[initial_value] != translate_value: 
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldFieldList.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldFieldList.py
index 98d699b442..83c7f93bc7 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldFieldList.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldFieldList.py
@@ -40,7 +40,7 @@ for business_field in business_field_list:
     term_list = get_term_list(business_field, reference)
     #if not term_list:
     #  continue
-    if item_dict.has_key(field):
+    if field in item_dict:
       continue
     item_dict[field] = True
 
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py
index 847971a97f..57fa3d2070 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getBusinessFieldWorkflowList.py
@@ -43,7 +43,7 @@ for business_field in business_field_list:
     term_list = get_term_list(business_field, reference)
     #if not term_list:
     #  continue
-    if item_dict.has_key(wf_item):
+    if wf_item in item_dict:
       continue
     item_dict[wf_item] = True
 
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromPortalType.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromPortalType.py
index 9f614332f7..9420cdddda 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromPortalType.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromPortalType.py
@@ -36,7 +36,7 @@ for portal_type in portal_type_list:
       for x in remove_suffix_list:
         if property_id.endswith(x):
           property_id = property_id[:-len(x)]
-      if id_dict.has_key(property_id) or property_id in skip_id_list:
+      if property_id in id_dict or property_id in skip_id_list:
         continue
       result.append({'reference':property_id,
                      'language':language,
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py
index d375a51c41..7195616677 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_glossary/GlossaryModule_getTermDictListFromWorkflow.py
@@ -42,7 +42,7 @@ for business_field in template_list:
     term_list = get_term_list(business_field, reference)
     #if not term_list:
     #  continue
-    if item_dict.has_key(wf_item):
+    if wf_item in item_dict:
       continue
     item_dict[wf_item] = True
 
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_renameProxyField.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_renameProxyField.py
index e2769a8a66..57aa8d4200 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_renameProxyField.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/BusinessTemplate_renameProxyField.py
@@ -47,9 +47,9 @@ def iterate(document, skin_path):
           form_id = field.get_value('form_id')
           field_id = field.get_value('field_id')
           key = "%s.%s" % (form_id, field_id)
-          if to_rename_dict.has_key(key):
+          if key in to_rename_dict:
             field_path =  "%s/%s/%s" % (skin_path, sub_object.id, field.id)
-            if selected_dict.has_key(field_path):
+            if field_path in selected_dict:
               unproxify_dict[field.id] = None
               proxify_dict[field.id] = to_rename_dict[key]
             next_preview_listbox.append(
@@ -83,7 +83,7 @@ if update:
   extra_kw = {}
   for line in next_preview_listbox:
     line["preview_listbox_key"] = "%03i" % count
-    line["selected"] = selected_dict.has_key(line["hidden_field_path"]) or preview_listbox is None
+    line["selected"] = line["hidden_field_path"] in selected_dict or preview_listbox is None
     extra_kw["field_preview_listbox_hidden_field_path_new_%03i" % count] = line["hidden_field_path"]
     extra_kw["field_preview_listbox_selected_new_%03i" % count] = line["selected"]
     count += 1
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_showAllUsedSelectionNames.py b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_showAllUsedSelectionNames.py
index ef33ce7c65..875b908b6e 100644
--- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_showAllUsedSelectionNames.py
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_showAllUsedSelectionNames.py
@@ -34,7 +34,7 @@ def callback(o,seldict):
             form_name = o.absolute_url() # TODO it could be done much better
             # assumes that name of form is unique enough
             form_name = form_name[form_name.rfind('/')+1:]
-            if seldict.has_key(field.get_value('selection_name')):
+            if field.get_value('selection_name') in seldict:
               old_list = seldict[field.get_value('selection_name')]
               if form_name not in old_list:
                 old_list.append(form_name)
diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py
index 8603b150b0..16d6935dc6 100644
--- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py
+++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_callDialogMethod.py
@@ -146,7 +146,7 @@ except FormValidationError as validation_errors:
   # Make sure editors are pushed back as values into the REQUEST object
   for f in form.get_fields():
     field_id = f.id
-    if request.has_key(field_id):
+    if field_id in request:
       value = request.get(field_id)
       if callable(value):
         value(request)
diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_edit.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_edit.py
index 7c6492c9bd..071a252517 100644
--- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_edit.py
+++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/Base_edit.py
@@ -47,7 +47,7 @@ except FormValidationError as validation_errors:
   # Make sure editors are pushed back as values into the REQUEST object
   for f in form.get_fields():
     field_id = f.id
-    if request.has_key(field_id):
+    if field_id in request:
       value = request.get(field_id)
       if callable(value):
         value(request)
@@ -179,11 +179,11 @@ def editMatrixBox(matrixbox_field, matrixbox):
       return "Could not create cell %s" % str(cell_index_tuple)
 
     cell.edit(edit_order=edit_order, **gv)  # First update globals which include the def. of property_list
-    if cell_value_dict.has_key('variated_property'):
+    if 'variated_property' in cell_value_dict:
       # For Variated Properties
       value = cell_value_dict['variated_property']
       del cell_value_dict['variated_property']
-      if gv.has_key('mapped_value_property_list'):
+      if 'mapped_value_property_list' in gv:
         # Change the property which is defined by the
         # first element of mapped_value_property_list
         # XXX Kato: What? Why?
diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
index 1790e60916..13e41f1ff5 100644
--- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
+++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
@@ -1096,7 +1096,7 @@ def renderForm(traversed_document, form, response_dict, key_prefix=None, selecti
                                               selection_params=selection_params,
                                               request_field=not use_relation_form_page_template,
                                               form_relative_url=form_relative_url)
-        if field_errors.has_key(field.id):
+        if field.id in field_errors:
           response_dict[field.id]["error_text"] = field_errors[field.id].getMessage(Base_translateString)
       except AttributeError as error:
         # Do not crash if field configuration is wrong.
@@ -2110,7 +2110,7 @@ def calculateHateoas(is_portal=None, is_site_root=None, traversed_document=None,
             value=default_field_value,
             key='field_%s_%s' % (editable_field.id, brain_uid))
           # Include cell error text in case of form validation
-          if field_errors.has_key('%s_%s' % (editable_field.id, brain_uid)):
+          if '%s_%s' % (editable_field.id, brain_uid) in field_errors:
             contents_item[select]['field_gadget_param']["error_text"] = \
               Base_translateString(field_errors['%s_%s' % (editable_field.id, brain_uid)].error_text)
 
diff --git a/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py b/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
index 6c3b5222a9..2b55e0c999 100644
--- a/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
+++ b/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
@@ -941,7 +941,7 @@ class TestERP5Document_getHateoas_mode_traverse(ERP5HALJSONStyleSkinsMixin):
       'form_view'
     )
 
-    self.assertFalse(result_dict['_embedded']['_view'].has_key('_actions'))
+    self.assertFalse('_actions' in result_dict['_embedded']['_view'])
 
 
   @simulate('Base_getRequestUrl', '*args, **kwargs',
diff --git a/bt5/erp5_immobilisation/TestTemplateItem/portal_components/test.erp5.testImmobilisation.py b/bt5/erp5_immobilisation/TestTemplateItem/portal_components/test.erp5.testImmobilisation.py
index e5e46dd78f..009fed4b1c 100644
--- a/bt5/erp5_immobilisation/TestTemplateItem/portal_components/test.erp5.testImmobilisation.py
+++ b/bt5/erp5_immobilisation/TestTemplateItem/portal_components/test.erp5.testImmobilisation.py
@@ -1092,7 +1092,7 @@ class TestImmobilisationMixin(ERP5TypeTestCase):
       for key in e_period.keys():
         e_value = e_period[key]
         #LOG('testing c_period %s "%s" value' % (e_period_cursor-1, key), 0, '')
-        self.assertTrue(c_period.has_key(key))
+        self.assertTrue(key in c_period)
         c_value = c_period[key]
         is_float = 0
         try:
diff --git a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_countMyContentList.py b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_countMyContentList.py
index ca35e98fa5..3888360b3a 100644
--- a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_countMyContentList.py
+++ b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_countMyContentList.py
@@ -12,7 +12,7 @@ if user is None:
 kw['owner'] = user
 kw['portal_type'] = context.getPortalMyDocumentTypeList()
 
-if not kw.has_key('validation_state'):
+if 'validation_state' not in kw:
   kw['validation_state'] = "!=embedded"
 
 return context.portal_catalog.countResults(**kw)
diff --git a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getMyContentList.py b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getMyContentList.py
index b0efe06aa6..939ad56cf7 100644
--- a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getMyContentList.py
+++ b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getMyContentList.py
@@ -12,7 +12,7 @@ if user is None:
 kw['portal_type'] = context.getPortalMyDocumentTypeList()
 kw['owner'] = user
 
-if not kw.has_key('validation_state'):
+if 'validation_state' not in kw:
   kw['validation_state'] = "!=embedded"
 
 return context.portal_catalog(**kw)
diff --git a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getPropertyDictFromFilename.py b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getPropertyDictFromFilename.py
index 1e245ec67e..5c8d8b173f 100644
--- a/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getPropertyDictFromFilename.py
+++ b/bt5/erp5_ingestion/SkinTemplateItem/portal_skins/erp5_ingestion/ContributionTool_getPropertyDictFromFilename.py
@@ -13,7 +13,7 @@
   Type-based.
 """
 # convert language to lowercase
-if property_dict.has_key('language'):
+if 'language' in property_dict:
   property_dict['language'] = property_dict['language'].lower()
 
 language = property_dict.get('language', 'en')
diff --git a/bt5/erp5_invoicing/ModuleComponentTemplateItem/portal_components/module.erp5.TestInvoiceMixin.py b/bt5/erp5_invoicing/ModuleComponentTemplateItem/portal_components/module.erp5.TestInvoiceMixin.py
index a993e6583e..fa538ed792 100644
--- a/bt5/erp5_invoicing/ModuleComponentTemplateItem/portal_components/module.erp5.TestInvoiceMixin.py
+++ b/bt5/erp5_invoicing/ModuleComponentTemplateItem/portal_components/module.erp5.TestInvoiceMixin.py
@@ -167,7 +167,7 @@ class TestInvoiceMixin(TestPackingListMixin):
                   'product_line/apparel'))
       account_module = portal.account_module
       for account_id, account_gap, account_type in self.account_definition_list:
-        if not account_module.has_key(account_id):
+        if account_id not in account_module:
           account = account_module.newContent(account_id, gap=account_gap,
                                               account_type=account_type)
           account.validate()
diff --git a/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item/ItemModule_createDeliveryLine.py b/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item/ItemModule_createDeliveryLine.py
index 3b33438cb1..f8ee57d7a4 100644
--- a/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item/ItemModule_createDeliveryLine.py
+++ b/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item/ItemModule_createDeliveryLine.py
@@ -35,7 +35,7 @@ for ss in source_section_list:
   else:
     uid = 'UID' 
 
-  if not pl_dict.has_key(uid):
+  if uid not in pl_dict:
     pl_dict[uid] = module.newContent(**pl_property_dict)
     pl_dict[uid].setSourceSectionValue(ss)
 
diff --git a/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item_trade/DeliveryLine_createItemList.py b/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item_trade/DeliveryLine_createItemList.py
index 22b242e3a9..0c028cd2d4 100644
--- a/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item_trade/DeliveryLine_createItemList.py
+++ b/bt5/erp5_item/SkinTemplateItem/portal_skins/erp5_item_trade/DeliveryLine_createItemList.py
@@ -21,7 +21,7 @@ if dialog.has_field('your_item_extra_property_list'):
 
 for line in kw.get('listbox'):
 
-  if line.has_key('listbox_key'):
+  if 'listbox_key' in line:
     item_reference = line.get('reference')
     if item_reference:
       item = context.portal_catalog.getResultValue(
diff --git a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py
index 90d8315ab8..e451ce4e63 100644
--- a/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py
+++ b/bt5/erp5_km/SkinTemplateItem/portal_skins/erp5_km/WebSite_getWorklistSettingsFor.py
@@ -21,7 +21,7 @@ kw = worklist.getIdentityCriterionDict()
 portal_type_list = workflow.getPortalTypeListForWorkflow()
 if not portal_type_list:
   return {} # If no portal type uses the workflow, ignore it
-if not kw.has_key('portal_type'):
+if 'portal_type' not in kw:
   # Set portal types which use the workflow
   kw['portal_type'] = portal_type_list
     
diff --git a/bt5/erp5_km_sphinxse_full_text_search/SkinTemplateItem/portal_skins/erp5_km_sphinxse_full_text_search/WebSite_getWebSectionPredicateMapAndUidList.py b/bt5/erp5_km_sphinxse_full_text_search/SkinTemplateItem/portal_skins/erp5_km_sphinxse_full_text_search/WebSite_getWebSectionPredicateMapAndUidList.py
index a6f2f12afd..53fd3dd82a 100644
--- a/bt5/erp5_km_sphinxse_full_text_search/SkinTemplateItem/portal_skins/erp5_km_sphinxse_full_text_search/WebSite_getWebSectionPredicateMapAndUidList.py
+++ b/bt5/erp5_km_sphinxse_full_text_search/SkinTemplateItem/portal_skins/erp5_km_sphinxse_full_text_search/WebSite_getWebSectionPredicateMapAndUidList.py
@@ -28,7 +28,7 @@ def getWebSectionPredicateValueList():
       # remove leading 'follow_up' from category
       if category.startswith('follow_up/'):
         category = category.replace('follow_up/', '', 1)
-      if not category_map.has_key(category):
+      if category not in category_map:
         category_map[category] = []
       category_map[category].append({'uid': section['uid'], 'relative_url':section['relative_url']})
     # get base_categories we care for
diff --git a/bt5/erp5_knowledge_pad/SkinTemplateItem/portal_skins/erp5_knowledge_pad/KnowledgeBox_baseEdit.py b/bt5/erp5_knowledge_pad/SkinTemplateItem/portal_skins/erp5_knowledge_pad/KnowledgeBox_baseEdit.py
index b0e5d4350d..c5044959f3 100644
--- a/bt5/erp5_knowledge_pad/SkinTemplateItem/portal_skins/erp5_knowledge_pad/KnowledgeBox_baseEdit.py
+++ b/bt5/erp5_knowledge_pad/SkinTemplateItem/portal_skins/erp5_knowledge_pad/KnowledgeBox_baseEdit.py
@@ -25,7 +25,7 @@ except FormValidationError, validation_errors:
   # Make sure editors are pushed back as values into the REQUEST object
   for f in form.get_fields():
     field_id = f.id
-    if request.has_key(field_id):
+    if field_id in request:
       value = request.get(field_id)
       if callable(value):
         value(request)
diff --git a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_getReportResultList.py b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_getReportResultList.py
index 68f2bc1d37..0c83cb605c 100644
--- a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_getReportResultList.py
+++ b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_getReportResultList.py
@@ -7,7 +7,7 @@ result_listbox = []
 
 # context.log(str(kw))
 if active_process_path is None:
-  if kw.has_key('active_process') and kw['active_process'] not in ('', None):
+  if 'active_process' in kw and kw['active_process'] not in ('', None):
     active_process_path = kw['active_process']
 #else:
 #  if context.REQUEST.get('active_process', None) not in ('None', None):
diff --git a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
index 26746415aa..1beec5cbff 100644
--- a/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
+++ b/bt5/erp5_ooo_import/SkinTemplateItem/portal_skins/erp5_ooo_import/Base_importFile.py
@@ -108,7 +108,7 @@ else:
 
       portal_type, property = portal_type_property.split('.', 1)
 
-      if not mapping.has_key(spreadsheet_name):
+      if spreadsheet_name not in mapping:
         mapping[spreadsheet_name] = (portal_type, {})
       mapping[spreadsheet_name][1][column_name] = property
 
@@ -147,7 +147,7 @@ else:
       imported_line_property_dict = {}
 
       for line_property_index in range(len(line)):
-        if column_mapping.has_key(line_property_index):
+        if line_property_index in column_mapping:
           property_value = line[line_property_index]
           if property_value:
             # Create a new property value
diff --git a/bt5/erp5_paypal_secure_payment/DocumentTemplateItem/portal_components/document.erp5.PaypalService.py b/bt5/erp5_paypal_secure_payment/DocumentTemplateItem/portal_components/document.erp5.PaypalService.py
index 8789d2ed4e..3b9c8def63 100644
--- a/bt5/erp5_paypal_secure_payment/DocumentTemplateItem/portal_components/document.erp5.PaypalService.py
+++ b/bt5/erp5_paypal_secure_payment/DocumentTemplateItem/portal_components/document.erp5.PaypalService.py
@@ -94,7 +94,7 @@ class PaypalService(XMLObject):
     param_dict = REQUEST.form
     LOG("PaypalService", DEBUG, param_dict)
     param_dict["cmd"] = "_notify-validate"
-    if param_dict.has_key("service"):
+    if "service" in param_dict:
       param_dict.pop("service")
     param_list = urlencode(param_dict)
     paypal_url = self.getLinkUrlString()
diff --git a/bt5/erp5_payroll/DocumentTemplateItem/portal_components/document.erp5.PaySheetTransaction.py b/bt5/erp5_payroll/DocumentTemplateItem/portal_components/document.erp5.PaySheetTransaction.py
index 754ef9b97f..6cc4057d5a 100644
--- a/bt5/erp5_payroll/DocumentTemplateItem/portal_components/document.erp5.PaySheetTransaction.py
+++ b/bt5/erp5_payroll/DocumentTemplateItem/portal_components/document.erp5.PaySheetTransaction.py
@@ -199,7 +199,7 @@ class PaySheetTransaction(Invoice):
         if movement.getTotalPrice() not in (0, None):
           # remove movement with 0 total_price
           trade_phase = movement.getTradePhase()
-          if not movement_list_trade_phase_dic.has_key(trade_phase):
+          if trade_phase not in movement_list_trade_phase_dic:
             movement_list_trade_phase_dic[trade_phase] = []
           movement_list_trade_phase_dic[trade_phase].append(movement)
       for trade_phase in movement_list_trade_phase_dic.keys():
diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_createAllPaySheetLineList.py b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_createAllPaySheetLineList.py
index d0522bd356..0c01316fd5 100644
--- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_createAllPaySheetLineList.py
+++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_createAllPaySheetLineList.py
@@ -14,7 +14,7 @@ context.manage_delObjects(id_list)
 # create Pay Sheet Lines
 context.createPaySheetLineList(listbox=listbox)
 
-if not(kw.has_key('skip_redirect') and kw['skip_redirect'] == True):
+if not('skip_redirect' in kw and kw['skip_redirect'] == True):
   # Return to pay sheet default view
   from ZTUtils import make_query
   redirect_url = '%s/%s?%s' % (context.absolute_url(), 'view', make_query())
diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getEditableObjectLineList.py b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getEditableObjectLineList.py
index 9ccdd90583..95bb19aa1b 100644
--- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getEditableObjectLineList.py
+++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getEditableObjectLineList.py
@@ -80,10 +80,10 @@ for model_line in model_line_list:
       salary_range = 'no_slice'
 
     # check that another share on the same slice have not been already add
-    if not object_dict.has_key(salary_range):
+    if salary_range not in object_dict:
       salary_range_title = None
       salary_range_relative_url = None
-      if tuple_dict.has_key('salary_range'):
+      if 'salary_range' in tuple_dict:
         salary_range_title = tuple_dict['salary_range']
         salary_range_relative_url = tuple_dict['salary_range_relative_url']
       new_uid = "new_%s" % id_
@@ -108,7 +108,7 @@ for model_line in model_line_list:
 
   for object_key in model_line.getSalaryRangeList():
     line_list.append(model_line.asContext(**object_dict[object_key]))
-  if object_dict.has_key('no_slice'):
+  if 'no_slice' in object_dict:
     line_list.append(model_line.asContext(**object_dict['no_slice']))
 
 
@@ -132,7 +132,7 @@ def sortByIntIndexDescending(x, y):
 
 sortByDefaultSortMethod = sortByIntIndexAscending
 
-if kw.has_key('sort_on'):
+if 'sort_on' in kw:
   sort_on = kw['sort_on']
   if sort_on[0][0] == 'title' and sort_on[0][1]=='ascending':
     line_list.sort(sortByTitleAscending)
diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getMovementList.py b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getMovementList.py
index e82aaca840..22f0201728 100644
--- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getMovementList.py
+++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_getMovementList.py
@@ -78,9 +78,9 @@ for paysheet_line in paysheet_line_list:
     salary_range_slice = cell.getSalaryRange()
     if salary_range_slice is None:
       salary_range_slice = 'no_slice'
-    if not object_dict.has_key(salary_range_slice):
+    if salary_range_slice not in object_dict:
       slice_title = None
-      if tuple_dict.has_key('salary_range'):
+      if 'salary_range' in tuple_dict:
         slice_title=tuple_dict['salary_range']
       object_dict[salary_range_slice]={
                     'slice':slice_title,
@@ -117,7 +117,7 @@ for paysheet_line in paysheet_line_list:
 
   for object_key in paysheet_line.getSalaryRangeList():
     line_list.append(paysheet_line.asContext(**object_dict[object_key]))
-  if object_dict.has_key('no_slice'):
+  if 'no_slice' in object_dict:
     line_list.append(paysheet_line.asContext(**object_dict['no_slice']))
 
 
@@ -137,7 +137,7 @@ def sortByIntIndexDescending(x, y):
 
 sortByDefaultSortMethod = sortByIntIndexAscending
 
-if kw.has_key('sort_on'):
+if 'sort_on' in kw:
   sort_on = kw['sort_on']
   if sort_on[0][0] == 'title' and sort_on[0][1]=='ascending':
     line_list.sort(sortByTitleAscending)
diff --git a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_viewPaySheetTransactionAsText.py b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_viewPaySheetTransactionAsText.py
index e732b22f69..2d2ce4178d 100644
--- a/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_viewPaySheetTransactionAsText.py
+++ b/bt5/erp5_payroll/SkinTemplateItem/portal_skins/erp5_payroll/PaySheetTransaction_viewPaySheetTransactionAsText.py
@@ -22,14 +22,14 @@ for line in line_dict_list:
   string_to_display.append(rightPad(line['title'], 40))
   string_to_display.append(rightPad(line['base'], 16))
 
-  if line.has_key('employer_quantity'):
+  if 'employer_quantity' in line:
     string_to_display.append(rightPad(str(line['employer_price']), 24))
     string_to_display.append(rightPad(str(line['employer_quantity']), 24))
   else:
     string_to_display.append(rightPad(' ', 24))
     string_to_display.append(rightPad(' ', 24))
 
-  if line.has_key('employee_quantity'):
+  if 'employee_quantity' in line:
     string_to_display.append(rightPad(str(line['employee_price']), 24))
     string_to_display.append(rightPad(str(line['employee_quantity']), 24))
   else:
diff --git a/bt5/erp5_payroll/TestTemplateItem/portal_components/test.erp5.testPayroll.py b/bt5/erp5_payroll/TestTemplateItem/portal_components/test.erp5.testPayroll.py
index a8444e2c4a..b7c925f1b1 100644
--- a/bt5/erp5_payroll/TestTemplateItem/portal_components/test.erp5.testPayroll.py
+++ b/bt5/erp5_payroll/TestTemplateItem/portal_components/test.erp5.testPayroll.py
@@ -1428,16 +1428,16 @@ class TestPayrollMixin(TestTradeModelLineMixin, ERP5ReportTestCase):
     self.assertEqual(len(model_reference_dict), 3) # there is 4 model but two
                                                     # models have the same
                                                     # reference.
-    self.assertEqual(model_reference_dict.has_key(model_employee_url), True)
+    self.assertEqual(model_employee_url in model_reference_dict, True)
     self.assertEqual(model_reference_dict[model_employee_url],
         ['over_time_duration'])
-    self.assertEqual(model_reference_dict.has_key(model_company_url), True)
+    self.assertEqual(model_company_url in model_reference_dict, True)
     self.assertEqual(model_reference_dict[model_company_url],
         ['worked_time_duration'])
-    self.assertEqual(model_reference_dict.has_key(model_company_alt_url), True)
+    self.assertEqual(model_company_alt_url in model_reference_dict, True)
     self.assertEqual(model_reference_dict[model_company_alt_url],
         ['social_insurance'])
-    self.assertNotEquals(model_reference_dict.has_key(model_country_url), True)
+    self.assertNotEquals(model_country_url in model_reference_dict, True)
 
     # check the object list :
     object_list = paysheet.getInheritedObjectValueList(portal_type_list=\
diff --git a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Amount_hashVariationCategoryItemList.py b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Amount_hashVariationCategoryItemList.py
index ee7c962519..869a948787 100644
--- a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Amount_hashVariationCategoryItemList.py
+++ b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Amount_hashVariationCategoryItemList.py
@@ -14,7 +14,7 @@ for item in item_list:
   item_split = string.split(item_value, '/')
   item_key = string.join(item_split[:split_depth] , '/' )
   base_category = item_split[0]
-  if not sub_field_dict.has_key(item_key):
+  if item_key not in sub_field_dict:
     # Create property dict
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Transformation_getReportSectionList.py b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Transformation_getReportSectionList.py
index b147786f2f..de35d77544 100644
--- a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Transformation_getReportSectionList.py
+++ b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/Transformation_getReportSectionList.py
@@ -14,7 +14,7 @@ result = []
 variation_category_dict = {}
 for variation_category in reference_variation_category_list:
   base_category = variation_category.split('/',1)[0]
-  if variation_category_dict.has_key( base_category ):
+  if base_category in variation_category_dict:
     variation_category_dict[base_category].append( variation_category )
   else:
     variation_category_dict[base_category] = [variation_category]
diff --git a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/TransformedResource_hashVariationCategoryItemList.py b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/TransformedResource_hashVariationCategoryItemList.py
index 4e0953bfd9..70e6e7484f 100644
--- a/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/TransformedResource_hashVariationCategoryItemList.py
+++ b/bt5/erp5_pdm/SkinTemplateItem/portal_skins/erp5_pdm/TransformedResource_hashVariationCategoryItemList.py
@@ -14,7 +14,7 @@ for item in item_list:
   item_split = string.split(item_value, '/')
   item_key = string.join(item_split[:split_depth] , '/' )
 
-  if not sub_field_dict.has_key(item_key):
+  if item_key not in sub_field_dict:
     # Create property dict
     sub_field_property_dict = default_sub_field_property_dict.copy()
     sub_field_property_dict['key'] = item_key
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/ProjectLine_generateTasks.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/ProjectLine_generateTasks.py
index 7e544d368e..01a9895158 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/ProjectLine_generateTasks.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/ProjectLine_generateTasks.py
@@ -14,7 +14,7 @@ task_items = []
 
 # get the user information
 for task in listbox:
-  if task.has_key('listbox_key'):
+  if 'listbox_key' in task:
     task_id = int(task['listbox_key'])
     task_dict = {}
     task_dict['id'] = task_id
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateMonthDomain.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateMonthDomain.py
index 094a952dc8..3abb125bb3 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateMonthDomain.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateMonthDomain.py
@@ -54,7 +54,7 @@ else:
   project_to_display_dict = here.monthly_project_to_display_dict.get(string_index, {})
   if depth == 1:
     category_list = [here.project_dict[x] for x in project_to_display_dict.keys() if
-                        here.project_dict.has_key(x)]
+                        x in here.project_dict]
   else:
     parent_category_list = parent.getMembershipCriterionCategoryList()
     category_list = []
@@ -63,12 +63,12 @@ else:
     # need to be displayed for this month
     for parent_category in parent_category_list:
       parent_category = '/'.join(parent_category.split('/')[1:])
-      if project_to_display_dict.has_key(parent_category):
+      if parent_category in project_to_display_dict:
         parent_category_object = context.restrictedTraverse(parent_category)
         category_child_list = parent_category_object.contentValues(portal_type=project_line_portal_type)
         #category_list.append(parent_category_object)
         for category_child in category_child_list:
-          if project_to_display_dict.has_key(category_child.getRelativeUrl()):
+          if category_child.getRelativeUrl() in project_to_display_dict:
             category_list.append(category_child)
 
 
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateQuantityReport.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateQuantityReport.py
index 2472340be9..b44e839a6c 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateQuantityReport.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_generateQuantityReport.py
@@ -37,7 +37,7 @@ def getTotalQuantity(line,worker):
     for child in child_list:
       child_quantity = getTotalQuantity(child,worker)
       for key,value in child_quantity.items():
-        if not quantity.has_key(key):
+        if key not in quantity:
           quantity[key] = 0
         quantity[key] = quantity[key] + value
   else:
@@ -73,7 +73,7 @@ for year,month in month_list:
   listbox_line['month'] = month
   for worker in worker_list:
     quantity = 0
-    if worker_quantity[worker].has_key((year,month)):
+    if (year,month) in worker_quantity[worker]:
       quantity = worker_quantity[worker][(year,month)]
     worker_title = 'unknown'
     if worker is not None:
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyObjectList.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyObjectList.py
index 9d87d71a04..1a9fc1268a 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyObjectList.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyObjectList.py
@@ -25,6 +25,6 @@ else:
     membership_criterion_category = membership_criterion_category_list[0]
     assert membership_criterion_category.startswith('source_project/')
     project_relative_url = membership_criterion_category[len('source_project/'):]
-    if returned_object.has_key(project_relative_url):
+    if project_relative_url in returned_object:
       result_list.append(returned_object[project_relative_url])
 return result_list
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyReportSectionList.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyReportSectionList.py
index 46c5c006ad..04d709d9a4 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyReportSectionList.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getMonthlyReportSectionList.py
@@ -127,7 +127,7 @@ for task_line in result_list:
   project_relative_url = project_dict['relative_url']
   full_date_total_worker_quantity_dict[source_relative_url] = \
     full_date_total_worker_quantity_dict.get(source_relative_url, 0) + quantity
-  if not full_date_total_object_dict.has_key(project_relative_url):
+  if project_relative_url not in full_date_total_object_dict:
     temp_object = temp_object_container.newContent(portal_type = 'Project Line',
                 temp_object=1,
                 string_index = full_date_string,
@@ -153,7 +153,7 @@ for task_line in result_list:
     project_to_display_dict = monthly_project_to_display_dict.setdefault(string_index, {})
     fillDictWithParentAndChildRelativeUrls(project_to_display_dict, project_relative_url)
     
-    if not quantity_dict.has_key(project_relative_url):
+    if project_relative_url not in quantity_dict:
       temp_object = temp_object_container.newContent(portal_type = 'Project Line',
                   temp_object=1,
                   string_index = string_index,
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskList.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskList.py
index 076a0ca3cc..dc24e2cbec 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskList.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskList.py
@@ -4,15 +4,15 @@ source_project_uid_list = [x.uid for x in context.portal_catalog(
 from Products.ZSQLCatalog.SQLCatalog import Query
 
 sql_kw = {}
-if kw.has_key('from_date') and kw['from_date'] is not None:
+if 'from_date' in kw and kw['from_date'] is not None:
   query_kw = {'delivery.start_date' : kw['from_date'],
               'range' : 'min'}
   sql_kw['delivery.start_date'] = Query(**query_kw)
-if kw.has_key('at_date') and kw['at_date'] is not None:
+if 'at_date' in kw and kw['at_date'] is not None:
   query_kw = {'delivery.stop_date' : kw['at_date'],
               'range' : 'ngt'}
   sql_kw['delivery.stop_date'] = Query(**query_kw)
-if kw.has_key('simulation_state') and len(kw['simulation_state']) > 0 :
+if 'simulation_state' in kw and len(kw['simulation_state']) > 0 :
   sql_kw['simulation_state'] = kw['simulation_state']
 
 task_list = [x.getObject() for x in \
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskReportList.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskReportList.py
index 6dc456c23c..95595d432b 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskReportList.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Project_getSourceProjectRelatedTaskReportList.py
@@ -4,18 +4,18 @@ source_project_uid_list = [x.uid for x in context.portal_catalog(
 from Products.ZSQLCatalog.SQLCatalog import Query
 
 sql_kw = {}
-if kw.has_key('from_date') and kw['from_date'] is not None:
+if 'from_date' in kw and kw['from_date'] is not None:
   query_kw = {'delivery.start_date' : kw['from_date'],
               'range' : 'min'}
   sql_kw['delivery.start_date'] = Query(**query_kw)
-if kw.has_key('at_date') and kw['at_date'] is not None:
+if 'at_date' in kw and kw['at_date'] is not None:
   query_kw = {'delivery.stop_date' : kw['at_date'],
               'range' : 'ngt'}
   sql_kw['delivery.stop_date'] = Query(**query_kw)
 
 # Make sure to not include "confirmed tasks" in any case, because in
 # this case we must take task reports
-if kw.has_key('simulation_state') and len(kw['simulation_state']) > 0 :
+if 'simulation_state' in kw and len(kw['simulation_state']) > 0 :
   task_simulation_state = [x for x in kw['simulation_state'] if x != 'confirmed']
   task_report_simulation_state = kw['simulation_state']
 else:
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Requirement_generateRequirements.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Requirement_generateRequirements.py
index 3a66aada71..fdc067954d 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Requirement_generateRequirements.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Requirement_generateRequirements.py
@@ -26,7 +26,7 @@ requirements_items = []
 
 # get the user information
 for requirement_line in listbox:
-  if requirement_line.has_key('listbox_key'):
+  if 'listbox_key' in requirement_line:
     requirement_line_id = int(requirement_line['listbox_key'])
     requirement = {}
     requirement['id'] = requirement_line_id
@@ -76,7 +76,7 @@ for requirement_item in requirements_items:
     new_1st_level_requirement.append(new_2nd_level_feat)
 
   if has_1st_level_requirement:
-    if clean_requirements.has_key(new_1st_level_requirement_title):
+    if new_1st_level_requirement_title in clean_requirements:
       new_1st_level_requirement = clean_requirements[new_1st_level_requirement_title] + new_1st_level_requirement
     clean_requirements[new_1st_level_requirement_title] = new_1st_level_requirement
     clean_requirements_key_list.append(new_1st_level_requirement_title)
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReport_getSourceTaskReportList.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReport_getSourceTaskReportList.py
index 69de4f58ba..565d490b47 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReport_getSourceTaskReportList.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/TaskReport_getSourceTaskReportList.py
@@ -3,7 +3,7 @@ log('task_list','starting')
 task_module = context.getDefaultModule('Task Report')
 log('task_list','next1')
 task_list = []
-if not kw.has_key('parent_uid'):
+if 'parent_uid' not in kw:
   kw['parent_uid'] = task_module.getUid()
 log('task_list','next2')
 log('context.getPath()',context.getPath())
diff --git a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Task_isSimpleTask.py b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Task_isSimpleTask.py
index 46a5a15eb5..e8435c646f 100644
--- a/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Task_isSimpleTask.py
+++ b/bt5/erp5_project/SkinTemplateItem/portal_skins/erp5_project/Task_isSimpleTask.py
@@ -1,2 +1,2 @@
 obj_len = len(context.objectValues(portal_type=("Task Line", "Task Report Line")))
-return (obj_len == 0) or ((obj_len == 1) and context.has_key('default_task_line'))
+return (obj_len == 0) or ((obj_len == 1) and 'default_task_line' in context)
diff --git a/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testProject.py b/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testProject.py
index 1590b36adc..bbdc0c84a5 100644
--- a/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testProject.py
+++ b/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testProject.py
@@ -62,18 +62,18 @@ class TestProject(ERP5TypeTestCase):
         rule.validate()
 
     # create organisations
-    if not self.portal.organisation_module.has_key('Organisation_1'):
+    if 'Organisation_1' not in self.portal.organisation_module:
       self.portal.organisation_module.newContent(
                               title='Organisation_1',
                               id='Organisation_1')
 
     # create organisations
-    if not self.portal.organisation_module.has_key('Organisation_2'):
+    if 'Organisation_2' not in self.portal.organisation_module:
       self.portal.organisation_module.newContent(
                               title='Organisation_2',
                               id='Organisation_2')
     # create project
-    if not self.portal.project_module.has_key('Project_1'):
+    if 'Project_1' not in self.portal.project_module:
       self.portal.project_module.newContent(
                               portal_type='Project',
                               reference='Project_1',
@@ -82,7 +82,7 @@ class TestProject(ERP5TypeTestCase):
 
     # Create resources
     module = self.portal.product_module
-    if not module.has_key('development'):
+    if 'development' not in module:
       module.newContent(
           portal_type='Product',
           id='development',
diff --git a/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testTaskReporting.py b/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testTaskReporting.py
index fd6d72e3fe..90a605e215 100644
--- a/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testTaskReporting.py
+++ b/bt5/erp5_project/TestTemplateItem/portal_components/test.erp5.testTaskReporting.py
@@ -71,14 +71,14 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
         rule.validate()
 
     # create organisations
-    if not self.portal.organisation_module.has_key('Organisation_1'):
+    if 'Organisation_1' not in self.portal.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_1',
                               title='Organisation_1',
                               id='Organisation_1')
 
-    if not self.portal.organisation_module.has_key('Organisation_2'):
+    if 'Organisation_2' not in self.portal.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_2',
@@ -86,13 +86,13 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
                               id='Organisation_2')
 
     # create persons
-    if not self.portal.person_module.has_key('Person_1'):
+    if 'Person_1' not in self.portal.person_module:
       self.portal.person_module.newContent(
                               portal_type='Person',
                               reference='Person_1',
                               title='Person_1',
                               id='Person_1')
-    if not self.portal.person_module.has_key('Person_2'):
+    if 'Person_2' not in self.portal.person_module:
       self.portal.person_module.newContent(
                               portal_type='Person',
                               reference='Person_2',
@@ -100,7 +100,7 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
                               id='Person_2')
 
     # create project
-    if not self.portal.project_module.has_key('Project_1'):
+    if 'Project_1' not in self.portal.project_module:
       project = self.portal.project_module.newContent(
                               portal_type='Project',
                               reference='Project_1',
@@ -114,7 +114,7 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
       project.newContent(portal_type='Project Line',
                          id='Line_2',
                          title='Line_2')
-    if not self.portal.project_module.has_key('Project_2'):
+    if 'Project_2' not in self.portal.project_module:
       project = self.portal.project_module.newContent(
                               portal_type='Project',
                               reference='Project_2',
@@ -125,7 +125,7 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
 
     # create unit categories
     for unit_id in ('day', 'hour',):
-      if not self.portal.portal_categories['quantity_unit'].has_key(unit_id):
+      if unit_id not in self.portal.portal_categories['quantity_unit']:
         self.portal.portal_categories.quantity_unit.newContent(
                                   portal_type='Category',
                                   title=unit_id.title(),
@@ -134,7 +134,7 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
 
     # Create resources
     module = self.portal.product_module
-    if not module.has_key('development'):
+    if 'development' not in module:
       module.newContent(
           portal_type='Product',
           id='development',
@@ -142,7 +142,7 @@ class TestTaskReportingMixin(ERP5ReportTestCase):
           reference='ref 1',
           quantity_unit='day'
           )
-    if not module.has_key('consulting'):
+    if 'consulting' not in module:
       module.newContent(
           portal_type='Product',
           id='consulting',
diff --git a/bt5/erp5_research_item/TestTemplateItem/portal_components/test.erp5.testResearchItemSummaryReport.py b/bt5/erp5_research_item/TestTemplateItem/portal_components/test.erp5.testResearchItemSummaryReport.py
index 63548bb0de..b4f1e188d1 100644
--- a/bt5/erp5_research_item/TestTemplateItem/portal_components/test.erp5.testResearchItemSummaryReport.py
+++ b/bt5/erp5_research_item/TestTemplateItem/portal_components/test.erp5.testResearchItemSummaryReport.py
@@ -42,16 +42,16 @@ class TestResearchItemSummaryReport(TestTaskReportingMixin):
     super(TestResearchItemSummaryReport, self).afterSetUp()
     ledger_base_category = self.portal.portal_categories.ledger
     for category_id in ("operation", "research"):
-      if not ledger_base_category.has_key(category_id):
+      if category_id not in ledger_base_category:
         ledger_base_category.newContent(
              portal_type='Category', title=category_id.title(),
              reference=category_id, id=category_id)
 
     # create items
-    if not self.portal.research_item_module.has_key('Item_1'):
+    if 'Item_1' not in self.portal.research_item_module:
       self.portal.research_item_module.newContent(title="Item_1",
            id="Item_1", portal_type="Research Item")
-    if not self.portal.research_item_module.has_key('Item_2'):
+    if 'Item_2' not in self.portal.research_item_module:
       self.portal.research_item_module.newContent(title="Item_2",
            id="Item_2", portal_type="Research Item")
 
diff --git a/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_createChapter.py b/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_createChapter.py
index 1ac6ed8450..26c5d7a84e 100644
--- a/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_createChapter.py
+++ b/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_createChapter.py
@@ -11,7 +11,7 @@ if image_caption in [None, ""]:
   image_caption = chapter_title
 
 session = context.ERP5Site_acquireRunMyDocsSession()
-if session.has_key('listbox') and len(session['listbox']) > 0:
+if 'listbox' in session and len(session['listbox']) > 0:
   listbox = session['listbox']
   int_index = listbox[-1].int_index + 1
 else:
diff --git a/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_getPreviousChapterList.py b/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_getPreviousChapterList.py
index 6f7be146eb..49bff62629 100644
--- a/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_getPreviousChapterList.py
+++ b/bt5/erp5_run_my_doc/SkinTemplateItem/portal_skins/erp5_run_my_doc/TestPageModule_getPreviousChapterList.py
@@ -3,7 +3,7 @@
 """
 
 session = context.ERP5Site_acquireRunMyDocsSession()
-if session.has_key('listbox'):
+if 'listbox' in session:
   listbox = session['listbox']
 else:
   listbox = []
diff --git a/bt5/erp5_simplified_invoicing/TestTemplateItem/portal_components/test.erp5.testBPMCore.py b/bt5/erp5_simplified_invoicing/TestTemplateItem/portal_components/test.erp5.testBPMCore.py
index 8a02ce903d..df56fe3d03 100644
--- a/bt5/erp5_simplified_invoicing/TestTemplateItem/portal_components/test.erp5.testBPMCore.py
+++ b/bt5/erp5_simplified_invoicing/TestTemplateItem/portal_components/test.erp5.testBPMCore.py
@@ -444,7 +444,7 @@ class TestBPMImplementation(TestBPMDummyDeliveryMovementMixin):
 
     context_movement = self.createMovement()
     self.assertEqual(None, business_path.getSourceValue())
-    self.assertFalse(business_path.getArrowCategoryDict(context=context_movement).has_key('source'))
+    self.assertFalse('source' in business_path.getArrowCategoryDict(context=context_movement))
 
   def test_BusinessPathDynamicCategoryAccessProviderReplaceCategory(self):
     business_path = self.createTradeModelPath()
diff --git a/bt5/erp5_syncml/DocumentTemplateItem/portal_components/document.erp5.SyncMLSubscription.py b/bt5/erp5_syncml/DocumentTemplateItem/portal_components/document.erp5.SyncMLSubscription.py
index 5d05aa0d37..5ab04d8e61 100644
--- a/bt5/erp5_syncml/DocumentTemplateItem/portal_components/document.erp5.SyncMLSubscription.py
+++ b/bt5/erp5_syncml/DocumentTemplateItem/portal_components/document.erp5.SyncMLSubscription.py
@@ -112,7 +112,7 @@ class SyncMLSubscription(XMLObject):
     activate_kw : activity parameters to pass to activate call
     kw : any parameter getAndActivate can required if it calls itself
     """
-    if kw.has_key("packet_size"):
+    if "packet_size" in kw:
       search_kw = dict(kw)
       packet_size = search_kw.pop('packet_size', 30)
       limit = packet_size * search_kw.pop('activity_count', 100)
@@ -277,7 +277,7 @@ class SyncMLSubscription(XMLObject):
     syncml_logger.debug("--> calling getAndActivate packet size = %s, limit = %s",
                         packet_size, limit)
     # We must know if we have a lower limit or not to propagate
-    if not kw.has_key("strict_min_gid"):
+    if "strict_min_gid" not in kw:
       first_call = True
     else:
       first_call = False
diff --git a/bt5/erp5_syncml/ModuleComponentTemplateItem/portal_components/module.erp5.ERP5ShopOrderConduit.py b/bt5/erp5_syncml/ModuleComponentTemplateItem/portal_components/module.erp5.ERP5ShopOrderConduit.py
index f31f4f1ca1..a737bdba01 100644
--- a/bt5/erp5_syncml/ModuleComponentTemplateItem/portal_components/module.erp5.ERP5ShopOrderConduit.py
+++ b/bt5/erp5_syncml/ModuleComponentTemplateItem/portal_components/module.erp5.ERP5ShopOrderConduit.py
@@ -292,7 +292,7 @@ class ERP5ShopOrderConduit(ERP5Conduit):
       * machin = getattr (object, methos)
       * machin()
     """
-    if kw.has_key(key):
+    if key in kw:
       new_value = kw[key]
       if new_value != None:
         if isinstance(new_value, str):
@@ -338,7 +338,7 @@ class ERP5ShopOrderConduit(ERP5Conduit):
     erp5_site_path = erp5_site.absolute_url(relative=1)
 
     # The object is a ShopOrder
-    if kw.has_key('country'):
+    if 'country' in kw:
       object.setStartDate(kw['target_start_date'])
       object.setStopDate(kw['target_stop_date'])
       # Find the organisation and the person folder
@@ -379,7 +379,7 @@ class ERP5ShopOrderConduit(ERP5Conduit):
         previous_owner_type = 'o' # Organisation is more important than the person
         # This is a particular case where the user put
         # the name of an organisation in his own name
-        if not kw.has_key('organisation'):
+        if 'organisation' not in kw:
           kw['organisation'] = org_object.getId()
       #if len(previous_owner_type) == 0:
       #  previous_owner_type = None
@@ -387,11 +387,11 @@ class ERP5ShopOrderConduit(ERP5Conduit):
 
       # Try to know the type of the current storever customer
       owner_type = ''
-      if kw.has_key('name') and kw['name'] not in (None, ''):
+      if 'name' in kw and kw['name'] not in (None, ''):
         owner_type += 'p'
-      if kw.has_key('organisation') and kw['organisation'] not in (None, '', 'none'):
+      if 'organisation' in kw and kw['organisation'] not in (None, '', 'none'):
         owner_type += 'o'
-      if kw.has_key('eu_vat') and kw['eu_vat'] not in (None, '') and owner_type.find('o') == -1:
+      if 'eu_vat' in kw and kw['eu_vat'] not in (None, '') and owner_type.find('o') == -1:
         owner_type += 'o'
       if len(owner_type) == 0:
         owner_type = None
@@ -511,11 +511,11 @@ class ERP5ShopOrderConduit(ERP5Conduit):
 #           elif previous_address.strip().lower() != kw['address'].strip().lower():
 #             LOG('We have to make the fusion of previous address with the current one  >>>>>>>', 0, '')
 
-        if kw.has_key('city') and kw['city']!=None:
+        if 'city' in kw and kw['city']!=None:
           person_object.setDefaultAddressCity(kw['city'].title())
-        if kw.has_key('address') and kw['address'] != None:
+        if 'address' in kw and kw['address'] != None:
           person_object.setDefaultAddressStreetAddress(kw['address'].title())
-        if kw.has_key('zipcode') and kw['zipcode']!=None:
+        if 'zipcode' in kw and kw['zipcode']!=None:
           person_object.setDefaultAddressZipCode(kw['zipcode'])
 #         # TODO : set the person products interest (storever, etc)
         # Search the country in the region category
@@ -525,15 +525,15 @@ class ERP5ShopOrderConduit(ERP5Conduit):
             person_object.setDefaultAddressRegion(region_path)
 #           else:
 #             # TODO : Ask the user to select an appropriate region
-        if kw.has_key('email') and kw['email'] != None:
+        if 'email' in kw and kw['email'] != None:
           person_object.setDefaultEmailText(kw['email'])
-        if kw.has_key('phone') and kw['phone'] != None:
+        if 'phone' in kw and kw['phone'] != None:
           person_object.setDefaultTelephoneText(kw['phone'])
 #         # TODO : Don't work
 #         person_object.setDefaultCareerRole("client")
         # Split the name to give at least a required LastName
         # Then the title will be automaticaly created by the Person object from this data
-        if kw.has_key('name') and kw['name'] != None:
+        if 'name' in kw and kw['name'] != None:
           splitted_name = kw['name'].strip().split(" ")
           person_object.setLastName((splitted_name[-1]).title())
           if len(splitted_name) > 1:
@@ -545,13 +545,13 @@ class ERP5ShopOrderConduit(ERP5Conduit):
         if owner_type.find('o') != -1 and  previous_owner_type =='o':
 #           # TODO : fix this
 #           person_object.setSubordination("organisation/" + owner_id)
-          if kw.has_key('organisation') and kw['organisation'] != None:
+          if 'organisation' in kw and kw['organisation'] != None:
             org_object.setTitle(kw['organisation'].title())
             org_object.setCorporateName(kw['organisation'].title())
-          if kw.has_key('eu_vat') and kw['eu_vat'] != None:
+          if 'eu_vat' in kw and kw['eu_vat'] != None:
             org_object.setVatCode(kw['eu_vat'])
           # Test for debug
-          if (not (kw.has_key('organisation')) or (kw.has_key('organisation') and kw['organisation'] != None)) and (not (kw.has_key('eu_vat')) or (kw.has_key('eu_vat') and kw['eu_vat'] != None)):
+          if (not ('organisation' in kw) or ('organisation' in kw and kw['organisation'] != None)) and (not ('eu_vat' in kw) or ('eu_vat' in kw and kw['eu_vat'] != None)):
             LOG("AARRGG ! Big conflict detected : this organisation has no title or eu_vat. These properties are primary key to deduced that the storever member account was an organisation >>>>>>>>>>", 0, '')
           org_object.setRole("client")
 
@@ -570,17 +570,17 @@ class ERP5ShopOrderConduit(ERP5Conduit):
         object.setDestination("organisation/" + owner_id)
         object.setDestinationSection("organisation/" + owner_id)
         # All information describe the organisation
-        if kw.has_key('organisation') and kw['organisation'] != None:
+        if 'organisation' in kw and kw['organisation'] != None:
           org_object.setTitle(kw['organisation'].title())
           org_object.setCorporateName(kw['organisation'].title())
         org_object.setRole("client")
-        if kw.has_key('eu_vat') and kw['eu_vat'] != None:
+        if 'eu_vat' in kw and kw['eu_vat'] != None:
           org_object.setVatCode(kw['eu_vat'])
-        if kw.has_key('address') and kw['address'] != None:
+        if 'address' in kw and kw['address'] != None:
           org_object.setDefaultAddressStreetAddress(kw['address'].title())
-        if kw.has_key('city') and kw['city'] != None:
+        if 'city' in kw and kw['city'] != None:
           org_object.setDefaultAddressCity(kw['city'].title())
-        if kw.has_key('zipcode') and kw['zipcode'] != None:
+        if 'zipcode' in kw and kw['zipcode'] != None:
           org_object.setDefaultAddressZipCode(kw['zipcode'])
         # Search the country in the region category
         if kw['country'] != None:
@@ -589,13 +589,13 @@ class ERP5ShopOrderConduit(ERP5Conduit):
             org_object.setDefaultAddressRegion(region_path)
 #           else:
 #             # TODO : Ask the user to select an appropriate region
-        if kw.has_key('email') and kw['email'] != None:
+        if 'email' in kw and kw['email'] != None:
           org_object.setDefaultEmailText(kw['email'])
-        if kw.has_key('phone') and kw['phone'] != None:
+        if 'phone' in kw and kw['phone'] != None:
           org_object.setDefaultTelephoneText(kw['phone'])
 
       # Save the billing address in the description, because there is no dedicated place for it
-      if kw.has_key('billing_address') and len(kw['billing_address']) > 0:
+      if 'billing_address' in kw and len(kw['billing_address']) > 0:
         object.setDescription("Send the bill to : " + kw['billing_address'])
       # Set the Title because its required
       object.setTitle("Storever Order " + str(kw['order_id']))
diff --git a/bt5/erp5_tiosafe_core/DocumentTemplateItem/portal_components/document.erp5.WebServiceRequest.py b/bt5/erp5_tiosafe_core/DocumentTemplateItem/portal_components/document.erp5.WebServiceRequest.py
index 70a8952aaf..e853ac05d7 100644
--- a/bt5/erp5_tiosafe_core/DocumentTemplateItem/portal_components/document.erp5.WebServiceRequest.py
+++ b/bt5/erp5_tiosafe_core/DocumentTemplateItem/portal_components/document.erp5.WebServiceRequest.py
@@ -111,11 +111,11 @@ class WebServiceRequest(XMLObject, ZopePageTemplate):
     if REQUEST is not None:
       return self.view()
     #LOG("_call__", 300, kw)
-    if kw.has_key("id"):
+    if "id" in kw:
       kw[self.getIDParameterName()] = str(kw.pop("id"))
 
     sub_id = None
-    if kw.has_key(self.getIDParameterName()) and ID_SEPARATOR in kw[self.getIDParameterName()]:
+    if self.getIDParameterName() in kw and ID_SEPARATOR in kw[self.getIDParameterName()]:
       kw[self.getIDParameterName()], sub_id = kw[self.getIDParameterName()].split(ID_SEPARATOR)
 
     object_list = []
diff --git a/bt5/erp5_tiosafe_core/ModuleComponentTemplateItem/portal_components/module.erp5.TioSafeUtils.py b/bt5/erp5_tiosafe_core/ModuleComponentTemplateItem/portal_components/module.erp5.TioSafeUtils.py
index 1069c57312..0dbeabebb8 100644
--- a/bt5/erp5_tiosafe_core/ModuleComponentTemplateItem/portal_components/module.erp5.TioSafeUtils.py
+++ b/bt5/erp5_tiosafe_core/ModuleComponentTemplateItem/portal_components/module.erp5.TioSafeUtils.py
@@ -68,7 +68,7 @@ class NewEchoDictTarget:
         self.current_parser = subtag
       else:
         if self._current_object is not None and \
-               not self._current_object.has_key(value):
+               value not in self._current_object:
           # Create default value
           self._current_object[value] = ""
           self._current_key = value
@@ -102,7 +102,7 @@ class NewEchoDictTarget:
   def data(self, data):
     if self._current_key and len(data.strip()):
       # for the element browsed several time
-      if self._current_object.has_key(self._current_key):
+      if self._current_key in self._current_object:
         data = self._current_object[self._current_key] + data
       self._current_object[self._current_key] = data
 
@@ -148,7 +148,7 @@ class EchoDictTarget:
       if root:
         self._current_object = {}
       if self._current_object is not None and \
-             not self._current_object.has_key(value):
+             value not in self._current_object:
         self._current_object[value] = ""
         self._current_key = value
       else:
@@ -171,7 +171,7 @@ class EchoDictTarget:
   def data(self, data):
     if self._current_key and len(data.strip()):
       # for the element browsed several time
-      if self._current_object.has_key(self._current_key):
+      if self._current_key in self._current_object:
         data = self._current_object[self._current_key] + data
       self._current_object[self._current_key] = data
 
diff --git a/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_setCategoryMappingLineList.py b/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_setCategoryMappingLineList.py
index 00bcafadac..398ac3dfa0 100644
--- a/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_setCategoryMappingLineList.py
+++ b/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_setCategoryMappingLineList.py
@@ -25,7 +25,7 @@ def createCategory(object_mapping=None, category=""):
 mapping_dict = {}
 destination_list = []
 for line in listbox:
-  if line.has_key('listbox_key'):
+  if 'listbox_key' in line:
     line_id = line['listbox_key']
     mapping_dict[line_id] = line
     if line["destination_reference_text"] != "":
diff --git a/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_updateCategoryMappingLineList.py b/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_updateCategoryMappingLineList.py
index 8537e9dbeb..080c2b7764 100644
--- a/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_updateCategoryMappingLineList.py
+++ b/bt5/erp5_tiosafe_core/SkinTemplateItem/portal_skins/erp5_integration/IntegrationSite_updateCategoryMappingLineList.py
@@ -14,14 +14,14 @@ def getMappingChildUid(mapping):
 
 def resetListBox(listbox, uid_list):
   for line in listbox:
-    if line.has_key('listbox_key'):
+    if 'listbox_key' in line:
       line_id = line['listbox_key']
       if line_id in uid_list:
         line['destination_reference'] = ""
   return listbox
 
 for line in listbox:
-  if line.has_key('listbox_key'):
+  if 'listbox_key' in line:
     line_id = line['listbox_key']
     mapping_dict[line_id] = line
     if line["destination_reference_text"] != "":
diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.py b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.py
index 2650fdd985..9438179bd2 100644
--- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.py
+++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_getOrderStatList.py
@@ -73,11 +73,11 @@ if len(client_dict):
     line_total_amount = 0
     for period in period_list:
       # client -> period
-      if client_dict[client_title].has_key(period):
+      if period in client_dict[client_title]:
         obj['Amount %s' %(period)] = round(client_dict[client_title][period]['amount'], 2)
         line_total_amount += client_dict[client_title][period]['amount']
         if report_group_by == "client":
-          if period_counter_dict.has_key('Amount %s' %(period)):
+          if 'Amount %s' %(period) in period_counter_dict:
             period_counter_dict['Amount %s' %(period)] = period_counter_dict['Amount %s' %(period)] + client_dict[client_title][period]['amount']
           else:
             period_counter_dict['Amount %s' %(period)] = client_dict[client_title][period]['amount']
@@ -85,7 +85,7 @@ if len(client_dict):
         obj['Amount %s' %(period)] = 0
     obj['total amount'] = round(line_total_amount, 2)
     if report_group_by == "client":
-      if period_counter_dict.has_key('total amount'):
+      if 'total amount' in period_counter_dict:
         period_counter_dict['total amount'] = period_counter_dict['total amount'] + line_total_amount
       else:
         period_counter_dict['total amount'] = line_total_amount
@@ -94,7 +94,7 @@ if len(client_dict):
     if report_group_by == "both":
       product_lines_list = []
       # one line per product
-      if product_dict.has_key(client_title):
+      if client_title in product_dict:
         line_product_dict = product_dict[client_title]
         for product_title in line_product_dict.keys():
           obj = Object(uid="new_")
@@ -102,7 +102,7 @@ if len(client_dict):
           line_total_amount = 0
           line_total_quantity = 0
           for period in period_list:
-            if line_product_dict[product_title].has_key(period):
+            if period in line_product_dict[product_title]:
               obj['Amount %s' %(period)] = round(line_product_dict[product_title][period]['amount'], 2)
               obj['Quantity %s' %(period)] = line_product_dict[product_title][period]['quantity']
               obj['Quantity Unit %s' %(period)] = line_product_dict[product_title][period]['quantity_unit']
@@ -110,7 +110,7 @@ if len(client_dict):
               line_total_amount += line_product_dict[product_title][period]['amount']
               line_total_quantity += line_product_dict[product_title][period]['quantity']
               # counter for stat line
-              if period_counter_dict.has_key('Amount %s' %(period)):
+              if 'Amount %s' %(period) in period_counter_dict:
                 period_counter_dict['Amount %s' %(period)] = period_counter_dict['Amount %s' %(period)] + \
                                                              line_product_dict[product_title][period]['amount']
               else:
@@ -124,7 +124,7 @@ if len(client_dict):
           obj['total quantity'] = line_total_quantity
           obj['total amount'] = round(line_total_amount, 2)
           # total for stat line
-          if period_counter_dict.has_key('total amount'):
+          if 'total amount' in period_counter_dict:
             period_counter_dict['total amount'] = period_counter_dict['total amount'] + line_total_amount
           else:
             period_counter_dict['total amount'] = line_total_amount
@@ -142,7 +142,7 @@ else:
       line_total_amount = 0
       line_total_quantity = 0    
       for period in period_list:
-        if product_dict[product_title].has_key(period):
+        if period in product_dict[product_title]:
           obj['Amount %s' %(period)] = round(product_dict[product_title][period]['amount'],2)
           obj['Quantity %s' %(period)] = product_dict[product_title][period]['quantity']
           obj['Quantity Unit %s' %(period)] = product_dict[product_title][period]['quantity_unit']
@@ -150,7 +150,7 @@ else:
           line_total_amount += product_dict[product_title][period]['amount']
           line_total_quantity += product_dict[product_title][period]['quantity']
           # counter for stat line
-          if period_counter_dict.has_key('Amount %s' %(period)):
+          if 'Amount %s' %(period) in period_counter_dict:
             period_counter_dict['Amount %s' %(period)] = period_counter_dict['Amount %s' %(period)] + product_dict[product_title][period]['amount']
           else:
             period_counter_dict['Amount %s' %(period)] = product_dict[product_title][period]['amount']
@@ -162,7 +162,7 @@ else:
       obj['total quantity'] = line_total_quantity
       obj['total amount'] = round(line_total_amount,2)
       # total for stat line
-      if period_counter_dict.has_key('total amount'):
+      if 'total amount' in period_counter_dict:
         period_counter_dict['total amount'] = period_counter_dict['total amount'] + line_total_amount
       else:
         period_counter_dict['total amount'] = line_total_amount
diff --git a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.py b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.py
index bff7931255..3fe693341b 100644
--- a/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.py
+++ b/bt5/erp5_trade/SkinTemplateItem/portal_skins/erp5_trade/OrderModule_processOrderStat.py
@@ -35,13 +35,13 @@ for result in document_list:
     else:
       client_title = result['source_section_title']
     # FIXME: if two clients have the same title, do we want to group ?
-    if not client_dict.has_key(client_title):
+    if client_title not in client_dict:
       client_dict[client_title] = {}
-    if client_dict[client_title].has_key(period):
+    if period in client_dict[client_title]:
       client_dict[client_title][period]['amount'] = client_dict[client_title][period]['amount'] + (total_price or 0)
     else:
       client_dict[client_title][period] = {'amount' : total_price or 0}
-    if not product_dict.has_key(client_title):
+    if client_title not in product_dict:
       line_dict = product_dict[client_title] = {}
     else:
       line_dict = product_dict[client_title]
@@ -54,12 +54,12 @@ for result in document_list:
     for line in line_list:
       # FIXME: if two resources have the same title, do we want to group ?
       product_title = line.resource_title
-      if not line_dict.has_key(product_title):
+      if product_title not in line_dict:
         line_dict[product_title] = {period :{"amount" : line.total_price or 0,
                                              "quantity" : line.quantity or 0,
                                              "quantity_unit" : translate(line.strict_quantity_unit_title)}}
       else:
-        if not line_dict[product_title].has_key(period):
+        if period not in line_dict[product_title]:
           line_dict[product_title][period] = {"amount" : line.total_price or 0,
                                                "quantity" : line.quantity or 0,
                                                "quantity_unit" : translate(line.strict_quantity_unit_title)}
diff --git a/bt5/erp5_trade/TestTemplateItem/portal_components/test.erp5.testTradeReports.py b/bt5/erp5_trade/TestTemplateItem/portal_components/test.erp5.testTradeReports.py
index 0bb6b96289..2729eb07a1 100644
--- a/bt5/erp5_trade/TestTemplateItem/portal_components/test.erp5.testTradeReports.py
+++ b/bt5/erp5_trade/TestTemplateItem/portal_components/test.erp5.testTradeReports.py
@@ -78,7 +78,7 @@ class TestTradeReports(ERP5ReportTestCase):
       ('demo_site_A', 'DEMO-SITE-A'),
       ('demo_site_B', 'DEMO-SITE-B'),
     ):
-      if not self.portal_categories['site'].has_key(site_id):
+      if site_id not in self.portal_categories['site']:
         self.portal_categories.site.newContent(
                                   portal_type='Category',
                                   title=site_id,
@@ -87,7 +87,7 @@ class TestTradeReports(ERP5ReportTestCase):
                                   id=site_id)
     # Colour categories
     for colour_id in ('colour1', 'colour2',):
-      if not self.portal_categories['colour'].has_key(colour_id):
+      if colour_id not in self.portal_categories['colour']:
         self.portal_categories.colour.newContent(
                                   portal_type='Category',
                                   title=colour_id,
@@ -96,7 +96,7 @@ class TestTradeReports(ERP5ReportTestCase):
 
     # create group categories
     for group_id in ('g1', 'g2', 'g3'):
-      if not self.portal_categories['group'].has_key(group_id):
+      if group_id not in self.portal_categories['group']:
         self.portal_categories.group.newContent(
                                   portal_type='Category',
                                   title=group_id,
@@ -105,7 +105,7 @@ class TestTradeReports(ERP5ReportTestCase):
 
     # create use categories
     for use_id in ('u1', 'u2'):
-      if not self.portal_categories['use'].has_key(use_id):
+      if use_id not in self.portal_categories['use']:
         self.portal_categories.use.newContent(
             portal_type='Category',
             title=use_id,
@@ -113,7 +113,7 @@ class TestTradeReports(ERP5ReportTestCase):
             id=use_id)
 
     # currencies
-    if not self.portal.currency_module.has_key('EUR'):
+    if 'EUR' not in self.portal.currency_module:
       self.portal.currency_module.newContent(
         portal_type='Currency',
         id='EUR',
@@ -122,7 +122,7 @@ class TestTradeReports(ERP5ReportTestCase):
 
     # product line
     for product_line in ('product_line_a','product_line_b'):
-      if not self.portal_categories.product_line.has_key(product_line):
+      if product_line not in self.portal_categories.product_line:
         self.portal_categories.product_line.newContent(
           portal_type='Category',
           title=product_line,
@@ -131,7 +131,7 @@ class TestTradeReports(ERP5ReportTestCase):
         )
 
     # create organisations (with no organisation member of g3)
-    if not self.organisation_module.has_key('Organisation_1'):
+    if 'Organisation_1' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_1',
@@ -145,7 +145,7 @@ class TestTradeReports(ERP5ReportTestCase):
                               default_address_street_address='1 Organisation Street',
                               default_address_zip_code='111',
                               default_address_city='City', )
-    if not self.organisation_module.has_key('Organisation_2'):
+    if 'Organisation_2' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_2',
@@ -154,7 +154,7 @@ class TestTradeReports(ERP5ReportTestCase):
                               group='g2',
                               site='demo_site_B')
     # no group no site
-    if not self.organisation_module.has_key('Organisation_3'):
+    if 'Organisation_3' not in self.organisation_module:
       self.portal.organisation_module.newContent(
                               portal_type='Organisation',
                               reference='Organisation_3',
@@ -162,12 +162,12 @@ class TestTradeReports(ERP5ReportTestCase):
                               id='Organisation_3',)
 
     # create unit categories
-    if not self.portal_categories.quantity_unit.has_key('mass'):
+    if 'mass' not in self.portal_categories.quantity_unit:
       self.portal_categories.quantity_unit.newContent(
           portal_type='Category',
           id='mass')
     for unit_id in ('kg', 'g',):
-      if not self.portal_categories.quantity_unit.mass.has_key(unit_id):
+      if unit_id not in self.portal_categories.quantity_unit.mass:
         self.portal_categories.quantity_unit.mass.newContent(
                                   portal_type='Category',
                                   title=unit_id.title(),
@@ -175,7 +175,7 @@ class TestTradeReports(ERP5ReportTestCase):
                                   id=unit_id)
 
     # and corresponding unit conversion group
-    if not self.portal.quantity_unit_conversion_module.has_key('mass_conversion_group'):
+    if 'mass_conversion_group' not in self.portal.quantity_unit_conversion_module:
       self.portal.quantity_unit_conversion_module.newContent(
           portal_type='Quantity Unit Conversion Group',
           id='mass_conversion_group',
@@ -216,7 +216,7 @@ class TestTradeReports(ERP5ReportTestCase):
         variation_base_category_list=['colour'],
         colour_list=['colour1', 'colour2'],
     )
-    if not self.portal.service_module.has_key('service_a'):
+    if 'service_a' not in self.portal.service_module:
       self.portal.service_module.newContent(
           portal_type='Service',
           id='service_a',
diff --git a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_generateFilename.py b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_generateFilename.py
index 24c7c5e6e8..fb892346ad 100644
--- a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_generateFilename.py
+++ b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_generateFilename.py
@@ -8,7 +8,7 @@ if session_id is None or not session_id.startswith("erp5zuite"):
   request.RESPONSE.setCookie('erp5_session_id', session_id, expires=(now +expire_timeout_days).fCommon(), path='/')
   
 session = context.portal_sessions[session_id]
-if not session.has_key('tempfolder') or session['tempfolder'] == '':
+if 'tempfolder' not in session or session['tempfolder'] == '':
   session['tempfolder'] = context.Zuite_createTempFolder() + '/'
 
 return session['tempfolder'] + str(context.portal_ids.generateNewId(id_generator='zuite', id_group=context.getId(), default=1)) + '.png'
diff --git a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_viewZeleniumTestLauncherValidator.py b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_viewZeleniumTestLauncherValidator.py
index 635bdb7ae0..18ef18d55b 100644
--- a/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_viewZeleniumTestLauncherValidator.py
+++ b/bt5/erp5_ui_test_core/SkinTemplateItem/portal_skins/erp5_ui_test_core/Zuite_viewZeleniumTestLauncherValidator.py
@@ -4,11 +4,11 @@ if web_page_context:
   no_web_page = False
   form_id = 'view'
 else:
-  no_web_page = not request.has_key('web_page') or request['web_page'] is None or not request['web_page']
+  no_web_page = 'web_page' not in request or request['web_page'] is None or not request['web_page']
   form_id = 'Zuite_viewRunZeleniumTestDialog'
 
-no_reference = not request.has_key('web_page_reference') or request['web_page_reference'] is None or not request['web_page_reference']
-no_url = not request.has_key('url') or request['url'] is None or not request['url']
+no_reference = 'web_page_reference' not in request or request['web_page_reference'] is None or not request['web_page_reference']
+no_url = 'url' not in request or request['url'] is None or not request['url']
 
 if no_web_page and no_url and no_reference:
   if validator:
diff --git a/bt5/erp5_web/DocumentTemplateItem/portal_components/document.erp5.WebSite.py b/bt5/erp5_web/DocumentTemplateItem/portal_components/document.erp5.WebSite.py
index 9feedcefcd..553853a200 100644
--- a/bt5/erp5_web/DocumentTemplateItem/portal_components/document.erp5.WebSite.py
+++ b/bt5/erp5_web/DocumentTemplateItem/portal_components/document.erp5.WebSite.py
@@ -171,7 +171,7 @@ class WebSite(WebSection):
         path = section.getPhysicalPath()
         for i in range(0, len(path)):
           sub_path = tuple(path[0:i])
-          if section_dict.has_key(sub_path):
+          if sub_path in section_dict:
             del section_dict[sub_path]
 
       section_list = section_dict.values()
diff --git a/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_logout.py b/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_logout.py
index 0a81ff8479..9e35d78827 100644
--- a/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_logout.py
+++ b/bt5/erp5_web/SkinTemplateItem/portal_skins/erp5_web/WebSite_logout.py
@@ -12,7 +12,7 @@ if username is not None:
     )
   )
 REQUEST = portal.REQUEST
-if REQUEST.has_key('portal_skin'):
+if 'portal_skin' in REQUEST:
   portal.portal_skins.clearSkinCookie()
 REQUEST.RESPONSE.expireCookie('__ac', path='/')
 
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui/WebSite_logout.py b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui/WebSite_logout.py
index 5efe9a2019..78b7f9caa5 100644
--- a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui/WebSite_logout.py
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui/WebSite_logout.py
@@ -12,7 +12,7 @@ if username is not None:
     )
   )
 REQUEST = portal.REQUEST
-if REQUEST.has_key('portal_skin'):
+if 'portal_skin' in REQUEST:
   portal.portal_skins.clearSkinCookie()
 REQUEST.RESPONSE.expireCookie('__ac', path='/')
 
diff --git a/bt5/erp5_web_ui_test/SkinTemplateItem/portal_skins/erp5_web_ui_test/WebSiteModule_resetWebZuite.py b/bt5/erp5_web_ui_test/SkinTemplateItem/portal_skins/erp5_web_ui_test/WebSiteModule_resetWebZuite.py
index 570a75ffd9..a75a57b452 100644
--- a/bt5/erp5_web_ui_test/SkinTemplateItem/portal_skins/erp5_web_ui_test/WebSiteModule_resetWebZuite.py
+++ b/bt5/erp5_web_ui_test/SkinTemplateItem/portal_skins/erp5_web_ui_test/WebSiteModule_resetWebZuite.py
@@ -2,19 +2,19 @@
 portal = context.getPortalObject()
 
 # Clean up the contents.
-if portal.web_site_module.has_key('test_web_site'):
+if 'test_web_site' in portal.web_site_module:
   portal.web_site_module.manage_delObjects('test_web_site')
 
-if portal.web_site_module.has_key('web_site_test'):
+if 'web_site_test' in portal.web_site_module:
   portal.web_site_module.manage_delObjects('web_site_test')
 
-if portal.web_site_module.has_key('test_web_site_2'):
+if 'test_web_site_2' in portal.web_site_module:
   portal.web_site_module.manage_delObjects('test_web_site_2')
 
-if portal.web_site_module.has_key('test_web_site'):
+if 'test_web_site' in portal.web_site_module:
   portal.web_site_module.manage_delObjects('test_web_site')
 
-if portal.person_module.has_key('test_website_predicate'):
+if 'test_website_predicate' in portal.person_module:
   portal.person_module.manage_delObjects('test_website_predicate')
 
 portal.web_page_module.manage_delObjects(
@@ -22,7 +22,7 @@ portal.web_page_module.manage_delObjects(
    if x.getTitle().startswith('test_')])
 
 # Create new users
-if not portal.person_module.has_key('test_webmaster'):
+if 'test_webmaster' not in portal.person_module:
   person = portal.person_module.newContent(id='test_webmaster', portal_type='Person')
 else:
   person = portal.person_module.test_webmaster
@@ -47,6 +47,6 @@ if person.getValidationState() != 'validated':
   person.validate()
 
 # Create region category
-if not portal.portal_categories.region.has_key('test_web_region'):
+if 'test_web_region' not in portal.portal_categories.region:
   portal.portal_categories.region.newContent(id='test_web_region', portal_type='Category', title='test_web_region')
 return 'Reset Successfully.'
diff --git a/product/ERP5Type/tests/Python3StyleTest.py b/product/ERP5Type/tests/Python3StyleTest.py
index c19cc45812..5c0113c4c2 100644
--- a/product/ERP5Type/tests/Python3StyleTest.py
+++ b/product/ERP5Type/tests/Python3StyleTest.py
@@ -81,6 +81,8 @@ class Python3StyleTest(ERP5TypeTestCase):
   def test_importFixApplied(self):
     self._testFixer('import')
 
+  def test_hasKeyFixApplied(self):
+    self._testFixer('has_key')
 
 def test_suite():
   suite = unittest.TestSuite()
-- 
2.30.9