Commit 4d70b829 authored by wenjie.zheng's avatar wenjie.zheng

Merge branch 'master' into erp5_workflow

parents d7008186 f3c81817
...@@ -139,16 +139,50 @@ account_type_to_group_by_payment = [ \'account_type/asset/cash/bank\' ]\n ...@@ -139,16 +139,50 @@ account_type_to_group_by_payment = [ \'account_type/asset/cash/bank\' ]\n
account_type_payable_receivable = [\n account_type_payable_receivable = [\n
\'account_type/asset/receivable\',\n \'account_type/asset/receivable\',\n
\'account_type/liability/payable\', ]\n \'account_type/liability/payable\', ]\n
\n
\n
# For initial balance of third party accounts, we want the same bottom line figure for initial\n
# debit and initial debit wether or not we expand accounts.\n
#\n
# For example if we have this balance when enabling the detailed breakdown\n
# by third party for payable & recievable accounts:\n
#\n
# Account | Third Party | Initial Debit Balance | Initial Credit Balance |\n
# --------+-------------+-----------------------+------------------------|\n
# A1 | P1 | 100 | |\n
# A1 | P2 | | 30 |\n
#\n
# When the breakdown is disabled, we still want to have:\n
#\n
# Account | Initial Debit Balance | Initial Credit Balance |\n
# --------+-----------------------+------------------------|\n
# A1 | 100 | 30 |\n
#\n
# and not an initial debit balance of 70.\n
# This behaviour applies to initial balances, not movements in the period.\n
#\n
# Inventory API does not provide such feature of a getInventory(omit_input/output=True) that\n
# does a sum of getInventoryList(omit_input/output=True, group_by_node=True), so we sum this up\n
# in python, which becomes heavy when there are a lot of third parties (even if we do not\n
# enable the break down).\n
# If user does not enable detailed columns, then there is only one column for initial balance,\n
# so the complexity described above does not apply.\n
if expand_accounts:\n if expand_accounts:\n
account_type_to_group_by_mirror_section = account_type_payable_receivable\n account_type_to_group_by_mirror_section = account_type_payable_receivable\n
account_type_to_group_by_mirror_section_previous_period = account_type_payable_receivable\n
else:\n else:\n
account_type_to_group_by_mirror_section = []\n account_type_to_group_by_mirror_section = []\n
account_type_to_group_by_mirror_section_previous_period = []\n
if show_detailed_balance_columns:\n
account_type_to_group_by_mirror_section_previous_period = account_type_payable_receivable\n
\n
\n \n
account_type_to_group_by_node = [at for at in balance_sheet_account_type_list\n account_type_to_group_by_node = [at for at in balance_sheet_account_type_list\n
if at not in account_type_to_group_by_payment\n if at not in account_type_to_group_by_payment\n
and at not in account_type_to_group_by_mirror_section]\n and at not in account_type_to_group_by_mirror_section]\n
\n \n
account_type_to_group_by_node_previous_period = [at for at in account_type_to_group_by_node if at not in account_type_payable_receivable]\n account_type_to_group_by_node_previous_period = [at for at in account_type_to_group_by_node\n
if at not in account_type_to_group_by_mirror_section_previous_period]\n
\n \n
\n \n
total_debit = 0\n total_debit = 0\n
...@@ -468,7 +502,7 @@ for node in getInventoryList(\n ...@@ -468,7 +502,7 @@ for node in getInventoryList(\n
# payable / receivable accounts {{{\n # payable / receivable accounts {{{\n
# initial balance\n # initial balance\n
for node in getInventoryList(\n for node in getInventoryList(\n
node_category_strict_membership=account_type_payable_receivable,\n node_category_strict_membership=account_type_to_group_by_mirror_section_previous_period,\n
group_by_mirror_section=1,\n group_by_mirror_section=1,\n
group_by_node=1,\n group_by_node=1,\n
to_date=period_start_date,\n to_date=period_start_date,\n
...@@ -478,7 +512,7 @@ for node in getInventoryList(\n ...@@ -478,7 +512,7 @@ for node in getInventoryList(\n
mirror_section_key = MARKER\n mirror_section_key = MARKER\n
if expand_accounts:\n if expand_accounts:\n
mirror_section_key = node[\'mirror_section_uid\']\n mirror_section_key = node[\'mirror_section_uid\']\n
\n \n
account_props = line_per_account.setdefault(\n account_props = line_per_account.setdefault(\n
getKey(node, mirror_section=mirror_section_key),\n getKey(node, mirror_section=mirror_section_key),\n
dict(debit=0, credit=0))\n dict(debit=0, credit=0))\n
...@@ -491,7 +525,7 @@ for node in getInventoryList(\n ...@@ -491,7 +525,7 @@ for node in getInventoryList(\n
found_balance=False\n found_balance=False\n
# Balance Transactions\n # Balance Transactions\n
for node in getInventoryList(\n for node in getInventoryList(\n
node_category_strict_membership=account_type_payable_receivable,\n node_category_strict_membership=account_type_to_group_by_mirror_section_previous_period,\n
group_by_mirror_section=1,\n group_by_mirror_section=1,\n
group_by_node=1,\n group_by_node=1,\n
from_date=from_date,\n from_date=from_date,\n
...@@ -801,7 +835,7 @@ return new_line_list\n ...@@ -801,7 +835,7 @@ return new_line_list\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>show_empty_accounts, expand_accounts, at_date, from_date, period_start_date, section_uid, simulation_state, precision, node_uid, gap_root=None, per_account_class_summary=0, portal_type=None, function=None, funding=None, project=None, group_analytic=[], mirror_section_category=None, **kw</string> </value> <value> <string>show_empty_accounts, expand_accounts, at_date, from_date, period_start_date, section_uid, simulation_state, precision, node_uid, gap_root=None, per_account_class_summary=0, portal_type=None, function=None, funding=None, project=None, group_analytic=[], mirror_section_category=None, show_detailed_balance_columns=False, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -181,7 +181,8 @@ return [ ReportSection(\n ...@@ -181,7 +181,8 @@ return [ ReportSection(\n
mirror_section_category,\n mirror_section_category,\n
per_account_class_summary=\n per_account_class_summary=\n
per_account_class_summary,\n per_account_class_summary,\n
gap_root=gap_root,), )]\n gap_root=gap_root,\n
show_detailed_balance_columns=show_detailed_balance_columns), )]\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
...@@ -67,8 +67,8 @@ def roundCurrency(value, resource_relative_url):\n ...@@ -67,8 +67,8 @@ def roundCurrency(value, resource_relative_url):\n
qty_precision = precision_cache[resource_relative_url]\n qty_precision = precision_cache[resource_relative_url]\n
return round(value, qty_precision)\n return round(value, qty_precision)\n
\n \n
# This tag is checked in accounting period workflow\n
activity_tag = \'BalanceTransactionCreation\'\n activity_tag = \'BalanceTransactionCreation\'\n
activate_kw=dict(tag=activity_tag)\n
\n \n
at_date = context.getStopDate()\n at_date = context.getStopDate()\n
assert at_date\n assert at_date\n
...@@ -109,7 +109,7 @@ def getDependantSectionList(group, main_section):\n ...@@ -109,7 +109,7 @@ def getDependantSectionList(group, main_section):\n
section_list.extend(getDependantSectionList(subgroup, main_section))\n section_list.extend(getDependantSectionList(subgroup, main_section))\n
\n \n
return section_list\n return section_list\n
\n \n
group_value = section.getGroupValue()\n group_value = section.getGroupValue()\n
section_list = [section]\n section_list = [section]\n
if group_value is not None:\n if group_value is not None:\n
...@@ -117,7 +117,6 @@ if group_value is not None:\n ...@@ -117,7 +117,6 @@ if group_value is not None:\n
\n \n
def createBalanceTransaction(section):\n def createBalanceTransaction(section):\n
return portal.accounting_module.newContent(\n return portal.accounting_module.newContent(\n
activate_kw=activate_kw,\n
portal_type=\'Balance Transaction\',\n portal_type=\'Balance Transaction\',\n
start_date=(at_date + 1).earliestTime(),\n start_date=(at_date + 1).earliestTime(),\n
title=context.getTitle() or Base_translateString(\'Balance Transaction\'),\n title=context.getTitle() or Base_translateString(\'Balance Transaction\'),\n
...@@ -125,221 +124,214 @@ def createBalanceTransaction(section):\n ...@@ -125,221 +124,214 @@ def createBalanceTransaction(section):\n
resource=section_currency,\n resource=section_currency,\n
causality_value=context)\n causality_value=context)\n
\n \n
for section in section_list:\n with context.defaultActivateParameterDict({\'tag\': activity_tag}, placeless=True):\n
section_uid = section.getUid()\n for section in section_list:\n
balance_transaction = None\n section_uid = section.getUid()\n
\n balance_transaction = None\n
group_by_node_node_category_list = []\n \n
group_by_mirror_section_node_category_list = []\n group_by_node_node_category_list = []\n
group_by_payment_node_category_list = []\n group_by_mirror_section_node_category_list = []\n
profit_and_loss_node_category_list = []\n group_by_payment_node_category_list = []\n
\n profit_and_loss_node_category_list = []\n
node_category_list = portal.portal_categories\\\n \n
.account_type.getCategoryChildValueList()\n node_category_list = portal.portal_categories\\\n
for node_category in node_category_list:\n .account_type.getCategoryChildValueList()\n
node_category_url = node_category.getRelativeUrl()\n for node_category in node_category_list:\n
if node_category_url in (\n node_category_url = node_category.getRelativeUrl()\n
\'account_type/asset/cash/bank\',):\n if node_category_url in (\n
group_by_payment_node_category_list.append(node_category_url)\n \'account_type/asset/cash/bank\',):\n
elif node_category_url in (\n group_by_payment_node_category_list.append(node_category_url)\n
\'account_type/asset/receivable\',\n elif node_category_url in (\n
\'account_type/liability/payable\'):\n \'account_type/asset/receivable\',\n
group_by_mirror_section_node_category_list.append(node_category_url)\n \'account_type/liability/payable\'):\n
elif node_category.isMemberOf(\'account_type/income\') or \\\n group_by_mirror_section_node_category_list.append(node_category_url)\n
node_category.isMemberOf(\'account_type/expense\'):\n elif node_category.isMemberOf(\'account_type/income\') or \\\n
profit_and_loss_node_category_list.append(node_category_url)\n node_category.isMemberOf(\'account_type/expense\'):\n
else:\n profit_and_loss_node_category_list.append(node_category_url)\n
group_by_node_node_category_list.append(node_category_url)\n else:\n
\n group_by_node_node_category_list.append(node_category_url)\n
getInventoryList = portal.portal_simulation.getInventoryList\n \n
\n getInventoryList = portal.portal_simulation.getInventoryList\n
inventory_param_dict = dict(section_uid=section_uid,\n \n
simulation_state=(\'delivered\',),\n inventory_param_dict = dict(section_uid=section_uid,\n
precision=section_currency_precision,\n simulation_state=(\'delivered\',),\n
portal_type=portal.getPortalAccountingMovementTypeList(),\n precision=section_currency_precision,\n
at_date=at_date.latestTime(),)\n portal_type=portal.getPortalAccountingMovementTypeList(),\n
\n at_date=at_date.latestTime(),)\n
# Calculate the sum of profit and loss accounts balances for that period.\n
# This must match the difference between assets, liability and equity accounts.\n
profit_and_loss_accounts_balance = portal.portal_simulation.getInventoryAssetPrice(\n
from_date=context.getStartDate(),\n
node_category_strict_membership=profit_and_loss_node_category_list,\n
**inventory_param_dict)\n
selected_profit_and_loss_account_balance = portal.portal_simulation.getInventoryAssetPrice(\n
node=profit_and_loss_account,\n
resource=section_currency,\n
**inventory_param_dict)\n
\n \n
section_currency_uid = context.getParentValue().getPriceCurrencyUid()\n # Calculate the sum of profit and loss accounts balances for that period.\n
\n # This must match the difference between assets, liability and equity accounts.\n
profit_and_loss_quantity = 0\n profit_and_loss_accounts_balance = portal.portal_simulation.getInventoryAssetPrice(\n
line_count = 0\n from_date=context.getStartDate(),\n
\n node_category_strict_membership=profit_and_loss_node_category_list,\n
for inventory in getInventoryList(\n **inventory_param_dict)\n
node_category_strict_membership=group_by_node_node_category_list,\n selected_profit_and_loss_account_balance = portal.portal_simulation.getInventoryAssetPrice(\n
group_by_node=1,\n node=profit_and_loss_account,\n
group_by_resource=1,\n resource=section_currency,\n
**inventory_param_dict):\n **inventory_param_dict)\n
\n \n
total_price = roundCurrency(inventory.total_price or 0, section_currency)\n section_currency_uid = context.getParentValue().getPriceCurrencyUid()\n
quantity = roundCurrency(inventory.total_quantity or 0,\n \n
inventory.resource_relative_url)\n profit_and_loss_quantity = 0\n
\n line_count = 0\n
if not total_price and not quantity:\n \n
continue\n for inventory in getInventoryList(\n
\n node_category_strict_membership=group_by_node_node_category_list,\n
line_count += 1\n group_by_node=1,\n
if inventory.resource_uid != section_currency_uid:\n group_by_resource=1,\n
**inventory_param_dict):\n
\n
total_price = roundCurrency(inventory.total_price or 0, section_currency)\n
quantity = roundCurrency(inventory.total_quantity or 0,\n
inventory.resource_relative_url)\n
\n
if not total_price and not quantity:\n
continue\n
\n
line_count += 1\n
if inventory.resource_uid != section_currency_uid:\n
profit_and_loss_quantity += total_price\n
\n
if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n
destination=inventory.node_relative_url,\n
resource=inventory.resource_relative_url,\n
quantity=quantity,\n
destination_total_asset_price=total_price)\n
else:\n
if total_price != quantity:\n
# If this fail for you, your accounting doesn\'t use currencies with\n
# consistency\n
raise ValueError(\'Different price: %s != %s \' % (\n
total_price, quantity))\n
\n
if inventory.node_relative_url != profit_and_loss_account:\n
profit_and_loss_quantity += total_price\n
if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n
destination=inventory.node_relative_url,\n
quantity=total_price)\n
\n
\n
for inventory in getInventoryList(\n
node_category_strict_membership=group_by_mirror_section_node_category_list,\n
group_by_node=1,\n
group_by_mirror_section=1,\n
group_by_resource=1,\n
**inventory_param_dict):\n
\n
total_price = roundCurrency(inventory.total_price or 0, section_currency)\n
quantity = roundCurrency(inventory.total_quantity or 0,\n
inventory.resource_relative_url)\n
\n
if not total_price and not quantity:\n
continue\n
profit_and_loss_quantity += total_price\n profit_and_loss_quantity += total_price\n
\n line_count += 1\n
if balance_transaction is None:\n \n
balance_transaction = createBalanceTransaction(section)\n if inventory.resource_uid != section_currency_uid:\n
balance_transaction.newContent(\n if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n portal_type=\'Balance Transaction Line\',\n
activate_kw=activate_kw,\n
destination=inventory.node_relative_url,\n destination=inventory.node_relative_url,\n
source_section_uid=inventory.mirror_section_uid,\n
resource=inventory.resource_relative_url,\n resource=inventory.resource_relative_url,\n
quantity=quantity,\n quantity=quantity,\n
destination_total_asset_price=total_price)\n destination_total_asset_price=total_price)\n
else:\n else:\n
if total_price != quantity:\n if total_price != quantity:\n
# If this fail for you, your accounting doesn\'t use currencies with\n raise ValueError(\'Different price: %s != %s \' % (\n
# consistency\n total_price, quantity))\n
raise ValueError(\'Different price: %s != %s \' % (\n
total_price, quantity))\n
\n
if inventory.node_relative_url != profit_and_loss_account:\n
profit_and_loss_quantity += total_price\n
if balance_transaction is None:\n if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n portal_type=\'Balance Transaction Line\',\n
activate_kw=activate_kw,\n
destination=inventory.node_relative_url,\n destination=inventory.node_relative_url,\n
source_section_uid=inventory.mirror_section_uid,\n
quantity=total_price)\n quantity=total_price)\n
\n \n
\n
for inventory in getInventoryList(\n
node_category_strict_membership=group_by_mirror_section_node_category_list,\n
group_by_node=1,\n
group_by_mirror_section=1,\n
group_by_resource=1,\n
**inventory_param_dict):\n
\n
total_price = roundCurrency(inventory.total_price or 0, section_currency)\n
quantity = roundCurrency(inventory.total_quantity or 0,\n
inventory.resource_relative_url)\n
\n
if not total_price and not quantity:\n
continue\n
profit_and_loss_quantity += total_price\n
line_count += 1\n
\n \n
if inventory.resource_uid != section_currency_uid:\n for inventory in getInventoryList(\n
if balance_transaction is None:\n node_category_strict_membership=group_by_payment_node_category_list,\n
balance_transaction = createBalanceTransaction(section)\n group_by_node=1,\n
balance_transaction.newContent(\n group_by_payment=1,\n
id=\'%03d\' % line_count,\n group_by_resource=1,\n
portal_type=\'Balance Transaction Line\',\n **inventory_param_dict):\n
activate_kw=activate_kw,\n \n
destination=inventory.node_relative_url,\n total_price = roundCurrency(inventory.total_price or 0, section_currency)\n
source_section_uid=inventory.mirror_section_uid,\n quantity = roundCurrency(inventory.total_quantity or 0,\n
resource=inventory.resource_relative_url,\n inventory.resource_relative_url)\n
quantity=quantity,\n \n
destination_total_asset_price=total_price)\n if not total_price and not quantity:\n
else:\n continue\n
if total_price != quantity:\n profit_and_loss_quantity += total_price\n
raise ValueError(\'Different price: %s != %s \' % (\n \n
total_price, quantity))\n line_count += 1\n
if balance_transaction is None:\n \n
if inventory.resource_uid != section_currency_uid:\n
if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n
destination=inventory.node_relative_url,\n
resource=inventory.resource_relative_url,\n
quantity=quantity,\n
destination_payment_uid=inventory.payment_uid,\n
destination_total_asset_price=total_price)\n
else:\n
if total_price != quantity:\n
raise ValueError(\'Different price: %s != %s \' % (\n
total_price, quantity))\n
if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n
destination=inventory.node_relative_url,\n
destination_payment_uid=inventory.payment_uid,\n
quantity=total_price)\n
\n
if balance_transaction is None:\n
# we did not have any transaction for this section\n
\n
# One possible corner case is that we have only transactions that brings\n
# the balance of all balance sheets accounts to 0. In this case we want to\n
# create a balance transaction that notes that the current balance of profit\n
# and loss account is 0, so that the delta gets indexed. \n
if profit_and_loss_accounts_balance:\n
balance_transaction = createBalanceTransaction(section)\n balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n portal_type=\'Balance Transaction Line\',\n
portal_type=\'Balance Transaction Line\',\n destination=profit_and_loss_account,\n
activate_kw=activate_kw,\n quantity=0)\n
destination=inventory.node_relative_url,\n balance_transaction.stop()\n
source_section_uid=inventory.mirror_section_uid,\n balance_transaction.deliver()\n
quantity=total_price)\n
\n
\n
for inventory in getInventoryList(\n
node_category_strict_membership=group_by_payment_node_category_list,\n
group_by_node=1,\n
group_by_payment=1,\n
group_by_resource=1,\n
**inventory_param_dict):\n
\n
total_price = roundCurrency(inventory.total_price or 0, section_currency)\n
quantity = roundCurrency(inventory.total_quantity or 0,\n
inventory.resource_relative_url)\n
\n
if not total_price and not quantity:\n
continue\n continue\n
profit_and_loss_quantity += total_price\n
\n
line_count += 1\n
\n \n
if inventory.resource_uid != section_currency_uid:\n assert roundCurrency(profit_and_loss_accounts_balance, section_currency) == roundCurrency(\n
if balance_transaction is None:\n - roundCurrency(selected_profit_and_loss_account_balance, section_currency)\n
balance_transaction = createBalanceTransaction(section)\n - roundCurrency(profit_and_loss_quantity, section_currency), section_currency)\n
balance_transaction.newContent(\n \n
id=\'%03d\' % line_count,\n # add a final line for p&l\n
portal_type=\'Balance Transaction Line\',\n balance_transaction.newContent(\n
activate_kw=activate_kw,\n id=\'%03d\' % (line_count + 1),\n
destination=inventory.node_relative_url,\n portal_type=\'Balance Transaction Line\',\n
resource=inventory.resource_relative_url,\n destination=profit_and_loss_account,\n
quantity=quantity,\n quantity=-profit_and_loss_quantity)\n
destination_payment_uid=inventory.payment_uid,\n
destination_total_asset_price=total_price)\n
else:\n
if total_price != quantity:\n
raise ValueError(\'Different price: %s != %s \' % (\n
total_price, quantity))\n
if balance_transaction is None:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
id=\'%03d\' % line_count,\n
portal_type=\'Balance Transaction Line\',\n
activate_kw=activate_kw,\n
destination=inventory.node_relative_url,\n
destination_payment_uid=inventory.payment_uid,\n
quantity=total_price)\n
\n
if balance_transaction is None:\n
# we did not have any transaction for this section\n
\n
# One possible corner case is that we have only transactions that brings\n
# the balance of all balance sheets accounts to 0. In this case we want to\n
# create a balance transaction that notes that the current balance of profit\n
# and loss account is 0, so that the delta gets indexed. \n
if profit_and_loss_accounts_balance:\n
balance_transaction = createBalanceTransaction(section)\n
balance_transaction.newContent(\n
activate_kw=activate_kw,\n
portal_type=\'Balance Transaction Line\',\n
destination=profit_and_loss_account,\n
quantity=0)\n
balance_transaction.stop()\n
balance_transaction.deliver()\n
continue\n
\n
assert roundCurrency(profit_and_loss_accounts_balance, section_currency) == roundCurrency(\n
- roundCurrency(selected_profit_and_loss_account_balance, section_currency)\n
- roundCurrency(profit_and_loss_quantity, section_currency), section_currency)\n
\n
# add a final line for p&l\n
balance_transaction.newContent(\n
id=\'%03d\' % (line_count + 1),\n
activate_kw=activate_kw,\n
portal_type=\'Balance Transaction Line\',\n
destination=profit_and_loss_account,\n
quantity=-profit_and_loss_quantity)\n
\n \n
# and go to delivered state directly (the user is not supposed to edit this document)\n # and go to delivered state directly (the user is not supposed to edit this document)\n
balance_transaction.stop()\n balance_transaction.stop()\n
balance_transaction.deliver()\n balance_transaction.deliver()\n
\n \n
# make sure this Accounting Period has an activity pending during the indexing\n # make sure this Accounting Period has an activity pending during the indexing\n
# of the balance transaction.\n # of the balance transaction.\n
......
...@@ -63,7 +63,7 @@ sort_dict = { \'income\': 0,\n ...@@ -63,7 +63,7 @@ sort_dict = { \'income\': 0,\n
def getAccountingTransactionLineSortKey(line):\n def getAccountingTransactionLineSortKey(line):\n
return sort_dict.get(line.getId(), line.getIntIndex() or line.getIntId())\n return sort_dict.get(line.getId(), line.getIntIndex() or line.getIntId())\n
\n \n
return sorted(context.contentValues(portal_type=portal_type), key=getAccountingTransactionLineSortKey)\n return sorted(context.contentValues(portal_type=portal_type, checked_permission="View"), key=getAccountingTransactionLineSortKey)\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
...@@ -60,6 +60,10 @@ portal = period.getPortalObject()\n ...@@ -60,6 +60,10 @@ portal = period.getPortalObject()\n
\n \n
period.Base_checkConsistency()\n period.Base_checkConsistency()\n
\n \n
# This tag is used in AccountingPeriod_createBalanceTransaction\n
if portal.portal_activities.countMessageWithTag(\'BalanceTransactionCreation\'):\n
raise ValidationFailed(translateString("Balance transaction creation already in progress. Please try again later."))\n
\n
valid_simulation_state_list = [\'cancelled\', \'delivered\', \'deleted\', \'rejected\']\n valid_simulation_state_list = [\'cancelled\', \'delivered\', \'deleted\', \'rejected\']\n
all_state_list = [x[1] for x in\n all_state_list = [x[1] for x in\n
portal.Base_getTranslatedWorkflowStateItemList(wf_id=\'accounting_workflow\')]\n portal.Base_getTranslatedWorkflowStateItemList(wf_id=\'accounting_workflow\')]\n
......
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
<value> <string>from Products.ERP5Type.Utils import UpperCase\n <value> <string>from Products.ERP5Type.Utils import UpperCase\n
from ZODB.POSException import ConflictError\n from ZODB.POSException import ConflictError\n
from zExceptions import Unauthorized\n from zExceptions import Unauthorized\n
from Products.ERP5.Document.Document import NotConvertedError\n
\n \n
method = context.z_catalog_fulltext_list\n method = context.z_catalog_fulltext_list\n
property_list = method.arguments_src.split()\n property_list = method.arguments_src.split()\n
...@@ -78,6 +79,8 @@ for path in path_list:\n ...@@ -78,6 +79,8 @@ for path in path_list:\n
raise\n raise\n
except Unauthorized: # should happen in tricky testERP5Catalog tests only \n except Unauthorized: # should happen in tricky testERP5Catalog tests only \n
continue\n continue\n
except NotConvertedError:\n
continue\n
except Exception, e:\n except Exception, e:\n
exception = e\n exception = e\n
failed_path_list.append(path)\n failed_path_list.append(path)\n
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<ZopeData> <ZopeData>
<record id="1" aka="AAAAAAAAAAE="> <record id="1" aka="AAAAAAAAAAE=">
<pickle> <pickle>
<global name="ERP5Form" module="Products.ERP5Form.Form"/> <global name="ERP5 Form" module="erp5.portal_type"/>
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
...@@ -88,7 +88,9 @@ ...@@ -88,7 +88,9 @@
<item> <item>
<key> <string>hidden</string> </key> <key> <string>hidden</string> </key>
<value> <value>
<list/> <list>
<string>listbox_link</string>
</list>
</value> </value>
</item> </item>
<item> <item>
......
...@@ -48,7 +48,6 @@ ...@@ -48,7 +48,6 @@
<string>View</string> <string>View</string>
<string>Add portal content</string> <string>Add portal content</string>
<string>Modify portal content</string> <string>Modify portal content</string>
<string>Delete objects</string>
</tuple> </tuple>
</value> </value>
</item> </item>
......
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>acknowledged</string> </value> <value> <string>acknowledged</string> </value>
</item> </item>
<item>
<key> <string>permission_roles</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string>Acknowledged</string> </value> <value> <string>Acknowledged</string> </value>
...@@ -33,4 +39,60 @@ ...@@ -33,4 +39,60 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>Access contents information</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Add portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Modify portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>View</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>confirmed</string> </value> <value> <string>confirmed</string> </value>
</item> </item>
<item>
<key> <string>permission_roles</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string>Submitted</string> </value> <value> <string>Submitted</string> </value>
...@@ -37,4 +43,60 @@ ...@@ -37,4 +43,60 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>Access contents information</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Add portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Modify portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>View</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>draft</string> </value> <value> <string>draft</string> </value>
</item> </item>
<item>
<key> <string>permission_roles</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string>Draft</string> </value> <value> <string>Draft</string> </value>
...@@ -36,4 +42,61 @@ ...@@ -36,4 +42,61 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>Access contents information</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Add portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Modify portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>View</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>expired</string> </value> <value> <string>expired</string> </value>
</item> </item>
<item>
<key> <string>permission_roles</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string>Expired</string> </value> <value> <string>Expired</string> </value>
...@@ -33,4 +39,60 @@ ...@@ -33,4 +39,60 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>Access contents information</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Add portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>Modify portal content</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>View</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
</tuple>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
...@@ -25,9 +25,14 @@ ...@@ -25,9 +25,14 @@
<item>Task</item> <item>Task</item>
</portal_type> </portal_type>
<portal_type id="Test Result Line"> <portal_type id="Test Result Line">
<item>CommandLineResult</item>
<item>SortIndex</item> <item>SortIndex</item>
<item>Task</item> <item>Task</item>
</portal_type> </portal_type>
<portal_type id="Test Result Node">
<item>CommandLineResult</item>
<item>Task</item>
</portal_type>
<portal_type id="Test Suite"> <portal_type id="Test Suite">
<item>Arrow</item> <item>Arrow</item>
<item>Reference</item> <item>Reference</item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Property Sheet" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>CommandLineResult</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Property Sheet</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>cmdline_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>stderr_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Standard Property" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>elementary_type/string</string>
</tuple>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>stdout_property</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Standard Property</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>"""\n
Web API intended for listing, one per line, the report URL (typically present\n
in node\'s stdout) of all nodes involved in a Test Result.\n
Multiline stdout values behaviour is undefined.\n
"""\n
for test_result_node in context.objectValues(portal_type=\'Test Result Node\'):\n
if test_result_node.getCmdline() == \'LOG url\':\n
print test_result_node.getStdout()\n
return printed\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>TestResult_viewTestResultLineStdoutSet</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -8,8 +8,11 @@ Scalability Test Suite | ScalabilityTestSuite ...@@ -8,8 +8,11 @@ Scalability Test Suite | ScalabilityTestSuite
Scalability Test Suite | TestSuite Scalability Test Suite | TestSuite
Test Node | DublinCore Test Node | DublinCore
Test Node | TestNode Test Node | TestNode
Test Result Line | CommandLineResult
Test Result Line | SortIndex Test Result Line | SortIndex
Test Result Line | Task Test Result Line | Task
Test Result Node | CommandLineResult
Test Result Node | Task
Test Result | Comment Test Result | Comment
Test Result | SortIndex Test Result | SortIndex
Test Result | Task Test Result | Task
......
TestSuite TestSuite
CommandLineResult
TestSuiteRepository TestSuiteRepository
TestSuiteRepositoryConstraint TestSuiteRepositoryConstraint
TestSuiteConstraint TestSuiteConstraint
......
...@@ -196,7 +196,6 @@ ...@@ -196,7 +196,6 @@
<string>my_dialog_mode_order</string> <string>my_dialog_mode_order</string>
<string>my_dialog_mode_section_category</string> <string>my_dialog_mode_section_category</string>
<string>my_dialog_mode_order_simulation_state</string> <string>my_dialog_mode_order_simulation_state</string>
<string>my_dialog_mode_use_selection</string>
<string>my_dialog_mode_spreadsheet_format</string> <string>my_dialog_mode_spreadsheet_format</string>
<string>my_dialog_mode_reference_as_prefix</string> <string>my_dialog_mode_reference_as_prefix</string>
<string>my_dialog_mode_international_form</string> <string>my_dialog_mode_international_form</string>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_dialog_mode_use_selection</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_checkbox</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Use Current Selection</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -50,52 +50,45 @@ ...@@ -50,52 +50,45 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[ <value> <string>"""\n
"""\n
Run upgrader\n Run upgrader\n
"""\n """\n
portal = context.getPortalObject()\n portal = context.getPortalObject()\n
portal_alarms = portal.portal_alarms\n portal_alarms = portal.portal_alarms\n
\n \n
def launchUpgraderAlarm(alarm_id, after_method_id=[]):\n def launchUpgraderAlarm(alarm_id, after_tag=None):\n
""" Get the alarm and use sense and solve """\n """ Get the alarm and use sense and solve """\n
if after_tag is None:\n
after_tag = []\n
upgrader_alarm = getattr(portal_alarms, alarm_id, None)\n upgrader_alarm = getattr(portal_alarms, alarm_id, None)\n
if upgrader_alarm is not None and upgrader_alarm.sense():\n if upgrader_alarm is not None and (force or upgrader_alarm.sense()):\n
# call solve method\n # call solve method\n
kw = dict(tag=alarm_id)\n tag = alarm_id\n
if len(after_method_id) > 0:\n activate_kw = dict(tag=tag)\n
kw["after_method_id"] = after_method_id\n activate_kw["after_tag"] = after_tag\n
method_id = upgrader_alarm.getSolveMethodId()\n method_id = upgrader_alarm.getSolveMethodId()\n
if method_id not in (None, \'\'):\n if method_id not in (None, \'\'):\n
method = getattr(upgrader_alarm.activate(**kw), method_id)\n method = getattr(upgrader_alarm.activate(**activate_kw), method_id)\n
method()\n method(force=force, activate_kw=activate_kw)\n
return [method_id] + after_method_id\n return [tag] + after_tag\n
return after_method_id\n return after_tag\n
\n
previous_method_id = launchUpgraderAlarm(\'upgrader_check_pre_upgrade\')\n
\n \n
previous_method_id.extend([\'recursiveImmediateReindexObject\',\n previous_tag = launchUpgraderAlarm(\'upgrader_check_pre_upgrade\')\n
\'immediateReindexObject\',\n
\'Base_postCheckConsistencyResult\'])\n
\n \n
previous_method_id = launchUpgraderAlarm(\'upgrader_check_upgrader\',\n previous_tag = launchUpgraderAlarm(\'upgrader_check_upgrader\',\n
after_method_id=previous_method_id)\n after_tag=previous_tag)\n
\n \n
previous_method_id.append(\'updateBusinessTemplateFromUrl\')\n previous_tag = launchUpgraderAlarm(\'upgrader_check_post_upgrade\',\n
previous_method_id = launchUpgraderAlarm(\'upgrader_check_post_upgrade\',\n after_tag=previous_tag)\n
after_method_id=previous_method_id)\n
\n \n
# Nothing else to do, so we can disable.\n # Nothing else to do, so we can disable.\n
context.setEnabled(False)\n context.setEnabled(False)\n
return\n return\n
</string> </value>
]]></string> </value>
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>**kw</string> </value> <value> <string>force=0, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -58,7 +58,7 @@ active_process = context.newActiveProcess()\n ...@@ -58,7 +58,7 @@ active_process = context.newActiveProcess()\n
\n \n
# We should not run post upgrade if upgrader was not solved or never executed\n # We should not run post upgrade if upgrader was not solved or never executed\n
alarm = getattr(portal_alarms, \'upgrader_check_upgrader\')\n alarm = getattr(portal_alarms, \'upgrader_check_upgrader\')\n
if alarm.sense() in (None, True):\n if not(force) and alarm.sense() in (None, True):\n
active_process.postActiveResult(summary=context.getTitle(),\n active_process.postActiveResult(summary=context.getTitle(),\n
severity=1,\n severity=1,\n
detail="Is required run upgrade before solve it. " +\\\n detail="Is required run upgrade before solve it. " +\\\n
...@@ -66,6 +66,7 @@ if alarm.sense() in (None, True):\n ...@@ -66,6 +66,7 @@ if alarm.sense() in (None, True):\n
return\n return\n
\n \n
context.ERP5Site_checkUpgraderConsistency(fixit=True,\n context.ERP5Site_checkUpgraderConsistency(fixit=True,\n
activate_kw=activate_kw,\n
active_process=active_process,\n active_process=active_process,\n
filter_dict={"constraint_type": "post_upgrade"})\n filter_dict={"constraint_type": "post_upgrade"})\n
\n \n
...@@ -75,7 +76,7 @@ return\n ...@@ -75,7 +76,7 @@ return\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>**kw</string> </value> <value> <string>force=0, activate_kw={}, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
Run Pre upgrade\n Run Pre upgrade\n
"""\n """\n
context.ERP5Site_checkUpgraderConsistency(fixit=True,\n context.ERP5Site_checkUpgraderConsistency(fixit=True,\n
activate_kw=activate_kw,\n
active_process=context.newActiveProcess(),\n active_process=context.newActiveProcess(),\n
filter_dict={"constraint_type": "pre_upgrade"})\n filter_dict={"constraint_type": "pre_upgrade"})\n
\n \n
...@@ -63,7 +64,7 @@ return\n ...@@ -63,7 +64,7 @@ return\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>**kw</string> </value> <value> <string>force=0, activate_kw={}, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -67,7 +67,7 @@ active_process = context.newActiveProcess()\n ...@@ -67,7 +67,7 @@ active_process = context.newActiveProcess()\n
\n \n
# We should not run upgrader if pre upgrade was not solved or never executed \n # We should not run upgrader if pre upgrade was not solved or never executed \n
alarm = getattr(portal_alarms, \'upgrader_check_pre_upgrade\')\n alarm = getattr(portal_alarms, \'upgrader_check_pre_upgrade\')\n
if alarm.sense() in (None, True):\n if not(force) and alarm.sense() in (None, True):\n
active_process.postActiveResult(summary=context.getTitle(),\n active_process.postActiveResult(summary=context.getTitle(),\n
severity=1,\n severity=1,\n
detail="Is required solve Pre Upgrade first. " +\\\n detail="Is required solve Pre Upgrade first. " +\\\n
...@@ -90,6 +90,7 @@ for portal_type in portal_type_list:\n ...@@ -90,6 +90,7 @@ for portal_type in portal_type_list:\n
if portal.portal_catalog.countResults(\n if portal.portal_catalog.countResults(\n
portal_type=portal_type_list)[0][0] > REINDEX_SPLIT_COUNT:\n portal_type=portal_type_list)[0][0] > REINDEX_SPLIT_COUNT:\n
portal.portal_catalog.searchAndActivate(\'Base_postCheckConsistencyResult\',\n portal.portal_catalog.searchAndActivate(\'Base_postCheckConsistencyResult\',\n
activate_kw=activate_kw,\n
portal_type=portal_type,\n portal_type=portal_type,\n
method_kw=method_kw)\n method_kw=method_kw)\n
else:\n else:\n
...@@ -104,7 +105,7 @@ return\n ...@@ -104,7 +105,7 @@ return\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>**kw</string> </value> <value> <string>force=0, activate_kw={}, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -64,6 +64,7 @@ for portal_type, constraint_type_list in constraint_type_per_type.iteritems():\n ...@@ -64,6 +64,7 @@ for portal_type, constraint_type_list in constraint_type_per_type.iteritems():\n
if portal_type_list:\n if portal_type_list:\n
context.getPortalObject().portal_catalog.searchAndActivate(\n context.getPortalObject().portal_catalog.searchAndActivate(\n
\'Base_postCheckConsistencyResult\',\n \'Base_postCheckConsistencyResult\',\n
activate_kw=activate_kw,\n
portal_type=portal_type_list,\n portal_type=portal_type_list,\n
method_kw={\n method_kw={\n
\'fixit\': fixit,\n \'fixit\': fixit,\n
...@@ -75,7 +76,7 @@ if portal_type_list:\n ...@@ -75,7 +76,7 @@ if portal_type_list:\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>active_process, fixit=False, filter_dict={}</string> </value> <value> <string>active_process, activate_kw={}, fixit=False, filter_dict={}</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
......
...@@ -82,7 +82,10 @@ for _, bt5_id in resolved_list:\n ...@@ -82,7 +82,10 @@ for _, bt5_id in resolved_list:\n
workflow_id = group_dict[\'workflow_id\']\n workflow_id = group_dict[\'workflow_id\']\n
workflow_id_list = portal_type_dict.setdefault("%s" % portal_type, [])\n workflow_id_list = portal_type_dict.setdefault("%s" % portal_type, [])\n
if workflow_id.startswith(\'-\'):\n if workflow_id.startswith(\'-\'):\n
workflow_id_list.remove(workflow_id.replace(\'-\', \'\'))\n try:\n
workflow_id_list.remove(workflow_id.replace(\'-\', \'\'))\n
except ValueError:\n
pass\n
continue\n continue\n
elif workflow_id in workflow_id_list:\n elif workflow_id in workflow_id_list:\n
continue\n continue\n
......
...@@ -108,6 +108,7 @@ ...@@ -108,6 +108,7 @@
</tr>\n </tr>\n
\n \n
<!-- Initialize -->\n <!-- Initialize -->\n
<!-- DISABLE FOR NOW\n
<tr>\n <tr>\n
<td>open</td>\n <td>open</td>\n
<td>${base_url}/web_site_module/e5g_ecommerce/</td>\n <td>${base_url}/web_site_module/e5g_ecommerce/</td>\n
...@@ -128,7 +129,6 @@ ...@@ -128,7 +129,6 @@
<td>5000</td>\n <td>5000</td>\n
<td></td>\n <td></td>\n
</tr>\n </tr>\n
<!-- DEBUG \n
<tr>\n <tr>\n
<td>storeEval</td>\n <td>storeEval</td>\n
<td>function x(el){var n,a=[],w=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,{acceptNode:function(m){if(!/^\\\\s*$/.test(m.data)){return NodeFilter.FILTER_ACCEPT;}}},false);while(n=w.nextNode())a.push(n);return a;}var i,len,t="",list=x(document.getElementById("selenium_myiframe").contentDocument.querySelector("body div"));for(i=0,len=list.length;i&lt;len;i++){t+=list[i].nodeValue+" "}</td>\n <td>function x(el){var n,a=[],w=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,{acceptNode:function(m){if(!/^\\\\s*$/.test(m.data)){return NodeFilter.FILTER_ACCEPT;}}},false);while(n=w.nextNode())a.push(n);return a;}var i,len,t="",list=x(document.getElementById("selenium_myiframe").contentDocument.querySelector("body div"));for(i=0,len=list.length;i&lt;len;i++){t+=list[i].nodeValue+" "}</td>\n
...@@ -139,7 +139,6 @@ ...@@ -139,7 +139,6 @@
<td>${my_global_text}</td>\n <td>${my_global_text}</td>\n
<td></td>\n <td></td>\n
</tr>\n </tr>\n
-->\n
<tr>\n <tr>\n
<td>waitForTextPresent</td>\n <td>waitForTextPresent</td>\n
<td>Super Product</td>\n <td>Super Product</td>\n
...@@ -150,7 +149,7 @@ ...@@ -150,7 +149,7 @@
<td>//h2</td>\n <td>//h2</td>\n
<td>Super Product 0</td>\n <td>Super Product 0</td>\n
</tr>\n </tr>\n
\n -->\n
\n \n
</tbody>\n </tbody>\n
</table>\n </table>\n
......
...@@ -108,6 +108,8 @@ ...@@ -108,6 +108,8 @@
</tr>\n </tr>\n
\n \n
<!-- Initialize -->\n <!-- Initialize -->\n
<!-- DISABLE FOR NOW -->\n
<!--\n
<tr>\n <tr>\n
<td>open</td>\n <td>open</td>\n
<td>${base_url}/web_site_module/e5g_ecrm/</td>\n <td>${base_url}/web_site_module/e5g_ecrm/</td>\n
...@@ -133,6 +135,7 @@ ...@@ -133,6 +135,7 @@
<td>//a[@href="#jio_key=bug_module%2Fbug_0&amp;view=view"]</td>\n <td>//a[@href="#jio_key=bug_module%2Fbug_0&amp;view=view"]</td>\n
<td>Super Bug 0</td>\n <td>Super Bug 0</td>\n
</tr>\n </tr>\n
-->\n
\n \n
\n \n
</tbody>\n </tbody>\n
......
...@@ -109,6 +109,8 @@ ...@@ -109,6 +109,8 @@
\n \n
\n \n
<!-- Initialize -->\n <!-- Initialize -->\n
<!-- DISABLE FOR NOW -->\n
<!--\n
<tr>\n <tr>\n
<td>open</td>\n <td>open</td>\n
<td>${base_url}/web_site_module/e5g_ehr/</td>\n <td>${base_url}/web_site_module/e5g_ehr/</td>\n
...@@ -154,7 +156,7 @@ ...@@ -154,7 +156,7 @@
<td>//a[@href="#jio_key=position_module%2Fposition_0&amp;view=view"]</td>\n <td>//a[@href="#jio_key=position_module%2Fposition_0&amp;view=view"]</td>\n
<td>Super Position 0</td>\n <td>Super Position 0</td>\n
</tr>\n </tr>\n
\n -->\n
\n \n
</tbody>\n </tbody>\n
</table>\n </table>\n
......
...@@ -109,6 +109,8 @@ ...@@ -109,6 +109,8 @@
\n \n
\n \n
<!-- Initialize -->\n <!-- Initialize -->\n
<!-- DISABLE FOR NOW -->\n
<!--\n
<tr>\n <tr>\n
<td>open</td>\n <td>open</td>\n
<td>${base_url}/web_site_module/e5g_eproject/</td>\n <td>${base_url}/web_site_module/e5g_eproject/</td>\n
...@@ -139,7 +141,7 @@ ...@@ -139,7 +141,7 @@
<td>//a[@href="#jio_key=task_module%2Ftask_0&amp;view=view"]</td>\n <td>//a[@href="#jio_key=task_module%2Ftask_0&amp;view=view"]</td>\n
<td>Super Task 0</td>\n <td>Super Task 0</td>\n
</tr>\n </tr>\n
\n -->\n
\n \n
</tbody>\n </tbody>\n
</table>\n </table>\n
......
...@@ -115,7 +115,7 @@ ...@@ -115,7 +115,7 @@
<link rel="stylesheet" href="gadget_bin.css">\n <link rel="stylesheet" href="gadget_bin.css">\n
<script src="rsvp.js" type="text/javascript"></script>\n <script src="rsvp.js" type="text/javascript"></script>\n
<script src="renderjs.js" type="text/javascript"></script>\n <script src="renderjs.js" type="text/javascript"></script>\n
<script src="jquery/core/jquery-2.1.min.js" type="text/javascript"></script>\n <script src="jquery.js" type="text/javascript"></script>\n
<script src="jquerymobile.js"> type="text/javascript"></script>\n <script src="jquerymobile.js"> type="text/javascript"></script>\n
<script src="handlebars.js" type="text/javascript"></script>\n <script src="handlebars.js" type="text/javascript"></script>\n
<script src="gadget_bin.js" type="text/javascript"></script>\n <script src="gadget_bin.js" type="text/javascript"></script>\n
...@@ -322,7 +322,7 @@ ...@@ -322,7 +322,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>944.23995.20237.27067</string> </value> <value> <string>944.36243.1568.23552</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -340,8 +340,8 @@ ...@@ -340,8 +340,8 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1436852011.35</float> <float>1437641133.89</float>
<string>GMT+9</string> <string>GMT</string>
</tuple> </tuple>
</state> </state>
</object> </object>
......
...@@ -125,7 +125,7 @@ ...@@ -125,7 +125,7 @@
<script src="rsvp.js" type="text/javascript"></script>\n <script src="rsvp.js" type="text/javascript"></script>\n
<script src="renderjs.js" type="text/javascript"></script>\n <script src="renderjs.js" type="text/javascript"></script>\n
<script src="URI.js" type="text/javascript"></script>\n <script src="URI.js" type="text/javascript"></script>\n
<script src="jquery/core/jquery-2.1.min.js" type="text/javascript"></script>\n <script src="jquery.js" type="text/javascript"></script>\n
<script src="jquerymobile.js" type="text/javascript"></script>\n <script src="jquerymobile.js" type="text/javascript"></script>\n
<script src="gadget_global.js" type="text/javascript"></script>\n <script src="gadget_global.js" type="text/javascript"></script>\n
<script src="gadget_erp5.js" type="text/javascript"></script>\n <script src="gadget_erp5.js" type="text/javascript"></script>\n
...@@ -293,7 +293,7 @@ ...@@ -293,7 +293,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>944.23995.20237.27067</string> </value> <value> <string>944.36243.11855.44902</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -311,8 +311,8 @@ ...@@ -311,8 +311,8 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1436852011.45</float> <float>1437641105.38</float>
<string>GMT+9</string> <string>GMT</string>
</tuple> </tuple>
</state> </state>
</object> </object>
......
...@@ -117,7 +117,7 @@ ...@@ -117,7 +117,7 @@
<script src="renderjs.js" type="text/javascript"></script>\n <script src="renderjs.js" type="text/javascript"></script>\n
<script src="handlebars.js" type="text/javascript"></script>\n <script src="handlebars.js" type="text/javascript"></script>\n
<script src="gadget_global.js" type="text/javascript"></script>\n <script src="gadget_global.js" type="text/javascript"></script>\n
<script src="jquery/core/jquery-2.1.min.js" type="text/javascript"></script>\n <script src="jquery.js" type="text/javascript"></script>\n
<script src="jquerymobile.js" type="text/javascript"></script>\n <script src="jquerymobile.js" type="text/javascript"></script>\n
\n \n
<script id="panel-template-header" type="text/x-handlebars-template">\n <script id="panel-template-header" type="text/x-handlebars-template">\n
...@@ -319,7 +319,7 @@ ...@@ -319,7 +319,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>944.23995.20237.27067</string> </value> <value> <string>944.36243.6132.18568</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -337,8 +337,8 @@ ...@@ -337,8 +337,8 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1436852011.47</float> <float>1437641090.96</float>
<string>GMT+9</string> <string>GMT</string>
</tuple> </tuple>
</state> </state>
</object> </object>
......
<registered_skin_selection> <registered_skin_selection>
<skin_folder_selection>
<skin_folder>erp5_jquery</skin_folder>
<skin_selection>RJS</skin_selection>
</skin_folder_selection>
<skin_folder_selection> <skin_folder_selection>
<skin_folder>erp5_web_renderjs_ui</skin_folder> <skin_folder>erp5_web_renderjs_ui</skin_folder>
<skin_selection>RJS</skin_selection> <skin_selection>RJS</skin_selection>
......
erp5_jquery | RJS
erp5_web_renderjs_ui | RJS erp5_web_renderjs_ui | RJS
\ No newline at end of file
...@@ -232,10 +232,12 @@ extends = %(temp_dir)s/testnode/foo/rep0/software.cfg ...@@ -232,10 +232,12 @@ extends = %(temp_dir)s/testnode/foo/rep0/software.cfg
[rep1] [rep1]
repository = %(temp_dir)s/testnode/foo/rep1 repository = %(temp_dir)s/testnode/foo/rep1
branch = master branch = master
develop = false
[rep2] [rep2]
repository = %(temp_dir)s/testnode/foo/rep2 repository = %(temp_dir)s/testnode/foo/rep2
branch = foo branch = foo
develop = false
""" % {'temp_dir': self._temp_dir} """ % {'temp_dir': self._temp_dir}
else: else:
revision1 = "azerty" revision1 = "azerty"
......
...@@ -106,7 +106,7 @@ def killCommand(pid, log): ...@@ -106,7 +106,7 @@ def killCommand(pid, log):
everyone at the same time everyone at the same time
""" """
process = psutil.Process(pid) process = psutil.Process(pid)
new_child_set = set([x.pid for x in process.get_children(recursive=True)]) new_child_set = set([x.pid for x in process.children(recursive=True)])
child_set = None child_set = None
os.kill(pid, signal.SIGSTOP) os.kill(pid, signal.SIGSTOP)
while new_child_set != child_set: while new_child_set != child_set:
...@@ -117,7 +117,7 @@ def killCommand(pid, log): ...@@ -117,7 +117,7 @@ def killCommand(pid, log):
os.kill(child_pid, signal.SIGSTOP) os.kill(child_pid, signal.SIGSTOP)
time.sleep(1) time.sleep(1)
child_set = new_child_set child_set = new_child_set
new_child_set = set([x.pid for x in process.get_children(recursive=True)]) new_child_set = set([x.pid for x in process.children(recursive=True)])
log("killCommand, finishing, child_set : %r" % (child_set,)) log("killCommand, finishing, child_set : %r" % (child_set,))
for child_pid in child_set: for child_pid in child_set:
os.kill(child_pid, signal.SIGKILL) os.kill(child_pid, signal.SIGKILL)
......
...@@ -339,7 +339,7 @@ develop = false ...@@ -339,7 +339,7 @@ develop = false
except: except:
log("testnode, error during requesting getTestType() method \ log("testnode, error during requesting getTestType() method \
from the distributor.") from the distributor.")
raise NotImplementedError raise
# Select runner according to the test type # Select runner according to the test type
if my_test_type == 'UnitTest': if my_test_type == 'UnitTest':
runner = UnitTestRunner(self) runner = UnitTestRunner(self)
......
...@@ -2499,6 +2499,40 @@ class TestClosingPeriod(AccountingTestCase): ...@@ -2499,6 +2499,40 @@ class TestClosingPeriod(AccountingTestCase):
section_uid=self.section.getUid(), section_uid=self.section.getUid(),
node_uid=self.account_module.receivable.getUid())) node_uid=self.account_module.receivable.getUid()))
def test_ParrallelClosingRefused(self):
organisation_module = self.organisation_module
stool = self.portal.portal_simulation
period = self.section.newContent(portal_type='Accounting Period')
period.setStartDate(DateTime(2006, 1, 1))
period.setStopDate(DateTime(2006, 12, 31))
period.start()
period2 = self.section.newContent(portal_type='Accounting Period')
period2.setStartDate(DateTime(2007, 1, 1))
period2.setStopDate(DateTime(2007, 12, 31))
period2.start()
pl = self.portal.account_module.newContent(
portal_type='Account',
account_type='equity')
transaction1 = self._makeOne(
start_date=DateTime(2006, 1, 1),
destination_section_value=organisation_module.client_1,
portal_type='Sale Invoice Transaction',
simulation_state='delivered',
lines=(dict(source_value=self.account_module.goods_sales,
source_credit=100),
dict(source_value=self.account_module.receivable,
source_debit=100)))
self.portal.portal_workflow.doActionFor(
period, 'stop_action',
profit_and_loss_account=pl.getRelativeUrl())
self.assertRaises(ValidationFailed,
self.getPortal().portal_workflow.doActionFor,
period2, 'stop_action' )
class TestAccountingExport(AccountingTestCase): class TestAccountingExport(AccountingTestCase):
......
...@@ -132,6 +132,7 @@ class Browser: ...@@ -132,6 +132,7 @@ class Browser:
def run(self, url, display): def run(self, url, display):
self.clean() self.clean()
self.environ = os.environ.copy()
self._setEnviron() self._setEnviron()
self._setDisplay(display) self._setDisplay(display)
self._run(url) self._run(url)
...@@ -151,21 +152,25 @@ class Browser: ...@@ -151,21 +152,25 @@ class Browser:
def _setDisplay(self, display): def _setDisplay(self, display):
if display: if display:
os.environ["DISPLAY"] = display self.environ["DISPLAY"] = display
else:
xauth = os.path.expanduser('~/.Xauthority')
if os.path.exists(xauth):
self.environ["XAUTHORITY"] = xauth
def _runCommand(self, *args): def _runCommand(self, *args):
print " ".join(args) print " ".join(args)
self.process = subprocess.Popen(args, close_fds=True) self.process = subprocess.Popen(args, close_fds=True, env=self.environ)
class Firefox(Browser): class Firefox(Browser):
""" Use firefox to open run all the tests""" """ Use firefox to open run all the tests"""
def _setEnviron(self): def _setEnviron(self):
os.environ['MOZ_NO_REMOTE'] = '1' self.environ['MOZ_NO_REMOTE'] = '1'
os.environ['HOME'] = self.profile_dir self.environ['HOME'] = self.profile_dir
os.environ['LC_ALL'] = 'C' self.environ['LC_ALL'] = 'C'
os.environ["MOZ_CRASHREPORTER_DISABLE"] = "1" self.environ["MOZ_CRASHREPORTER_DISABLE"] = "1"
os.environ["NO_EM_RESTART"] = "1" self.environ["NO_EM_RESTART"] = "1"
# This disables unwanted SCIM as it fails with Xvfb, at least on Mandriva # This disables unwanted SCIM as it fails with Xvfb, at least on Mandriva
# 2010.0, because Firefox tries to start scim-bridge which SIGSEGV and # 2010.0, because Firefox tries to start scim-bridge which SIGSEGV and
...@@ -174,7 +179,7 @@ class Firefox(Browser): ...@@ -174,7 +179,7 @@ class Firefox(Browser):
'XIM_PROGRAM', 'XIM_PROGRAM',
'XMODIFIERS', 'XMODIFIERS',
'QT_IM_MODULE'): 'QT_IM_MODULE'):
os.environ.pop(remove_environment_variable, None) self.environ.pop(remove_environment_variable, None)
def _run(self, url): def _run(self, url):
# Prepare to run # Prepare to run
...@@ -183,8 +188,6 @@ class Firefox(Browser): ...@@ -183,8 +188,6 @@ class Firefox(Browser):
self._runCommand(firefox_bin, "-no-remote", self._runCommand(firefox_bin, "-no-remote",
"-profile", self.profile_dir, url) "-profile", self.profile_dir, url)
os.environ['MOZ_NO_REMOTE'] = '0'
def getPrefJs(self): def getPrefJs(self):
from App.config import getConfiguration from App.config import getConfiguration
return """ return """
......
...@@ -276,7 +276,7 @@ class MessageCatalog(LanguageManager, ObjectManager, SimpleItem): ...@@ -276,7 +276,7 @@ class MessageCatalog(LanguageManager, ObjectManager, SimpleItem):
as a translation for unknown messages. as a translation for unknown messages.
""" """
if not isinstance(message, basestring): if not isinstance(message, basestring):
raise TypeError, 'only strings can be translated.' raise TypeError('only strings can be translated, not: %r' % (message,))
if default is None: if default is None:
default = message default = message
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment