Commit 783efd4c authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

Merge remote-tracking branch 'origin/master' into erp5-component

parents 574d45a6 0d8e7211
Changes Changes
======= =======
0.4.24 (2013-02-11)
-------------------
* erp5.util.testnode:
- Fixed wrong location for the construction os test suite software
[Sebastien Robin]
0.4.23 (2013-02-11)
-------------------
* erp5.util.testnode:
- Make erp5testnode allow remote access to test suite logs instead of
uploading them to master [Tatuya Kamada], [Sebastien Robin]
0.4.22 (2013-01-08) 0.4.22 (2013-01-08)
------------------- -------------------
......
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
<string>your_omit_grouping_reference</string> <string>your_omit_grouping_reference</string>
<string>your_mirror_section_category_list</string> <string>your_mirror_section_category_list</string>
<string>your_mirror_section</string> <string>your_mirror_section</string>
<string>your_gap</string> <string>your_gap_list</string>
<string>your_gap_root</string> <string>your_gap_root</string>
<string>your_simulation_state</string> <string>your_simulation_state</string>
</list> </list>
...@@ -111,7 +111,6 @@ ...@@ -111,7 +111,6 @@
<list> <list>
<string>your_at_date</string> <string>your_at_date</string>
<string>your_from_date</string> <string>your_from_date</string>
<string>your_gap</string>
<string>your_gap_root</string> <string>your_gap_root</string>
<string>your_section_category</string> <string>your_section_category</string>
<string>your_simulation_state</string> <string>your_simulation_state</string>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="MultiListField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>your_gap_list</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>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>unknown_selection</string> </key>
<value> <string>You selected an item that was not in the list.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>items</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>items</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra_item</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>items</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>5</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>GAP</string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>view_separator</string> </key>
<value> <string encoding="cdata"><![CDATA[
<br />
]]></string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: request.get(\'gap_list\') or request.get(\'your_gap_list\') or None</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: context.Account_getGapItemList()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -75,10 +75,10 @@ while date < context.getStopDate():\n ...@@ -75,10 +75,10 @@ while date < context.getStopDate():\n
\n \n
if frequency == \'quarterly\':\n if frequency == \'quarterly\':\n
period.setShortTitle(\'%s-%s\' % (\n period.setShortTitle(\'%s-%s\' % (\n
date.strftime(\'%Y %m\'), (end_date - 1).strftime(\'%m\')))\n start_date.strftime(\'%Y %m\'), (end_date - 1).strftime(\'%m\')))\n
else:\n else:\n
period.setShortTitle(date.strftime(\'%Y-%m\'))\n period.setShortTitle(start_date.strftime(\'%Y-%m\'))\n
period.setTitle(str(translateString(date.strftime(\'%B\'))))\n period.setTitle(str(translateString(start_date.strftime(\'%B\'))))\n
\n \n
if open_periods:\n if open_periods:\n
period.start()\n period.start()\n
......
<?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 encoding="cdata"><![CDATA[
"""\n
Returns journal entries, for use with AccountingTransactionModule_viewJournal\n
\n
return a list of dictionnaries like that :\n
\n
{ \'date\' : Date\n
, \'description\': String\n
, \'currency\' : String\n
, \'lines\' : { \'debtor\' : Bool\n
, \'account_gap_id\': String\n
, \'account_name\' : String # with extra-description (ie. bank name if a bank, organisation name if an other party)\n
, \'amount\' : Float\n
}\n
}\n
"""\n
\n
request = context.REQUEST\n
selection_name = "accounting_selection"\n
Base_translateString = context.Base_translateString\n
result = []\n
journal_total_debit = 0\n
journal_total_credit = 0\n
\n
# this report can be used in two ways:\n
# * with a report dialog to specify parameters\n
if request.has_key(\'at_date\'):\n
at_date = request[\'at_date\'].latestTime()\n
section_category = request[\'transaction_section_category\']\n
transaction_simulation_state = request[\'transaction_simulation_state\']\n
transaction_portal_type = request[\'transaction_portal_type\']\n
from_date = request.get(\'from_date\', None)\n
params = { \'sort_on\' : \'delivery.start_date\',\n
\'at_date\' : at_date,\n
\'simulation_state\': transaction_simulation_state,\n
\'search_result_keys\': [],\n
\'section_category\': section_category,\n
\'portal_type\' : transaction_portal_type, }\n
\n
if from_date:\n
params[\'from_date\'] = from_date\n
\n
zGetList = context.AccountingTransactionModule_zGetAccountingTransactionList\n
transaction_list = zGetList( selection_params = params\n
, **params\n
)\n
else:\n
stool = context.getPortalObject().portal_selections\n
transaction_list = [x.getObject() for x in \n
stool.callSelectionFor(selection_name)]\n
section_category = stool.getSelectionParamsFor(selection_name\n
).get(\'section_category\', \'unset\')\n
\n
for transaction in transaction_list:\n
transaction = transaction.getObject()\n
destination_section = transaction.getDestinationSectionValue()\n
source_section = transaction.getSourceSectionValue()\n
\n
# add a test on portal type to bypass bad acquisition of group category from\n
# person to Orignisation This help us filter employee of the source_section:\n
# because of acquisition via subordination they are seen as part of the group\n
# but in this accounting context group define a business unit composed of\n
# organisation\n
we_are_destination = (destination_section is not None) and \\\n
(\'group/%s\' % destination_section.getGroup(\'\')\n
).startswith(section_category) and \\\n
destination_section.getPortalType() == "Organisation"\n
we_are_source = (source_section is not None) and \\\n
(\'group/%s\' % source_section.getGroup(\'\')\n
).startswith(section_category) and \\\n
source_section.getPortalType() == "Organisation"\n
\n
if we_are_source:\n
specific_reference = transaction.getSourceReference()\n
date = transaction.getStartDate()\n
else:\n
specific_reference = transaction.getDestinationReference()\n
date = transaction.getStopDate()\n
\n
lines = []\n
transaction_dict = {\n
\'date\' : context.Base_FormatDate( date ),\n
\'lines\' : lines,\n
\'description\': Base_translateString(\n
"${transaction_title} (Transaction Reference "\n
"= ${transaction_reference},\\n Creation Date = "\n
"${creation_date} \\n Currency = ${currency_title})",\n
mapping = {\n
"transaction_title": unicode(transaction.getTitle() or \'\', \'utf8\'),\n
"transaction_reference": unicode(specific_reference or \'\', \'utf8\'),\n
"creation_date": context.Base_FormatDate(transaction.getCreationDate()),\n
"currency_title": transaction.getResourceTitle() or \'\' })}\n
\n
result.append(transaction_dict)\n
transaction_lines = transaction.contentValues(\n
filter = {\'portal_type\' : context.getPortalAccountingMovementTypeList()})\n
\n
if we_are_source :\n
transaction_lines.sort(key=lambda x: x.getObject().getSourceInventoriatedTotalAssetPrice(),\n
reverse=True)\n
else :\n
transaction_lines.sort(key=lambda x: x.getObject().getDestinationInventoriatedTotalAssetPrice(),\n
reverse=True)\n
\n
for line in transaction_lines:\n
line = line.getObject()\n
\n
if we_are_source :\n
debit = line.getSourceInventoriatedTotalAssetDebit() or 0.0\n
credit = line.getSourceInventoriatedTotalAssetCredit() or 0.0\n
debtor = (line.getSourceInventoriatedTotalAssetPrice() > 0)\n
account = line.getSourceValue()\n
if account is None: continue\n
if account.isMemberOf(\'account_type/asset/cash\'):\n
account_description = "%s (%s)" % ( line.getSourceTitle()\n
, line.getSourcePaymentTitle()\n
)\n
elif account.getAccountType() in (\'asset/receivable\',\n
\'liability/payable\'):\n
account_description = "%s (%s)" % ( line.getSourceTitle()\n
, line.getDestinationSectionTitle()\n
)\n
else:\n
account_description = line.getSourceTitle()\n
lines.append({ \'debtor\' : debtor\n
, \'account_gap_id\': account.Account_getGapId()\n
, \'account_name\' : account_description\n
, \'amount\' : debtor and (debit) or (credit)\n
})\n
if debtor:\n
journal_total_debit += debit\n
else:\n
journal_total_credit += credit\n
\n
if we_are_destination:\n
debit = line.getDestinationInventoriatedTotalAssetDebit() or 0.0\n
credit = line.getDestinationInventoriatedTotalAssetCredit() or 0.0\n
debtor = (debit > credit)\n
account = line.getDestinationValue()\n
if account is None: continue\n
if account.isMemberOf(\'account_type/asset/cash\'):\n
account_description = "%s (%s)" % ( line.getDestinationTitle()\n
, line.getDestinationPaymentTitle()\n
)\n
elif account.getAccountType() in (\'asset/receivable\',\n
\'liability/payable\'):\n
account_description = "%s (%s)" % ( line.getDestinationTitle()\n
, line.getSourceSectionTitle()\n
)\n
else:\n
account_description = line.getDestinationTitle()\n
lines.append({ \'debtor\' : debtor\n
, \'account_gap_id\': account.Account_getGapId()\n
, \'account_name\' : account_description\n
, \'amount\' : debtor and (debit) or (credit)\n
})\n
if debtor:\n
journal_total_debit += debit\n
else:\n
journal_total_credit += credit\n
\n
\n
return result + [{ "journal_total_debit" : journal_total_debit\n
, "journal_total_credit": journal_total_credit\n
}]\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>AccountingTransactionModule_getJournalAccountingTransactionList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<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_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<?xml version="1.0" encoding="iso-8859-1"?>\n
<template bottommargin=\'2cm\' showboundary=\'0\' topmargin=\'2cm\' \n
rightmargin=\'2cm\' tal:define=\'portal python:here.portal_url.getPortalObject()\' \n
filename=\'journal.pdf\' pagesize=\'A4\' allowsplitting=\'1\' landscape=\'0\' leftmargin=\'2cm\'>\n
\n
<pagetemplate startframe=\'content\' id=\'FirstPage\'>\n
<static>\n
<infostring align="left" x="1cm" y= "29cm" size="8" font="Helvetica" color="(0,0,0)"\n
tal:content="python: here.Localizer.erp5_ui.gettext(\'Printed by %(user)s at %(date)s\') % {\'user\':user.getUserName(), \'date\':DateTime()}" >Printed by</infostring>\n
<infostring align="left" x="18cm" y= "0.5cm" size="10" font="Helvetica" color="(0,0,0)" >Page %(page)s</infostring>\n
</static>\n
<frame showBoundary=\'0\' leftpadding=\'0.1cm\' height=\'23.94cm\' width=\'17.59cm\' rightpadding=\'0.1cm\' y=\'2cm\' x=\'2cm\' nextid=\'content\' toppadding=\'0.2cm\' id=\'content\' bottompadding=\'0.5cm\'/>\n
</pagetemplate>\n
\n
<stylesheet>\n
<paragraphstyle name="Title" parent="Normal" fontname="Helvetica-Bold" fontsize="32" align="CENTER"/>\n
<tablestyle name=\'default\'>\n
<stylecmd expr="(\'GRID\', (0,0), (-1,-1), 0.1, colors.black)"/>\n
</tablestyle>\n
<paragraphstyle name="TableStandard" parent="Normal" fontname="Helvetica" fontsize="8" alignment="left" />\n
<paragraphstyle name="TableStandardLeftAligned" parent="Normal" fontname="Helvetica" fontsize="7" alignment="left" />\n
<paragraphstyle name="TableStandardRightAligned" parent="Normal" fontname="Helvetica" fontsize="7" alignment="right" />\n
<paragraphstyle name="TableHeader" parent="Normal" fontname="Helvetica-Oblique" fontsize="9" alignment="left" />\n
<paragraphstyle name="TableLastLine" parent="Normal" fontname="Helvetica-Oblique" fontsize="11" alignment="left" />\n
\n
<tablestyle name=\'transaction_header\'>\n
<stylecmd expr="(\'LINEBELOW\', (2,0), (2,0), 0.1, colors.black)"/> \n
<stylecmd expr="(\'LINEBELOW\', (-3,0), (-3,0), 0.1, colors.black)"/> \n
<stylecmd expr="(\'LINEBEFORE\', (0,0),(2,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'ALIGN\', (0,0),(-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0),(-1,-1), \'BOTTOM\')"/>\n
</tablestyle>\n
<tablestyle name=\'transaction_body\'>\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Helvetica\', 8)"/>\n
<stylecmd expr="(\'LINEBEFORE\', (0,0),(2,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'ALIGN\', (-2,0), (-1,-1), \'RIGHT\')"/>\n
</tablestyle>\n
<tablestyle name=\'transaction_footer\'>\n
<stylecmd expr="(\'LINEBEFORE\', (0,0),(2,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Times-Italic\', 10)"/>\n
</tablestyle>\n
\n
<tablestyle name="top_of_page">\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Helvetica\', 8)"/>\n
<stylecmd expr="(\'BOX\', (0,0), (-1,0), 1, colors.black)"/>\n
<stylecmd expr="(\'BOX\', (0,1), (-1,-1), 1, colors.black)"/>\n
<stylecmd expr="(\'BACKGROUND\', (0,0), (-1,0), (0.9,0.9,0.9))"/>\n
<stylecmd expr="(\'ALIGN\', (0,0), (-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0), (-1,-1), \'TOP\')"/>\n
<stylecmd expr="(\'LEFTPADDING\', (0,0), (-1,-1), 1)"/>\n
<stylecmd expr="(\'RIGHTPADDING\', (0,0), (-1,-1), 1)"/>\n
<stylecmd expr="(\'BOTTOMPADDING\', (0,0), (-1,-1), 0)"/>\n
<stylecmd expr="(\'TOPPADDING\', (0,0), (-1,-1), 1)"/>\n
</tablestyle>\n
\n
<tablestyle name="AttributesTable">\n
<stylecmd expr="(\'INNERGRID\', (0,0), (-1,-1), 1, (0.5,0.5,0.5))"/>\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Helvetica\', 8)"/>\n
<stylecmd expr="(\'BOX\', (0,0), (-1,-1), 1, colors.black)"/>\n
<stylecmd expr="(\'BACKGROUND\', (0,0), (0,-1), (0.9,0.9,0.9))"/>\n
<stylecmd expr="(\'ALIGN\', (0,0), (-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0), (-1,-1), \'TOP\')"/>\n
</tablestyle>\n
\n
</stylesheet>\n
</template>
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>AccountingTransactionModule_journal_pdf_template</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PDFTemplate" module="Products.ERP5Form.PDFTemplate"/>
</pickle>
<pickle>
<dictionary>
<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_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<?xml version="1.0" encoding="latin1"?>\n
<document\n
filename="journal.pdf"\n
tal:define="portal here/portal_url/getPortalObject;\n
transaction_list here/AccountingTransactionModule_getJournalAccountingTransactionList;\n
precision here/Base_getPreferredPrecision">\n
<title>Journal</title>\n
<author>ERP5</author>\n
<subject>Journal</subject>\n
<content xmlns:tal="http://xml.zope.org/namespaces/tal">\n
<para style="Title" i18n:translate="" i18n:domain="ui">Journal</para>\n
<action name="nextPageTemplate">\n
<parameter>FirstPage</parameter>\n
</action>\n
<spacer height="50"/>\n
\n
<table splitbyrow="1" repeatrows="0"\n
repeatcols="0" style="AttributesTable"\n
tal:condition="request/at_date | nothing">\n
<tr tal:condition="python: request.get(\'from_date\', 0)">\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'From Date\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.Base_FormatDate(request.get(\'from_date\'))"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'At Date\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.Base_FormatDate(request.get(\'at_date\'))"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Section\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.portal_categories.restrictedTraverse(request.get(\'transaction_section_category\')).getLogicalPath()"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Transactions Simulation State\')"/> </td>\n
<td colwidth="15cm"> <tal:block tal:repeat="state python:request.get(\'transaction_simulation_state\', [])">\n
<para style="TableStandardRightAligned" tal:content="state"/> </tal:block> </td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Journal Type\')"/> </td>\n
<td colwidth="15cm"> <tal:block tal:repeat="type python:request.get(\'transaction_portal_type\', [])">\n
<para style="TableStandardRightAligned" tal:content="python: here.Base_translateString(type)"/> </tal:block> </td> </tr>\n
\n
</table>\n
<spacer height="10"/>\n
\n
<table style="top_of_page" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.512cm">\n
<td colwidth="1.5cm">Debit</td>\n
<td colwidth="1.5cm">Credit</td>\n
<td colwidth="12cm">Account Title</td>\n
<td colwidth="2.5cm">Debit</td>\n
<td colwidth="2.5cm">Credit</td>\n
</tr>\n
</table>\n
<tal:block tal:repeat="transaction python:transaction_list[:-1]">\n
<table style="transaction_header" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.5cm">\n
<td colwidth="1.5cm"/>\n
<td colwidth="1.5cm"/>\n
<td colwidth="4.5cm"/>\n
<td colwidth="3cm" tal:content="transaction/date">Date</td>\n
<td colwidth="4.5cm"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
<tal:block tal:repeat="line transaction/lines">\n
<table style="transaction_body" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.512cm">\n
<td colwidth="1.5cm" tal:content="python:line[\'debtor\'] and line[\'account_gap_id\'] or \' \' "/>\n
<td colwidth="1.5cm" tal:content="python:line[\'debtor\'] and \' \' or line[\'account_gap_id\'] "/>\n
<tal:block tal:condition="not:line/debtor">\n
<td colwidth="2cm"/>\n
</tal:block>\n
<td colwidth="modified"\n
tal:attributes="colwidth python: line[\'debtor\'] and \'12cm\' or \'10cm\' ;" tal:content="python:line[\'account_name\']"/>\n
<td colwidth="2.5cm" tal:content="python:line[\'debtor\'] and here.Base_getRoundValue(line[\'amount\'], precision) or \' \' "/>\n
<td colwidth="2.5cm" tal:content="python:line[\'debtor\'] and \' \' or here.Base_getRoundValue(line[\'amount\'], precision) "/>\n
</tr>\n
</table>\n
</tal:block>\n
<table style="transaction_footer" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr>\n
<td colwidth="1.5cm"/>\n
<td colwidth="1.5cm"/>\n
<td colwidth="0.5cm"/>\n
<td colwidth="11.5cm" tal:content="transaction/description"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
</tal:block>\n
\n
<tal:block tal:replace="nothing"> Summary.\n
</tal:block>\n
<tal:block>\n
<table style="transaction_header" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.5cm">\n
<td colwidth="1.5cm"/>\n
<td colwidth="1.5cm"/>\n
<td colwidth="4.5cm"/>\n
<td colwidth="3cm"/>\n
<td colwidth="4.5cm"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
<table style="transaction_body" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="1.5cm">\n
<td colwidth="1.5cm"/>\n
<td colwidth="1.5cm"/>\n
<td colwidth="2cm"/>\n
<td colwidth="10cm" > Total </td>\n
<td colwidth="2.5cm" tal:content="python: here.Base_getRoundValue(transaction_list[-1][\'journal_total_debit\' ], precision) "/>\n
<td colwidth="2.5cm" tal:content="python: here.Base_getRoundValue(transaction_list[-1][\'journal_total_credit\'], precision) "/>\n
</tr>\n
</table>\n
</tal:block>\n
</content>\n
</document>\n
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>AccountingTransactionModule_viewJournalAsPdf</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>pdf_stylesheet</string> </key>
<value> <string>AccountingTransactionModule_journal_pdf_template</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -150,6 +150,7 @@ for (node, section, mirror_section, extra_parameter), line_info_list in lines_pe ...@@ -150,6 +150,7 @@ for (node, section, mirror_section, extra_parameter), line_info_list in lines_pe
\n \n
for line in line_info_list:\n for line in line_info_list:\n
line_obj = portal.restrictedTraverse(line[\'path\'])\n line_obj = portal.restrictedTraverse(line[\'path\'])\n
assert not line_obj.getGroupingReference(), line\n
line_obj.setGroupingReference(string_reference)\n line_obj.setGroupingReference(string_reference)\n
line_obj.setGroupingDate(date)\n line_obj.setGroupingDate(date)\n
line_obj.reindexObject(activate_kw=dict(tag=\'accounting_grouping_reference\'))\n line_obj.reindexObject(activate_kw=dict(tag=\'accounting_grouping_reference\'))\n
......
...@@ -50,110 +50,19 @@ ...@@ -50,110 +50,19 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>src__ = 0\n <value> <string>"""Returns Accounting Transactions where this bank account is payment.\n
if kw.has_key(\'src__\'): src__ = kw[\'src__\']\n """\n
precision = context.Base_getPreferredPrecision()\n kw[\'payment_uid\'] = context.getUid()\n
r_ = lambda x: context.Base_getRoundValue(x, precision)\n kw[\'node_category\'] = \'account_type/asset/cash/bank\'\n
\n transaction_list = context.Node_getAccountingTransactionList(**kw)\n
# read settings from user preference\n \n
preference = context.getPortalObject().portal_preferences\n # As we are showing quantities and not asset prices, we use the precision\n
simulation_state = preference.getPreferredAccountingTransactionSimulationStateList()\n # from this bank account currency\n
section_category = preference.getPreferredAccountingTransactionSectionCategory()\n if context.getPriceCurrency():\n
from_date = preference.getPreferredAccountingTransactionFromDate()\n container.REQUEST.set(\'precision\',\n
at_date = preference.getPreferredAccountingTransactionAtDate()\n context.getQuantityPrecisionFromResource(context.getPriceCurrency()))\n
\n \n
# Build the common inventory dict\n return transaction_list\n
params = {}\n
\n
if kw.get(\'no_from_date\', False): from_date = None\n
\n
if simulation_state: params[\'simulation_state\'] = simulation_state\n
params[\'section_uid\'] = context.Base_getSectionUidListForSectionCategory(section_category)\n
\n
\n
if kw.has_key(\'node_uid\') : params[\'node_uid\'] = kw[\'node_uid\']\n
if kw.has_key(\'portal_type\'): params[\'portal_type\'] = kw[\'portal_type\']\n
\n
# Create the related accouting line list\n
new_result = []\n
net_balance = 0.0\n
\n
if from_date is not None:\n
# Create a new parameter list to get the previous balance\n
get_inventory_kw = params.copy()\n
get_inventory_kw.update({ \'omit_simulation\' : True\n
, \'payment_uid\' : context.getUid()\n
, \'to_date\' : from_date\n
# , \'where_expression\': " section.portal_type = \'Organisation\' "\n
, \'stat\' : True\n
})\n
\n
getInventory = context.getPortalObject().portal_simulation.getInventory\n
# Get previous debit and credit\n
previous_total_debit = r_(getInventory(omit_output=True, **get_inventory_kw))\n
previous_total_credit = r_(getInventory(omit_input =True, **get_inventory_kw))\n
if previous_total_credit != 0:\n
previous_total_credit = - previous_total_credit\n
\n
# Show the previous balance if not empty\n
if previous_total_credit != 0 or previous_total_debit != 0:\n
from Products.ERP5Type.Document import newTempAccountingTransaction\n
\n
net_balance = r_(previous_total_debit - previous_total_credit)\n
previous_balance = newTempAccountingTransaction( context.getPortalObject()\n
, "temp_%s" % context.getUid()\n
)\n
previous_balance.setUid(\'new_000\')\n
\n
previous_balance.edit( \\\n
title = context.Base_translateString("Previous Balance")\n
, date = from_date - 1\n
, portal_type = ""\n
, simulation_state_title = ""\n
, debit = previous_total_debit\n
, credit = previous_total_credit\n
, balance = net_balance\n
, net_balance = net_balance\n
, is_previous_balance = True\n
)\n
new_result.append(previous_balance)\n
\n
\n
# Show / Hide grouping if needed\n
if kw.has_key(\'hide_grouping\'): params[\'hide_grouping\'] = kw[\'hide_grouping\']\n
\n
# FIXME:\n
# using listbox current page number * number of line per listbox page, you can call a\n
# ZSQL Method to initialize net_balance and calculate this only for this page.\n
#\n
# But this is just temporary because some day, erp5_accounting will be rewritten using\n
# only portal_catalog and getInventory. The Iventory API should provide a way to implement\n
# such a net_balance column (in one instruction, so that we do not need to write a wrapping\n
# list method like this one)\n
result = context.BankAccount_zGetAccountingTransactionList( from_date = from_date\n
, at_date = at_date\n
, src__ = src__\n
, **params\n
)\n
if src__:\n
return result\n
\n
# Add related accounting lines one by one in order to calculate intermediate balance\n
for l in result:\n
o = l.getObject()\n
net_balance += l.balance or 0.0\n
if o is not None:\n
c = o.asContext( net_balance = net_balance\n
, balance = l.balance\n
, credit = l.credit\n
, debit = l.debit\n
, date = l.date.toZone(l.getObject().getStartDate().timezone())\n
, section_title = l.section_title\n
, specific_reference = l.specific_reference\n
)\n
new_result.append(c)\n
\n
return new_result\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
...@@ -50,10 +50,13 @@ ...@@ -50,10 +50,13 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>kw[\'omit_input\'] = 1\n <value> <string>"""Total balance (in local currency) of all accounting transactions having this\n
debit = context.BankAccount_statSourceBalance(**kw)\n bank account as payment node\n
return float(\'%.02f\' % debit)\n """\n
# vim: syntax=python\n kw[\'payment_uid\'] = context.getUid()\n
kw[\'asset_price\'] = False\n
kw[\'node_category\'] = \'account_type/asset/cash/bank\'\n
return context.Node_statAccountingBalance(**kw)\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
...@@ -62,7 +65,7 @@ return float(\'%.02f\' % debit)\n ...@@ -62,7 +65,7 @@ return float(\'%.02f\' % debit)\n
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>BankAccount_statSourceDebit</string> </value> <value> <string>BankAccount_statBalance</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -50,19 +50,26 @@ ...@@ -50,19 +50,26 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>context.log(old_method_name, \'%s is deprecated, use %s instead\'\n <value> <string>"""Total credit (in local currency) of all accounting transactions having this\n
% (old_method_name, new_method_name))\n bank account as payment\n
"""\n
kw[\'payment_uid\'] = context.getUid()\n
kw[\'omit_asset_increase\'] = 1\n
kw[\'asset_price\'] = False\n
kw[\'node_category\'] = \'account_type/asset/cash/bank\'\n
kw.update(kw[\'selection\'].getParams())\n
\n \n
return getattr(context, new_method_name)(*args, **kw)\n # here, or 0 is to prevent displaying "- 0"\n
return - context.Node_statAccountingBalance(**kw) or 0\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>old_method_name, new_method_name, *args, **kw</string> </value> <value> <string>**kw</string> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>Base_callDeprecatedMethod</string> </value> <value> <string>BankAccount_statCredit</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -50,12 +50,16 @@ ...@@ -50,12 +50,16 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>kw[\'omit_output\'] = 1\n <value> <string>"""Total debit (in local currency) of all accounting transactions having this\n
credit = context.BankAccount_statSourceBalance(**kw)\n bank account as payment\n
if credit :\n """\n
return float(\'%.02f\' % - credit)\n kw[\'payment_uid\'] = context.getUid()\n
return 0.0\n kw[\'omit_asset_decrease\'] = 1\n
# vim: syntax=python\n kw[\'asset_price\'] = False\n
kw[\'node_category\'] = \'account_type/asset/cash/bank\'\n
kw.update(kw[\'selection\'].getParams())\n
\n
return context.Node_statAccountingBalance(**kw)\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
...@@ -64,7 +68,7 @@ return 0.0\n ...@@ -64,7 +68,7 @@ return 0.0\n
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>BankAccount_statSourceCredit</string> </value> <value> <string>BankAccount_statDebit</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
<?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>params = {}\n
pref = context.getPortalObject().portal_preferences\n
precision = context.Base_getPreferredPrecision()\n
\n
###\n
# Get the \'from_date\' parameter\n
from_date = kw.get( \'from_date\'\n
, pref.getPreferredAccountingTransactionFromDate()\n
)\n
if from_date:\n
params[\'from_date\'] = from_date\n
\n
###\n
# Get the \'at_date\' parameter\n
at_date = kw.get( \'at_date\'\n
, pref.getPreferredAccountingTransactionAtDate()\n
)\n
if at_date:\n
params[\'at_date\'] = at_date\n
\n
###\n
# Get the \'simulation_state\' parameter\n
# Sometimes \'simulation_state\' is now as \'transaction_simulation_state\'\n
simulation_state = kw.get( \'transaction_simulation_state\'\n
, None\n
)\n
if not simulation_state:\n
simulation_state = kw.get( \'simulation_state\'\n
, pref.getPreferredAccountingTransactionSimulationStateList()\n
)\n
if simulation_state:\n
params[\'simulation_state\'] = simulation_state\n
\n
###\n
# Get the \'section_category\' parameter\n
# Sometimes \'section_category\' is now as \'transaction_section_category\'\n
section_category = kw.get( \'transaction_section_category\'\n
, None\n
)\n
if not section_category:\n
section_category = kw.get( \'section_category\'\n
, pref.getPreferredAccountingTransactionSectionCategory()\n
)\n
if section_category:\n
params[\'section_category\'] = section_category\n
\n
###\n
# Parameters only used in reports\n
if kw.has_key(\'node_uid\'): params[\'node_uid\'] = kw[\'node_uid\']\n
\n
###\n
# Get omit parameters\n
if kw.get(\'omit_input\') : params[\'omit_input\'] = 1\n
if kw.get(\'omit_output\'): params[\'omit_output\'] = 1\n
\n
params[\'stat\'] = 1\n
\n
if kw.has_key(\'getUid\') : params[\'getUid\'] = kw[\'getUid\']\n
if kw.has_key(\'getParentUid\'): params[\'getParentUid\'] = kw[\'getParentUid\']\n
\n
###\n
# Call the query with selected parameters\n
result = context.BankAccount_zGetAccountingTransactionList(**params)\n
row = result[0]\n
\n
###\n
# Round the result to avoid float bad precision\n
# TODO: use currency precision\n
return context.Base_getRoundValue(row.quantity or 0.0, precision)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>**kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>BankAccount_statSourceBalance</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
<string>right</string> <string>right</string>
<string>center</string> <string>center</string>
<string>bottom</string> <string>bottom</string>
<string>hidden</string>
</list> </list>
</value> </value>
</item> </item>
...@@ -76,6 +77,18 @@ ...@@ -76,6 +77,18 @@
</list> </list>
</value> </value>
</item> </item>
<item>
<key> <string>hidden</string> </key>
<value>
<list>
<string>listbox_credit</string>
<string>listbox_date</string>
<string>listbox_debit</string>
<string>listbox_running_total_quantity</string>
<string>listbox_total_quantity</string>
</list>
</value>
</item>
<item> <item>
<key> <string>left</string> </key> <key> <string>left</string> </key>
<value> <value>
......
...@@ -11,10 +11,12 @@ ...@@ -11,10 +11,12 @@
<value> <value>
<list> <list>
<string>columns</string> <string>columns</string>
<string>domain_root_list</string> <string>editable_columns</string>
<string>list_method</string> <string>list_method</string>
<string>portal_types</string> <string>portal_types</string>
<string>selection_name</string> <string>selection_name</string>
<string>sort</string>
<string>sort_columns</string>
<string>stat_columns</string> <string>stat_columns</string>
<string>stat_method</string> <string>stat_method</string>
<string>title</string> <string>title</string>
...@@ -96,27 +98,31 @@ ...@@ -96,27 +98,31 @@
<value> <value>
<list> <list>
<tuple> <tuple>
<string>title</string> <string>Movement_getSpecificReference</string>
<string>Title</string> <string>Reference</string>
</tuple> </tuple>
<tuple> <tuple>
<string>section_title</string> <string>Movement_getExplanationTitle</string>
<string>Section</string> <string>Title</string>
</tuple> </tuple>
<tuple> <tuple>
<string>date</string> <string>date</string>
<string>Date</string> <string>Date</string>
</tuple> </tuple>
<tuple> <tuple>
<string>translated_portal_type</string> <string>Movement_getExplanationTranslatedPortalType</string>
<string>Type</string> <string>Type</string>
</tuple> </tuple>
<tuple> <tuple>
<string>specific_reference</string> <string>Movement_getExplanationReference</string>
<string>Transaction Reference</string> <string>Invoice Number</string>
</tuple> </tuple>
<tuple> <tuple>
<string>translated_simulation_state_title</string> <string>Movement_getMirrorSectionTitle</string>
<string>Third Party</string>
</tuple>
<tuple>
<string>getTranslatedSimulationStateTitle</string>
<string>State</string> <string>State</string>
</tuple> </tuple>
<tuple> <tuple>
...@@ -128,27 +134,47 @@ ...@@ -128,27 +134,47 @@
<string>Credit</string> <string>Credit</string>
</tuple> </tuple>
<tuple> <tuple>
<string>balance</string> <string>total_quantity</string>
<string>Balance</string> <string>Balance</string>
</tuple> </tuple>
<tuple> <tuple>
<string>net_balance</string> <string>running_total_quantity</string>
<string>Net</string> <string>Running Balance</string>
</tuple> </tuple>
</list> </list>
</value> </value>
</item> </item>
<item> <item>
<key> <string>domain_root_list</string> </key> <key> <string>editable_columns</string> </key>
<value> <value>
<list> <list>
<tuple> <tuple>
<string>group</string> <string>function</string>
<string>Group</string> <string>function</string>
</tuple>
<tuple>
<string>project</string>
<string>project</string>
</tuple>
<tuple>
<string>date</string>
<string>date</string>
</tuple>
<tuple>
<string>debit</string>
<string>debit</string>
</tuple>
<tuple>
<string>credit</string>
<string>credit</string>
</tuple>
<tuple>
<string>total_quantity</string>
<string>total_quantity</string>
</tuple> </tuple>
<tuple> <tuple>
<string>region</string> <string>running_total_quantity</string>
<string>Region</string> <string>running_total_quantity</string>
</tuple> </tuple>
</list> </list>
</value> </value>
...@@ -194,21 +220,47 @@ ...@@ -194,21 +220,47 @@
<key> <string>selection_name</string> </key> <key> <string>selection_name</string> </key>
<value> <string>bank_account_transaction_selection</string> </value> <value> <string>bank_account_transaction_selection</string> </value>
</item> </item>
<item>
<key> <string>sort</string> </key>
<value>
<list>
<tuple>
<string>stock.date</string>
<string>ASC</string>
</tuple>
<tuple>
<string>stock.uid</string>
<string>ASC</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>sort_columns</string> </key>
<value>
<list>
<tuple>
<string>None</string>
<string>sorting disabled</string>
</tuple>
</list>
</value>
</item>
<item> <item>
<key> <string>stat_columns</string> </key> <key> <string>stat_columns</string> </key>
<value> <value>
<list> <list>
<tuple> <tuple>
<string>debit</string> <string>debit</string>
<string>BankAccount_statSourceDebit</string> <string>BankAccount_statDebit</string>
</tuple> </tuple>
<tuple> <tuple>
<string>credit</string> <string>credit</string>
<string>BankAccount_statSourceCredit</string> <string>BankAccount_statCredit</string>
</tuple> </tuple>
<tuple> <tuple>
<string>balance</string> <string>total_quantity</string>
<string>BankAccount_statSourceBalance</string> <string>BankAccount_statBalance</string>
</tuple> </tuple>
</list> </list>
</value> </value>
......
...@@ -9,12 +9,14 @@ ...@@ -9,12 +9,14 @@
<item> <item>
<key> <string>delegated_list</string> </key> <key> <string>delegated_list</string> </key>
<value> <value>
<list/> <list>
<string>editable</string>
</list>
</value> </value>
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>your_gap</string> </value> <value> <string>listbox_credit</string> </value>
</item> </item>
<item> <item>
<key> <string>message_values</string> </key> <key> <string>message_values</string> </key>
...@@ -50,12 +52,6 @@ ...@@ -50,12 +52,6 @@
<key> <string>tales</string> </key> <key> <string>tales</string> </key>
<value> <value>
<dictionary> <dictionary>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item> <item>
<key> <string>field_id</string> </key> <key> <string>field_id</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
...@@ -75,13 +71,17 @@ ...@@ -75,13 +71,17 @@
<key> <string>values</string> </key> <key> <string>values</string> </key>
<value> <value>
<dictionary> <dictionary>
<item>
<key> <string>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item> <item>
<key> <string>field_id</string> </key> <key> <string>field_id</string> </key>
<value> <string>your_gap</string> </value> <value> <string>my_view_mode_money_quantity</string> </value>
</item> </item>
<item> <item>
<key> <string>form_id</string> </key> <key> <string>form_id</string> </key>
<value> <string>AccountModule_viewReportFieldLibrary</string> </value> <value> <string>Base_viewFieldLibrary</string> </value>
</item> </item>
<item> <item>
<key> <string>target</string> </key> <key> <string>target</string> </key>
...@@ -93,17 +93,4 @@ ...@@ -93,17 +93,4 @@
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: dict([x[::-1] for x in here.Account_getGapItemList()])[here.REQUEST.get(\'gap\')]</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData> </ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DateTimeField" module="Products.Formulator.StandardFields"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_date</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>datetime_out_of_range</string> </key>
<value> <string>The date and time you entered were out of range.</string> </value>
</item>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>not_datetime</string> </key>
<value> <string>You did not enter a valid date and time.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>allow_empty_time</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>sub_form</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>allow_empty_time</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>allow_empty_time</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ampm_time_style</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>date_only</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>date_separator</string> </key>
<value> <string>/</string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_now</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end_datetime</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>hidden_day_is_last_day</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>hide_day</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>input_order</string> </key>
<value> <string>ymd</string> </value>
</item>
<item>
<key> <string>input_style</string> </key>
<value> <string>text</string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start_datetime</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>time_separator</string> </key>
<value> <string>:</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Date</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.Form</string>
<string>BasicForm</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>fields</string> </key>
<value>
<dictionary>
<item>
<key> <string>ampm</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>day</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>hour</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>minute</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
<item>
<key> <string>month</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
<item>
<key> <string>year</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>Default</string>
<string>date</string>
<string>time</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>Default</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>date</string> </key>
<value>
<list>
<string>year</string>
<string>month</string>
<string>day</string>
</list>
</value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<list>
<string>hour</string>
<string>minute</string>
<string>ampm</string>
</list>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>ISO-8859-1</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Basic Form</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.TALESField</string>
<string>TALESMethod</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>preferences/getPreferredDateOrder | string:ymd</string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>StringField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>ampm</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>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
<item>
<key> <string>too_long</string> </key>
<value> <string>Too much input was given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>max_length</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>am/pm</string> </value>
</item>
<item>
<key> <string>truncate</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>unicode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>IntegerField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>day</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Day</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>IntegerField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>hour</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Hour</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>IntegerField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>minute</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Minute</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="8" aka="AAAAAAAAAAg=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>IntegerField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>month</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>2</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Month</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="9" aka="AAAAAAAAAAk=">
<pickle>
<tuple>
<tuple>
<string>Products.Formulator.StandardFields</string>
<string>IntegerField</string>
</tuple>
<none/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>year</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>
<item>
<key> <string>integer_out_of_range</string> </key>
<value> <string>The integer you entered was out of range.</string> </value>
</item>
<item>
<key> <string>not_integer</string> </key>
<value> <string>You did not enter an integer.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>end</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>start</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Year</string> </value>
</item>
<item>
<key> <string>whitespace_preserve</string> </key>
<value> <int>0</int> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?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>editable</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_debit</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>editable</string> </key>
<value> <string></string> </value>
</item>
<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>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_money_quantity</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>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?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>editable</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_running_total_quantity</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>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_money_quantity</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>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?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>editable</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_total_quantity</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>editable</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_money_quantity</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>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Use_Database_Methods_Permission</string> </key>
<value>
<list>
<string>Member</string>
</list>
</value>
</item>
<item>
<key> <string>allow_simple_one_argument_traversal</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>getUid\r\n
getParentUid\r\n
query\r\n
omit_input\r\n
omit_output\r\n
resource_uid:list\r\n
from_date\r\n
at_date\r\n
to_date\r\n
simulation_state:list\r\n
node_uid:list\r\n
stat</string> </value>
</item>
<item>
<key> <string>cache_time_</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>class_file_</string> </key>
<value> <string>ZSQLCatalog.zsqlbrain</string> </value>
</item>
<item>
<key> <string>class_name_</string> </key>
<value> <string>ZSQLBrain</string> </value>
</item>
<item>
<key> <string>connection_hook</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>BankAccount_zGetAccountingTransactionList</string> </value>
</item>
<item>
<key> <string>max_cache_</string> </key>
<value> <int>100</int> </value>
</item>
<item>
<key> <string>max_rows_</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
<dtml-if getParentUid>\n
SELECT\n
<dtml-if stat>\n
SUM(stock.quantity) AS quantity\n
<dtml-else>\n
catalog.uid\n
, catalog.path\n
, stock.date as date\n
, section.title as section_title\n
, IF(delivery.source_section_uid = stock.section_uid,\n
catalog.source_reference,\n
catalog.destination_reference) AS specific_reference\n
, IFNULL(SUM(IF(stock.quantity > 0, stock.quantity, 0)), 0) AS debit\n
, IFNULL(SUM(IF(stock.quantity < 0, - stock.quantity, 0)), 0) AS credit\n
, - IFNULL(SUM(IF(stock.quantity < 0, - stock.quantity, 0)), 0)\n
+ IFNULL(SUM(IF(stock.quantity > 0, stock.quantity, 0)), 0) AS balance \n
</dtml-if>\n
FROM\n
movement\n
, catalog AS child\n
, catalog\n
, catalog AS node\n
, category AS node_category\n
, delivery\n
, stock\n
LEFT JOIN catalog AS section\n
ON stock.mirror_section_uid = section.uid\n
<dtml-if query>\n
, category\n
</dtml-if>\n
WHERE stock.section_uid = <dtml-var getParentUid>\n
AND stock.payment_uid = <dtml-var getUid>\n
AND delivery.uid = catalog.uid\n
AND child.uid = stock.uid\n
AND child.parent_uid = catalog.uid\n
AND movement.uid = stock.uid\n
AND movement.is_accountable = 1\n
AND node.uid = stock.node_uid\n
AND node.uid = node_category.uid\n
AND node_category.category_uid = <dtml-sqlvar\n
"portal_categories.account_type.asset.cash.bank.getUid()" type="int">\n
<dtml-if node_uid>\n
AND (\n
<dtml-in node_uid>\n
stock.node_uid = <dtml-sqlvar sequence-item type="int">\n
<dtml-unless sequence-end> OR </dtml-unless>\n
</dtml-in>\n
)\n
</dtml-if>\n
<dtml-if resource_uid>\n
AND (\n
<dtml-in resource_uid>\n
movement.resource_uid = <dtml-sqlvar sequence-item type="int">\n
<dtml-unless sequence-end> OR </dtml-unless>\n
</dtml-in>\n
)\n
</dtml-if>\n
<dtml-if from_date>\n
AND stock.date >= <dtml-sqlvar from_date type="datetime">\n
</dtml-if>\n
<dtml-if at_date>\n
AND stock.date <= <dtml-sqlvar at_date type="datetime">\n
</dtml-if>\n
<dtml-if to_date>\n
AND stock.date < <dtml-sqlvar to_date type="datetime">\n
</dtml-if>\n
<dtml-if omit_input>\n
AND stock.quantity > 0\n
</dtml-if>\n
<dtml-if omit_output>\n
AND stock.quantity < 0\n
</dtml-if>\n
<dtml-if simulation_state>\n
AND (\n
<dtml-in simulation_state>\n
catalog.simulation_state = <dtml-sqlvar sequence-item type="string">\n
<dtml-unless sequence-end> OR </dtml-unless>\n
</dtml-in>\n
)\n
</dtml-if>\n
<dtml-if query>\n
AND category.uid = stock.section_uid\n
AND <dtml-var query>\n
</dtml-if>\n
<dtml-unless stat>\n
GROUP BY catalog.uid\n
</dtml-unless>\n
ORDER BY stock.date, movement.uid\n
</dtml-if>\n
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></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 encoding="cdata"><![CDATA[
try:\n
# Round the value\n
# Fortunately, the round() python method follow french fiscal rules.\n
# Exemples:\n
# 116.5049 should be rounded to 116.50\n
# 116.505 should be rounded to 116.51\n
# 116.5051 should be rounded to 116.51\n
# Please check in your country if the round() method comply with local accounting and fiscal laws.\n
rounded_value = round(value, precision)\n
\n
# Truncate the rounded value\n
trunc_value = (\'%.\' + str(precision) + \'f\') % rounded_value\n
\n
if as_string:\n
return trunc_value\n
return float(trunc_value)\n
\n
except:\n
context.log("bad convertion >>>", repr(context) + " | " + repr(value) + " | " + repr(precision))\n
return 0.0\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>value, precision, as_string=False</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_getRoundValue</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -54,9 +54,13 @@ ...@@ -54,9 +54,13 @@
portal = context.getPortalObject()\n portal = context.getPortalObject()\n
\n \n
params = portal.ERP5Accounting_getParams(selection_name=selection_name)\n params = portal.ERP5Accounting_getParams(selection_name=selection_name)\n
getInventoryAssetPrice = portal.portal_simulation.getInventoryAssetPrice\n
getSelectionDomainDictFor = context.portal_selections.getSelectionDomainDictFor\n getSelectionDomainDictFor = context.portal_selections.getSelectionDomainDictFor\n
\n \n
if asset_price:\n
getInventory = portal.portal_simulation.getInventoryAssetPrice\n
else:\n
getInventory = portal.portal_simulation.getInventory\n
\n
if kw.get(\'node_uid\'):\n if kw.get(\'node_uid\'):\n
params[\'node_uid\'] = kw[\'node_uid\']\n params[\'node_uid\'] = kw[\'node_uid\']\n
\n \n
...@@ -138,26 +142,26 @@ if period_start_date and params.get(\'node_uid\'):\n ...@@ -138,26 +142,26 @@ if period_start_date and params.get(\'node_uid\'):\n
# balance at the beginning of the period, plus debit or credit from this\n # balance at the beginning of the period, plus debit or credit from this\n
# beginning of period to the from_date\n # beginning of period to the from_date\n
at_date = params.pop(\'at_date\', None)\n at_date = params.pop(\'at_date\', None)\n
period_openning_balance = getInventoryAssetPrice(\n period_openning_balance = getInventory(\n
selection_domain=getSelectionDomainDictFor(selection_name),\n selection_domain=getSelectionDomainDictFor(selection_name),\n
to_date=period_start_date,\n to_date=period_start_date,\n
**params)\n **params)\n
if omit_asset_decrease:\n if omit_asset_decrease:\n
return getInventoryAssetPrice(omit_asset_decrease=1,\n return getInventory(omit_asset_decrease=1,\n
from_date=period_start_date,\n from_date=period_start_date,\n
at_date=at_date,\n at_date=at_date,\n
**params) + max(period_openning_balance, 0)\n **params) + max(period_openning_balance, 0)\n
elif omit_asset_increase:\n elif omit_asset_increase:\n
return getInventoryAssetPrice(omit_asset_increase=1,\n return getInventory(omit_asset_increase=1,\n
from_date=period_start_date,\n from_date=period_start_date,\n
at_date=at_date,\n at_date=at_date,\n
**params) - max(-period_openning_balance, 0)\n **params) - max(-period_openning_balance, 0)\n
return getInventoryAssetPrice(\n return getInventory(\n
from_date=period_start_date,\n from_date=period_start_date,\n
at_date=at_date,\n at_date=at_date,\n
**params) + period_openning_balance\n **params) + period_openning_balance\n
\n \n
return getInventoryAssetPrice(\n return getInventory(\n
omit_asset_increase=omit_asset_increase,\n omit_asset_increase=omit_asset_increase,\n
omit_asset_decrease=omit_asset_decrease,\n omit_asset_decrease=omit_asset_decrease,\n
selection_domain=getSelectionDomainDictFor(selection_name),\n selection_domain=getSelectionDomainDictFor(selection_name),\n
...@@ -166,7 +170,7 @@ return getInventoryAssetPrice(\n ...@@ -166,7 +170,7 @@ return getInventoryAssetPrice(\n
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
<value> <string>selection=None, omit_asset_increase=0, omit_asset_decrease=0, selection_name=None, **kw</string> </value> <value> <string>selection=None, omit_asset_increase=0, omit_asset_decrease=0, asset_price=True, selection_name=None, **kw</string> </value>
</item> </item>
<item> <item>
<key> <string>_proxy_roles</string> </key> <key> <string>_proxy_roles</string> </key>
......
<?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>context.log(\'erp5_accounting\',\n
\'InvoiceTransactionLine_getSourceItemList is a deprecated compatibility\'\n
\' alias to AccountingTransactionLine_getNodeItemList()\')\n
return context.AccountingTransactionLine_getNodeItemList()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>category_dict=None, caching_method_id=\'InvoiceTransactionLine_getSourceItemList\'</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>InvoiceTransactionLine_getSourceItemList</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -50,7 +50,9 @@ ...@@ -50,7 +50,9 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>from Products.DCWorkflow.DCWorkflow import ValidationFailed\n <value> <string encoding="cdata"><![CDATA[
from Products.DCWorkflow.DCWorkflow import ValidationFailed\n
from Products.ERP5Type.Message import translateString\n from Products.ERP5Type.Message import translateString\n
\n \n
period = state_change[\'object\']\n period = state_change[\'object\']\n
...@@ -64,6 +66,18 @@ all_state_list = [x[1] for x in\n ...@@ -64,6 +66,18 @@ all_state_list = [x[1] for x in\n
invalid_simulation_state_list = [state for state in all_state_list\n invalid_simulation_state_list = [state for state in all_state_list\n
if state not in valid_simulation_state_list]\n if state not in valid_simulation_state_list]\n
\n \n
if period.getParentValue().getPortalType() == \'Organisation\':\n
# if this is a "main" accounting period, we refuse to close if the previous\n
# period is not already closed.\n
for other_period in period.getParentValue().contentValues(\n
portal_type=\'Accounting Period\',\n
checked_permission=\'View\'):\n
if other_period != period and \\\n
other_period.getSimulationState() not in (\'delivered\', \'cancelled\') and\\\n
other_period.getStartDate() < period.getStartDate():\n
raise ValidationFailed(translateString(\n
"Previous accounting periods has to be closed first."))\n
\n
section = period.getParentValue()\n section = period.getParentValue()\n
while section.getPortalType() == period.getPortalType():\n while section.getPortalType() == period.getPortalType():\n
section = section.getParentValue()\n section = section.getParentValue()\n
...@@ -115,7 +129,9 @@ movement_list = portal.portal_simulation.getMovementHistoryList(\n ...@@ -115,7 +129,9 @@ movement_list = portal.portal_simulation.getMovementHistoryList(\n
if movement_list:\n if movement_list:\n
raise ValidationFailed, translateString(\n raise ValidationFailed, translateString(\n
"All Accounting Transactions for this organisation during the period have to be closed first.")\n "All Accounting Transactions for this organisation during the period have to be closed first.")\n
</string> </value>
]]></string> </value>
</item> </item>
<item> <item>
<key> <string>_params</string> </key> <key> <string>_params</string> </key>
......
1508 1517
\ No newline at end of file
erp5_accounting erp5_accounting
erp5_accounting_bbb \ No newline at end of file
\ No newline at end of file
...@@ -71,9 +71,6 @@ request = context.REQUEST\n ...@@ -71,9 +71,6 @@ request = context.REQUEST\n
gap_base = request.get("gap_base", "gap/fr/pcg/")\n gap_base = request.get("gap_base", "gap/fr/pcg/")\n
getURL = lambda gap_id: context.GAPCategory_getURLFromId(gap_id, gap_base)\n getURL = lambda gap_id: context.GAPCategory_getURLFromId(gap_id, gap_base)\n
\n \n
precision = context.Base_getPreferredPrecision()\n
r_ = lambda x: context.Base_getRoundValue(x, precision)\n
\n
section = context.restrictedTraverse(request.get("organisation"))\n section = context.restrictedTraverse(request.get("organisation"))\n
section_region = section.getRegion()\n section_region = section.getRegion()\n
\n \n
...@@ -81,8 +78,8 @@ section_region = section.getRegion()\n ...@@ -81,8 +78,8 @@ section_region = section.getRegion()\n
params = { \'omit_simulation\' : True\n params = { \'omit_simulation\' : True\n
, \'simulation_state\': request.get("simulation_state", [\'stopped\', \'delivered\'])\n , \'simulation_state\': request.get("simulation_state", [\'stopped\', \'delivered\'])\n
, \'section_uid\' : section.getUid()\n , \'section_uid\' : section.getUid()\n
, \'precision\' : 2\n
, \'at_date\' : request[\'at_date\']\n , \'at_date\' : request[\'at_date\']\n
, \'where_expression\': " section.portal_type = \'Organisation\' "\n
}\n }\n
params.update(kw)\n params.update(kw)\n
\n \n
...@@ -134,12 +131,12 @@ for gap_id in gap_id_list:\n ...@@ -134,12 +131,12 @@ for gap_id in gap_id_list:\n
\n \n
# Get the transaction\'s balance\n # Get the transaction\'s balance\n
if not region.startswith(section_region):\n if not region.startswith(section_region):\n
new_balance = r_(r_(new_balance) + r_(transaction.total_price)) or 0.0\n new_balance = new_balance + transaction.total_price\n
\n \n
# Update the general balance\n # Update the general balance\n
net_balance = r_(r_(net_balance) + r_(new_balance))\n net_balance = net_balance + new_balance\n
\n \n
return r_(net_balance)\n return net_balance\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
......
26 27
\ No newline at end of file \ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ZopePageTemplate" module="Products.PageTemplates.ZopePageTemplate"/>
</pickle>
<pickle>
<dictionary>
<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_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<?xml version="1.0" encoding="iso-8859-1"?>\n
<template bottommargin=\'2cm\' showboundary=\'0\' topmargin=\'2cm\' \n
rightmargin=\'2cm\' tal:define=\'portal python:here.portal_url.getPortalObject()\' \n
filename=\'journal.pdf\' pagesize=\'A4\' allowsplitting=\'1\' landscape=\'0\' leftmargin=\'2cm\'>\n
\n
<pagetemplate startframe=\'content\' id=\'FirstPage\'>\n
<static>\n
<infostring align="left" x="1cm" y= "29cm" size="8" font="Helvetica" color="(0,0,0)"\n
tal:content="python: here.Localizer.erp5_ui.gettext(\'Printed by %(user)s at %(date)s\') % {\'user\':user.getUserName(), \'date\':DateTime()}" >Printed by</infostring>\n
<infostring align="left" x="18cm" y= "0.5cm" size="10" font="Helvetica" color="(0,0,0)" >Page %(page)s</infostring>\n
</static>\n
<frame showBoundary=\'0\' leftpadding=\'0.1cm\' height=\'23.94cm\' width=\'17.59cm\' rightpadding=\'0.1cm\' y=\'2cm\' x=\'2cm\' nextid=\'content\' toppadding=\'0.2cm\' id=\'content\' bottompadding=\'0.5cm\'/>\n
</pagetemplate>\n
\n
<stylesheet>\n
<paragraphstyle name="Title" parent="Normal" fontname="Helvetica-Bold" fontsize="32" align="CENTER"/>\n
<tablestyle name=\'default\'>\n
<stylecmd expr="(\'GRID\', (0,0), (-1,-1), 0.1, colors.black)"/>\n
</tablestyle>\n
<paragraphstyle name="TableStandard" parent="Normal" fontname="Helvetica" fontsize="8" alignment="left" />\n
<paragraphstyle name="TableStandardLeftAligned" parent="Normal" fontname="Helvetica" fontsize="7" alignment="left" />\n
<paragraphstyle name="TableStandardRightAligned" parent="Normal" fontname="Helvetica" fontsize="7" alignment="right" />\n
<paragraphstyle name="TableHeader" parent="Normal" fontname="Helvetica-Oblique" fontsize="9" alignment="left" />\n
<paragraphstyle name="TableLastLine" parent="Normal" fontname="Helvetica-Oblique" fontsize="11" alignment="left" />\n
\n
<tablestyle name=\'transaction_header\'>\n
\t <stylecmd expr="(\'LINEBELOW\', (0,0), (0,0), 0.1, colors.black)"/> \n
\t <stylecmd expr="(\'LINEBELOW\', (-3,0), (-3,0), 0.1, colors.black)"/> \n
\t <stylecmd expr="(\'LINEBEFORE\', (0,0),(0,0), 0.1, colors.black)"/>\n
\t <stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'ALIGN\', (0,0),(-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0),(-1,-1), \'BOTTOM\')"/>\n
</tablestyle>\n
<tablestyle name=\'transaction_body\'>\n
<stylecmd expr="(\'LINEBEFORE\', (0,0),(0,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'ALIGN\', (-2,0), (-1,-1), \'RIGHT\')"/>\n
</tablestyle>\n
<tablestyle name=\'transaction_footer\'>\n
<stylecmd expr="(\'LINEBEFORE\', (0,0),(0,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'LINEAFTER\', (-3,0),(-1,0), 0.1, colors.black)"/>\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Times-Italic\', 10)"/>\n
</tablestyle>\n
\n
<tablestyle name="top_of_page">\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Helvetica\', 8)"/>\n
<stylecmd expr="(\'BOX\', (0,0), (-1,0), 1, colors.black)"/>\n
<stylecmd expr="(\'BOX\', (0,1), (-1,-1), 1, colors.black)"/>\n
<stylecmd expr="(\'BACKGROUND\', (0,0), (-1,0), (0.9,0.9,0.9))"/>\n
<stylecmd expr="(\'ALIGN\', (0,0), (-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0), (-1,-1), \'TOP\')"/>\n
<stylecmd expr="(\'LEFTPADDING\', (0,0), (-1,-1), 1)"/>\n
<stylecmd expr="(\'RIGHTPADDING\', (0,0), (-1,-1), 1)"/>\n
<stylecmd expr="(\'BOTTOMPADDING\', (0,0), (-1,-1), 0)"/>\n
<stylecmd expr="(\'TOPPADDING\', (0,0), (-1,-1), 1)"/>\n
</tablestyle>\n
\n
<tablestyle name="AttributesTable">\n
<stylecmd expr="(\'INNERGRID\', (0,0), (-1,-1), 1, (0.5,0.5,0.5))"/>\n
<stylecmd expr="(\'FONT\', (0,0), (-1,-1), \'Helvetica\', 8)"/>\n
<stylecmd expr="(\'BOX\', (0,0), (-1,-1), 1, colors.black)"/>\n
<stylecmd expr="(\'BACKGROUND\', (0,0), (0,-1), (0.9,0.9,0.9))"/>\n
<stylecmd expr="(\'ALIGN\', (0,0), (-1,-1), \'CENTER\')"/>\n
<stylecmd expr="(\'VALIGN\', (0,0), (-1,-1), \'TOP\')"/>\n
</tablestyle>\n
\n
</stylesheet>\n
</template>\n
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>AccountingTransactionModule_journal_pdf_template</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PDFTemplate" module="Products.ERP5Form.PDFTemplate"/>
</pickle>
<pickle>
<dictionary>
<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_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<?xml version="1.0" encoding="latin1"?>\n
<document\n
filename="journal.pdf"\n
tal:define="portal here/portal_url/getPortalObject;\n
transaction_list here/AccountingTransactionModule_getJournalAccountingTransactionList;\n
precision here/Base_getPreferredPrecision">\n
<title>Journal</title>\n
<author>ERP5</author>\n
<subject>Journal</subject>\n
<content xmlns:tal="http://xml.zope.org/namespaces/tal">\n
<para style="Title" i18n:translate="" i18n:domain="ui">Journal</para>\n
<action name="nextPageTemplate">\n
<parameter>FirstPage</parameter>\n
</action>\n
<spacer height="50"/>\n
\n
<table splitbyrow="1" repeatrows="0" repeatcols="0" style="AttributesTable" >\n
<tr tal:condition="python: request.get(\'from_date\', 0)">\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'From Date\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.Base_FormatDate(request.get(\'from_date\'))"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'At Date\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.Base_FormatDate(request.get(\'at_date\'))"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Section\')"/> </td>\n
<td colwidth="15cm"> <para style="TableStandardRightAligned" tal:content="python: here.portal_categories.restrictedTraverse(request.get(\'transaction_section_category\')).getLogicalPath()"/></td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Transactions Simulation State\')"/> </td>\n
<td colwidth="15cm"> <tal:block tal:repeat="state python:request.get(\'transaction_simulation_state\', [])">\n
<para style="TableStandardRightAligned" tal:content="state"/> </tal:block> </td> </tr>\n
<tr>\n
<td colwidth="5cm"> <para style="TableHeader" tal:content="python: here.Base_translateString(\'Journal Type\')"/> </td>\n
<td colwidth="15cm"> <tal:block tal:repeat="type python:request.get(\'transaction_portal_type\', [])">\n
<para style="TableStandardRightAligned" tal:content="python: here.Base_translateString(type)"/> </tal:block> </td> </tr>\n
\n
</table>\n
<spacer height="10"/>\n
\n
<table style="top_of_page" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.512cm">\n
<td colwidth="12cm">Account Title</td>\n
<td colwidth="2.5cm">Debit</td>\n
<td colwidth="2.5cm">Credit</td>\n
</tr>\n
</table>\n
<tal:block tal:repeat="transaction python:transaction_list[:-1]">\n
<table style="transaction_header" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.5cm">\n
<td colwidth="4.5cm"/>\n
<td colwidth="3cm" tal:content="transaction/date">Date</td>\n
<td colwidth="4.5cm"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
\n
<tal:block tal:repeat="line transaction/lines">\n
<table style="transaction_body" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.512cm">\n
<tal:block tal:condition="not:line/debtor">\n
<td colwidth="2cm"/>\n
</tal:block>\n
<td colwidth="modified"\n
tal:attributes="colwidth python: line[\'debtor\'] and \'12cm\' or \'10cm\' ;" tal:content="python:line[\'account_name\']"/>\n
<td colwidth="2.5cm" tal:content="python:line[\'debtor\'] and here.Base_getRoundValue(line[\'amount\'], precision) or \' \' "/>\n
<td colwidth="2.5cm" tal:content="python:line[\'debtor\'] and \' \' or here.Base_getRoundValue(line[\'amount\'], precision) "/>\n
</tr>\n
</table>\n
</tal:block>\n
\n
<table style="transaction_footer" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr>\n
<td colwidth="0.5cm"/>\n
<td colwidth="11.5cm" tal:content="transaction/description"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
</tal:block>\n
\n
<tal:block tal:replace="nothing"> Summary.\n
</tal:block>\n
<tal:block>\n
\t\t\t<!--\n
<table style="transaction_header" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="0.5cm">\n
<td colwidth="1.5cm"/>\n
<td colwidth="1.5cm"/>\n
<td colwidth="4.5cm"/>\n
<td colwidth="3cm"/>\n
<td colwidth="4.5cm"/>\n
<td colwidth="2.5cm"/>\n
<td colwidth="2.5cm"/>\n
</tr>\n
</table>\n
\t\t\t-->\n
<table style="transaction_body" splitbyrow="1" repeatrows="0" repeatcols="0">\n
<tr rowheight="1.5cm">\n
<!-- <td colwidth="1.5cm"/>-->\n
<!-- <td colwidth="1.5cm"/>-->\n
<!-- <td colwidth="2cm"/>-->\n
\t\t\t\t\t<td colwidth="0.5cm"/>\n
<td colwidth="11.5cm" > Total </td>\n
<td colwidth="2.5cm" tal:content="python: here.Base_getRoundValue(transaction_list[-1][\'journal_total_debit\' ], precision) "/>\n
<td colwidth="2.5cm" tal:content="python: here.Base_getRoundValue(transaction_list[-1][\'journal_total_credit\'], precision) "/>\n
</tr>\n
</table>\n
</tal:block>\n
</content>\n
</document>\n
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>AccountingTransactionModule_viewJournalAsPdf</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>pdf_stylesheet</string> </key>
<value> <string>AccountingTransactionModule_journal_pdf_template</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
20 21
\ No newline at end of file \ No newline at end of file
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
706 707
\ No newline at end of file \ No newline at end of file
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
498 499
\ No newline at end of file \ No newline at end of file
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -77,7 +77,10 @@ if engaged_budget:\n ...@@ -77,7 +77,10 @@ if engaged_budget:\n
portal.getPortalCurrentInventoryStateList() +\n portal.getPortalCurrentInventoryStateList() +\n
portal.getPortalTransitInventoryStateList())\n portal.getPortalTransitInventoryStateList())\n
\n \n
kw.setdefault(\'simulation_state\', portal.getPortalCurrentInventoryStateList())\n # those are simulation state parameters equivalent to getCurrentInventoryQuery that can be passed to getMovementHistoryList\n
kw.setdefault(\'simulation_state\', portal.getPortalCurrentInventoryStateList() + portal.getPortalTransitInventoryStateList())\n
kw.setdefault(\'transit_simulation_state\', portal.getPortalTransitInventoryStateList())\n
kw.setdefault(\'omit_transit\', False)\n
\n \n
return kw\n return kw\n
</string> </value> </string> </value>
......
...@@ -352,8 +352,8 @@ ...@@ -352,8 +352,8 @@
<value> <value>
<list> <list>
<tuple> <tuple>
<string>id</string> <string>reference</string>
<string>ID</string> <string>Reference</string>
</tuple> </tuple>
<tuple> <tuple>
<string>SaleOrder_getFormattedTotalPrice</string> <string>SaleOrder_getFormattedTotalPrice</string>
...@@ -364,7 +364,7 @@ ...@@ -364,7 +364,7 @@
<string>Order Date</string> <string>Order Date</string>
</tuple> </tuple>
<tuple> <tuple>
<string>translated_simulation_state</string> <string>translated_simulation_state_title</string>
<string>State</string> <string>State</string>
</tuple> </tuple>
</list> </list>
...@@ -382,6 +382,10 @@ ...@@ -382,6 +382,10 @@
<key> <string>default</string> </key> <key> <string>default</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
</item> </item>
<item>
<key> <string>default_display_style</string> </key>
<value> <string>table</string> </value>
</item>
<item> <item>
<key> <string>default_params</string> </key> <key> <string>default_params</string> </key>
<value> <value>
...@@ -392,6 +396,12 @@ ...@@ -392,6 +396,12 @@
<key> <string>description</string> </key> <key> <string>description</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
</item> </item>
<item>
<key> <string>display_style_list</string> </key>
<value>
<list/>
</value>
</item>
<item> <item>
<key> <string>domain_root_list</string> </key> <key> <string>domain_root_list</string> </key>
<value> <value>
...@@ -426,6 +436,10 @@ ...@@ -426,6 +436,10 @@
<list/> <list/>
</value> </value>
</item> </item>
<item>
<key> <string>global_search_column</string> </key>
<value> <string></string> </value>
</item>
<item> <item>
<key> <string>hidden</string> </key> <key> <string>hidden</string> </key>
<value> <int>0</int> </value> <value> <int>0</int> </value>
...@@ -454,6 +468,10 @@ ...@@ -454,6 +468,10 @@
<list/> <list/>
</value> </value>
</item> </item>
<item>
<key> <string>page_navigation_template</string> </key>
<value> <string>ListBox_viewSliderPageNavigationRenderer</string> </value>
</item>
<item> <item>
<key> <string>page_template</string> </key> <key> <string>page_template</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
...@@ -517,8 +535,8 @@ ...@@ -517,8 +535,8 @@
<value> <value>
<list> <list>
<tuple> <tuple>
<string>id</string> <string>reference</string>
<string>ID</string> <string>Reference</string>
</tuple> </tuple>
<tuple> <tuple>
<string>SaleOrder_getFormattedTotalPrice</string> <string>SaleOrder_getFormattedTotalPrice</string>
...@@ -529,7 +547,7 @@ ...@@ -529,7 +547,7 @@
<string>Date</string> <string>Date</string>
</tuple> </tuple>
<tuple> <tuple>
<string>translated_simulation_state</string> <string>translated_simulation_state_title</string>
<string>State</string> <string>State</string>
</tuple> </tuple>
</list> </list>
...@@ -545,9 +563,15 @@ ...@@ -545,9 +563,15 @@
<key> <string>stat_method</string> </key> <key> <string>stat_method</string> </key>
<value> <string></string> </value> <value> <string></string> </value>
</item> </item>
<item>
<key> <string>style_columns</string> </key>
<value>
<list/>
</value>
</item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string>Sale Orders</string> </value> <value> <string>My Orders</string> </value>
</item> </item>
<item> <item>
<key> <string>untranslatable_columns</string> </key> <key> <string>untranslatable_columns</string> </key>
...@@ -560,7 +584,7 @@ ...@@ -560,7 +584,7 @@
<value> <value>
<list> <list>
<tuple> <tuple>
<string>id</string> <string>reference</string>
<string>SaleOrder_getSaleOrderUrl</string> <string>SaleOrder_getSaleOrderUrl</string>
</tuple> </tuple>
<tuple> <tuple>
...@@ -572,7 +596,7 @@ ...@@ -572,7 +596,7 @@
<string>SaleOrder_getSaleOrderUrl</string> <string>SaleOrder_getSaleOrderUrl</string>
</tuple> </tuple>
<tuple> <tuple>
<string>translated_simulation_state</string> <string>translated_simulation_state_title</string>
<string>SaleOrder_getSaleOrderUrl</string> <string>SaleOrder_getSaleOrderUrl</string>
</tuple> </tuple>
</list> </list>
...@@ -586,10 +610,7 @@ ...@@ -586,10 +610,7 @@
</record> </record>
<record id="2" aka="AAAAAAAAAAI="> <record id="2" aka="AAAAAAAAAAI=">
<pickle> <pickle>
<tuple> <global name="Method" module="Products.Formulator.MethodField"/>
<global name="Method" module="Products.Formulator.MethodField"/>
<tuple/>
</tuple>
</pickle> </pickle>
<pickle> <pickle>
<dictionary> <dictionary>
......
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
<key> <string>default</string> </key> <key> <string>default</string> </key>
<value> <string encoding="cdata"><![CDATA[ <value> <string encoding="cdata"><![CDATA[
<h2>Sale Order Details</h2> <h2>Order Details</h2>
]]></string> </value> ]]></string> </value>
</item> </item>
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
website here/getWebSiteValue">\n website here/getWebSiteValue">\n
\n \n
<p class="article">\n <p class="article">\n
<span><span tal:replace="python: here.Base_translateString(\'You are logged as\')"/> <span tal:replace="customer/getTitle"/></span>\n <span><span tal:replace="python: here.Base_translateString(\'You are logged as\')"/> <span tal:replace="customer/getTitle | string:Unknown User"/></span>\n
</p>\n </p>\n
<a class="articlelink" \n <a class="articlelink" \n
tal:attributes="href python: \'%s/sale_order_module/SaleOrderModule_viewAsWebSaleOrderList\' % website.absolute_url()">\n tal:attributes="href python: \'%s/sale_order_module/SaleOrderModule_viewAsWebSaleOrderList\' % website.absolute_url()">\n
...@@ -89,8 +89,7 @@ ...@@ -89,8 +89,7 @@
<br/>\n <br/>\n
</tal:block>\n </tal:block>\n
\n \n
</tal:block>\n </tal:block>
]]></unicode> </value> ]]></unicode> </value>
</item> </item>
......
...@@ -58,8 +58,7 @@ ...@@ -58,8 +58,7 @@
</tal:block>\n </tal:block>\n
</tal:block>\n </tal:block>\n
</tal:block>\n </tal:block>\n
</tal:block>\n </tal:block>
]]></unicode> </value> ]]></unicode> </value>
</item> </item>
......
...@@ -27,7 +27,10 @@ ...@@ -27,7 +27,10 @@
<item> <item>
<key> <string>transitions</string> </key> <key> <string>transitions</string> </key>
<value> <value>
<tuple/> <tuple>
<string>delete</string>
<string>delete_action</string>
</tuple>
</value> </value>
</item> </item>
<item> <item>
......
1268 1269
\ No newline at end of file \ No newline at end of file
...@@ -55,20 +55,31 @@ SearchableText</string> </value> ...@@ -55,20 +55,31 @@ SearchableText</string> </value>
<key> <string>src</string> </key> <key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[ <value> <string encoding="cdata"><![CDATA[
REPLACE INTO\n DELETE FROM\n
full_text\n
WHERE\n
<dtml-in uid>\n
uid=<dtml-sqlvar sequence-item type="int"><dtml-if sequence-end><dtml-else> OR </dtml-if>\n
</dtml-in>\n
;\n
<dtml-var "\'\\0\'"><dtml-let document_list="[]">\n
<dtml-in prefix="loop" expr="_.range(_.len(uid))">\n
<dtml-if "SearchableText[loop_item]">\n
<dtml-call expr="document_list.append(loop_item)">\n
</dtml-if>\n
</dtml-in>\n
<dtml-if expr="_.len(document_list) > 0">\n
INSERT INTO\n
full_text\n full_text\n
VALUES\n VALUES\n
<dtml-in prefix="loop" expr="_.range(_.len(uid))">\n <dtml-in prefix="loop" expr="document_list">\n
(\n ( \n
<dtml-sqlvar expr="uid[loop_item]" type="int">, \n <dtml-sqlvar expr="uid[loop_item]" type="int">,\n
<dtml-sqlvar expr="SearchableText[loop_item]" type="string" optional>\n <dtml-sqlvar expr="SearchableText[loop_item]" type="string" optional>\n
)\n )<dtml-unless sequence-end>,</dtml-unless>\n
<dtml-if sequence-end>\n </dtml-in>\n
<dtml-else>\n </dtml-if>\n
,\n </dtml-let>
</dtml-if>\n
</dtml-in>\n
]]></string> </value> ]]></string> </value>
</item> </item>
......
5 6
\ No newline at end of file \ No newline at end of file
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_text</string> </key> <key> <string>_text</string> </key>
<value> <string>python:cell.getObject().InvoiceTransactionLine_getSourceItemList()</string> </value> <value> <string>python:cell.getObject().AccountingTransactionLine_getNodeItemList()</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
181 182
\ No newline at end of file \ No newline at end of file
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>erp5_accounting_bbb</string> </value> <value> <string>jqzoom</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts48589804.75</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jqzoom-core-pack.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*!\r\n
* jQzoom Evolution Library v2.3 - Javascript Image magnifier\r\n
* http://www.mind-projects.it\r\n
*\r\n
* Copyright 2011, Engineer Marco Renzi\r\n
* Licensed under the BSD license.\r\n
*\r\n
* Redistribution and use in source and binary forms, with or without\r\n
* modification, are permitted provided that the following conditions are met:\r\n
* * Redistributions of source code must retain the above copyright\r\n
* notice, this list of conditions and the following disclaimer.\r\n
* * Redistributions in binary form must reproduce the above copyright\r\n
* notice, this list of conditions and the following disclaimer in the\r\n
* documentation and/or other materials provided with the distribution.\r\n
* * Neither the name of the organization nor the\r\n
* names of its contributors may be used to endorse or promote products\r\n
* derived from this software without specific prior written permission.\r\n
*\r\n
* Date: 03 May 2011 22:16:00\r\n
*/\r\n
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?\'\':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!\'\'.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return\'\\\\w+\'};c=1};while(c--)if(k[c])p=p.replace(new RegExp(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);return p}(\'(8($){9 v=($.1A.2j&&$.1A.2k<7);9 w=$(1B.1C);9 y=$(y);9 z=F;$.3d.13=8(b){G 5.1Y(8(){9 a=5.3e.3f();A(a==\\\'a\\\'){Q 13(5,b)}})};13=8(g,h){9 j=2l;j=$(g).1D("13");A(j)G j;9 k=5;9 l=$.1E({},$.13.2m,h||{});k.3g=g;g.1p=$(g).R(\\\'1p\\\');g.1F=F;g.3h=F;g.1u=F;g.1h=F;g.1b={};g.2n=2l;g.14={};g.1G=F;$(g).D({\\\'3i-1i\\\':\\\'1v\\\',\\\'3j-3k\\\':\\\'1v\\\'});9 m=$("3l:3m(0)",g);g.V=$(g).R(\\\'V\\\');g.1Z=m.R(\\\'V\\\');9 n=($.1w(g.V).Y>0)?g.V:g.1Z;9 p=Q 2o(m);9 q=Q 2p();9 r=Q 2q();9 s=Q 2r();9 t=Q 2s();$(g).1H(\\\'2t\\\',8(e){e.2u();G F});9 u=[\\\'20\\\',\\\'1c\\\',\\\'1j\\\',\\\'1q\\\'];A($.3n($.1w(l.H),u)<0){l.H=\\\'20\\\'}$.1E(k,{21:8(){A($(".L",g).Y==0){g.L=$(\\\'<Z/>\\\').1I(\\\'L\\\');m.3o(g.L)}A(l.H==\\\'1j\\\'){l.15=p.w;l.16=p.h}A($(".22",g).Y==0){q.S()}A($(".23",g).Y==0){r.S()}A($(".2v",g).Y==0){t.S()}A(l.24||l.H==\\\'1c\\\'||l.1J){k.1K()}k.2w()},2w:8(){A(l.H==\\\'1c\\\'){$(".L",g).3p(8(){g.1G=17});$(".L",g).3q(8(){g.1G=F});1B.1C.3r=8(){G F};$(".L",g).D({1L:\\\'1r\\\'});$(".22",g).D({1L:\\\'3s\\\'})}A(l.H==\\\'1j\\\'){$(".1M",g).D({1L:\\\'3t\\\'})}$(".L",g).1H(\\\'3u 3v\\\',8(a){m.R(\\\'V\\\',\\\'\\\');$(g).R(\\\'V\\\',\\\'\\\');g.1F=17;p.1s();A(g.1h){k.25(a)}1k{k.1K()}});$(".L",g).1H(\\\'3w\\\',8(a){k.2x()});$(".L",g).1H(\\\'3x\\\',8(e){A(e.26>p.E.r||e.26<p.E.l||e.27<p.E.t||e.27>p.E.b){q.1N();G F}g.1F=17;A(g.1h&&!$(\\\'.23\\\',g).3y(\\\':2y\\\')){k.25(e)}A(g.1h&&(l.H!=\\\'1c\\\'||(l.H==\\\'1c\\\'&&g.1G))){q.1l(e)}});9 c=Q 2z();9 i=0;9 d=Q 2z();d=$(\\\'a\\\').3z(8(){9 a=Q 3A("3B[\\\\\\\\s]*:[\\\\\\\\s]*\\\'"+$.1w(g.1p)+"\\\'","i");9 b=$(5).R(\\\'1p\\\');A(a.3C(b)){G 5}});A(d.Y>0){9 f=d.3D(0,1);d.3E(f)}d.1Y(8(){A(l.24){9 a=$.1E({},1O("("+$.1w($(5).R(\\\'1p\\\'))+")"));c[i]=Q 28();c[i].1d=a.1x;i++}$(5).2t(8(e){A($(5).3F(\\\'29\\\')){G F}d.1Y(8(){$(5).3G(\\\'29\\\')});e.2u();k.2A(5);G F})})},1K:8(){A(g.1h==F&&g.1u==F){9 a=$(g).R(\\\'2B\\\');g.1u=17;s.2C(a)}},25:8(e){3H(g.2n);q.T();r.T()},2x:8(e){1P(l.H){1t\\\'1c\\\':W;1r:m.R(\\\'V\\\',g.1Z);$(g).R(\\\'V\\\',g.V);A(l.1J){q.1N()}1k{r.O();q.O()}W}g.1F=F},2A:8(a){g.1u=F;g.1h=F;9 b=Q 3I();b=$.1E({},1O("("+$.1w($(a).R(\\\'1p\\\'))+")"));A(b.1Q&&b.1x){9 c=b.1Q;9 d=b.1x;$(a).1I(\\\'29\\\');$(g).R(\\\'2B\\\',d);m.R(\\\'1d\\\',c);q.O();r.O();k.1K()}1k{2a(\\\'2D :: 2E 2F 1R 1x 2G 1Q.\\\');2b\\\'2D :: 2E 2F 1R 1x 2G 1Q.\\\';}G F}});A(m[0].3J){p.1s();A($(".L",g).Y==0)k.21()}8 2o(c){9 d=5;5.6=c[0];5.2H=8(){9 a=0;a=c.D(\\\'2c-B-P\\\');M=\\\'\\\';9 b=0;b=c.D(\\\'2c-C-P\\\');K=\\\'\\\';A(a){1R(i=0;i<3;i++){9 x=[];x=a.1S(i,1);A(2I(x)==F){M=M+\\\'\\\'+a.1S(i,1)}1k{W}}}A(b){1R(i=0;i<3;i++){A(!2I(b.1S(i,1))){K=K+b.1S(i,1)}1k{W}}}d.M=(M.Y>0)?1O(M):0;d.K=(K.Y>0)?1O(K):0};5.1s=8(){d.2H();d.w=c.P();d.h=c.12();d.1m=c.3K();d.1e=c.3L();d.E=c.1f();d.E.l=c.1f().C+d.K;d.E.t=c.1f().B+d.M;d.E.r=d.w+d.E.l;d.E.b=d.h+d.E.t;d.2J=c.1f().C+d.1m;d.3M=c.1f().B+d.1e};5.6.2K=8(){2a(\\\'1T 1U 1V X.\\\');2b\\\'1T 1U 1V X.\\\';};5.6.2L=8(){d.1s();A($(".L",g).Y==0)k.21()};G d};8 2s(){9 a=5;5.S=8(){5.6=$(\\\'<Z/>\\\').1I(\\\'2v\\\').D(\\\'2d\\\',\\\'2M\\\').2N(l.2O);$(\\\'.L\\\',g).S(5.6)};5.T=8(){5.6.B=(p.1e-5.6.12())/2;5.6.C=(p.1m-5.6.P())/2;5.6.D({B:5.6.B,C:5.6.C,11:\\\'18\\\',2d:\\\'2y\\\'})};5.O=8(){5.6.D(\\\'2d\\\',\\\'2M\\\')};G 5}8 2p(){9 d=5;5.6=$(\\\'<Z/>\\\').1I(\\\'22\\\');5.S=8(){$(\\\'.L\\\',g).S($(5.6).O());A(l.H==\\\'1q\\\'){5.X=Q 28();5.X.1d=p.6.1d;$(5.6).2e().S(5.X)}};5.2P=8(){5.6.w=(1W((l.15)/g.1b.x)>p.w)?p.w:(1W(l.15/g.1b.x));5.6.h=(1W((l.16)/g.1b.y)>p.h)?p.h:(1W(l.16/g.1b.y));5.6.B=(p.1e-5.6.h-2)/2;5.6.C=(p.1m-5.6.w-2)/2;5.6.D({B:0,C:0,P:5.6.w+\\\'I\\\',12:5.6.h+\\\'I\\\',11:\\\'18\\\',1g:\\\'1v\\\',2f:1+\\\'I\\\'});A(l.H==\\\'1q\\\'){5.X.1d=p.6.1d;$(5.6).D({\\\'2g\\\':1});$(5.X).D({11:\\\'18\\\',1g:\\\'1y\\\',C:-(5.6.C+1-p.K)+\\\'I\\\',B:-(5.6.B+1-p.M)+\\\'I\\\'})}};5.1N=8(){5.6.B=(p.1e-5.6.h-2)/2;5.6.C=(p.1m-5.6.w-2)/2;5.6.D({B:5.6.B,C:5.6.C});A(l.H==\\\'1q\\\'){$(5.X).D({11:\\\'18\\\',1g:\\\'1y\\\',C:-(5.6.C+1-p.K)+\\\'I\\\',B:-(5.6.B+1-p.M)+\\\'I\\\'})}s.1l()};5.1l=8(e){g.14.x=e.26;g.14.y=e.27;9 b=0;9 c=0;8 2Q(a){G g.14.x-(a.w)/2<p.E.l}8 2R(a){G g.14.x+(a.w)/2>p.E.r}8 2S(a){G g.14.y-(a.h)/2<p.E.t}8 2T(a){G g.14.y+(a.h)/2>p.E.b}b=g.14.x+p.K-p.E.l-(5.6.w+2)/2;c=g.14.y+p.M-p.E.t-(5.6.h+2)/2;A(2Q(5.6)){b=p.K-1}1k A(2R(5.6)){b=p.w+p.K-5.6.w-1}A(2S(5.6)){c=p.M-1}1k A(2T(5.6)){c=p.h+p.M-5.6.h-1}5.6.C=b;5.6.B=c;5.6.D({\\\'C\\\':b+\\\'I\\\',\\\'B\\\':c+\\\'I\\\'});A(l.H==\\\'1q\\\'){A($.1A.2j&&$.1A.2k>7){$(5.6).2e().S(5.X)}$(5.X).D({11:\\\'18\\\',1g:\\\'1y\\\',C:-(5.6.C+1-p.K)+\\\'I\\\',B:-(5.6.B+1-p.M)+\\\'I\\\'})}s.1l()};5.O=8(){m.D({\\\'2g\\\':1});5.6.O()};5.T=8(){A(l.H!=\\\'1j\\\'&&(l.2U||l.H==\\\'1c\\\')){5.6.T()}A(l.H==\\\'1q\\\'){m.D({\\\'2g\\\':l.2V})}};5.2h=8(){9 o={};o.C=d.6.C;o.B=d.6.B;G o};G 5};8 2q(){9 b=5;5.6=$("<Z 1z=\\\'23\\\'><Z 1z=\\\'1M\\\'><Z 1z=\\\'1X\\\'></Z><Z 1z=\\\'2i\\\'></Z></Z></Z>");5.U=$(\\\'<2W 1z="3N" 1d="3O:\\\\\\\'\\\\\\\';" 3P="0" 3Q="0" 3R="2X" 3S="3T" 3U="0" ></2W>\\\');5.1l=8(){5.6.1n=0;5.6.1o=0;A(l.H!=\\\'1j\\\'){1P(l.11){1t"C":5.6.1n=(p.E.l-p.K-J.N(l.19)-l.15>0)?(0-l.15-J.N(l.19)):(p.1m+J.N(l.19));5.6.1o=J.N(l.1a);W;1t"B":5.6.1n=J.N(l.19);5.6.1o=(p.E.t-p.M-J.N(l.1a)-l.16>0)?(0-l.16-J.N(l.1a)):(p.1e+J.N(l.1a));W;1t"2X":5.6.1n=J.N(l.19);5.6.1o=(p.E.t-p.M+p.1e+J.N(l.1a)+l.16<2Y.12)?(p.1e+J.N(l.1a)):(0-l.16-J.N(l.1a));W;1r:5.6.1n=(p.2J+J.N(l.19)+l.15<2Y.P)?(p.1m+J.N(l.19)):(0-l.15-J.N(l.19));5.6.1o=J.N(l.1a);W}}5.6.D({\\\'C\\\':5.6.1n+\\\'I\\\',\\\'B\\\':5.6.1o+\\\'I\\\'});G 5};5.S=8(){$(\\\'.L\\\',g).S(5.6);5.6.D({11:\\\'18\\\',1g:\\\'1v\\\',2Z:3V});A(l.H==\\\'1j\\\'){5.6.D({1L:\\\'1r\\\'});9 a=(p.K==0)?1:p.K;$(\\\'.1M\\\',5.6).D({2f:a+\\\'I\\\'})}$(\\\'.1M\\\',5.6).D({P:J.30(l.15)+\\\'I\\\',2f:a+\\\'I\\\'});$(\\\'.2i\\\',5.6).D({P:\\\'31%\\\',12:J.30(l.16)+\\\'I\\\'});$(\\\'.1X\\\',5.6).D({P:\\\'31%\\\',11:\\\'18\\\'});$(\\\'.1X\\\',5.6).O();A(l.V&&n.Y>0){$(\\\'.1X\\\',5.6).2N(n).T()}b.1l()};5.O=8(){1P(l.32){1t\\\'3W\\\':5.6.3X(l.33,8(){});W;1r:5.6.O();W}5.U.O()};5.T=8(){1P(l.34){1t\\\'3Y\\\':5.6.35();5.6.35(l.36,8(){});W;1r:5.6.T();W}A(v&&l.H!=\\\'1j\\\'){5.U.P=5.6.P();5.U.12=5.6.12();5.U.C=5.6.1n;5.U.B=5.6.1o;5.U.D({1g:\\\'1y\\\',11:"18",C:5.U.C,B:5.U.B,2Z:3Z,P:5.U.P+\\\'I\\\',12:5.U.12+\\\'I\\\'});$(\\\'.L\\\',g).S(5.U);5.U.T()}}};8 2r(){9 c=5;5.6=Q 28();5.2C=8(a){t.T();5.40=a;5.6.1i.11=\\\'18\\\';5.6.1i.2c=\\\'37\\\';5.6.1i.1g=\\\'1v\\\';5.6.1i.C=\\\'-41\\\';5.6.1i.B=\\\'37\\\';1B.1C.42(5.6);5.6.1d=a};5.1s=8(){9 a=$(5.6);9 b={};5.6.1i.1g=\\\'1y\\\';c.w=a.P();c.h=a.12();c.E=a.1f();c.E.l=a.1f().C;c.E.t=a.1f().B;c.E.r=c.w+c.E.l;c.E.b=c.h+c.E.t;b.x=(c.w/p.w);b.y=(c.h/p.h);g.1b=b;1B.1C.43(5.6);$(\\\'.2i\\\',g).2e().S(5.6);q.2P()};5.6.2K=8(){2a(\\\'1T 1U 1V 38 39 X.\\\');2b\\\'1T 1U 1V 38 39 X.\\\';};5.6.2L=8(){c.1s();t.O();g.1u=F;g.1h=17;A(l.H==\\\'1c\\\'||l.1J){q.T();r.T();q.1N()}};5.1l=8(){9 a=-g.1b.x*(q.2h().C-p.K+1);9 b=-g.1b.y*(q.2h().B-p.M+1);$(5.6).D({\\\'C\\\':a+\\\'I\\\',\\\'B\\\':b+\\\'I\\\'})};G 5};$(g).1D("13",k)};$.13={2m:{H:\\\'20\\\',15:3a,16:3a,19:10,1a:0,11:"44",24:17,2O:\\\'45 46\\\',V:17,2U:17,2V:0.4,1J:F,34:\\\'T\\\',32:\\\'O\\\',36:\\\'47\\\',33:\\\'48\\\'},3b:8(a){9 b=$(a).1D(\\\'13\\\');b.3b();G F},3c:8(a){9 b=$(a).1D(\\\'13\\\');b.3c();G F},49:8(a){z=17},4a:8(a){z=F}}})(4b);\',62,260,\'|||||this|node||function|var|||||||||||||||||||||||||||if|top|left|css|pos|false|return|zoomType|px|Math|bleft|zoomPad|btop|abs|hide|width|new|attr|append|show|ieframe|title|break|image|length|div||position|height|jqzoom|mousepos|zoomWidth|zoomHeight|true|absolute|xOffset|yOffset|scale|drag|src|oh|offset|display|largeimageloaded|style|innerzoom|else|setposition|ow|leftpos|toppos|rel|reverse|default|fetchdata|case|largeimageloading|none|trim|largeimage|block|class|browser|document|body|data|extend|zoom_active|mouseDown|bind|addClass|alwaysOn|load|cursor|zoomWrapper|setcenter|eval|switch|smallimage|for|substr|Problems|while|loading|parseInt|zoomWrapperTitle|each|imagetitle|standard|create|zoomPup|zoomWindow|preloadImages|activate|pageX|pageY|Image|zoomThumbActive|alert|throw|border|visibility|empty|borderWidth|opacity|getoffset|zoomWrapperImage|msie|version|null|defaults|timer|Smallimage|Lens|Stage|Largeimage|Loader|click|preventDefault|zoomPreload|init|deactivate|visible|Array|swapimage|href|loadimage|ERROR|Missing|parameter|or|findborder|isNaN|rightlimit|onerror|onload|hidden|html|preloadText|setdimensions|overleft|overright|overtop|overbottom|lens|imageOpacity|iframe|bottom|screen|zIndex|round|100|hideEffect|fadeoutSpeed|showEffect|fadeIn|fadeinSpeed|0px|the|big|300|disable|enable|fn|nodeName|toLowerCase|el|zoom_disabled|outline|text|decoration|img|eq|inArray|wrap|mousedown|mouseup|ondragstart|move|crosshair|mouseenter|mouseover|mouseleave|mousemove|is|filter|RegExp|gallery|test|splice|push|hasClass|removeClass|clearTimeout|Object|complete|outerWidth|outerHeight|bottomlimit|zoomIframe|javascript|marginwidth|marginheight|align|scrolling|no|frameborder|5001|fadeout|fadeOut|fadein|99|url|5000px|appendChild|removeChild|right|Loading|zoom|slow|2000|disableAll|enableAll|jQuery\'.split(\'|\'),0,{}))\r\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>9669</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts58795626.09</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jqzoom-core.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*!\r\n
* jQzoom Evolution Library v2.3 - Javascript Image magnifier\r\n
* http://www.mind-projects.it\r\n
*\r\n
* Copyright 2011, Engineer Marco Renzi\r\n
* Licensed under the BSD license.\r\n
*\r\n
* Redistribution and use in source and binary forms, with or without\r\n
* modification, are permitted provided that the following conditions are met:\r\n
* * Redistributions of source code must retain the above copyright\r\n
* notice, this list of conditions and the following disclaimer.\r\n
* * Redistributions in binary form must reproduce the above copyright\r\n
* notice, this list of conditions and the following disclaimer in the\r\n
* documentation and/or other materials provided with the distribution.\r\n
* * Neither the name of the organization nor the\r\n
* names of its contributors may be used to endorse or promote products\r\n
* derived from this software without specific prior written permission.\r\n
*\r\n
* Date: 03 May 2011 22:16:00\r\n
*/\r\n
(function ($) {\r\n
//GLOBAL VARIABLES\r\n
var isIE6 = ($.browser.msie && $.browser.version < 7);\r\n
var body = $(document.body);\r\n
var window = $(window);\r\n
var jqzoompluging_disabled = false; //disabilita globalmente il plugin\r\n
$.fn.jqzoom = function (options) {\r\n
return this.each(function () {\r\n
var node = this.nodeName.toLowerCase();\r\n
if (node == \'a\') {\r\n
new jqzoom(this, options);\r\n
}\r\n
});\r\n
};\r\n
jqzoom = function (el, options) {\r\n
var api = null;\r\n
api = $(el).data("jqzoom");\r\n
if (api) return api;\r\n
var obj = this;\r\n
var settings = $.extend({}, $.jqzoom.defaults, options || {});\r\n
obj.el = el;\r\n
el.rel = $(el).attr(\'rel\');\r\n
//ANCHOR ELEMENT\r\n
el.zoom_active = false;\r\n
el.zoom_disabled = false; //to disable single zoom instance\r\n
el.largeimageloading = false; //tell us if large image is loading\r\n
el.largeimageloaded = false; //tell us if large image is loaded\r\n
el.scale = {};\r\n
el.timer = null;\r\n
el.mousepos = {};\r\n
el.mouseDown = false;\r\n
$(el).css({\r\n
\'outline-style\': \'none\',\r\n
\'text-decoration\': \'none\'\r\n
});\r\n
//BASE IMAGE\r\n
var img = $("img:eq(0)", el);\r\n
el.title = $(el).attr(\'title\');\r\n
el.imagetitle = img.attr(\'title\');\r\n
var zoomtitle = ($.trim(el.title).length > 0) ? el.title : el.imagetitle;\r\n
var smallimage = new Smallimage(img);\r\n
var lens = new Lens();\r\n
var stage = new Stage();\r\n
var largeimage = new Largeimage();\r\n
var loader = new Loader();\r\n
//preventing default click,allowing the onclick event [exmple: lightbox]\r\n
$(el).bind(\'click\', function (e) {\r\n
e.preventDefault();\r\n
return false;\r\n
});\r\n
//setting the default zoomType if not in settings\r\n
var zoomtypes = [\'standard\', \'drag\', \'innerzoom\', \'reverse\'];\r\n
if ($.inArray($.trim(settings.zoomType), zoomtypes) < 0) {\r\n
settings.zoomType = \'standard\';\r\n
}\r\n
$.extend(obj, {\r\n
create: function () { //create the main objects\r\n
//create ZoomPad\r\n
if ($(".zoomPad", el).length == 0) {\r\n
el.zoomPad = $(\'<div/>\').addClass(\'zoomPad\');\r\n
img.wrap(el.zoomPad);\r\n
}\r\n
if(settings.zoomType == \'innerzoom\'){\r\n
settings.zoomWidth = smallimage.w;\r\n
settings.zoomHeight = smallimage.h;\r\n
}\r\n
//creating ZoomPup\r\n
if ($(".zoomPup", el).length == 0) {\r\n
lens.append();\r\n
}\r\n
//creating zoomWindow\r\n
if ($(".zoomWindow", el).length == 0) {\r\n
stage.append();\r\n
}\r\n
//creating Preload\r\n
if ($(".zoomPreload", el).length == 0) {\r\n
loader.append();\r\n
}\r\n
//preloading images\r\n
if (settings.preloadImages || settings.zoomType == \'drag\' || settings.alwaysOn) {\r\n
obj.load();\r\n
}\r\n
obj.init();\r\n
},\r\n
init: function () {\r\n
//drag option\r\n
if (settings.zoomType == \'drag\') {\r\n
$(".zoomPad", el).mousedown(function () {\r\n
el.mouseDown = true;\r\n
});\r\n
$(".zoomPad", el).mouseup(function () {\r\n
el.mouseDown = false;\r\n
});\r\n
document.body.ondragstart = function () {\r\n
return false;\r\n
};\r\n
$(".zoomPad", el).css({\r\n
cursor: \'default\'\r\n
});\r\n
$(".zoomPup", el).css({\r\n
cursor: \'move\'\r\n
});\r\n
}\r\n
if (settings.zoomType == \'innerzoom\') {\r\n
$(".zoomWrapper", el).css({\r\n
cursor: \'crosshair\'\r\n
});\r\n
}\r\n
$(".zoomPad", el).bind(\'mouseenter mouseover\', function (event) {\r\n
img.attr(\'title\', \'\');\r\n
$(el).attr(\'title\', \'\');\r\n
el.zoom_active = true;\r\n
//if loaded then activate else load large image\r\n
smallimage.fetchdata();\r\n
if (el.largeimageloaded) {\r\n
obj.activate(event);\r\n
} else {\r\n
obj.load();\r\n
}\r\n
});\r\n
$(".zoomPad", el).bind(\'mouseleave\', function (event) {\r\n
obj.deactivate();\r\n
});\r\n
$(".zoomPad", el).bind(\'mousemove\', function (e) {\r\n
\r\n
//prevent fast mouse mevements not to fire the mouseout event\r\n
if (e.pageX > smallimage.pos.r || e.pageX < smallimage.pos.l || e.pageY < smallimage.pos.t || e.pageY > smallimage.pos.b) {\r\n
lens.setcenter();\r\n
return false;\r\n
}\r\n
el.zoom_active = true;\r\n
if (el.largeimageloaded && !$(\'.zoomWindow\', el).is(\':visible\')) {\r\n
obj.activate(e);\r\n
}\r\n
if (el.largeimageloaded && (settings.zoomType != \'drag\' || (settings.zoomType == \'drag\' && el.mouseDown))) {\r\n
lens.setposition(e);\r\n
}\r\n
});\r\n
var thumb_preload = new Array();\r\n
var i = 0;\r\n
//binding click event on thumbnails\r\n
var thumblist = new Array();\r\n
thumblist = $(\'a\').filter(function () {\r\n
var regex = new RegExp("gallery[\\\\s]*:[\\\\s]*\'" + $.trim(el.rel) + "\'", "i");\r\n
var rel = $(this).attr(\'rel\');\r\n
if (regex.test(rel)) {\r\n
return this;\r\n
}\r\n
});\r\n
if (thumblist.length > 0) {\r\n
//getting the first to the last\r\n
var first = thumblist.splice(0, 1);\r\n
thumblist.push(first);\r\n
}\r\n
thumblist.each(function () {\r\n
//preloading thumbs\r\n
if (settings.preloadImages) {\r\n
var thumb_options = $.extend({}, eval("(" + $.trim($(this).attr(\'rel\')) + ")"));\r\n
thumb_preload[i] = new Image();\r\n
thumb_preload[i].src = thumb_options.largeimage;\r\n
i++;\r\n
}\r\n
$(this).click(function (e) {\r\n
if($(this).hasClass(\'zoomThumbActive\')){\r\n
return false;\r\n
}\r\n
thumblist.each(function () {\r\n
$(this).removeClass(\'zoomThumbActive\');\r\n
});\r\n
e.preventDefault();\r\n
obj.swapimage(this);\r\n
return false;\r\n
});\r\n
});\r\n
},\r\n
load: function () {\r\n
if (el.largeimageloaded == false && el.largeimageloading == false) {\r\n
var url = $(el).attr(\'href\');\r\n
el.largeimageloading = true;\r\n
largeimage.loadimage(url);\r\n
}\r\n
},\r\n
activate: function (e) {\r\n
clearTimeout(el.timer);\r\n
//show lens and zoomWindow\r\n
lens.show();\r\n
stage.show();\r\n
},\r\n
deactivate: function (e) {\r\n
switch (settings.zoomType) {\r\n
case \'drag\':\r\n
//nothing or lens.setcenter();\r\n
break;\r\n
default:\r\n
img.attr(\'title\', el.imagetitle);\r\n
$(el).attr(\'title\', el.title);\r\n
if (settings.alwaysOn) {\r\n
lens.setcenter();\r\n
} else {\r\n
stage.hide();\r\n
lens.hide();\r\n
}\r\n
break;\r\n
}\r\n
el.zoom_active = false;\r\n
},\r\n
swapimage: function (link) {\r\n
el.largeimageloading = false;\r\n
el.largeimageloaded = false;\r\n
var options = new Object();\r\n
options = $.extend({}, eval("(" + $.trim($(link).attr(\'rel\')) + ")"));\r\n
if (options.smallimage && options.largeimage) {\r\n
var smallimage = options.smallimage;\r\n
var largeimage = options.largeimage;\r\n
$(link).addClass(\'zoomThumbActive\');\r\n
$(el).attr(\'href\', largeimage);\r\n
img.attr(\'src\', smallimage);\r\n
lens.hide();\r\n
stage.hide();\r\n
obj.load();\r\n
} else {\r\n
alert(\'ERROR :: Missing parameter for largeimage or smallimage.\');\r\n
throw \'ERROR :: Missing parameter for largeimage or smallimage.\';\r\n
}\r\n
return false;\r\n
}\r\n
});\r\n
//sometimes image is already loaded and onload will not fire\r\n
if (img[0].complete) {\r\n
//fetching data from sallimage if was previously loaded\r\n
smallimage.fetchdata();\r\n
if ($(".zoomPad", el).length == 0) obj.create();\r\n
}\r\n
/*========================================================,\r\n
| Smallimage\r\n
|---------------------------------------------------------:\r\n
| Base image into the anchor element\r\n
`========================================================*/\r\n
\r\n
function Smallimage(image) {\r\n
var $obj = this;\r\n
this.node = image[0];\r\n
this.findborder = function () {\r\n
var bordertop = 0;\r\n
bordertop = image.css(\'border-top-width\');\r\n
btop = \'\';\r\n
var borderleft = 0;\r\n
borderleft = image.css(\'border-left-width\');\r\n
bleft = \'\';\r\n
if (bordertop) {\r\n
for (i = 0; i < 3; i++) {\r\n
var x = [];\r\n
x = bordertop.substr(i, 1);\r\n
if (isNaN(x) == false) {\r\n
btop = btop + \'\' + bordertop.substr(i, 1);\r\n
} else {\r\n
break;\r\n
}\r\n
}\r\n
}\r\n
if (borderleft) {\r\n
for (i = 0; i < 3; i++) {\r\n
if (!isNaN(borderleft.substr(i, 1))) {\r\n
bleft = bleft + borderleft.substr(i, 1)\r\n
} else {\r\n
break;\r\n
}\r\n
}\r\n
}\r\n
$obj.btop = (btop.length > 0) ? eval(btop) : 0;\r\n
$obj.bleft = (bleft.length > 0) ? eval(bleft) : 0;\r\n
};\r\n
this.fetchdata = function () {\r\n
$obj.findborder();\r\n
$obj.w = image.width();\r\n
$obj.h = image.height();\r\n
$obj.ow = image.outerWidth();\r\n
$obj.oh = image.outerHeight();\r\n
$obj.pos = image.offset();\r\n
$obj.pos.l = image.offset().left + $obj.bleft;\r\n
$obj.pos.t = image.offset().top + $obj.btop;\r\n
$obj.pos.r = $obj.w + $obj.pos.l;\r\n
$obj.pos.b = $obj.h + $obj.pos.t;\r\n
$obj.rightlimit = image.offset().left + $obj.ow;\r\n
$obj.bottomlimit = image.offset().top + $obj.oh;\r\n
\r\n
};\r\n
this.node.onerror = function () {\r\n
alert(\'Problems while loading image.\');\r\n
throw \'Problems while loading image.\';\r\n
};\r\n
this.node.onload = function () {\r\n
$obj.fetchdata();\r\n
if ($(".zoomPad", el).length == 0) obj.create();\r\n
};\r\n
return $obj;\r\n
};\r\n
/*========================================================,\r\n
| Loader\r\n
|---------------------------------------------------------:\r\n
| Show that the large image is loading\r\n
`========================================================*/\r\n
\r\n
function Loader() {\r\n
var $obj = this;\r\n
this.append = function () {\r\n
this.node = $(\'<div/>\').addClass(\'zoomPreload\').css(\'visibility\', \'hidden\').html(settings.preloadText);\r\n
$(\'.zoomPad\', el).append(this.node);\r\n
};\r\n
this.show = function () {\r\n
this.node.top = (smallimage.oh - this.node.height()) / 2;\r\n
this.node.left = (smallimage.ow - this.node.width()) / 2;\r\n
//setting position\r\n
this.node.css({\r\n
top: this.node.top,\r\n
left: this.node.left,\r\n
position: \'absolute\',\r\n
visibility: \'visible\'\r\n
});\r\n
};\r\n
this.hide = function () {\r\n
this.node.css(\'visibility\', \'hidden\');\r\n
};\r\n
return this;\r\n
}\r\n
/*========================================================,\r\n
| Lens\r\n
|---------------------------------------------------------:\r\n
| Lens over the image\r\n
`========================================================*/\r\n
\r\n
function Lens() {\r\n
var $obj = this;\r\n
this.node = $(\'<div/>\').addClass(\'zoomPup\');\r\n
//this.nodeimgwrapper = $("<div/>").addClass(\'zoomPupImgWrapper\');\r\n
this.append = function () {\r\n
$(\'.zoomPad\', el).append($(this.node).hide());\r\n
if (settings.zoomType == \'reverse\') {\r\n
this.image = new Image();\r\n
this.image.src = smallimage.node.src; // fires off async\r\n
$(this.node).empty().append(this.image);\r\n
}\r\n
};\r\n
this.setdimensions = function () {\r\n
this.node.w = (parseInt((settings.zoomWidth) / el.scale.x) > smallimage.w ) ? smallimage.w : (parseInt(settings.zoomWidth / el.scale.x)); \r\n
this.node.h = (parseInt((settings.zoomHeight) / el.scale.y) > smallimage.h ) ? smallimage.h : (parseInt(settings.zoomHeight / el.scale.y)); \r\n
this.node.top = (smallimage.oh - this.node.h - 2) / 2;\r\n
this.node.left = (smallimage.ow - this.node.w - 2) / 2;\r\n
//centering lens\r\n
this.node.css({\r\n
top: 0,\r\n
left: 0,\r\n
width: this.node.w + \'px\',\r\n
height: this.node.h + \'px\',\r\n
position: \'absolute\',\r\n
display: \'none\',\r\n
borderWidth: 1 + \'px\'\r\n
});\r\n
\r\n
\r\n
\r\n
if (settings.zoomType == \'reverse\') {\r\n
this.image.src = smallimage.node.src;\r\n
$(this.node).css({\r\n
\'opacity\': 1\r\n
});\r\n
\r\n
$(this.image).css({\r\n
position: \'absolute\',\r\n
display: \'block\',\r\n
left: -(this.node.left + 1 - smallimage.bleft) + \'px\',\r\n
top: -(this.node.top + 1 - smallimage.btop) + \'px\'\r\n
});\r\n
\r\n
}\r\n
};\r\n
this.setcenter = function () {\r\n
//calculating center position\r\n
this.node.top = (smallimage.oh - this.node.h - 2) / 2;\r\n
this.node.left = (smallimage.ow - this.node.w - 2) / 2;\r\n
//centering lens\r\n
this.node.css({\r\n
top: this.node.top,\r\n
left: this.node.left\r\n
});\r\n
if (settings.zoomType == \'reverse\') {\r\n
$(this.image).css({\r\n
position: \'absolute\',\r\n
display: \'block\',\r\n
left: -(this.node.left + 1 - smallimage.bleft) + \'px\',\r\n
top: -(this.node.top + 1 - smallimage.btop) + \'px\'\r\n
});\r\n
\r\n
}\r\n
//centering large image\r\n
largeimage.setposition();\r\n
};\r\n
this.setposition = function (e) {\r\n
el.mousepos.x = e.pageX;\r\n
el.mousepos.y = e.pageY;\r\n
var lensleft = 0;\r\n
var lenstop = 0;\r\n
\r\n
function overleft(lens) {\r\n
return el.mousepos.x - (lens.w) / 2 < smallimage.pos.l; \r\n
}\r\n
\r\n
function overright(lens) {\r\n
return el.mousepos.x + (lens.w) / 2 > smallimage.pos.r; \r\n
\r\n
}\r\n
\r\n
function overtop(lens) {\r\n
return el.mousepos.y - (lens.h) / 2 < smallimage.pos.t; \r\n
}\r\n
\r\n
function overbottom(lens) {\r\n
return el.mousepos.y + (lens.h) / 2 > smallimage.pos.b; \r\n
}\r\n
\r\n
lensleft = el.mousepos.x + smallimage.bleft - smallimage.pos.l - (this.node.w + 2) / 2;\r\n
lenstop = el.mousepos.y + smallimage.btop - smallimage.pos.t - (this.node.h + 2) / 2;\r\n
if (overleft(this.node)) {\r\n
lensleft = smallimage.bleft - 1;\r\n
} else if (overright(this.node)) {\r\n
lensleft = smallimage.w + smallimage.bleft - this.node.w - 1;\r\n
}\r\n
if (overtop(this.node)) {\r\n
lenstop = smallimage.btop - 1;\r\n
} else if (overbottom(this.node)) {\r\n
lenstop = smallimage.h + smallimage.btop - this.node.h - 1;\r\n
}\r\n
\r\n
this.node.left = lensleft;\r\n
this.node.top = lenstop;\r\n
this.node.css({\r\n
\'left\': lensleft + \'px\',\r\n
\'top\': lenstop + \'px\'\r\n
});\r\n
if (settings.zoomType == \'reverse\') {\r\n
if ($.browser.msie && $.browser.version > 7) {\r\n
$(this.node).empty().append(this.image);\r\n
}\r\n
\r\n
$(this.image).css({\r\n
position: \'absolute\',\r\n
display: \'block\',\r\n
left: -(this.node.left + 1 - smallimage.bleft) + \'px\',\r\n
top: -(this.node.top + 1 - smallimage.btop) + \'px\'\r\n
});\r\n
}\r\n
\r\n
largeimage.setposition();\r\n
};\r\n
this.hide = function () {\r\n
img.css({\r\n
\'opacity\': 1\r\n
});\r\n
this.node.hide();\r\n
};\r\n
this.show = function () { \r\n
\r\n
if (settings.zoomType != \'innerzoom\' && (settings.lens || settings.zoomType == \'drag\')) {\r\n
this.node.show();\r\n
} \r\n
\r\n
if (settings.zoomType == \'reverse\') {\r\n
img.css({\r\n
\'opacity\': settings.imageOpacity\r\n
});\r\n
}\r\n
};\r\n
this.getoffset = function () {\r\n
var o = {};\r\n
o.left = $obj.node.left;\r\n
o.top = $obj.node.top;\r\n
return o;\r\n
};\r\n
return this;\r\n
};\r\n
/*========================================================,\r\n
| Stage\r\n
|---------------------------------------------------------:\r\n
| Window area that contains the large image\r\n
`========================================================*/\r\n
\r\n
function Stage() {\r\n
var $obj = this;\r\n
this.node = $("<div class=\'zoomWindow\'><div class=\'zoomWrapper\'><div class=\'zoomWrapperTitle\'></div><div class=\'zoomWrapperImage\'></div></div></div>");\r\n
this.ieframe = $(\'<iframe class="zoomIframe" src="javascript:\\\'\\\';" marginwidth="0" marginheight="0" align="bottom" scrolling="no" frameborder="0" ></iframe>\');\r\n
this.setposition = function () {\r\n
this.node.leftpos = 0;\r\n
this.node.toppos = 0;\r\n
if (settings.zoomType != \'innerzoom\') {\r\n
//positioning\r\n
switch (settings.position) {\r\n
case "left":\r\n
this.node.leftpos = (smallimage.pos.l - smallimage.bleft - Math.abs(settings.xOffset) - settings.zoomWidth > 0) ? (0 - settings.zoomWidth - Math.abs(settings.xOffset)) : (smallimage.ow + Math.abs(settings.xOffset));\r\n
this.node.toppos = Math.abs(settings.yOffset);\r\n
break;\r\n
case "top":\r\n
this.node.leftpos = Math.abs(settings.xOffset);\r\n
this.node.toppos = (smallimage.pos.t - smallimage.btop - Math.abs(settings.yOffset) - settings.zoomHeight > 0) ? (0 - settings.zoomHeight - Math.abs(settings.yOffset)) : (smallimage.oh + Math.abs(settings.yOffset));\r\n
break;\r\n
case "bottom":\r\n
this.node.leftpos = Math.abs(settings.xOffset);\r\n
this.node.toppos = (smallimage.pos.t - smallimage.btop + smallimage.oh + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height) ? (smallimage.oh + Math.abs(settings.yOffset)) : (0 - settings.zoomHeight - Math.abs(settings.yOffset));\r\n
break;\r\n
default:\r\n
this.node.leftpos = (smallimage.rightlimit + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width) ? (smallimage.ow + Math.abs(settings.xOffset)) : (0 - settings.zoomWidth - Math.abs(settings.xOffset));\r\n
this.node.toppos = Math.abs(settings.yOffset);\r\n
break;\r\n
}\r\n
}\r\n
this.node.css({\r\n
\'left\': this.node.leftpos + \'px\',\r\n
\'top\': this.node.toppos + \'px\'\r\n
});\r\n
return this;\r\n
};\r\n
this.append = function () {\r\n
$(\'.zoomPad\', el).append(this.node);\r\n
this.node.css({\r\n
position: \'absolute\',\r\n
display: \'none\',\r\n
zIndex: 5001\r\n
});\r\n
if (settings.zoomType == \'innerzoom\') {\r\n
this.node.css({\r\n
cursor: \'default\'\r\n
});\r\n
var thickness = (smallimage.bleft == 0) ? 1 : smallimage.bleft;\r\n
$(\'.zoomWrapper\', this.node).css({\r\n
borderWidth: thickness + \'px\'\r\n
}); \r\n
}\r\n
\r\n
$(\'.zoomWrapper\', this.node).css({\r\n
width: Math.round(settings.zoomWidth) + \'px\' ,\r\n
borderWidth: thickness + \'px\'\r\n
});\r\n
$(\'.zoomWrapperImage\', this.node).css({\r\n
width: \'100%\',\r\n
height: Math.round(settings.zoomHeight) + \'px\'\r\n
});\r\n
//zoom title\r\n
$(\'.zoomWrapperTitle\', this.node).css({\r\n
width: \'100%\',\r\n
position: \'absolute\'\r\n
}); \r\n
\r\n
$(\'.zoomWrapperTitle\', this.node).hide();\r\n
if (settings.title && zoomtitle.length > 0) {\r\n
$(\'.zoomWrapperTitle\', this.node).html(zoomtitle).show();\r\n
}\r\n
$obj.setposition();\r\n
};\r\n
this.hide = function () {\r\n
switch (settings.hideEffect) {\r\n
case \'fadeout\':\r\n
this.node.fadeOut(settings.fadeoutSpeed, function () {});\r\n
break;\r\n
default:\r\n
this.node.hide();\r\n
break;\r\n
}\r\n
this.ieframe.hide();\r\n
};\r\n
this.show = function () {\r\n
switch (settings.showEffect) {\r\n
case \'fadein\':\r\n
this.node.fadeIn();\r\n
this.node.fadeIn(settings.fadeinSpeed, function () {});\r\n
break;\r\n
default:\r\n
this.node.show();\r\n
break;\r\n
}\r\n
if (isIE6 && settings.zoomType != \'innerzoom\') {\r\n
this.ieframe.width = this.node.width();\r\n
this.ieframe.height = this.node.height();\r\n
this.ieframe.left = this.node.leftpos;\r\n
this.ieframe.top = this.node.toppos;\r\n
this.ieframe.css({\r\n
display: \'block\',\r\n
position: "absolute",\r\n
left: this.ieframe.left,\r\n
top: this.ieframe.top,\r\n
zIndex: 99,\r\n
width: this.ieframe.width + \'px\',\r\n
height: this.ieframe.height + \'px\'\r\n
});\r\n
$(\'.zoomPad\', el).append(this.ieframe);\r\n
this.ieframe.show();\r\n
};\r\n
};\r\n
};\r\n
/*========================================================,\r\n
| LargeImage\r\n
|---------------------------------------------------------:\r\n
| The large detailed image\r\n
`========================================================*/\r\n
\r\n
function Largeimage() {\r\n
var $obj = this;\r\n
this.node = new Image();\r\n
this.loadimage = function (url) {\r\n
//showing preload\r\n
loader.show();\r\n
this.url = url;\r\n
this.node.style.position = \'absolute\';\r\n
this.node.style.border = \'0px\';\r\n
this.node.style.display = \'none\';\r\n
this.node.style.left = \'-5000px\';\r\n
this.node.style.top = \'0px\';\r\n
document.body.appendChild(this.node);\r\n
this.node.src = url; // fires off async\r\n
};\r\n
this.fetchdata = function () {\r\n
var image = $(this.node);\r\n
var scale = {};\r\n
this.node.style.display = \'block\';\r\n
$obj.w = image.width();\r\n
$obj.h = image.height();\r\n
$obj.pos = image.offset();\r\n
$obj.pos.l = image.offset().left;\r\n
$obj.pos.t = image.offset().top;\r\n
$obj.pos.r = $obj.w + $obj.pos.l;\r\n
$obj.pos.b = $obj.h + $obj.pos.t;\r\n
scale.x = ($obj.w / smallimage.w);\r\n
scale.y = ($obj.h / smallimage.h);\r\n
el.scale = scale;\r\n
document.body.removeChild(this.node);\r\n
$(\'.zoomWrapperImage\', el).empty().append(this.node);\r\n
//setting lens dimensions;\r\n
lens.setdimensions();\r\n
};\r\n
this.node.onerror = function () {\r\n
alert(\'Problems while loading the big image.\');\r\n
throw \'Problems while loading the big image.\';\r\n
};\r\n
this.node.onload = function () {\r\n
//fetching data\r\n
$obj.fetchdata();\r\n
loader.hide();\r\n
el.largeimageloading = false;\r\n
el.largeimageloaded = true;\r\n
if (settings.zoomType == \'drag\' || settings.alwaysOn) {\r\n
lens.show();\r\n
stage.show();\r\n
lens.setcenter();\r\n
}\r\n
};\r\n
this.setposition = function () {\r\n
var left = -el.scale.x * (lens.getoffset().left - smallimage.bleft + 1);\r\n
var top = -el.scale.y * (lens.getoffset().top - smallimage.btop + 1);\r\n
$(this.node).css({\r\n
\'left\': left + \'px\',\r\n
\'top\': top + \'px\'\r\n
});\r\n
};\r\n
return this;\r\n
};\r\n
$(el).data("jqzoom", obj);\r\n
};\r\n
//es. $.jqzoom.disable(\'#jqzoom1\');\r\n
$.jqzoom = {\r\n
defaults: {\r\n
zoomType: \'standard\',\r\n
//innerzoom/standard/reverse/drag\r\n
zoomWidth: 300,\r\n
//zoomWindow default width\r\n
zoomHeight: 300,\r\n
//zoomWindow default height\r\n
xOffset: 10,\r\n
//zoomWindow x offset, can be negative(more on the left) or positive(more on the right)\r\n
yOffset: 0,\r\n
//zoomWindow y offset, can be negative(more on the left) or positive(more on the right)\r\n
position: "right",\r\n
//zoomWindow default position\r\n
preloadImages: true,\r\n
//image preload\r\n
preloadText: \'Loading zoom\',\r\n
title: true,\r\n
lens: true,\r\n
imageOpacity: 0.4,\r\n
alwaysOn: false,\r\n
showEffect: \'show\',\r\n
//show/fadein\r\n
hideEffect: \'hide\',\r\n
//hide/fadeout\r\n
fadeinSpeed: \'slow\',\r\n
//fast/slow/number\r\n
fadeoutSpeed: \'2000\' //fast/slow/number\r\n
},\r\n
disable: function (el) {\r\n
var api = $(el).data(\'jqzoom\');\r\n
api.disable();\r\n
return false;\r\n
},\r\n
enable: function (el) {\r\n
var api = $(el).data(\'jqzoom\');\r\n
api.enable();\r\n
return false;\r\n
},\r\n
disableAll: function (el) {\r\n
jqzoompluging_disabled = true;\r\n
},\r\n
enableAll: function (el) {\r\n
jqzoompluging_disabled = false;\r\n
}\r\n
};\r\n
})(jQuery);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>31322</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jquery.jqzoom-core.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts48590418.74</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jqzoom.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>.zoomPad{\r\n
\tposition:relative;\r\n
\tfloat:left;\r\n
\tz-index:99;\r\n
\tcursor:crosshair;\r\n
}\r\n
\r\n
\r\n
.zoomPreload{\r\n
-moz-opacity:0.8;\r\n
opacity: 0.8;\r\n
filter: alpha(opacity = 80);\r\n
color: #333;\r\n
font-size: 12px;\r\n
font-family: Tahoma;\r\n
text-decoration: none;\r\n
border: 1px solid #CCC;\r\n
background-color: white;\r\n
padding: 8px;\r\n
text-align:center;\r\n
background-image: url(../images/zoomloader.gif);\r\n
background-repeat: no-repeat;\r\n
background-position: 43px 30px;\r\n
z-index:110;\r\n
width:90px;\r\n
height:43px;\r\n
position:absolute;\r\n
top:0px;\r\n
left:0px;\r\n
* width:100px;\r\n
* height:49px;\r\n
}\r\n
\r\n
\r\n
.zoomPup{\r\n
\toverflow:hidden;\r\n
\tbackground-color: #FFF;\r\n
\t-moz-opacity:0.6;\r\n
\topacity: 0.6;\r\n
\tfilter: alpha(opacity = 60);\r\n
\tz-index:120;\r\n
\tposition:absolute;\r\n
\tborder:1px solid #CCC;\r\n
z-index:101;\r\n
cursor:crosshair;\r\n
}\r\n
\r\n
.zoomOverlay{\r\n
\tposition:absolute;\r\n
\tleft:0px;\r\n
\ttop:0px;\r\n
\tbackground:#FFF;\r\n
\t/*opacity:0.5;*/\r\n
\tz-index:5000;\r\n
\twidth:100%;\r\n
\theight:100%;\r\n
\tdisplay:none;\r\n
z-index:101;\r\n
}\r\n
\r\n
.zoomWindow{\r\n
\tposition:absolute;\r\n
\tleft:110%;\r\n
\ttop:40px;\r\n
\tbackground:#FFF;\r\n
\tz-index:6000;\r\n
\theight:auto;\r\n
z-index:10000;\r\n
z-index:110;\r\n
}\r\n
.zoomWrapper{\r\n
\tposition:relative;\r\n
\tborder:1px solid #999;\r\n
z-index:110;\r\n
}\r\n
.zoomWrapperTitle{\r\n
\tdisplay:block;\r\n
\tbackground:#999;\r\n
\tcolor:#FFF;\r\n
\theight:18px;\r\n
\tline-height:18px;\r\n
\twidth:100%;\r\n
overflow:hidden;\r\n
\ttext-align:center;\r\n
\tfont-size:10px;\r\n
position:absolute;\r\n
top:0px;\r\n
left:0px;\r\n
z-index:120;\r\n
-moz-opacity:0.6;\r\n
opacity: 0.6;\r\n
filter: alpha(opacity = 60);\r\n
}\r\n
.zoomWrapperImage{\r\n
\tdisplay:block;\r\n
position:relative;\r\n
overflow:hidden;\r\n
z-index:110;\r\n
\r\n
}\r\n
.zoomWrapperImage img{\r\n
border:0px;\r\n
display:block;\r\n
position:absolute;\r\n
z-index:101;\r\n
}\r\n
\r\n
.zoomIframe{\r\n
z-index: -1;\r\n
filter:alpha(opacity=0);\r\n
-moz-opacity: 0.80;\r\n
opacity: 0.80;\r\n
position:absolute;\r\n
display:block;\r\n
}\r\n
\r\n
/*********************************************************\r\n
/ When clicking on thumbs jqzoom will add the class\r\n
/ "zoomThumbActive" on the anchor selected\r\n
/*********************************************************/</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2139</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jquery.jqzoom.css</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
2013-01-21 rafael
* The initial commit
\ No newline at end of file
2013 (c) Nexedi SA
\ No newline at end of file
erp5_jquery
\ No newline at end of file
This Business Template contains only static files of jqzoom plugin.
\ No newline at end of file
GPL
\ No newline at end of file
rafael
\ No newline at end of file
1
\ No newline at end of file
portal_skins/erp5_jquery/jquery/plugin/jqzoom
portal_skins/erp5_jquery/jquery/plugin/jqzoom/**
\ No newline at end of file
erp5_jquery_plugin_jqzoom
\ No newline at end of file
5.4.7
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>lightbox</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts48651728.89</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>lightbox-0.5.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\r\n
* jQuery lightBox plugin\r\n
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)\r\n
* and adapted to me for use like a plugin from jQuery.\r\n
* @name jquery-lightbox-0.5.css\r\n
* @author Leandro Vieira Pinho - http://leandrovieira.com\r\n
* @version 0.5\r\n
* @date April 11, 2008\r\n
* @category jQuery plugin\r\n
* @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)\r\n
* @license CCAttribution-ShareAlike 2.5 Brazil - http://creativecommons.org/licenses/by-sa/2.5/br/deed.en_US\r\n
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin\r\n
*/\r\n
#jquery-overlay {\r\n
\tposition: absolute;\r\n
\ttop: 0;\r\n
\tleft: 0;\r\n
\tz-index: 90;\r\n
\twidth: 100%;\r\n
\theight: 500px;\r\n
}\r\n
#jquery-lightbox {\r\n
\tposition: absolute;\r\n
\ttop: 0;\r\n
\tleft: 0;\r\n
\twidth: 100%;\r\n
\tz-index: 100;\r\n
\ttext-align: center;\r\n
\tline-height: 0;\r\n
}\r\n
#jquery-lightbox a img { border: none; }\r\n
#lightbox-container-image-box {\r\n
\tposition: relative;\r\n
\tbackground-color: #fff;\r\n
\twidth: 250px;\r\n
\theight: 250px;\r\n
\tmargin: 0 auto;\r\n
}\r\n
#lightbox-container-image { padding: 10px; }\r\n
#lightbox-loading {\r\n
\tposition: absolute;\r\n
\ttop: 40%;\r\n
\tleft: 0%;\r\n
\theight: 25%;\r\n
\twidth: 100%;\r\n
\ttext-align: center;\r\n
\tline-height: 0;\r\n
}\r\n
#lightbox-nav {\r\n
\tposition: absolute;\r\n
\ttop: 0;\r\n
\tleft: 0;\r\n
\theight: 100%;\r\n
\twidth: 100%;\r\n
\tz-index: 10;\r\n
}\r\n
#lightbox-container-image-box > #lightbox-nav { left: 0; }\r\n
#lightbox-nav a { outline: none;}\r\n
#lightbox-nav-btnPrev, #lightbox-nav-btnNext {\r\n
\twidth: 49%;\r\n
\theight: 100%;\r\n
\tzoom: 1;\r\n
\tdisplay: block;\r\n
}\r\n
#lightbox-nav-btnPrev { \r\n
\tleft: 0; \r\n
\tfloat: left;\r\n
}\r\n
#lightbox-nav-btnNext { \r\n
\tright: 0; \r\n
\tfloat: right;\r\n
}\r\n
#lightbox-container-image-data-box {\r\n
\tfont: 10px Verdana, Helvetica, sans-serif;\r\n
\tbackground-color: #fff;\r\n
\tmargin: 0 auto;\r\n
\tline-height: 1.4em;\r\n
\toverflow: auto;\r\n
\twidth: 100%;\r\n
\tpadding: 0 10px 0;\r\n
}\r\n
#lightbox-container-image-data {\r\n
\tpadding: 0 10px; \r\n
\tcolor: #666; \r\n
}\r\n
#lightbox-container-image-data #lightbox-image-details { \r\n
\twidth: 70%; \r\n
\tfloat: left; \r\n
\ttext-align: left; \r\n
}\t\r\n
#lightbox-image-details-caption { font-weight: bold; }\r\n
#lightbox-image-details-currentNumber {\r\n
\tdisplay: block; \r\n
\tclear: left; \r\n
\tpadding-bottom: 1.0em;\t\r\n
}\t\t\t\r\n
#lightbox-secNav-btnClose {\r\n
\twidth: 66px; \r\n
\tfloat: right;\r\n
\tpadding-bottom: 0.7em;\t\r\n
}
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2366</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jquery.lightbox-0.5.css</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts58795772.1</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>lightbox-0.5.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\r\n
* jQuery lightBox plugin\r\n
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)\r\n
* and adapted to me for use like a plugin from jQuery.\r\n
* @name jquery-lightbox-0.5.js\r\n
* @author Leandro Vieira Pinho - http://leandrovieira.com\r\n
* @version 0.5\r\n
* @date April 11, 2008\r\n
* @category jQuery plugin\r\n
* @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)\r\n
* @license CCAttribution-ShareAlike 2.5 Brazil - http://creativecommons.org/licenses/by-sa/2.5/br/deed.en_US\r\n
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin\r\n
*/\r\n
\r\n
// Offering a Custom Alias suport - More info: http://docs.jquery.com/Plugins/Authoring#Custom_Alias\r\n
(function($) {\r\n
\t/**\r\n
\t * $ is an alias to jQuery object\r\n
\t *\r\n
\t */\r\n
\t$.fn.lightBox = function(settings) {\r\n
\t\t// Settings to configure the jQuery lightBox plugin how you like\r\n
\t\tsettings = jQuery.extend({\r\n
\t\t\t// Configuration related to overlay\r\n
\t\t\toverlayBgColor: \t\t\'#000\',\t\t// (string) Background color to overlay; inform a hexadecimal value like: #RRGGBB. Where RR, GG, and BB are the hexadecimal values for the red, green, and blue values of the color.\r\n
\t\t\toverlayOpacity:\t\t\t0.8,\t\t// (integer) Opacity value to overlay; inform: 0.X. Where X are number from 0 to 9\r\n
\t\t\t// Configuration related to navigation\r\n
\t\t\tfixedNavigation:\t\tfalse,\t\t// (boolean) Boolean that informs if the navigation (next and prev button) will be fixed or not in the interface.\r\n
\t\t\t// Configuration related to images\r\n
\t\t\timageLoading:\t\t\t\'images/lightbox-ico-loading.gif\',\t\t// (string) Path and the name of the loading icon\r\n
\t\t\timageBtnPrev:\t\t\t\'images/lightbox-btn-prev.gif\',\t\t\t// (string) Path and the name of the prev button image\r\n
\t\t\timageBtnNext:\t\t\t\'images/lightbox-btn-next.gif\',\t\t\t// (string) Path and the name of the next button image\r\n
\t\t\timageBtnClose:\t\t\t\'images/lightbox-btn-close.gif\',\t\t// (string) Path and the name of the close btn\r\n
\t\t\timageBlank:\t\t\t\t\'images/lightbox-blank.gif\',\t\t\t// (string) Path and the name of a blank image (one pixel)\r\n
\t\t\t// Configuration related to container image box\r\n
\t\t\tcontainerBorderSize:\t10,\t\t\t// (integer) If you adjust the padding in the CSS for the container, #lightbox-container-image-box, you will need to update this value\r\n
\t\t\tcontainerResizeSpeed:\t400,\t\t// (integer) Specify the resize duration of container image. These number are miliseconds. 400 is default.\r\n
\t\t\t// Configuration related to texts in caption. For example: Image 2 of 8. You can alter either "Image" and "of" texts.\r\n
\t\t\ttxtImage:\t\t\t\t\'Image\',\t// (string) Specify text "Image"\r\n
\t\t\ttxtOf:\t\t\t\t\t\'of\',\t\t// (string) Specify text "of"\r\n
\t\t\t// Configuration related to keyboard navigation\r\n
\t\t\tkeyToClose:\t\t\t\t\'c\',\t\t// (string) (c = close) Letter to close the jQuery lightBox interface. Beyond this letter, the letter X and the SCAPE key is used to.\r\n
\t\t\tkeyToPrev:\t\t\t\t\'p\',\t\t// (string) (p = previous) Letter to show the previous image\r\n
\t\t\tkeyToNext:\t\t\t\t\'n\',\t\t// (string) (n = next) Letter to show the next image.\r\n
\t\t\t// Don\xb4t alter these variables in any way\r\n
\t\t\timageArray:\t\t\t\t[],\r\n
\t\t\tactiveImage:\t\t\t0\r\n
\t\t},settings);\r\n
\t\t// Caching the jQuery object with all elements matched\r\n
\t\tvar jQueryMatchedObj = this; // This, in this context, refer to jQuery object\r\n
\t\t/**\r\n
\t\t * Initializing the plugin calling the start function\r\n
\t\t *\r\n
\t\t * @return boolean false\r\n
\t\t */\r\n
\t\tfunction _initialize() {\r\n
\t\t\t_start(this,jQueryMatchedObj); // This, in this context, refer to object (link) which the user have clicked\r\n
\t\t\treturn false; // Avoid the browser following the link\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Start the jQuery lightBox plugin\r\n
\t\t *\r\n
\t\t * @param object objClicked The object (link) whick the user have clicked\r\n
\t\t * @param object jQueryMatchedObj The jQuery object with all elements matched\r\n
\t\t */\r\n
\t\tfunction _start(objClicked,jQueryMatchedObj) {\r\n
\t\t\t// Hime some elements to avoid conflict with overlay in IE. These elements appear above the overlay.\r\n
\t\t\t$(\'embed, object, select\').css({ \'visibility\' : \'hidden\' });\r\n
\t\t\t// Call the function to create the markup structure; style some elements; assign events in some elements.\r\n
\t\t\t_set_interface();\r\n
\t\t\t// Unset total images in imageArray\r\n
\t\t\tsettings.imageArray.length = 0;\r\n
\t\t\t// Unset image active information\r\n
\t\t\tsettings.activeImage = 0;\r\n
\t\t\t// We have an image set? Or just an image? Let\xb4s see it.\r\n
\t\t\tif ( jQueryMatchedObj.length == 1 ) {\r\n
\t\t\t\tsettings.imageArray.push(new Array(objClicked.getAttribute(\'href\'),objClicked.getAttribute(\'title\')));\r\n
\t\t\t} else {\r\n
\t\t\t\t// Add an Array (as many as we have), with href and title atributes, inside the Array that storage the images references\t\t\r\n
\t\t\t\tfor ( var i = 0; i < jQueryMatchedObj.length; i++ ) {\r\n
\t\t\t\t\tsettings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute(\'href\'),jQueryMatchedObj[i].getAttribute(\'title\')));\r\n
\t\t\t\t}\r\n
\t\t\t}\r\n
\t\t\twhile ( settings.imageArray[settings.activeImage][0] != objClicked.getAttribute(\'href\') ) {\r\n
\t\t\t\tsettings.activeImage++;\r\n
\t\t\t}\r\n
\t\t\t// Call the function that prepares image exibition\r\n
\t\t\t_set_image_to_view();\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Create the jQuery lightBox plugin interface\r\n
\t\t *\r\n
\t\t * The HTML markup will be like that:\r\n
\t\t\t<div id="jquery-overlay"></div>\r\n
\t\t\t<div id="jquery-lightbox">\r\n
\t\t\t\t<div id="lightbox-container-image-box">\r\n
\t\t\t\t\t<div id="lightbox-container-image">\r\n
\t\t\t\t\t\t<img src="../fotos/XX.jpg" id="lightbox-image">\r\n
\t\t\t\t\t\t<div id="lightbox-nav">\r\n
\t\t\t\t\t\t\t<a href="#" id="lightbox-nav-btnPrev"></a>\r\n
\t\t\t\t\t\t\t<a href="#" id="lightbox-nav-btnNext"></a>\r\n
\t\t\t\t\t\t</div>\r\n
\t\t\t\t\t\t<div id="lightbox-loading">\r\n
\t\t\t\t\t\t\t<a href="#" id="lightbox-loading-link">\r\n
\t\t\t\t\t\t\t\t<img src="../images/lightbox-ico-loading.gif">\r\n
\t\t\t\t\t\t\t</a>\r\n
\t\t\t\t\t\t</div>\r\n
\t\t\t\t\t</div>\r\n
\t\t\t\t</div>\r\n
\t\t\t\t<div id="lightbox-container-image-data-box">\r\n
\t\t\t\t\t<div id="lightbox-container-image-data">\r\n
\t\t\t\t\t\t<div id="lightbox-image-details">\r\n
\t\t\t\t\t\t\t<span id="lightbox-image-details-caption"></span>\r\n
\t\t\t\t\t\t\t<span id="lightbox-image-details-currentNumber"></span>\r\n
\t\t\t\t\t\t</div>\r\n
\t\t\t\t\t\t<div id="lightbox-secNav">\r\n
\t\t\t\t\t\t\t<a href="#" id="lightbox-secNav-btnClose">\r\n
\t\t\t\t\t\t\t\t<img src="../images/lightbox-btn-close.gif">\r\n
\t\t\t\t\t\t\t</a>\r\n
\t\t\t\t\t\t</div>\r\n
\t\t\t\t\t</div>\r\n
\t\t\t\t</div>\r\n
\t\t\t</div>\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _set_interface() {\r\n
\t\t\t// Apply the HTML markup into body tag\r\n
\t\t\t$(\'body\').append(\'<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="\' + settings.imageLoading + \'"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="\' + settings.imageBtnClose + \'"></a></div></div></div></div>\');\t\r\n
\t\t\t// Get page sizes\r\n
\t\t\tvar arrPageSizes = ___getPageSize();\r\n
\t\t\t// Style overlay and show it\r\n
\t\t\t$(\'#jquery-overlay\').css({\r\n
\t\t\t\tbackgroundColor:\tsettings.overlayBgColor,\r\n
\t\t\t\topacity:\t\t\tsettings.overlayOpacity,\r\n
\t\t\t\twidth:\t\t\t\tarrPageSizes[0],\r\n
\t\t\t\theight:\t\t\t\tarrPageSizes[1]\r\n
\t\t\t}).fadeIn();\r\n
\t\t\t// Get page scroll\r\n
\t\t\tvar arrPageScroll = ___getPageScroll();\r\n
\t\t\t// Calculate top and left offset for the jquery-lightbox div object and show it\r\n
\t\t\t$(\'#jquery-lightbox\').css({\r\n
\t\t\t\ttop:\tarrPageScroll[1] + (arrPageSizes[3] / 10),\r\n
\t\t\t\tleft:\tarrPageScroll[0]\r\n
\t\t\t}).show();\r\n
\t\t\t// Assigning click events in elements to close overlay\r\n
\t\t\t$(\'#jquery-overlay,#jquery-lightbox\').click(function() {\r\n
\t\t\t\t_finish();\t\t\t\t\t\t\t\t\t\r\n
\t\t\t});\r\n
\t\t\t// Assign the _finish function to lightbox-loading-link and lightbox-secNav-btnClose objects\r\n
\t\t\t$(\'#lightbox-loading-link,#lightbox-secNav-btnClose\').click(function() {\r\n
\t\t\t\t_finish();\r\n
\t\t\t\treturn false;\r\n
\t\t\t});\r\n
\t\t\t// If window was resized, calculate the new overlay dimensions\r\n
\t\t\t$(window).resize(function() {\r\n
\t\t\t\t// Get page sizes\r\n
\t\t\t\tvar arrPageSizes = ___getPageSize();\r\n
\t\t\t\t// Style overlay and show it\r\n
\t\t\t\t$(\'#jquery-overlay\').css({\r\n
\t\t\t\t\twidth:\t\tarrPageSizes[0],\r\n
\t\t\t\t\theight:\t\tarrPageSizes[1]\r\n
\t\t\t\t});\r\n
\t\t\t\t// Get page scroll\r\n
\t\t\t\tvar arrPageScroll = ___getPageScroll();\r\n
\t\t\t\t// Calculate top and left offset for the jquery-lightbox div object and show it\r\n
\t\t\t\t$(\'#jquery-lightbox\').css({\r\n
\t\t\t\t\ttop:\tarrPageScroll[1] + (arrPageSizes[3] / 10),\r\n
\t\t\t\t\tleft:\tarrPageScroll[0]\r\n
\t\t\t\t});\r\n
\t\t\t});\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Prepares image exibition; doing a image\xb4s preloader to calculate it\xb4s size\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _set_image_to_view() { // show the loading\r\n
\t\t\t// Show the loading\r\n
\t\t\t$(\'#lightbox-loading\').show();\r\n
\t\t\tif ( settings.fixedNavigation ) {\r\n
\t\t\t\t$(\'#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber\').hide();\r\n
\t\t\t} else {\r\n
\t\t\t\t// Hide some elements\r\n
\t\t\t\t$(\'#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber\').hide();\r\n
\t\t\t}\r\n
\t\t\t// Image preload process\r\n
\t\t\tvar objImagePreloader = new Image();\r\n
\t\t\tobjImagePreloader.onload = function() {\r\n
\t\t\t\t$(\'#lightbox-image\').attr(\'src\',settings.imageArray[settings.activeImage][0]);\r\n
\t\t\t\t// Perfomance an effect in the image container resizing it\r\n
\t\t\t\t_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);\r\n
\t\t\t\t//\tclear onLoad, IE behaves irratically with animated gifs otherwise\r\n
\t\t\t\tobjImagePreloader.onload=function(){};\r\n
\t\t\t};\r\n
\t\t\tobjImagePreloader.src = settings.imageArray[settings.activeImage][0];\r\n
\t\t};\r\n
\t\t/**\r\n
\t\t * Perfomance an effect in the image container resizing it\r\n
\t\t *\r\n
\t\t * @param integer intImageWidth The image\xb4s width that will be showed\r\n
\t\t * @param integer intImageHeight The image\xb4s height that will be showed\r\n
\t\t */\r\n
\t\tfunction _resize_container_image_box(intImageWidth,intImageHeight) {\r\n
\t\t\t// Get current width and height\r\n
\t\t\tvar intCurrentWidth = $(\'#lightbox-container-image-box\').width();\r\n
\t\t\tvar intCurrentHeight = $(\'#lightbox-container-image-box\').height();\r\n
\t\t\t// Get the width and height of the selected image plus the padding\r\n
\t\t\tvar intWidth = (intImageWidth + (settings.containerBorderSize * 2)); // Plus the image\xb4s width and the left and right padding value\r\n
\t\t\tvar intHeight = (intImageHeight + (settings.containerBorderSize * 2)); // Plus the image\xb4s height and the left and right padding value\r\n
\t\t\t// Diferences\r\n
\t\t\tvar intDiffW = intCurrentWidth - intWidth;\r\n
\t\t\tvar intDiffH = intCurrentHeight - intHeight;\r\n
\t\t\t// Perfomance the effect\r\n
\t\t\t$(\'#lightbox-container-image-box\').animate({ width: intWidth, height: intHeight },settings.containerResizeSpeed,function() { _show_image(); });\r\n
\t\t\tif ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) {\r\n
\t\t\t\tif ( $.browser.msie ) {\r\n
\t\t\t\t\t___pause(250);\r\n
\t\t\t\t} else {\r\n
\t\t\t\t\t___pause(100);\t\r\n
\t\t\t\t}\r\n
\t\t\t} \r\n
\t\t\t$(\'#lightbox-container-image-data-box\').css({ width: intImageWidth });\r\n
\t\t\t$(\'#lightbox-nav-btnPrev,#lightbox-nav-btnNext\').css({ height: intImageHeight + (settings.containerBorderSize * 2) });\r\n
\t\t};\r\n
\t\t/**\r\n
\t\t * Show the prepared image\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _show_image() {\r\n
\t\t\t$(\'#lightbox-loading\').hide();\r\n
\t\t\t$(\'#lightbox-image\').fadeIn(function() {\r\n
\t\t\t\t_show_image_data();\r\n
\t\t\t\t_set_navigation();\r\n
\t\t\t});\r\n
\t\t\t_preload_neighbor_images();\r\n
\t\t};\r\n
\t\t/**\r\n
\t\t * Show the image information\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _show_image_data() {\r\n
\t\t\t$(\'#lightbox-container-image-data-box\').slideDown(\'fast\');\r\n
\t\t\t$(\'#lightbox-image-details-caption\').hide();\r\n
\t\t\tif ( settings.imageArray[settings.activeImage][1] ) {\r\n
\t\t\t\t$(\'#lightbox-image-details-caption\').html(settings.imageArray[settings.activeImage][1]).show();\r\n
\t\t\t}\r\n
\t\t\t// If we have a image set, display \'Image X of X\'\r\n
\t\t\tif ( settings.imageArray.length > 1 ) {\r\n
\t\t\t\t$(\'#lightbox-image-details-currentNumber\').html(settings.txtImage + \' \' + ( settings.activeImage + 1 ) + \' \' + settings.txtOf + \' \' + settings.imageArray.length).show();\r\n
\t\t\t}\t\t\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Display the button navigations\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _set_navigation() {\r\n
\t\t\t$(\'#lightbox-nav\').show();\r\n
\r\n
\t\t\t// Instead to define this configuration in CSS file, we define here. And it\xb4s need to IE. Just.\r\n
\t\t\t$(\'#lightbox-nav-btnPrev,#lightbox-nav-btnNext\').css({ \'background\' : \'transparent url(\' + settings.imageBlank + \') no-repeat\' });\r\n
\t\t\t\r\n
\t\t\t// Show the prev button, if not the first image in set\r\n
\t\t\tif ( settings.activeImage != 0 ) {\r\n
\t\t\t\tif ( settings.fixedNavigation ) {\r\n
\t\t\t\t\t$(\'#lightbox-nav-btnPrev\').css({ \'background\' : \'url(\' + settings.imageBtnPrev + \') left 15% no-repeat\' })\r\n
\t\t\t\t\t\t.unbind()\r\n
\t\t\t\t\t\t.bind(\'click\',function() {\r\n
\t\t\t\t\t\t\tsettings.activeImage = settings.activeImage - 1;\r\n
\t\t\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t\t\treturn false;\r\n
\t\t\t\t\t\t});\r\n
\t\t\t\t} else {\r\n
\t\t\t\t\t// Show the images button for Next buttons\r\n
\t\t\t\t\t$(\'#lightbox-nav-btnPrev\').unbind().hover(function() {\r\n
\t\t\t\t\t\t$(this).css({ \'background\' : \'url(\' + settings.imageBtnPrev + \') left 15% no-repeat\' });\r\n
\t\t\t\t\t},function() {\r\n
\t\t\t\t\t\t$(this).css({ \'background\' : \'transparent url(\' + settings.imageBlank + \') no-repeat\' });\r\n
\t\t\t\t\t}).show().bind(\'click\',function() {\r\n
\t\t\t\t\t\tsettings.activeImage = settings.activeImage - 1;\r\n
\t\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t\treturn false;\r\n
\t\t\t\t\t});\r\n
\t\t\t\t}\r\n
\t\t\t}\r\n
\t\t\t\r\n
\t\t\t// Show the next button, if not the last image in set\r\n
\t\t\tif ( settings.activeImage != ( settings.imageArray.length -1 ) ) {\r\n
\t\t\t\tif ( settings.fixedNavigation ) {\r\n
\t\t\t\t\t$(\'#lightbox-nav-btnNext\').css({ \'background\' : \'url(\' + settings.imageBtnNext + \') right 15% no-repeat\' })\r\n
\t\t\t\t\t\t.unbind()\r\n
\t\t\t\t\t\t.bind(\'click\',function() {\r\n
\t\t\t\t\t\t\tsettings.activeImage = settings.activeImage + 1;\r\n
\t\t\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t\t\treturn false;\r\n
\t\t\t\t\t\t});\r\n
\t\t\t\t} else {\r\n
\t\t\t\t\t// Show the images button for Next buttons\r\n
\t\t\t\t\t$(\'#lightbox-nav-btnNext\').unbind().hover(function() {\r\n
\t\t\t\t\t\t$(this).css({ \'background\' : \'url(\' + settings.imageBtnNext + \') right 15% no-repeat\' });\r\n
\t\t\t\t\t},function() {\r\n
\t\t\t\t\t\t$(this).css({ \'background\' : \'transparent url(\' + settings.imageBlank + \') no-repeat\' });\r\n
\t\t\t\t\t}).show().bind(\'click\',function() {\r\n
\t\t\t\t\t\tsettings.activeImage = settings.activeImage + 1;\r\n
\t\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t\treturn false;\r\n
\t\t\t\t\t});\r\n
\t\t\t\t}\r\n
\t\t\t}\r\n
\t\t\t// Enable keyboard navigation\r\n
\t\t\t_enable_keyboard_navigation();\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Enable a support to keyboard navigation\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _enable_keyboard_navigation() {\r\n
\t\t\t$(document).keydown(function(objEvent) {\r\n
\t\t\t\t_keyboard_action(objEvent);\r\n
\t\t\t});\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Disable the support to keyboard navigation\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _disable_keyboard_navigation() {\r\n
\t\t\t$(document).unbind();\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Perform the keyboard actions\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _keyboard_action(objEvent) {\r\n
\t\t\t// To ie\r\n
\t\t\tif ( objEvent == null ) {\r\n
\t\t\t\tkeycode = event.keyCode;\r\n
\t\t\t\tescapeKey = 27;\r\n
\t\t\t// To Mozilla\r\n
\t\t\t} else {\r\n
\t\t\t\tkeycode = objEvent.keyCode;\r\n
\t\t\t\tescapeKey = objEvent.DOM_VK_ESCAPE;\r\n
\t\t\t}\r\n
\t\t\t// Get the key in lower case form\r\n
\t\t\tkey = String.fromCharCode(keycode).toLowerCase();\r\n
\t\t\t// Verify the keys to close the ligthBox\r\n
\t\t\tif ( ( key == settings.keyToClose ) || ( key == \'x\' ) || ( keycode == escapeKey ) ) {\r\n
\t\t\t\t_finish();\r\n
\t\t\t}\r\n
\t\t\t// Verify the key to show the previous image\r\n
\t\t\tif ( ( key == settings.keyToPrev ) || ( keycode == 37 ) ) {\r\n
\t\t\t\t// If we\xb4re not showing the first image, call the previous\r\n
\t\t\t\tif ( settings.activeImage != 0 ) {\r\n
\t\t\t\t\tsettings.activeImage = settings.activeImage - 1;\r\n
\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t_disable_keyboard_navigation();\r\n
\t\t\t\t}\r\n
\t\t\t}\r\n
\t\t\t// Verify the key to show the next image\r\n
\t\t\tif ( ( key == settings.keyToNext ) || ( keycode == 39 ) ) {\r\n
\t\t\t\t// If we\xb4re not showing the last image, call the next\r\n
\t\t\t\tif ( settings.activeImage != ( settings.imageArray.length - 1 ) ) {\r\n
\t\t\t\t\tsettings.activeImage = settings.activeImage + 1;\r\n
\t\t\t\t\t_set_image_to_view();\r\n
\t\t\t\t\t_disable_keyboard_navigation();\r\n
\t\t\t\t}\r\n
\t\t\t}\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Preload prev and next images being showed\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _preload_neighbor_images() {\r\n
\t\t\tif ( (settings.imageArray.length -1) > settings.activeImage ) {\r\n
\t\t\t\tobjNext = new Image();\r\n
\t\t\t\tobjNext.src = settings.imageArray[settings.activeImage + 1][0];\r\n
\t\t\t}\r\n
\t\t\tif ( settings.activeImage > 0 ) {\r\n
\t\t\t\tobjPrev = new Image();\r\n
\t\t\t\tobjPrev.src = settings.imageArray[settings.activeImage -1][0];\r\n
\t\t\t}\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t * Remove jQuery lightBox plugin HTML markup\r\n
\t\t *\r\n
\t\t */\r\n
\t\tfunction _finish() {\r\n
\t\t\t$(\'#jquery-lightbox\').remove();\r\n
\t\t\t$(\'#jquery-overlay\').fadeOut(function() { $(\'#jquery-overlay\').remove(); });\r\n
\t\t\t// Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.\r\n
\t\t\t$(\'embed, object, select\').css({ \'visibility\' : \'visible\' });\r\n
\t\t}\r\n
\t\t/**\r\n
\t\t / THIRD FUNCTION\r\n
\t\t * getPageSize() by quirksmode.com\r\n
\t\t *\r\n
\t\t * @return Array Return an array with page width, height and window width, height\r\n
\t\t */\r\n
\t\tfunction ___getPageSize() {\r\n
\t\t\tvar xScroll, yScroll;\r\n
\t\t\tif (window.innerHeight && window.scrollMaxY) {\t\r\n
\t\t\t\txScroll = window.innerWidth + window.scrollMaxX;\r\n
\t\t\t\tyScroll = window.innerHeight + window.scrollMaxY;\r\n
\t\t\t} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac\r\n
\t\t\t\txScroll = document.body.scrollWidth;\r\n
\t\t\t\tyScroll = document.body.scrollHeight;\r\n
\t\t\t} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari\r\n
\t\t\t\txScroll = document.body.offsetWidth;\r\n
\t\t\t\tyScroll = document.body.offsetHeight;\r\n
\t\t\t}\r\n
\t\t\tvar windowWidth, windowHeight;\r\n
\t\t\tif (self.innerHeight) {\t// all except Explorer\r\n
\t\t\t\tif(document.documentElement.clientWidth){\r\n
\t\t\t\t\twindowWidth = document.documentElement.clientWidth; \r\n
\t\t\t\t} else {\r\n
\t\t\t\t\twindowWidth = self.innerWidth;\r\n
\t\t\t\t}\r\n
\t\t\t\twindowHeight = self.innerHeight;\r\n
\t\t\t} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode\r\n
\t\t\t\twindowWidth = document.documentElement.clientWidth;\r\n
\t\t\t\twindowHeight = document.documentElement.clientHeight;\r\n
\t\t\t} else if (document.body) { // other Explorers\r\n
\t\t\t\twindowWidth = document.body.clientWidth;\r\n
\t\t\t\twindowHeight = document.body.clientHeight;\r\n
\t\t\t}\t\r\n
\t\t\t// for small pages with total height less then height of the viewport\r\n
\t\t\tif(yScroll < windowHeight){\r\n
\t\t\t\tpageHeight = windowHeight;\r\n
\t\t\t} else { \r\n
\t\t\t\tpageHeight = yScroll;\r\n
\t\t\t}\r\n
\t\t\t// for small pages with total width less then width of the viewport\r\n
\t\t\tif(xScroll < windowWidth){\t\r\n
\t\t\t\tpageWidth = xScroll;\t\t\r\n
\t\t\t} else {\r\n
\t\t\t\tpageWidth = windowWidth;\r\n
\t\t\t}\r\n
\t\t\tarrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);\r\n
\t\t\treturn arrayPageSize;\r\n
\t\t};\r\n
\t\t/**\r\n
\t\t / THIRD FUNCTION\r\n
\t\t * getPageScroll() by quirksmode.com\r\n
\t\t *\r\n
\t\t * @return Array Return an array with x,y page scroll values.\r\n
\t\t */\r\n
\t\tfunction ___getPageScroll() {\r\n
\t\t\tvar xScroll, yScroll;\r\n
\t\t\tif (self.pageYOffset) {\r\n
\t\t\t\tyScroll = self.pageYOffset;\r\n
\t\t\t\txScroll = self.pageXOffset;\r\n
\t\t\t} else if (document.documentElement && document.documentElement.scrollTop) {\t // Explorer 6 Strict\r\n
\t\t\t\tyScroll = document.documentElement.scrollTop;\r\n
\t\t\t\txScroll = document.documentElement.scrollLeft;\r\n
\t\t\t} else if (document.body) {// all other Explorers\r\n
\t\t\t\tyScroll = document.body.scrollTop;\r\n
\t\t\t\txScroll = document.body.scrollLeft;\t\r\n
\t\t\t}\r\n
\t\t\tarrayPageScroll = new Array(xScroll,yScroll);\r\n
\t\t\treturn arrayPageScroll;\r\n
\t\t};\r\n
\t\t /**\r\n
\t\t * Stop the code execution from a escified time in milisecond\r\n
\t\t *\r\n
\t\t */\r\n
\t\t function ___pause(ms) {\r\n
\t\t\tvar date = new Date(); \r\n
\t\t\tcurDate = null;\r\n
\t\t\tdo { var curDate = new Date(); }\r\n
\t\t\twhile ( curDate - date < ms);\r\n
\t\t };\r\n
\t\t// Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once\r\n
\t\treturn this.unbind(\'click\').click(_initialize);\r\n
\t};\r\n
})(jQuery); // Call and execute the function immediately passing the jQuery object
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>20065</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jquery.lightbox-0.5.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Cacheable__manager_id</string> </key>
<value> <string>http_cache</string> </value>
</item>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts48651328.53</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>lightbox-0.5.pack.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\r\n
* jQuery lightBox plugin\r\n
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)\r\n
* and adapted to me for use like a plugin from jQuery.\r\n
* @name jquery-lightbox-0.5.js\r\n
* @author Leandro Vieira Pinho - http://leandrovieira.com\r\n
* @version 0.5\r\n
* @date April 11, 2008\r\n
* @category jQuery plugin\r\n
* @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)\r\n
* @license CCAttribution-ShareAlike 2.5 Brazil - http://creativecommons.org/licenses/by-sa/2.5/br/deed.en_US\r\n
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin\r\n
*/\r\n
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?\'\':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!\'\'.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return\'\\\\w+\'};c=1};while(c--)if(k[c])p=p.replace(new RegExp(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);return p}(\'(6($){$.2N.3g=6(4){4=23.2H({2B:\\\'#34\\\',2g:0.8,1d:F,1M:\\\'18/5-33-Y.16\\\',1v:\\\'18/5-1u-2Q.16\\\',1E:\\\'18/5-1u-2L.16\\\',1W:\\\'18/5-1u-2I.16\\\',19:\\\'18/5-2F.16\\\',1f:10,2A:3d,2s:\\\'1j\\\',2o:\\\'32\\\',2j:\\\'c\\\',2f:\\\'p\\\',2d:\\\'n\\\',h:[],9:0},4);f I=N;6 20(){1X(N,I);u F}6 1X(1e,I){$(\\\'1U, 1S, 1R\\\').l({\\\'1Q\\\':\\\'2E\\\'});1O();4.h.B=0;4.9=0;7(I.B==1){4.h.1J(v 1m(1e.17(\\\'J\\\'),1e.17(\\\'2v\\\')))}j{36(f i=0;i<I.B;i++){4.h.1J(v 1m(I[i].17(\\\'J\\\'),I[i].17(\\\'2v\\\')))}}2n(4.h[4.9][0]!=1e.17(\\\'J\\\')){4.9++}D()}6 1O(){$(\\\'m\\\').31(\\\'<e g="q-13"></e><e g="q-5"><e g="5-s-b-w"><e g="5-s-b"><1w g="5-b"><e 2V="" g="5-k"><a J="#" g="5-k-V"></a><a J="#" g="5-k-X"></a></e><e g="5-Y"><a J="#" g="5-Y-29"><1w W="\\\'+4.1M+\\\'"></a></e></e></e><e g="5-s-b-T-w"><e g="5-s-b-T"><e g="5-b-A"><1i g="5-b-A-1t"></1i><1i g="5-b-A-1g"></1i></e><e g="5-1s"><a J="#" g="5-1s-22"><1w W="\\\'+4.1W+\\\'"></a></e></e></e></e>\\\');f z=1D();$(\\\'#q-13\\\').l({2K:4.2B,2J:4.2g,S:z[0],P:z[1]}).1V();f R=1p();$(\\\'#q-5\\\').l({1T:R[1]+(z[3]/10),1c:R[0]}).E();$(\\\'#q-13,#q-5\\\').C(6(){1a()});$(\\\'#5-Y-29,#5-1s-22\\\').C(6(){1a();u F});$(G).2G(6(){f z=1D();$(\\\'#q-13\\\').l({S:z[0],P:z[1]});f R=1p();$(\\\'#q-5\\\').l({1T:R[1]+(z[3]/10),1c:R[0]})})}6 D(){$(\\\'#5-Y\\\').E();7(4.1d){$(\\\'#5-b,#5-s-b-T-w,#5-b-A-1g\\\').1b()}j{$(\\\'#5-b,#5-k,#5-k-V,#5-k-X,#5-s-b-T-w,#5-b-A-1g\\\').1b()}f Q=v 1j();Q.1P=6(){$(\\\'#5-b\\\').2D(\\\'W\\\',4.h[4.9][0]);1N(Q.S,Q.P);Q.1P=6(){}};Q.W=4.h[4.9][0]};6 1N(1o,1r){f 1L=$(\\\'#5-s-b-w\\\').S();f 1K=$(\\\'#5-s-b-w\\\').P();f 1n=(1o+(4.1f*2));f 1y=(1r+(4.1f*2));f 1I=1L-1n;f 2z=1K-1y;$(\\\'#5-s-b-w\\\').3f({S:1n,P:1y},4.2A,6(){2y()});7((1I==0)&&(2z==0)){7($.3e.3c){1H(3b)}j{1H(3a)}}$(\\\'#5-s-b-T-w\\\').l({S:1o});$(\\\'#5-k-V,#5-k-X\\\').l({P:1r+(4.1f*2)})};6 2y(){$(\\\'#5-Y\\\').1b();$(\\\'#5-b\\\').1V(6(){2u();2t()});2r()};6 2u(){$(\\\'#5-s-b-T-w\\\').38(\\\'35\\\');$(\\\'#5-b-A-1t\\\').1b();7(4.h[4.9][1]){$(\\\'#5-b-A-1t\\\').2p(4.h[4.9][1]).E()}7(4.h.B>1){$(\\\'#5-b-A-1g\\\').2p(4.2s+\\\' \\\'+(4.9+1)+\\\' \\\'+4.2o+\\\' \\\'+4.h.B).E()}}6 2t(){$(\\\'#5-k\\\').E();$(\\\'#5-k-V,#5-k-X\\\').l({\\\'K\\\':\\\'1C M(\\\'+4.19+\\\') L-O\\\'});7(4.9!=0){7(4.1d){$(\\\'#5-k-V\\\').l({\\\'K\\\':\\\'M(\\\'+4.1v+\\\') 1c 15% L-O\\\'}).11().1k(\\\'C\\\',6(){4.9=4.9-1;D();u F})}j{$(\\\'#5-k-V\\\').11().2m(6(){$(N).l({\\\'K\\\':\\\'M(\\\'+4.1v+\\\') 1c 15% L-O\\\'})},6(){$(N).l({\\\'K\\\':\\\'1C M(\\\'+4.19+\\\') L-O\\\'})}).E().1k(\\\'C\\\',6(){4.9=4.9-1;D();u F})}}7(4.9!=(4.h.B-1)){7(4.1d){$(\\\'#5-k-X\\\').l({\\\'K\\\':\\\'M(\\\'+4.1E+\\\') 2l 15% L-O\\\'}).11().1k(\\\'C\\\',6(){4.9=4.9+1;D();u F})}j{$(\\\'#5-k-X\\\').11().2m(6(){$(N).l({\\\'K\\\':\\\'M(\\\'+4.1E+\\\') 2l 15% L-O\\\'})},6(){$(N).l({\\\'K\\\':\\\'1C M(\\\'+4.19+\\\') L-O\\\'})}).E().1k(\\\'C\\\',6(){4.9=4.9+1;D();u F})}}2k()}6 2k(){$(d).30(6(12){2i(12)})}6 1G(){$(d).11()}6 2i(12){7(12==2h){U=2Z.2e;1x=27}j{U=12.2e;1x=12.2Y}14=2X.2W(U).2U();7((14==4.2j)||(14==\\\'x\\\')||(U==1x)){1a()}7((14==4.2f)||(U==37)){7(4.9!=0){4.9=4.9-1;D();1G()}}7((14==4.2d)||(U==39)){7(4.9!=(4.h.B-1)){4.9=4.9+1;D();1G()}}}6 2r(){7((4.h.B-1)>4.9){2c=v 1j();2c.W=4.h[4.9+1][0]}7(4.9>0){2b=v 1j();2b.W=4.h[4.9-1][0]}}6 1a(){$(\\\'#q-5\\\').2a();$(\\\'#q-13\\\').2T(6(){$(\\\'#q-13\\\').2a()});$(\\\'1U, 1S, 1R\\\').l({\\\'1Q\\\':\\\'2S\\\'})}6 1D(){f o,r;7(G.1h&&G.28){o=G.26+G.2R;r=G.1h+G.28}j 7(d.m.25>d.m.24){o=d.m.2P;r=d.m.25}j{o=d.m.2O;r=d.m.24}f y,H;7(Z.1h){7(d.t.1l){y=d.t.1l}j{y=Z.26}H=Z.1h}j 7(d.t&&d.t.1A){y=d.t.1l;H=d.t.1A}j 7(d.m){y=d.m.1l;H=d.m.1A}7(r<H){1z=H}j{1z=r}7(o<y){1B=o}j{1B=y}21=v 1m(1B,1z,y,H);u 21};6 1p(){f o,r;7(Z.1Z){r=Z.1Z;o=Z.2M}j 7(d.t&&d.t.1F){r=d.t.1F;o=d.t.1Y}j 7(d.m){r=d.m.1F;o=d.m.1Y}2q=v 1m(o,r);u 2q};6 1H(2C){f 2x=v 2w();1q=2h;3h{f 1q=v 2w()}2n(1q-2x<2C)};u N.11(\\\'C\\\').C(20)}})(23);\',62,204,\'||||settings|lightbox|function|if||activeImage||image||document|div|var|id|imageArray||else|nav|css|body||xScroll||jquery|yScroll|container|documentElement|return|new|box||windowWidth|arrPageSizes|details|length|click|_set_image_to_view|show|false|window|windowHeight|jQueryMatchedObj|href|background|no|url|this|repeat|height|objImagePreloader|arrPageScroll|width|data|keycode|btnPrev|src|btnNext|loading|self||unbind|objEvent|overlay|key||gif|getAttribute|images|imageBlank|_finish|hide|left|fixedNavigation|objClicked|containerBorderSize|currentNumber|innerHeight|span|Image|bind|clientWidth|Array|intWidth|intImageWidth|___getPageScroll|curDate|intImageHeight|secNav|caption|btn|imageBtnPrev|img|escapeKey|intHeight|pageHeight|clientHeight|pageWidth|transparent|___getPageSize|imageBtnNext|scrollTop|_disable_keyboard_navigation|___pause|intDiffW|push|intCurrentHeight|intCurrentWidth|imageLoading|_resize_container_image_box|_set_interface|onload|visibility|select|object|top|embed|fadeIn|imageBtnClose|_start|scrollLeft|pageYOffset|_initialize|arrayPageSize|btnClose|jQuery|offsetHeight|scrollHeight|innerWidth||scrollMaxY|link|remove|objPrev|objNext|keyToNext|keyCode|keyToPrev|overlayOpacity|null|_keyboard_action|keyToClose|_enable_keyboard_navigation|right|hover|while|txtOf|html|arrayPageScroll|_preload_neighbor_images|txtImage|_set_navigation|_show_image_data|title|Date|date|_show_image|intDiffH|containerResizeSpeed|overlayBgColor|ms|attr|hidden|blank|resize|extend|close|opacity|backgroundColor|next|pageXOffset|fn|offsetWidth|scrollWidth|prev|scrollMaxX|visible|fadeOut|toLowerCase|style|fromCharCode|String|DOM_VK_ESCAPE|event|keydown|append|of|ico|000|fast|for||slideDown||100|250|msie|400|browser|animate|lightBox|do\'.split(\'|\'),0,{}))
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>6267</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>jquery.lightbox-0.5.pack.js</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
2013-01-21 rafael
* The initial commit
\ No newline at end of file
2013 (c) Nexedi SA
\ No newline at end of file
erp5_jquery
\ No newline at end of file
This Business Template contains only static files of jquery lighbox plugin.
Current version is 0.5 one.
\ No newline at end of file
GPL
\ No newline at end of file
portal_skins/erp5_jquery/jquery/plugin/lightbox
portal_skins/erp5_jquery/jquery/plugin/lightbox/**
\ No newline at end of file
erp5_jquery_plugin_lightbox
\ No newline at end of file
5.4.7
\ No newline at end of file
...@@ -50,17 +50,22 @@ ...@@ -50,17 +50,22 @@
</item> </item>
<item> <item>
<key> <string>_body</string> </key> <key> <string>_body</string> </key>
<value> <string>portal = context.getPortalObject()\n <value> <string>real_context = context\n
Base_translateString = portal.Base_translateString\n if real_context.isTempObject():\n
real_context = real_context.getParentValue()\n
\n \n
currency = context.portal_preferences.getPreferredAccountingTransactionCurrency()\n web_site_value = real_context.getWebSiteValue()\n
if currency is None:\n if web_site_value is not None and web_site_value.isTempObject():\n
raise ValueError, Base_translateString("Currency must be defined in preferences.")\n real_web_site_value = web_site_value.getParentValue()\n
while real_web_site_value.isTempObject():\n
real_web_site_value = real_web_site_value.getParentValue()\n
web_site_url = web_site_value.getRelativeUrl()\n
web_site_url_without_language = real_web_site_value.getRelativeUrl()\n
real_context_url = real_context.getRelativeUrl()\n
real_context_url_without_language = real_context_url.replace(web_site_url, web_site_url_without_language, 1)\n
real_context = context.getPortalObject().restrictedTraverse(real_context_url_without_language)\n
\n \n
currency_value = context.restrictedTraverse(currency)\n return real_context\n
precision = currency_value.getQuantityPrecision()\n
\n
return precision\n
</string> </value> </string> </value>
</item> </item>
<item> <item>
...@@ -69,7 +74,7 @@ return precision\n ...@@ -69,7 +74,7 @@ return precision\n
</item> </item>
<item> <item>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>Base_getPreferredPrecision</string> </value> <value> <string>Base_getRealContext</string> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -55,9 +55,7 @@ ...@@ -55,9 +55,7 @@
# for web mode\n # for web mode\n
if mode in (\'web_front\', \'web_section\',):\n if mode in (\'web_front\', \'web_section\',):\n
# in Web Mode we can have a temporary Web Site objects created based on current language\n # in Web Mode we can have a temporary Web Site objects created based on current language\n
real_context = context\n real_context = context.Base_getRealContext()\n
if context.isTempObject():\n
real_context = context.getParentValue()\n
pad.setPublicationSectionValue(real_context)\n pad.setPublicationSectionValue(real_context)\n
\n \n
# set it as active\n # set it as active\n
......
...@@ -102,9 +102,7 @@ if knowledge_pad is None:\n ...@@ -102,9 +102,7 @@ if knowledge_pad is None:\n
activate_kw = activate_kw)\n activate_kw = activate_kw)\n
if is_web_mode:\n if is_web_mode:\n
# in Web Mode we can have a temporary Web Site objects created based on current language\n # in Web Mode we can have a temporary Web Site objects created based on current language\n
real_context = context\n real_context = context.Base_getRealContext()\n
if context.isTempObject():\n
real_context = context.getParentValue()\n
if real_context.getPortalType() == \'Web Site\' and default_pad_group in (\'\', None,):\n if real_context.getPortalType() == \'Web Site\' and default_pad_group in (\'\', None,):\n
# script is called within Front Page Gadgets view\n # script is called within Front Page Gadgets view\n
knowledge_pad.setPublicationSectionValue(real_context)\n knowledge_pad.setPublicationSectionValue(real_context)\n
......
...@@ -69,17 +69,9 @@ active_knowledge_pad, knowledge_pads = \\\n ...@@ -69,17 +69,9 @@ active_knowledge_pad, knowledge_pads = \\\n
if active_knowledge_pad is not None:\n if active_knowledge_pad is not None:\n
return active_knowledge_pad, knowledge_pads\n return active_knowledge_pad, knowledge_pads\n
\n \n
# in Web Mode we can have a temporary object created based on current language, document by reference\n real_context = context.Base_getRealContext()\n
real_context = context\n
while real_context.isTempObject():\n
real_context = real_context.getParentValue()\n
real_context_url = real_context.getRelativeUrl()\n real_context_url = real_context.getRelativeUrl()\n
\n \n
real_context_url_list = real_context_url.split("/")\n
current_language = context.Localizer.get_selected_language()\n
if current_language in real_context_url_list:\n
real_context_url = "/".join(filter(lambda x: x != current_language, real_context_url_list))\n
\n
# first filter if we have a custom Pad for the context\n # first filter if we have a custom Pad for the context\n
for knowledge_pad in knowledge_pads:\n for knowledge_pad in knowledge_pads:\n
pad_state = knowledge_pad.getValidationState()\n pad_state = knowledge_pad.getValidationState()\n
......
...@@ -58,11 +58,8 @@ from zExceptions import Unauthorized\n ...@@ -58,11 +58,8 @@ from zExceptions import Unauthorized\n
def filterKnowledgePadListForContext(results, mode, \n def filterKnowledgePadListForContext(results, mode, \n
default_pad_group):\n default_pad_group):\n
# in Web Mode we can have a temporary object created based on current language, document by reference\n # in Web Mode we can have a temporary object created based on current language, document by reference\n
real_context = context\n real_context = context.Base_getRealContext()\n
while real_context.isTempObject():\n
real_context = real_context.getParentValue()\n
real_context_url = real_context.getRelativeUrl()\n real_context_url = real_context.getRelativeUrl()\n
\n
if mode == \'erp5_front\':\n if mode == \'erp5_front\':\n
# leave only those not having a publication_section as \n # leave only those not having a publication_section as \n
# this means belonging to root\n # this means belonging to root\n
......
757 758
\ No newline at end of file \ No newline at end of file
...@@ -54,12 +54,12 @@ ...@@ -54,12 +54,12 @@
\n \n
if not production_order_line.hasSpecialise():\n if not production_order_line.hasSpecialise():\n
portal = production_order_line.getPortalObject()\n portal = production_order_line.getPortalObject()\n
resource = production_order_line.getResourceValue()\n resource_uid = production_order_line.getResourceUid()\n
if resource is not None:\n if resource_uid:\n
transformation_list = portal.portal_catalog(\n transformation_list = portal.portal_catalog(\n
portal_type=portal.getPortalTransformationTypeList(),\n portal_type=portal.getPortalTransformationTypeList(),\n
validation_state="!=invalidated",\n validation_state="!=invalidated",\n
resource_relative_url=resource.getRelativeUrl())\n default_resource_uid=resource_uid)\n
if len(transformation_list) == 1:\n if len(transformation_list) == 1:\n
transformation = transformation_list[0].getRelativeUrl()\n transformation = transformation_list[0].getRelativeUrl()\n
production_order_line.setSpecialise(transformation)\n production_order_line.setSpecialise(transformation)\n
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_EtagSupport__etag</string> </key> <key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts78319528.42</string> </value> <value> <string>ts30609662.31</string> </value>
</item> </item>
<item> <item>
<key> <string>__name__</string> </key> <key> <string>__name__</string> </key>
...@@ -20,263 +20,265 @@ ...@@ -20,263 +20,265 @@
</item> </item>
<item> <item>
<key> <string>data</string> </key> <key> <string>data</string> </key>
<value> <string encoding="base64">UEsDBAoAAAAAANJbjjhexjIMJwAAACcAAAAIABwAbWltZXR5cGVVVAkAAzwkA0g8JANIdXgLAAEE <value> <string encoding="base64">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</string> </value>
AAAAAAAAABwAGAAAAAAAAAAQAO1BYyYAAENvbmZpZ3VyYXRpb25zMi9hY2NlbGVyYXRvci9VVAUA
A3mbMUx1eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAADSW444AAAAAAAAAAAAAAAAJwAYAAAAAAAA
AAAApIG5JgAAQ29uZmlndXJhdGlvbnMyL2FjY2VsZXJhdG9yL2N1cnJlbnQueG1sVVQFAAM8JANI
dXgLAAEE9AEAAAT0AQAAUEsBAh4DCgAAAAAA0luOOAAAAAAAAAAAAAAAABwAGAAAAAAAAAAQAO1B
GicAAENvbmZpZ3VyYXRpb25zMi9wcm9ncmVzc2Jhci9VVAUAAzwkA0h1eAsAAQT0AQAABPQBAABQ
SwECHgMKAAAAAADSW444AAAAAAAAAAAAAAAAGAAYAAAAAAAAABAA7UFwJwAAQ29uZmlndXJhdGlv
bnMyL2Zsb2F0ZXIvVVQFAAM8JANIdXgLAAEE9AEAAAT0AQAAUEsBAh4DCgAAAAAA0luOOAAAAAAA
AAAAAAAAABoAGAAAAAAAAAAQAO1BwicAAENvbmZpZ3VyYXRpb25zMi9wb3B1cG1lbnUvVVQFAAM8
JANIdXgLAAEE9AEAAAT0AQAAUEsBAh4DCgAAAAAA0luOOAAAAAAAAAAAAAAAABgAGAAAAAAAAAAQ
AO1BFigAAENvbmZpZ3VyYXRpb25zMi9tZW51YmFyL1VUBQADPCQDSHV4CwABBPQBAAAE9AEAAFBL
AQIeAwoAAAAAANJbjjgAAAAAAAAAAAAAAAAYABgAAAAAAAAAEADtQWgoAABDb25maWd1cmF0aW9u
czIvdG9vbGJhci9VVAUAAzwkA0h1eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAACVVeU8AAAAAAAA
AAAAAAAAFwAYAAAAAAAAABAA7UG6KAAAQ29uZmlndXJhdGlvbnMyL2ltYWdlcy9VVAUAA3mbMUx1
eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAADSW444AAAAAAAAAAAAAAAAHwAYAAAAAAAAABAA7UEL
KQAAQ29uZmlndXJhdGlvbnMyL2ltYWdlcy9CaXRtYXBzL1VUBQADPCQDSHV4CwABBPQBAAAE9AEA
AFBLAQIeAwoAAAAAANJbjjgAAAAAAAAAAAAAAAAaABgAAAAAAAAAEADtQWQpAABDb25maWd1cmF0
aW9uczIvc3RhdHVzYmFyL1VUBQADPCQDSHV4CwABBPQBAAAE9AEAAFBLAQIeAxQAAAAIANJbjjhw
NpakxgUAAGUgAAAMABgAAAAAAAEAAACkgbgpAABzZXR0aW5ncy54bWxVVAUAAzwkA0h1eAsAAQT0
AQAABPQBAABQSwECHgMKAAAAAACVVeU8AAAAAAAAAAAAAAAACQAYAAAAAAAAABAA7UHELwAATUVU
QS1JTkYvVVQFAAN5mzFMdXgLAAEE9AEAAAT0AQAAUEsBAh4DFAAAAAgA0luOON1y6J1UAQAArQcA
ABUAGAAAAAAAAQAAAKSBBzAAAE1FVEEtSU5GL21hbmlmZXN0LnhtbFVUBQADPCQDSHV4CwABBPQB
AAAE9AEAAFBLBQYAAAAAFQAVAF0HAACqMQAAAAA=</string> </value>
</item> </item>
<item> <item>
<key> <string>precondition</string> </key> <key> <string>precondition</string> </key>
...@@ -284,7 +286,7 @@ AAAE9AEAAFBLBQYAAAAAFQAVAF0HAACqMQAAAAA=</string> </value> ...@@ -284,7 +286,7 @@ AAAE9AEAAFBLBQYAAAAAFQAVAF0HAACqMQAAAAA=</string> </value>
</item> </item>
<item> <item>
<key> <string>size</string> </key> <key> <string>size</string> </key>
<value> <int>14621</int> </value> <value> <int>14760</int> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="OOoTemplate" module="Products.ERP5OOo.OOoTemplate"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>OLE_documents_zipstring</string> </key>
<value> <string encoding="base64">UEsDBBQAAAAIAK9tYUAJB63McQEAAIcIAAAVAAAATUVUQS1JTkYvbWFuaWZlc3QueG1stZbBTsMw
DIbvPEWVK2oDO6Fq3SSQeILxAF7qdpFSJ0qcaX172oltBQZiY7klkfN/v93EzXy560y2RR+0pUo8
Fg8iQ1K21tRW4m31mj+J5eJu3gHpBgOXh0E27KNwnFYieiotBB1Kgg5Dyaq0Dqm2KnZIXH6OL0fS
4i47CTfaYD4E+j47wbDWkHPvsBLgnNEKePApt1QXe1YxRRSMOxan3ZOsZpPlJhqTO+BNJaSQF3kY
AXJI5LyassSjjTHgMt1pbmtN4PvzBAO9jZwrUBv8B8LXzf2PWRzWiiHqpuUJ3BsMV1Tnd9kOGa4Q
PS+22sRuTaBNkHwYFo7aW4vfRO/FUqPb6PcfNcwkKIUGh6n1UkXvrzuLl7OSAJy3rccQ1pAI0BgL
jKncWxfd0JNiGnm21jggNGnkR+PJ6j56TyauO2gxyGfNHbhE1+yDkUQ7MHC85sx//TuGSOPdL6Iu
1JTxNxu37fvIPLwmjp1/Lr89JhbvUEsBAhQDFAAAAAgAr21hQAkHrcxxAQAAhwgAABUAAAAAAAAA
AAAAAIABAAAAAE1FVEEtSU5GL21hbmlmZXN0LnhtbFBLBQYAAAAAAQABAEMAAACkAQAAAAA=</string> </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_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_text</string> </key>
<value> <unicode encoding="cdata"><![CDATA[
<?xml version=\'1.0\' encoding=\'utf-8\'?>\n
<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:ooo="http://openoffice.org/2004/office" xmlns:metal="http://xml.zope.org/namespaces/metal" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:i18n="http://xml.zope.org/namespaces/i18n" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:tal="http://xml.zope.org/namespaces/tal" office:version="1.2" tal:attributes="dummy python:request.RESPONSE.setHeader(\'Content-Type\', \'text/html;; charset=utf-8\')">\n
<office:meta i18n:domain="ui" tal:define="user context/ERP5Site_getAuthenticatedMemberPersonValue;\n
username python:(user is None) and context.getPortalObject().portal_membership.getAuthenticatedMember() or user.getTitle()">\n
<meta:generator>ERP5</meta:generator>\n
<meta:creation-date tal:content="python:modules[\'DateTime\'].DateTime().ISO8601()">2007-07-04T15:43:50</meta:creation-date>\n
<meta:initial-creator tal:content="username"/>\n
<dc:date>2012-03-01T13:44:50</dc:date>\n
<meta:editing-cycles>1</meta:editing-cycles>\n
<meta:editing-duration>PT16H44M42S</meta:editing-duration>\n
<dc:title tal:content="context/title_or_id" i18n:translate=""/>\n
<dc:creator tal:content="username"/>\n
<meta:document-statistic meta:table-count="2" meta:image-count="0" meta:object-count="0" meta:page-count="2" meta:paragraph-count="33" meta:word-count="141" meta:character-count="1187"/>\n
<meta:user-defined meta:name="Info 1"/>\n
<meta:user-defined meta:name="Info 2"/>\n
<meta:user-defined meta:name="Info 3"/>\n
<meta:user-defined meta:name="Info 4"/>\n
</office:meta>\n
</office:document-meta>
]]></unicode> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/xml</string> </value>
</item>
<item>
<key> <string>expand</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>filename</string> </key>
<value> <string>object/aq_parent/title_or_id</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_getODTMetaStyleSheet</string> </value>
</item>
<item>
<key> <string>ooo_script_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>ooo_stylesheet</string> </key>
<value> <string>Base_getODTStyleSheet</string> </value>
</item>
<item>
<key> <string>ooo_xml_file_id</string> </key>
<value> <string>meta.xml</string> </value>
</item>
<item>
<key> <string>output_encoding</string> </key>
<value> <string>utf-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <unicode></unicode> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<dictionary> <dictionary>
<item> <item>
<key> <string>_EtagSupport__etag</string> </key> <key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts78319162.03</string> </value> <value> <string>ts30609831.57</string> </value>
</item> </item>
<item> <item>
<key> <string>__name__</string> </key> <key> <string>__name__</string> </key>
...@@ -21,261 +21,263 @@ ...@@ -21,261 +21,263 @@
<item> <item>
<key> <string>data</string> </key> <key> <string>data</string> </key>
<value> <string encoding="base64">UEsDBAoAAAAAAI9bjjhexjIMJwAAACcAAAAIABwAbWltZXR5cGVVVAkAA74jA0i+IwNIdXgLAAEE <value> <string encoding="base64">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 Ah4DCgAAAAAA0luOOAAAAAAAAAAAAAAAABoAGAAAAAAAAAAQAO1B7QIAAENvbmZpZ3VyYXRpb25z
AENvbmZpZ3VyYXRpb25zMi9VVAUAA5OZMUx1eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAACSVOU8 Mi9zdGF0dXNiYXIvVVQFAAM8JANIdXgLAAEE9AEAAAT0AQAAUEsBAh4DCgAAAAAAGXZhQAAAAAAA
AAAAAAAAAAAAAAAAHAAYAAAAAAAAABAA7UEfJwAAQ29uZmlndXJhdGlvbnMyL2FjY2VsZXJhdG9y AAAAAAAAABwAGAAAAAAAAAAQAO1BQQMAAENvbmZpZ3VyYXRpb25zMi9hY2NlbGVyYXRvci9VVAUA
L1VUBQADk5kxTHV4CwABBPQBAAAE9AEAAFBLAQIeAwoAAAAAAI9bjjgAAAAAAAAAAAAAAAAnABgA A0F+T091eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAACPW444AAAAAAAAAAAAAAAAJwAYAAAAAAAA
AAAAAAAAAACkgXUnAABDb25maWd1cmF0aW9uczIvYWNjZWxlcmF0b3IvY3VycmVudC54bWxVVAUA AAAApIGXAwAAQ29uZmlndXJhdGlvbnMyL2FjY2VsZXJhdG9yL2N1cnJlbnQueG1sVVQFAAO+IwNI
A74jA0h1eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAACPW444AAAAAAAAAAAAAAAAHAAYAAAAAAAA dXgLAAEE9AEAAAT0AQAAUEsBAh4DCgAAAAAA0luOOAAAAAAAAAAAAAAAABwAGAAAAAAAAAAQAO1B
ABAA7UHWJwAAQ29uZmlndXJhdGlvbnMyL3Byb2dyZXNzYmFyL1VUBQADviMDSHV4CwABBPQBAAAE +AMAAENvbmZpZ3VyYXRpb25zMi9wcm9ncmVzc2Jhci9VVAUAAzwkA0h1eAsAAQT0AQAABPQBAABQ
9AEAAFBLAQIeAwoAAAAAAI9bjjgAAAAAAAAAAAAAAAAYABgAAAAAAAAAEADtQSwoAABDb25maWd1 SwECHgMKAAAAAADSW444AAAAAAAAAAAAAAAAGAAYAAAAAAAAABAA7UFOBAAAQ29uZmlndXJhdGlv
cmF0aW9uczIvZmxvYXRlci9VVAUAA74jA0h1eAsAAQT0AQAABPQBAABQSwECHgMKAAAAAACPW444 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</string> </value> AAAAAACkgTIiAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmdVVAUAA74jA0h1eAsAAQT0AQAABPQB
AABQSwECHgMKAAAAAACPW444fhwWIxIAAAASAAAADAAYAAAAAAAAAAAApIGfMQAAbGF5b3V0LWNh
Y2hlVVQFAAO+IwNIdXgLAAEE9AEAAAT0AQAAUEsFBgAAAAAVABUAXQcAAPcxAAAAAA==</string> </value>
</item> </item>
<item> <item>
<key> <string>precondition</string> </key> <key> <string>precondition</string> </key>
...@@ -283,7 +285,7 @@ AAEE9AEAAAT0AQAAUEsFBgAAAAAVABUAXQcAAHYxAAAAAA==</string> </value> ...@@ -283,7 +285,7 @@ AAEE9AEAAAT0AQAAUEsFBgAAAAAVABUAXQcAAHYxAAAAAA==</string> </value>
</item> </item>
<item> <item>
<key> <string>size</string> </key> <key> <string>size</string> </key>
<value> <int>14569</int> </value> <value> <int>14698</int> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
......
...@@ -237,9 +237,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value> ...@@ -237,9 +237,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>form_list</string> </value> <value> <string>form_list</string> </value>
</item> </item>
<item>
<key> <string>ooo_script_name</string> </key>
<value> <string></string> </value>
</item>
<item> <item>
<key> <string>ooo_stylesheet</string> </key> <key> <string>ooo_stylesheet</string> </key>
<value> <string>Base_getODTStyleSheet</string> </value> <value> <string>Base_getODTMetaStyleSheet</string> </value>
</item>
<item>
<key> <string>ooo_xml_file_id</string> </key>
<value> <string>content.xml</string> </value>
</item> </item>
<item> <item>
<key> <string>output_encoding</string> </key> <key> <string>output_encoding</string> </key>
...@@ -247,7 +255,7 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value> ...@@ -247,7 +255,7 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string></string> </value> <value> <unicode></unicode> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
...@@ -440,9 +440,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value> ...@@ -440,9 +440,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>form_view</string> </value> <value> <string>form_view</string> </value>
</item> </item>
<item>
<key> <string>ooo_script_name</string> </key>
<value> <string></string> </value>
</item>
<item> <item>
<key> <string>ooo_stylesheet</string> </key> <key> <string>ooo_stylesheet</string> </key>
<value> <string>Base_getODTStyleSheet</string> </value> <value> <string>Base_getODTMetaStyleSheet</string> </value>
</item>
<item>
<key> <string>ooo_xml_file_id</string> </key>
<value> <string>content.xml</string> </value>
</item> </item>
<item> <item>
<key> <string>output_encoding</string> </key> <key> <string>output_encoding</string> </key>
......
...@@ -306,9 +306,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value> ...@@ -306,9 +306,17 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value>
<key> <string>id</string> </key> <key> <string>id</string> </key>
<value> <string>report_view</string> </value> <value> <string>report_view</string> </value>
</item> </item>
<item>
<key> <string>ooo_script_name</string> </key>
<value> <string></string> </value>
</item>
<item> <item>
<key> <string>ooo_stylesheet</string> </key> <key> <string>ooo_stylesheet</string> </key>
<value> <string>Base_getODTStyleSheet</string> </value> <value> <string>Base_getODTMetaStyleSheet</string> </value>
</item>
<item>
<key> <string>ooo_xml_file_id</string> </key>
<value> <string>content.xml</string> </value>
</item> </item>
<item> <item>
<key> <string>output_encoding</string> </key> <key> <string>output_encoding</string> </key>
...@@ -316,7 +324,7 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value> ...@@ -316,7 +324,7 @@ bWxQSwUGAAAAAAIAAgCeAAAAhwwAAAAA</string> </value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
<value> <string></string> </value> <value> <unicode></unicode> </value>
</item> </item>
</dictionary> </dictionary>
</pickle> </pickle>
......
117 121
\ No newline at end of file \ No newline at end of file
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
<string>plan</string> <string>plan</string>
<string>order</string> <string>order</string>
<string>validate</string> <string>validate</string>
<string>cancel</string>
</list> </list>
</value> </value>
</item> </item>
......
105 107
\ No newline at end of file \ No newline at end of file
...@@ -324,12 +324,12 @@ function queryStringToArray(query_string){\n ...@@ -324,12 +324,12 @@ function queryStringToArray(query_string){\n
/*\n /*\n
Turn a query string into a "dictionary"\n Turn a query string into a "dictionary"\n
*/\n */\n
var final ={};\n var final_dict = {};\n
var b = query_string.split(\'&\');\n var b = query_string.split(\'&\');\n
$.each(b, function(x, y){\n $.each(b, function(x, y){\n
var temp = y.split(\'=\');\n var temp = y.split(\'=\');\n
final[temp[0]] = temp[1];});\n final_dict[temp[0]] = temp[1];});\n
return final \n return final_dict;\n
}\n }\n
\n \n
function submitLinkAsHtmlForm(event){\n function submitLinkAsHtmlForm(event){\n
......
...@@ -15,6 +15,8 @@ import subprocess ...@@ -15,6 +15,8 @@ import subprocess
import tempfile import tempfile
import json import json
import time import time
import types
import re
class ERP5TestNode(TestCase): class ERP5TestNode(TestCase):
...@@ -24,7 +26,7 @@ class ERP5TestNode(TestCase): ...@@ -24,7 +26,7 @@ class ERP5TestNode(TestCase):
self.slapos_directory = os.path.join(self._temp_dir, 'slapos') self.slapos_directory = os.path.join(self._temp_dir, 'slapos')
self.test_suite_directory = os.path.join(self._temp_dir,'test_suite') self.test_suite_directory = os.path.join(self._temp_dir,'test_suite')
self.environment = os.path.join(self._temp_dir,'environment') self.environment = os.path.join(self._temp_dir,'environment')
self.log_directory = os.path.join(self._temp_dir,'var/log') self.log_directory = os.path.join(self._temp_dir,'var/log/testnode')
self.log_file = os.path.join(self.log_directory,'test.log') self.log_file = os.path.join(self.log_directory,'test.log')
self.remote_repository0 = os.path.join(self._temp_dir, 'rep0') self.remote_repository0 = os.path.join(self._temp_dir, 'rep0')
self.remote_repository1 = os.path.join(self._temp_dir, 'rep1') self.remote_repository1 = os.path.join(self._temp_dir, 'rep1')
...@@ -496,3 +498,90 @@ branch = foo ...@@ -496,3 +498,90 @@ branch = foo
self.assertEquals(True, os.path.exists(to_drop_path)) self.assertEquals(True, os.path.exists(to_drop_path))
createFolder(folder, clean=True) createFolder(folder, clean=True)
self.assertEquals(False, os.path.exists(to_drop_path)) self.assertEquals(False, os.path.exists(to_drop_path))
def test_15_suite_log_directory(self):
def doNothing(self, *args, **kw):
pass
test_self = self
test_result_path_root = os.path.join(test_self._temp_dir,'test/results')
os.makedirs(test_result_path_root)
global counter
counter = 0
def patch_startTestSuite(self,test_node_title):
global counter
config_list = []
if counter == 0:
config_list.append(test_self.getTestSuiteData(reference='aa')[0])
if counter == 1:
config_list.append(test_self.getTestSuiteData(reference='bb')[0])
elif counter == 2:
raise StopIteration
counter += 1
return json.dumps(config_list)
def patch_createTestResult(self, revision, test_name_list, node_title,
allow_restart=False, test_title=None, project_title=None):
test_result_path = os.path.join(test_result_path_root, test_title)
result = TestResultProxy(self._proxy, self._retry_time,
self._logger, test_result_path, node_title, revision)
return result
def checkTestSuite(test_node):
test_node.node_test_suite_dict
rand_part_set = set()
for ref, suite in test_node.node_test_suite_dict.items():
assert(suite.suite_log is not None)
assert(isinstance(suite.suite_log, types.MethodType))
self.assertTrue('var/log/testnode/%s' % suite.reference in \
suite.suite_log_path,
"Incorrect suite log path : %r" % suite.suite_log_path)
assert(suite.suite_log_path.endswith('suite.log'))
m = re.match('.*\-(.*)\/suite.log', suite.suite_log_path)
rand_part = m.groups()[0]
assert(len(rand_part) == 32)
assert(rand_part not in rand_part_set)
rand_part_set.add(rand_part)
original_sleep = time.sleep
time.sleep = doNothing
self.generateTestRepositoryList()
original_startTestSuite = TaskDistributor.startTestSuite
TaskDistributor.startTestSuite = patch_startTestSuite
original_createTestResult = TaskDistributionTool.createTestResult
TaskDistributionTool.createTestResult = patch_createTestResult
test_node = self.getTestNode()
original_prepareSlapOS = test_node._prepareSlapOS
test_node._prepareSlapOS = doNothing
original_runTestSuite = test_node.runTestSuite
test_node.runTestSuite = doNothing
SlapOSControler.initializeSlapOSControler = doNothing
try:
test_node.run()
except Exception as e:
checkTestSuite(test_node)
self.assertEqual(type(e),StopIteration)
finally:
time.sleep = original_sleep
TaskDistributor.startTestSuite = original_startTestSuite
TaskDistributionTool.createTestResult = original_createTestResult
test_node._prepareSlapOS = original_prepareSlapOS
test_node.runTestSuite = original_runTestSuite
def test_16_cleanupLogDirectory(self):
# Make sure that we are able to cleanup old log folders
test_node = self.getTestNode()
def check(file_list):
log_directory_dir = os.listdir(self.log_directory)
self.assertTrue(set(file_list).issubset(
set(log_directory_dir)),
"%r not contained by %r" % (file_list, log_directory_dir))
check([])
os.mkdir(os.path.join(self.log_directory, 'ab-llzje'))
a_file = open(os.path.join(self.log_directory, 'a_file'), 'w')
a_file.close()
check(set(['ab-llzje', 'a_file']))
# default log file time is 15 days, so nothing is going to be deleted
test_node._cleanupLog()
check(set(['ab-llzje', 'a_file']))
# then we set keep time to 0, folder will be deleted
test_node.max_log_time = 0
test_node._cleanupLog()
check(set(['a_file']))
\ No newline at end of file
...@@ -347,7 +347,8 @@ class TestResultProxy(RPCRetry): ...@@ -347,7 +347,8 @@ class TestResultProxy(RPCRetry):
with cond: with cond:
self._watcher_can_run = False self._watcher_can_run = False
cond.notify() cond.notify()
self._watcher_thread.join() if self._watcher_thread is not None:
self._watcher_thread.join()
class ServerProxy(xmlrpclib.ServerProxy): class ServerProxy(xmlrpclib.ServerProxy):
......
...@@ -142,6 +142,9 @@ class ProcessManager(object): ...@@ -142,6 +142,9 @@ class ProcessManager(object):
get_output = kw.pop('get_output', True) get_output = kw.pop('get_output', True)
log_prefix = kw.pop('log_prefix', '') log_prefix = kw.pop('log_prefix', '')
new_session = kw.pop('new_session', True) new_session = kw.pop('new_session', True)
log = kw.pop('log', None)
if log is None:
log = self.log
subprocess_kw = {} subprocess_kw = {}
cwd = kw.pop('cwd', None) cwd = kw.pop('cwd', None)
if cwd: if cwd:
...@@ -151,15 +154,15 @@ class ProcessManager(object): ...@@ -151,15 +154,15 @@ class ProcessManager(object):
raise_error_if_fail = kw.pop('raise_error_if_fail', True) raise_error_if_fail = kw.pop('raise_error_if_fail', True)
env = kw and dict(os.environ, **kw) or None env = kw and dict(os.environ, **kw) or None
command = format_command(*args, **kw) command = format_command(*args, **kw)
self.log('subprocess_kw : %r' % (subprocess_kw,)) log('subprocess_kw : %r' % (subprocess_kw,))
self.log('$ ' + command) log('$ ' + command)
sys.stdout.flush() sys.stdout.flush()
p = subprocess.Popen(args, stdin=self.stdin, stdout=subprocess.PIPE, p = subprocess.Popen(args, stdin=self.stdin, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env, **subprocess_kw) stderr=subprocess.PIPE, env=env, **subprocess_kw)
self.process_pid_set.add(p.pid) self.process_pid_set.add(p.pid)
timer = threading.Timer(self.max_timeout, timeoutExpired, args=(p, self.log)) timer = threading.Timer(self.max_timeout, timeoutExpired, args=(p, log))
timer.start() timer.start()
stdout, stderr = subprocess_capture(p, self.log, log_prefix, stdout, stderr = subprocess_capture(p, log, log_prefix,
get_output=get_output) get_output=get_output)
timer.cancel() timer.cancel()
result = dict(status_code=p.returncode, command=command, result = dict(status_code=p.returncode, command=command,
......
...@@ -42,6 +42,10 @@ def createFolder(folder, clean=False): ...@@ -42,6 +42,10 @@ def createFolder(folder, clean=False):
if not(os.path.exists(folder)): if not(os.path.exists(folder)):
os.mkdir(folder) os.mkdir(folder)
def createFolders(folder):
if not(os.path.exists(folder)):
os.makedirs(folder)
class SlapOSControler(object): class SlapOSControler(object):
def __init__(self, working_directory, config, log): def __init__(self, working_directory, config, log):
......
...@@ -75,7 +75,7 @@ def main(*args): ...@@ -75,7 +75,7 @@ def main(*args):
'git_binary','zip_binary','node_quantity','test_node_title', 'git_binary','zip_binary','node_quantity','test_node_title',
'ipv4_address','ipv6_address','test_suite_master_url', 'ipv4_address','ipv6_address','test_suite_master_url',
'slapgrid_partition_binary','slapgrid_software_binary', 'slapgrid_partition_binary','slapgrid_software_binary',
'slapproxy_binary'): 'slapproxy_binary', 'httpd_ip', 'httpd_port'):
CONFIG[key] = config.get('testnode',key) CONFIG[key] = config.get('testnode',key)
for key in ('slapos_directory', 'working_directory', 'test_suite_directory', for key in ('slapos_directory', 'working_directory', 'test_suite_directory',
...@@ -85,6 +85,8 @@ def main(*args): ...@@ -85,6 +85,8 @@ def main(*args):
raise ValueError('Directory %r does not exists.' % d) raise ValueError('Directory %r does not exists.' % d)
CONFIG['master_url'] = 'http://%s:%s' % (CONFIG['proxy_host'], CONFIG['master_url'] = 'http://%s:%s' % (CONFIG['proxy_host'],
CONFIG['proxy_port']) CONFIG['proxy_port'])
CONFIG['httpd_url'] = 'https://[%s]:%s' % (CONFIG['httpd_ip'],
CONFIG['httpd_port'])
# generate vcs_repository_list # generate vcs_repository_list
if 'bot_environment' in config.sections(): if 'bot_environment' in config.sections():
......
...@@ -34,12 +34,17 @@ import SlapOSControler ...@@ -34,12 +34,17 @@ import SlapOSControler
import json import json
import time import time
import shutil import shutil
import logging
import string
import random
from ProcessManager import SubprocessError, ProcessManager, CancellationError from ProcessManager import SubprocessError, ProcessManager, CancellationError
from subprocess import CalledProcessError from subprocess import CalledProcessError
from Updater import Updater from Updater import Updater
from erp5.util import taskdistribution from erp5.util import taskdistribution
DEFAULT_SLEEP_TIMEOUT = 120 # time in seconds to sleep DEFAULT_SLEEP_TIMEOUT = 120 # time in seconds to sleep
MAX_LOG_TIME = 15 # time in days we should keep logs that we can see through
# httd
supervisord_pid_file = None supervisord_pid_file = None
PROFILE_PATH_KEY = 'profile_path' PROFILE_PATH_KEY = 'profile_path'
...@@ -106,17 +111,49 @@ class NodeTestSuite(SlapOSInstance): ...@@ -106,17 +111,49 @@ class NodeTestSuite(SlapOSInstance):
vcs_repository['repository_id'] = repository_id vcs_repository['repository_id'] = repository_id
vcs_repository['repository_path'] = repository_path vcs_repository['repository_path'] = repository_path
def createSuiteLog(self):
# /srv/slapgrid/slappartXX/srv/var/log/testnode/az-mlksjfmlk234Sljssdflkj23KSdfslj/suite.log
alphabets = string.digits + string.letters
rand_part = ''.join(random.choice(alphabets) for i in xrange(32))
random_suite_folder_id = '%s-%s' % (self.reference, rand_part)
suite_log_directory = os.path.join(self.log_directory,
random_suite_folder_id)
SlapOSControler.createFolders(suite_log_directory)
self.suite_log_path = os.path.join(suite_log_directory,
'suite.log')
self._initializeSuiteLog()
return self.getSuiteLogPath(), random_suite_folder_id
def getSuiteLogPath(self):
return getattr(self,"suite_log_path", None)
def getSuiteLog(self):
return getattr(self, "suite_log", None)
def _initializeSuiteLog(self):
logger_format = '%(asctime)s %(name)-13s: %(levelname)-8s %(message)s'
formatter = logging.Formatter(logger_format)
logging.basicConfig(level=logging.INFO, format=logger_format)
logger = logging.getLogger('testsuite')
file_handler = logging.FileHandler(filename=self.suite_log_path)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info('Activated logfile %r output' % self.suite_log_path)
self.suite_log = logger.info
class TestNode(object): class TestNode(object):
def __init__(self, log, config): def __init__(self, log, config, max_log_time=MAX_LOG_TIME):
self.testnode_log = log
self.log = log self.log = log
self.config = config or {} self.config = config or {}
self.process_manager = ProcessManager(log) self.process_manager = ProcessManager(log)
self.node_test_suite_dict = {} self.node_test_suite_dict = {}
# hack until slapos.cookbook is updated # hack until slapos.cookbook is updated
if self.config.get('working_directory', '').endswith("slapos/"): if self.config.get('working_directory', '').endswith("slapos"):
self.config['working_directory'] = self.config[ self.config['working_directory'] = self.config[
'working_directory'][:-(len("slapos/"))] + "testnode" 'working_directory'][:-(len("slapos"))] + "testnode"
self.max_log_time = max_log_time
def checkOldTestSuite(self,test_suite_data): def checkOldTestSuite(self,test_suite_data):
config = self.config config = self.config
...@@ -206,19 +243,27 @@ branch = %(branch)s ...@@ -206,19 +243,27 @@ branch = %(branch)s
node_test_suite.revision = ','.join(full_revision_list) node_test_suite.revision = ','.join(full_revision_list)
return full_revision_list return full_revision_list
def addWatcher(self,test_result): def registerSuiteLog(self, test_result, node_test_suite):
config = self.config """
if config.get('log_file'): Create a log dedicated for the test suite,
log_file_name = config['log_file'] and register the url to master node.
log_file = open(log_file_name) """
log_file.seek(0, 2) log_file_name, folder_id = node_test_suite.createSuiteLog()
log_file.seek(-min(5000, log_file.tell()), 2) if log_file_name is None and config.get('log_file'):
test_result.addWatch(log_file_name,log_file,max_history_bytes=10000) log_file_name = config['log_file']
return log_file_name # TODO make the path into url
test_result.reportStatus('LOG url', "%s/%s" % (self.config.get('httpd_url'),
folder_id), '')
self.log("going to switch to log %r" % log_file_name)
log = node_test_suite.getSuiteLog()
self.process_manager.log = self.log = log
return log_file_name
def checkRevision(self, test_result, node_test_suite): def checkRevision(self, test_result, node_test_suite):
config = self.config config = self.config
log = self.log log = node_test_suite.getSuiteLog()
if log is None:
log = self.log
if node_test_suite.revision != test_result.revision: if node_test_suite.revision != test_result.revision:
log('Disagreement on tested revision, checking out: %r' % ( log('Disagreement on tested revision, checking out: %r' % (
(node_test_suite.revision,test_result.revision),)) (node_test_suite.revision,test_result.revision),))
...@@ -235,19 +280,19 @@ branch = %(branch)s ...@@ -235,19 +280,19 @@ branch = %(branch)s
updater.checkout() updater.checkout()
node_test_suite.revision = test_result.revision node_test_suite.revision = test_result.revision
def _prepareSlapOS(self, working_directory, slapos_instance, def _prepareSlapOS(self, working_directory, slapos_instance, log,
create_partition=1, software_path_list=None, **kw): create_partition=1, software_path_list=None, **kw):
""" """
Launch slapos to build software and partitions Launch slapos to build software and partitions
""" """
slapproxy_log = os.path.join(self.config['log_directory'], slapproxy_log = os.path.join(self.config['log_directory'],
'slapproxy.log') 'slapproxy.log')
self.log('Configured slapproxy log to %r' % slapproxy_log) log('Configured slapproxy log to %r' % slapproxy_log)
reset_software = slapos_instance.retry_software_count > 10 reset_software = slapos_instance.retry_software_count > 10
self.log('testnode, retry_software_count : %r' % \ log('testnode, retry_software_count : %r' % \
slapos_instance.retry_software_count) slapos_instance.retry_software_count)
self.slapos_controler = SlapOSControler.SlapOSControler( self.slapos_controler = SlapOSControler.SlapOSControler(
working_directory, self.config, self.log) working_directory, self.config, log)
self.slapos_controler.initializeSlapOSControler(slapproxy_log=slapproxy_log, self.slapos_controler.initializeSlapOSControler(slapproxy_log=slapproxy_log,
process_manager=self.process_manager, reset_software=reset_software, process_manager=self.process_manager, reset_software=reset_software,
software_path_list=software_path_list) software_path_list=software_path_list)
...@@ -275,12 +320,15 @@ branch = %(branch)s ...@@ -275,12 +320,15 @@ branch = %(branch)s
like the building of selenium-runner by default like the building of selenium-runner by default
""" """
return self._prepareSlapOS(self.config['slapos_directory'], return self._prepareSlapOS(self.config['slapos_directory'],
test_node_slapos, create_partition=0, test_node_slapos, self.log, create_partition=0,
software_path_list=self.config.get("software_list")) software_path_list=self.config.get("software_list"))
def prepareSlapOSForTestSuite(self, node_test_suite): def prepareSlapOSForTestSuite(self, node_test_suite):
log = node_test_suite.getSuiteLog()
if log is None:
log = self.log
return self._prepareSlapOS(node_test_suite.working_directory, return self._prepareSlapOS(node_test_suite.working_directory,
node_test_suite, node_test_suite, log,
software_path_list=[node_test_suite.custom_profile_path]) software_path_list=[node_test_suite.custom_profile_path])
def _dealShebang(self,run_test_suite_path): def _dealShebang(self,run_test_suite_path):
...@@ -290,7 +338,7 @@ branch = %(branch)s ...@@ -290,7 +338,7 @@ branch = %(branch)s
invocation_list = line[2:].split() invocation_list = line[2:].split()
return invocation_list return invocation_list
def runTestSuite(self, node_test_suite, portal_url): def runTestSuite(self, node_test_suite, portal_url, log=None):
config = self.config config = self.config
parameter_list = [] parameter_list = []
run_test_suite_path_list = glob.glob("%s/*/bin/runTestSuite" % \ run_test_suite_path_list = glob.glob("%s/*/bin/runTestSuite" % \
...@@ -333,15 +381,22 @@ branch = %(branch)s ...@@ -333,15 +381,22 @@ branch = %(branch)s
cwd=node_test_suite.test_suite_directory, cwd=node_test_suite.test_suite_directory,
log_prefix='runTestSuite', get_output=False) log_prefix='runTestSuite', get_output=False)
def _cleanupLog(self):
config = self.config
log_directory = self.config['log_directory']
now = time.time()
for log_folder in os.listdir(log_directory):
folder_path = os.path.join(log_directory, log_folder)
if os.path.isdir(folder_path):
if (now - os.stat(folder_path).st_mtime)/86400 > self.max_log_time:
self.log("deleting log directory %r" % (folder_path,))
shutil.rmtree(folder_path)
def cleanUp(self,test_result): def cleanUp(self,test_result):
log = self.log log = self.log
log('Testnode.cleanUp') log('Testnode.cleanUp')
self.process_manager.killPreviousRun() self.process_manager.killPreviousRun()
if test_result is not None: self._cleanupLog()
try:
test_result.removeWatch(self.config['log_file'])
except KeyError:
log("KeyError, Watcher already deleted or not added correctly")
def run(self): def run(self):
log = self.log log = self.log
...@@ -355,6 +410,7 @@ branch = %(branch)s ...@@ -355,6 +410,7 @@ branch = %(branch)s
try: try:
while True: while True:
try: try:
self.log = self.process_manager.log = self.testnode_log
self.cleanUp(None) self.cleanUp(None)
remote_test_result_needs_cleanup = False remote_test_result_needs_cleanup = False
begin = time.time() begin = time.time()
...@@ -373,7 +429,8 @@ branch = %(branch)s ...@@ -373,7 +429,8 @@ branch = %(branch)s
node_test_suite = self.getNodeTestSuite( node_test_suite = self.getNodeTestSuite(
test_suite["test_suite_reference"]) test_suite["test_suite_reference"])
node_test_suite.edit( node_test_suite.edit(
working_directory=self.config['working_directory']) working_directory=self.config['working_directory'],
log_directory=self.config['log_directory'])
node_test_suite.edit(**test_suite) node_test_suite.edit(**test_suite)
run_software = True run_software = True
# Write our own software.cfg to use the local repository # Write our own software.cfg to use the local repository
...@@ -389,7 +446,7 @@ branch = %(branch)s ...@@ -389,7 +446,7 @@ branch = %(branch)s
remote_test_result_needs_cleanup = True remote_test_result_needs_cleanup = True
log("testnode, test_result : %r" % (test_result, )) log("testnode, test_result : %r" % (test_result, ))
if test_result is not None: if test_result is not None:
log_file_name = self.addWatcher(test_result) self.registerSuiteLog(test_result, node_test_suite)
self.checkRevision(test_result,node_test_suite) self.checkRevision(test_result,node_test_suite)
# Now prepare the installation of SlapOS and create instance # Now prepare the installation of SlapOS and create instance
status_dict = self.prepareSlapOSForTestSuite(node_test_suite) status_dict = self.prepareSlapOSForTestSuite(node_test_suite)
...@@ -398,7 +455,6 @@ branch = %(branch)s ...@@ -398,7 +455,6 @@ branch = %(branch)s
# a reliable way to check if they are up or not ... # a reliable way to check if they are up or not ...
time.sleep(20) time.sleep(20)
self.runTestSuite(node_test_suite,portal_url) self.runTestSuite(node_test_suite,portal_url)
test_result.removeWatch(log_file_name)
# break the loop to get latest priorities from master # break the loop to get latest priorities from master
break break
self.cleanUp(test_result) self.cleanUp(test_result)
...@@ -430,6 +486,8 @@ branch = %(branch)s ...@@ -430,6 +486,8 @@ branch = %(branch)s
sleep_time = 120 - (now-begin) sleep_time = 120 - (now-begin)
log("End of processing, going to sleep %s" % sleep_time) log("End of processing, going to sleep %s" % sleep_time)
time.sleep(sleep_time) time.sleep(sleep_time)
except:
log("Exception in error handling", exc_info=sys.exc_info())
finally: finally:
# Nice way to kill *everything* generated by run process -- process # Nice way to kill *everything* generated by run process -- process
# groups working only in POSIX compilant systems # groups working only in POSIX compilant systems
......
...@@ -729,11 +729,11 @@ class Amount(Base, VariatedMixin): ...@@ -729,11 +729,11 @@ class Amount(Base, VariatedMixin):
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'getQuantityUnit') 'getQuantityUnit')
def getQuantityUnit(self): def getQuantityUnit(self, checked_permission=None):
result = self._getDefaultCategoryMembership('quantity_unit') result = self._getDefaultCategoryMembership('quantity_unit', checked_permission=checked_permission)
if result is None: if result is None:
resource = self.getResourceValue() resource = self.getResourceValue()
if resource is not None: if resource is not None:
result = resource.getQuantityUnit() result = resource.getQuantityUnit(checked_permission=checked_permission)
return result return result
...@@ -143,23 +143,23 @@ class BudgetCell(Predicate, MetaNode, Movement): ...@@ -143,23 +143,23 @@ class BudgetCell(Predicate, MetaNode, Movement):
'setSourceCredit') 'setSourceCredit')
def setSourceCredit(self, source_credit): def setSourceCredit(self, source_credit):
"""Set the quantity. """Set the quantity.
Overloaded from movement, we always set the quantity, if not passed Overloaded from movement, we always set the quantity, even if not passed
""" """
try: try:
source_credit = float(source_credit) source_credit = float(source_credit)
except TypeError: except TypeError:
source_credit = 0.0 source_credit = 0.0
self.setQuantity(source_credit) Movement.setSourceCredit(self, source_credit)
def setSourceDebit(self, source_debit): def setSourceDebit(self, source_debit):
"""Set the quantity. """Set the quantity.
Overloaded from movement, we always set the quantity, if not passed Overloaded from movement, we always set the quantity, even if not passed
""" """
try: try:
source_debit = float(source_debit) source_debit = float(source_debit)
except TypeError: except TypeError:
source_debit = 0.0 source_debit = 0.0
self.setQuantity(-source_debit) Movement.setSourceDebit(self, source_debit)
security.declareProtected( Permissions.ModifyPortalContent, security.declareProtected( Permissions.ModifyPortalContent,
'setDestinationDebit', 'setDestinationCredit' ) 'setDestinationDebit', 'setDestinationCredit' )
......
...@@ -181,7 +181,11 @@ class Delivery(XMLObject, ImmobilisationDelivery, SimulableMixin, ...@@ -181,7 +181,11 @@ class Delivery(XMLObject, ImmobilisationDelivery, SimulableMixin,
'getTotalNetPrice') 'getTotalNetPrice')
def getTotalNetPrice(self, fast=0, src__=0, **kw): def getTotalNetPrice(self, fast=0, src__=0, **kw):
""" """
Same as getTotalPrice, but including Tax and Discount. Same as getTotalPrice, but including Tax and Discount (from legacy
simulation).
This method is deprecated because it uses deprecated Tax & Discount
portal types. You should use getTotalPrice(base_contribution=) instead.
""" """
total_price = self.getTotalPrice(fast=fast, src__=src__, **kw) total_price = self.getTotalPrice(fast=fast, src__=src__, **kw)
kw['portal_type'] = self.getPortalTaxMovementTypeList() kw['portal_type'] = self.getPortalTaxMovementTypeList()
......
...@@ -186,5 +186,5 @@ class DeliveryCell(MappedValue, Movement, ImmobilisationMovement): ...@@ -186,5 +186,5 @@ class DeliveryCell(MappedValue, Movement, ImmobilisationMovement):
security.declareProtected( Permissions.AccessContentsInformation, security.declareProtected( Permissions.AccessContentsInformation,
'getQuantityUnit') 'getQuantityUnit')
def getQuantityUnit(self): def getQuantityUnit(self, checked_permission=None):
return self.getParentValue().getQuantityUnit() return self.getParentValue().getQuantityUnit(checked_permission=checked_permission)
...@@ -128,7 +128,7 @@ class Image(TextConvertableMixin, File, OFSImage): ...@@ -128,7 +128,7 @@ class Image(TextConvertableMixin, File, OFSImage):
width, height = header[1:] width, height = header[1:]
self.height = height self.height = height
self.width = width self.width = width
self._setContentType(content_type) self._setContentType(content_type or 'application/unknown')
def _upradeImage(self): def _upradeImage(self):
""" """
...@@ -150,9 +150,9 @@ class Image(TextConvertableMixin, File, OFSImage): ...@@ -150,9 +150,9 @@ class Image(TextConvertableMixin, File, OFSImage):
self.data = self._data self.data = self._data
# Make sure size is defined # Make sure size is defined
if (not hasattr(aq_base(self), 'size') or not self.size) and \ size = len(self.data)
hasattr(aq_base(self), 'data'): if getattr(aq_base(self), 'size', None) != size:
self.size = len(self.data) self.size = size
security.declareProtected(Permissions.AccessContentsInformation, 'getWidth') security.declareProtected(Permissions.AccessContentsInformation, 'getWidth')
def getWidth(self): def getWidth(self):
......
...@@ -291,7 +291,7 @@ class Resource(XMLObject, XMLMatrix, VariatedMixin): ...@@ -291,7 +291,7 @@ class Resource(XMLObject, XMLMatrix, VariatedMixin):
if context is None: if context is None:
transformation_list = self.portal_catalog( transformation_list = self.portal_catalog(
portal_type="Transformation", portal_type="Transformation",
resource_relative_url=self.getRelativeUrl(), default_resource_uid=self.getUid(),
sort_on=[('version', 'descending')], sort_on=[('version', 'descending')],
limit=1 limit=1
) )
......
...@@ -221,11 +221,11 @@ class SubscriptionItem(Item, CompositionMixin, MovementGeneratorMixin, ...@@ -221,11 +221,11 @@ class SubscriptionItem(Item, CompositionMixin, MovementGeneratorMixin,
return None return None
return open_order_line.getQuantity() return open_order_line.getQuantity()
def getQuantityUnit(self): def getQuantityUnit(self, checked_permission=None):
open_order_line = self.getAggregateRelatedValue(portal_type='Open Sale Order Line') open_order_line = self.getAggregateRelatedValue(portal_type='Open Sale Order Line')
if open_order_line is None: if open_order_line is None:
return None return None
return open_order_line.getQuantityUnit() return open_order_line.getQuantityUnit(checked_permission=checked_permission)
def getPrice(self): def getPrice(self):
open_order_line = self.getAggregateRelatedValue(portal_type='Open Sale Order Line') open_order_line = self.getAggregateRelatedValue(portal_type='Open Sale Order Line')
......
...@@ -76,5 +76,5 @@ class SupplyCell(Path): ...@@ -76,5 +76,5 @@ class SupplyCell(Path):
security.declareProtected( Permissions.AccessContentsInformation, security.declareProtected( Permissions.AccessContentsInformation,
'getQuantityUnit') 'getQuantityUnit')
def getQuantityUnit(self): def getQuantityUnit(self, checked_permission=None):
return self.getParentValue().getQuantityUnit() return self.getParentValue().getQuantityUnit(checked_permission=checked_permission)
...@@ -282,6 +282,14 @@ class NotificationTool(BaseTool): ...@@ -282,6 +282,14 @@ class NotificationTool(BaseTool):
catalog_tool = getToolByName(self, 'portal_catalog') catalog_tool = getToolByName(self, 'portal_catalog')
if portal_type_list is None: if portal_type_list is None:
portal_type_list = ('Person',) portal_type_list = ('Person',)
if notifier_list is None:
# XXX TODO: Use priority_level. Need to implement default notifier query system.
# XXX For now, we use 'Mail Message'.
notifier_list = ['Mail Message']
if not isinstance(notifier_list, (tuple, list)):
raise TypeError("Notifier list must be a list of portal types")
# Find "From" Person # Find "From" Person
from_person = None from_person = None
if isinstance(sender, basestring): if isinstance(sender, basestring):
...@@ -333,10 +341,6 @@ class NotificationTool(BaseTool): ...@@ -333,10 +341,6 @@ class NotificationTool(BaseTool):
# Make event # Make event
available_notifier_list = self.getNotifierList() available_notifier_list = self.getNotifierList()
event_list = [] event_list = []
if notifier_list is None:
# XXX TODO: Use priority_level. Need to implement default notifier query system.
# XXX For now, we use 'Mail Message'.
notifier_list = ['Mail Message']
if event_keyword_argument_dict is None: if event_keyword_argument_dict is None:
event_keyword_argument_dict = {} event_keyword_argument_dict = {}
for notifier in notifier_list: for notifier in notifier_list:
......
...@@ -109,6 +109,9 @@ def initialize( context ): ...@@ -109,6 +109,9 @@ def initialize( context ):
ModuleSecurityInfo('Products.ERP5.Document.Image').declarePublic( ModuleSecurityInfo('Products.ERP5.Document.Image').declarePublic(
'getSizeFromImageDisplay') 'getSizeFromImageDisplay')
# Make sure InteactionWorkflow is visible in UI
import Products.ERP5.InteractionWorkflow
# backward compatibility names # backward compatibility names
XML = None XML = None
UI = None UI = None
...@@ -39,7 +39,9 @@ ...@@ -39,7 +39,9 @@
</item> </item>
<item> <item>
<key> <string>description</string> </key> <key> <string>description</string> </key>
<value> <string></string> </value> <value>
<none/>
</value>
</item> </item>
<item> <item>
<key> <string>factory</string> </key> <key> <string>factory</string> </key>
...@@ -47,7 +49,7 @@ ...@@ -47,7 +49,7 @@
</item> </item>
<item> <item>
<key> <string>filter_content_types</string> </key> <key> <string>filter_content_types</string> </key>
<value> <int>1</int> </value> <value> <int>0</int> </value>
</item> </item>
<item> <item>
<key> <string>group_list</string> </key> <key> <string>group_list</string> </key>
...@@ -61,11 +63,15 @@ ...@@ -61,11 +63,15 @@
</item> </item>
<item> <item>
<key> <string>init_script</string> </key> <key> <string>init_script</string> </key>
<value> <string></string> </value> <value>
<none/>
</value>
</item> </item>
<item> <item>
<key> <string>permission</string> </key> <key> <string>permission</string> </key>
<value> <string></string> </value> <value>
<none/>
</value>
</item> </item>
<item> <item>
<key> <string>title</string> </key> <key> <string>title</string> </key>
...@@ -75,6 +81,18 @@ ...@@ -75,6 +81,18 @@
<key> <string>type_class</string> </key> <key> <string>type_class</string> </key>
<value> <string>SessionTool</string> </value> <value> <string>SessionTool</string> </value>
</item> </item>
<item>
<key> <string>type_interface</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>type_mixin</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary> </dictionary>
</pickle> </pickle>
</record> </record>
......
...@@ -63,6 +63,8 @@ def escape(data):\n ...@@ -63,6 +63,8 @@ def escape(data):\n
data = data.replace("<", "&lt;")\n data = data.replace("<", "&lt;")\n
return data\n return data\n
\n \n
from pprint import pformat\n
\n
ret = \'<html><body><table width=100%>\\n\'\n ret = \'<html><body><table width=100%>\\n\'\n
\n \n
dict = context.showDict().items()\n dict = context.showDict().items()\n
...@@ -74,7 +76,7 @@ for k,v in dict:\n ...@@ -74,7 +76,7 @@ for k,v in dict:\n
else:\n else:\n
c = \'#dddd88\'\n c = \'#dddd88\'\n
i += 1\n i += 1\n
ret += \'<tr bgcolor="%s"><td >%s</td><td>%s</td></tr>\\n\' % (escape(c), escape(k), escape(repr(v)))\n ret += \'<tr bgcolor="%s"><td >%s</td><td><pre>%s</pre></td></tr>\\n\' % (escape(c), escape(k), escape(pformat(v)))\n
\n \n
ret += \'</table></body></html>\\n\'\n ret += \'</table></body></html>\\n\'\n
\n \n
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Use_Database_Methods_Permission</string> </key>
<value>
<list>
<string>Member</string>
</list>
</value>
</item>
<item>
<key> <string>allow_simple_one_argument_traversal</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>query\r\n
resource_uid:list\r\n
from_date\r\n
at_date\r\n
to_date\r\n
omit_simulation\r\n
omit_input\r\n
omit_output\r\n
simulation_state:list\r\n
section_category\r\n
selection_domain\r\n
selection_report\r\n
closed_summary\r\n
where_expression\r\n
from_table_list\r\n
selection_uids:list</string> </value>
</item>
<item>
<key> <string>cache_time_</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>class_file_</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>class_name_</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>connection_hook</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Resource_zStatInventory</string> </value>
</item>
<item>
<key> <string>max_cache_</string> </key>
<value> <int>100</int> </value>
</item>
<item>
<key> <string>max_rows_</string> </key>
<value> <int>1000</int> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
SELECT\n
IFNULL(COUNT(DISTINCT stock.uid), 0) AS count,\n
IFNULL(SUM(stock.quantity), 0.00) AS quantity,\n
IFNULL(SUM(stock.total_price), 0.00) AS total_price\n
\n
FROM\n
<dtml-unless from_table_list>\n
catalog,\n
</dtml-unless>\n
catalog AS child,\n
stock,\n
catalog AS node\n
<dtml-if section_category>\n
, catalog AS section_c\n
, catalog AS section_bc\n
, category AS section_membership\n
, catalog AS section\n
</dtml-if>\n
<dtml-if query>\n
, category\n
</dtml-if>\n
<dtml-if from_table_list>\n
<dtml-in from_table_list>\n
, <dtml-var sequence-item> AS <dtml-var sequence-key>\n
</dtml-in>\n
</dtml-if>\n
<dtml-if selection_domain>, <dtml-var "portal_selections.buildSQLJoinExpressionFromDomainSelection(selection_domain)"> </dtml-if>\n
<dtml-if selection_report>, <dtml-var "portal_selections.buildSQLJoinExpressionFromDomainSelection(selection_report)"> </dtml-if>\n
\n
WHERE\n
child.uid = stock.uid\n
AND catalog.uid = stock.node_uid\n
<dtml-if where_expression> AND <dtml-var where_expression></dtml-if>\n
<dtml-if resource_uid>\n
AND\n
(\n
<dtml-in resource_uid>\n
stock.resource_uid = <dtml-sqlvar sequence-item type="int">\n
<dtml-if sequence-end><dtml-else> OR </dtml-if>\n
</dtml-in>\n
)\n
</dtml-if>\n
AND node.uid = stock.node_uid\n
<dtml-if from_date>\n
AND stock.date >= <dtml-sqlvar from_date type="datetime">\n
</dtml-if>\n
<dtml-if at_date>\n
AND stock.date <= <dtml-sqlvar at_date type="datetime">\n
</dtml-if>\n
<dtml-if to_date>\n
AND stock.date < <dtml-sqlvar to_date type="datetime">\n
</dtml-if>\n
<dtml-if omit_simulation>\n
AND catalog.portal_type != \'Simulation Movement\'\n
</dtml-if>\n
<dtml-if omit_input>\n
AND stock.quantity < 0\n
AND (stock.node_uid <> stock.mirror_node_uid\n
OR stock.section_uid <> stock.mirror_section_uid\n
OR stock.mirror_node_uid IS NULL\n
OR stock.mirror_section_uid IS NULL\n
OR stock.payment_uid IS NOT NULL\n
)\n
</dtml-if>\n
<dtml-if omit_output>\n
AND stock.quantity > 0\n
AND (stock.node_uid <> stock.mirror_node_uid\n
OR stock.section_uid <> stock.mirror_section_uid\n
OR stock.mirror_node_uid IS NULL\n
OR stock.mirror_section_uid IS NULL\n
OR stock.payment_uid IS NOT NULL\n
)\n
</dtml-if>\n
<dtml-if simulation_state>\n
AND\n
(\n
<dtml-in simulation_state>\n
stock.simulation_state = <dtml-sqlvar sequence-item type="string">\n
<dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>\n
)\n
</dtml-if>\n
<dtml-if section_category>\n
AND section.uid = stock.section_uid\n
AND section_c.relative_url = <dtml-sqlvar section_category type="string">\n
AND section_membership.category_uid = section_c.uid\n
AND section_membership.base_category_uid = section_bc.uid\n
AND section_membership.uid = section.uid\n
</dtml-if>\n
<dtml-if query>\n
AND category.uid = node.uid\n
AND <dtml-var query>\n
</dtml-if>\n
\n
<dtml-if selection_domain>\n
AND <dtml-var "portal_selections.buildSQLExpressionFromDomainSelection(selection_domain)">\n
</dtml-if>\n
<dtml-if selection_report>\n
AND <dtml-var "portal_selections.buildSQLExpressionFromDomainSelection(selection_report)">\n
</dtml-if>\n
<dtml-if selection_uids>\n
AND\n
(\n
<dtml-in selection_uids>\n
node.uid = <dtml-sqlvar sequence-item type="int">\n
<dtml-if sequence-end><dtml-else> OR </dtml-if></dtml-in>\n
)\n
</dtml-if>\n
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
...@@ -474,6 +474,7 @@ ...@@ -474,6 +474,7 @@
<!-- Data cells -->\n <!-- Data cells -->\n
<tal:block tal:repeat="value render_result">\n <tal:block tal:repeat="value render_result">\n
<td class="listbox-table-data-cell"\n <td class="listbox-table-data-cell"\n
tal:attributes="class python: line.isSummary() and \'listbox-table-summary-cell\' or \'listbox-table-data-cell\'"\n
tal:define="html python: value[0];">\n tal:define="html python: value[0];">\n
<input tal:condition="not: repeat/value/index"\n <input tal:condition="not: repeat/value/index"\n
type="hidden" value="1" name="listbox_uid:list"\n type="hidden" value="1" name="listbox_uid:list"\n
......
...@@ -561,7 +561,8 @@ div.listbox-list-style-selection li a{\n ...@@ -561,7 +561,8 @@ div.listbox-list-style-selection li a{\n
div.listbox-list-style-selection li a.selected,\n div.listbox-list-style-selection li a.selected,\n
.listbox-table-report-tree-selection-cell a.selected,\n .listbox-table-report-tree-selection-cell a.selected,\n
.listbox-table-domain-tree-cell a.selected,\n .listbox-table-domain-tree-cell a.selected,\n
.listbox-page-navigation-text a.selected{\n .listbox-page-navigation-text a.selected,\n
table.listbox td.listbox-table-summary-cell {\n
font-weight: bold;\n font-weight: bold;\n
}\n }\n
\n \n
...@@ -768,6 +769,11 @@ table.listbox input.listbox-select-action{\n ...@@ -768,6 +769,11 @@ table.listbox input.listbox-select-action{\n
display:block;\n display:block;\n
}\n }\n
\n \n
.listbox-table-summary-cell > .figure{\n
float:right;\n
display:block;\n
}\n
\n
table.listbox th button{\n table.listbox th button{\n
border-width:0;\n border-width:0;\n
cursor:pointer;\n cursor:pointer;\n
......
...@@ -1357,7 +1357,9 @@ class TestBudget(ERP5TypeTestCase): ...@@ -1357,7 +1357,9 @@ class TestBudget(ERP5TypeTestCase):
self.assertEquals({ self.assertEquals({
'from_date': None, 'from_date': None,
'simulation_state': ('delivered', 'stopped'), 'simulation_state': ('delivered', 'stopped', 'started'),
'transit_simulation_state': ('started', ),
'omit_transit': False,
# XXX order is reversed for some reason ... # XXX order is reversed for some reason ...
'section_category': ['group/demo_group/sub2', 'section_category': ['group/demo_group/sub2',
'group/demo_group/sub1'], 'group/demo_group/sub1'],
......
...@@ -328,12 +328,8 @@ class TestOrderMixin(SubcontentReindexingWrapper): ...@@ -328,12 +328,8 @@ class TestOrderMixin(SubcontentReindexingWrapper):
portal = self.getPortal() portal = self.getPortal()
order_module = portal.getDefaultModule(portal_type=self.order_portal_type) order_module = portal.getDefaultModule(portal_type=self.order_portal_type)
order = order_module.newContent(portal_type=self.order_portal_type) order = order_module.newContent(portal_type=self.order_portal_type)
test_name = "%s.%s.%s" % (self.__class__.__module__,
self.__class__.__name__,
self._testMethodName)
order.edit( order.edit(
title = "Order%s (%s)" % (order.getId(), test_name), title = "Order%s (%s)" % (order.getId(), self.id()),
start_date = self.datetime + 10, start_date = self.datetime + 10,
stop_date = self.datetime + 20, stop_date = self.datetime + 20,
specialise = self.business_process, specialise = self.business_process,
......
...@@ -887,7 +887,6 @@ class TestPackingListMixin(TestOrderMixin): ...@@ -887,7 +887,6 @@ class TestPackingListMixin(TestOrderMixin):
for line in packing_list.objectValues( for line in packing_list.objectValues(
portal_type=self.packing_list_line_portal_type): portal_type=self.packing_list_line_portal_type):
resource = line.getResourceValue() resource = line.getResourceValue()
tmp_kw={'movement.resource_uid':resource.getUid()}
container_line = \ container_line = \
container.newContent(portal_type=self.container_line_portal_type) container.newContent(portal_type=self.container_line_portal_type)
container_line.setResourceValue(resource) container_line.setResourceValue(resource)
......
...@@ -791,22 +791,27 @@ class TestERP5BankingMixin(ERP5TypeTestCase): ...@@ -791,22 +791,27 @@ class TestERP5BankingMixin(ERP5TypeTestCase):
sql_connection.manage_test("DROP TABLE IF EXISTS movement") sql_connection.manage_test("DROP TABLE IF EXISTS movement")
# Delete also all ZSQL Methods related to movement table # Delete also all ZSQL Methods related to movement table
catalog = self.portal.portal_catalog.getSQLCatalog() catalog = self.portal.portal_catalog.getSQLCatalog()
catalog.manage_delObjects(ids=["z0_drop_movement", for zsql in ["z0_drop_movement", "z0_uncatalog_movement",
"z0_uncatalog_movement", "z_catalog_movement_list", "z_create_movement", ]:
"z_catalog_movement_list", if catalog._getOb(zsql, None) is not None:
"z_create_movement", catalog.manage_delObjects(ids=[zsql])
])
# Update properties of catalog # Update properties of catalog
sql_catalog_object_list = list(catalog.sql_catalog_object_list) sql_catalog_object_list = list(catalog.sql_catalog_object_list)
sql_uncatalog_object = list(catalog.sql_uncatalog_object) sql_uncatalog_object = list(catalog.sql_uncatalog_object)
sql_clear_catalog = list(catalog.sql_clear_catalog) sql_clear_catalog = list(catalog.sql_clear_catalog)
sql_search_tables = list(catalog.sql_search_tables) sql_search_tables = list(catalog.sql_search_tables)
sql_catalog_object_list.remove("z_catalog_movement_list") if "z_catalog_movement_list" in sql_catalog_object_list:
sql_uncatalog_object.remove("z0_uncatalog_movement") sql_catalog_object_list.remove("z_catalog_movement_list")
sql_clear_catalog.remove("z0_drop_movement") if "z0_uncatalog_movement" in sql_uncatalog_object:
sql_clear_catalog.remove("z_create_movement") sql_uncatalog_object.remove("z0_uncatalog_movement")
sql_search_tables.remove("movement") if "z0_drop_movement" in sql_clear_catalog:
sql_clear_catalog.remove("z0_drop_movement")
if "z_create_movement" in sql_clear_catalog:
sql_clear_catalog.remove("z_create_movement")
if "movement" in sql_search_tables:
sql_search_tables.remove("movement")
catalog.sql_catalog_object_list = tuple(sql_catalog_object_list) catalog.sql_catalog_object_list = tuple(sql_catalog_object_list)
catalog.sql_uncatalog_object = tuple(sql_uncatalog_object) catalog.sql_uncatalog_object = tuple(sql_uncatalog_object)
......
...@@ -2378,12 +2378,10 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine): ...@@ -2378,12 +2378,10 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine):
# If a field is editable, generate an input form. # If a field is editable, generate an input form.
# XXX why don't we generate an input form when a widget is not defined? # XXX why don't we generate an input form when a widget is not defined?
editable_field = None editable_field = renderer.getEditableField(alias)
if not self.isSummary():
editable_field = renderer.getEditableField(alias)
# Prepare link value - we now use it for both static and field rendering # Prepare link value - we now use it for both static and field rendering
no_link = False no_link = self.isSummary()
url_method = None url_method = None
url = None url = None
...@@ -2488,7 +2486,8 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine): ...@@ -2488,7 +2486,8 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine):
value=display_value, value=display_value,
REQUEST=request, REQUEST=request,
key=key, key=key,
editable=listbox_defines_column_as_editable and editable, editable=(not self.isSummary()) \
and listbox_defines_column_as_editable and editable,
) )
if isinstance(cell_html, str): if isinstance(cell_html, str):
cell_html = unicode(cell_html, encoding) cell_html = unicode(cell_html, encoding)
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
import unittest import unittest
from lxml import etree from lxml import etree
import textwrap
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from AccessControl.SecurityManagement import newSecurityManager from AccessControl.SecurityManagement import newSecurityManager
...@@ -162,12 +163,12 @@ class TestListBox(ERP5TypeTestCase): ...@@ -162,12 +163,12 @@ class TestListBox(ERP5TypeTestCase):
portal.portal_skins.custom, portal.portal_skins.custom,
list_method_id, list_method_id,
'selection=None, sort_on=None, **kw', 'selection=None, sort_on=None, **kw',
r""" textwrap.dedent(r"""
if sort_on != [('title', 'ASC'), ('uid', 'ASC')]: if sort_on != [('title', 'ASC'), ('uid', 'ASC')]:
raise AssertionError('sort_on is %r' % sort_on) raise AssertionError('sort_on is %r' % sort_on)
return [] return []
""") """))
# set the listbox to use this as list method # set the listbox to use this as list method
listbox = portal.FooModule_viewFooList.listbox listbox = portal.FooModule_viewFooList.listbox
listbox.ListBox_setPropertyList( listbox.ListBox_setPropertyList(
...@@ -175,7 +176,7 @@ return [] ...@@ -175,7 +176,7 @@ return []
field_count_method = '', field_count_method = '',
field_sort = 'title | ASC\n' field_sort = 'title | ASC\n'
'uid | ASC',) 'uid | ASC',)
# render the listbox, checks are done by list method itself # render the listbox, checks are done by list method itself
request = get_request() request = get_request()
request['here'] = portal.foo_module request['here'] = portal.foo_module
...@@ -194,31 +195,32 @@ return [] ...@@ -194,31 +195,32 @@ return []
portal.portal_skins.custom, portal.portal_skins.custom,
list_method_id, list_method_id,
'selection=None, dummy_default_param=None, **kw', 'selection=None, dummy_default_param=None, **kw',
""" textwrap.dedent(
if dummy_default_param != 'dummy value': """
raise AssertionError('recieved wrong arguments: %s instead of "dummy value"' if dummy_default_param != 'dummy value':
% dummy_default_param ) raise AssertionError('recieved wrong arguments: %s instead of "dummy value"'
return [] % dummy_default_param )
""") return []
"""))
# set the listbox to use this as list method # set the listbox to use this as list method
listbox = portal.FooModule_viewFooList.listbox listbox = portal.FooModule_viewFooList.listbox
listbox.ListBox_setPropertyList( listbox.ListBox_setPropertyList(
field_list_method = list_method_id, field_list_method = list_method_id,
field_count_method = '', field_count_method = '',
field_default_params = 'dummy_default_param | dummy value',) field_default_params = 'dummy_default_param | dummy value',)
# render the listbox, checks are done by list method itself # render the listbox, checks are done by list method itself
request = get_request() request = get_request()
request['here'] = portal.foo_module request['here'] = portal.foo_module
listbox.get_value('default', render_format='list', REQUEST=request) listbox.get_value('default', render_format='list', REQUEST=request)
def test_04_UnicodeParameters(self, quiet=0, run=run_all_test): def test_04_UnicodeParameters(self, quiet=0, run=run_all_test):
"""Unicode properties are handled. """Unicode properties are handled.
""" """
portal = self.getPortal() portal = self.getPortal()
portal.ListBoxZuite_reset() portal.ListBoxZuite_reset()
# We create a script to use as a list method # We create a script to use as a list method
list_method_id = 'ListBox_ParametersListMethod' list_method_id = 'ListBox_ParametersListMethod'
createZODBPythonScript( createZODBPythonScript(
...@@ -226,14 +228,14 @@ return [] ...@@ -226,14 +228,14 @@ return []
list_method_id, list_method_id,
'selection=None, **kw', 'selection=None, **kw',
"""return [context.asContext(alternate_title = u'\xe9lisa')]""") """return [context.asContext(alternate_title = u'\xe9lisa')]""")
# set the listbox to use this as list method # set the listbox to use this as list method
listbox = portal.FooModule_viewFooList.listbox listbox = portal.FooModule_viewFooList.listbox
listbox.ListBox_setPropertyList( listbox.ListBox_setPropertyList(
field_list_method = list_method_id, field_list_method = list_method_id,
field_count_method = '', field_count_method = '',
field_columns = ['alternate_title | Alternate Title',],) field_columns = ['alternate_title | Alternate Title',],)
request = get_request() request = get_request()
request['here'] = portal.foo_module request['here'] = portal.foo_module
try: try:
...@@ -503,14 +505,14 @@ return [] ...@@ -503,14 +505,14 @@ return []
field_editable_columns = ['title | title'], field_editable_columns = ['title | title'],
field_columns = ['title | Title',],) field_columns = ['title | Title',],)
form.manage_addField('listbox_title', 'Title', 'StringField') form.manage_addField('listbox_title', 'Title', 'StringField')
createZODBPythonScript( createZODBPythonScript(
portal.portal_skins.custom, portal.portal_skins.custom,
list_method_id, list_method_id,
'selection=None, **kw', 'selection=None, **kw',
"from Products.PythonScripts.standard import Object\n" "from Products.PythonScripts.standard import Object\n"
"return [Object(uid='new_', title='Object Title')]") "return [Object(uid='new_', title='Object Title')]")
request = get_request() request = get_request()
request['here'] = portal.foo_module request['here'] = portal.foo_module
line_list = [l for l in listbox.get_value('default', line_list = [l for l in listbox.get_value('default',
...@@ -531,7 +533,7 @@ return [] ...@@ -531,7 +533,7 @@ return []
listbox.ListBox_setPropertyList( listbox.ListBox_setPropertyList(
field_list_method='contentValues', field_list_method='contentValues',
field_columns=['listbox_value | Title',],) field_columns=['listbox_value | Title',],)
# create a form, to store our proxy field inside # create a form, to store our proxy field inside
portal._setObject('Test_view', portal._setObject('Test_view',
ERP5Form('Test_view', 'View')) ERP5Form('Test_view', 'View'))
...@@ -544,7 +546,7 @@ return [] ...@@ -544,7 +546,7 @@ return []
# this proxy field will not delegate its "columns" value # this proxy field will not delegate its "columns" value
proxy_field._surcharged_edit(dict(columns=[('proxy_value', 'Proxy')]), proxy_field._surcharged_edit(dict(columns=[('proxy_value', 'Proxy')]),
['columns']) ['columns'])
request = get_request() request = get_request()
request['here'] = portal.foo_module request['here'] = portal.foo_module
line_list = proxy_field.get_value('default', line_list = proxy_field.get_value('default',
...@@ -584,7 +586,8 @@ return [] ...@@ -584,7 +586,8 @@ return []
renderer.getSelectedColumnList()) renderer.getSelectedColumnList())
# default(no list_style) # default(no list_style)
self.assertEqual(getListBoxRenderer(listbox).getDefaultDisplayStyle(), getListBoxRenderer(listbox).getListboxDisplayStyle()) self.assertEqual(getListBoxRenderer(listbox).getDefaultDisplayStyle(),
getListBoxRenderer(listbox).getListboxDisplayStyle())
self.assertSameSet([('id', u'ID'), ('title', u'Title'), ('getQuantity', u'Quantity')], self.assertSameSet([('id', u'ID'), ('title', u'Title'), ('getQuantity', u'Quantity')],
getListBoxRenderer(listbox).getSelectedColumnList()) getListBoxRenderer(listbox).getSelectedColumnList())
...@@ -620,7 +623,7 @@ return [] ...@@ -620,7 +623,7 @@ return []
request.set('list_style', 'table') request.set('list_style', 'table')
self.assertSameSet([('id', u'ID'), ('title', u'Title'), ('getQuantity', u'Quantity')], self.assertSameSet([('id', u'ID'), ('title', u'Title'), ('getQuantity', u'Quantity')],
getListBoxRenderer(listbox).getSelectedColumnList()) getListBoxRenderer(listbox).getSelectedColumnList())
def test_ListboxRequestParameterPropagandation(self): def test_ListboxRequestParameterPropagandation(self):
""" """
Test that rendering a listbox field will set respective form & field_id of current form Test that rendering a listbox field will set respective form & field_id of current form
......
...@@ -436,12 +436,6 @@ class ERP5Conduit(XMLSyncUtilsMixin): ...@@ -436,12 +436,6 @@ class ERP5Conduit(XMLSyncUtilsMixin):
data = new_data data = new_data
if isinstance(data, unicode): if isinstance(data, unicode):
data = data.encode(self.getEncoding()) data = data.encode(self.getEncoding())
if keyword == 'binary_data':
#LOG('ERP5Conduit.getFormatedArgs', DEBUG, 'binary_data keyword: %s' % str(keyword))
msg = MIMEBase('application','octet-stream')
encoders.encode_base64(msg)
msg.set_payload(data)
data = msg.get_payload(decode=True)
new_args[keyword] = data new_args[keyword] = data
return new_args return new_args
......
...@@ -2846,40 +2846,6 @@ class Base( CopyContainer, ...@@ -2846,40 +2846,6 @@ class Base( CopyContainer,
""" """
return [] return []
security.declareProtected(Permissions.View, 'getBinaryData')
def getBinaryData(self):
"""
Return the binary data
"""
bin = None
if hasattr(self,'_original'):
bin = self._original._data()
elif hasattr(self,'_data'):
bin = self._data
elif hasattr(self,'data'):
bin = self.data
if bin is not None:
return StringIO(str(bin))
return None
security.declareProtected(Permissions.ModifyPortalContent, 'setBinaryData')
def setBinaryData(self, data):
"""
Set the binary data, data must be a cStringIO
"""
self.edit(file=data)
#LOG('Base.setBinaryData',0,'data: %s' % str(data))
#obj=''
#if hasattr(self,'_original'):
# LOG('Base.setBinaryData',0,'_original for : %s' % str(self))
# self._original.data = data
#elif hasattr(self,'_data'):
# LOG('Base.setBinaryData',0,'_data for : %s' % str(self))
# self._data = data
#elif hasattr(self,'data'):
# LOG('Base.setBinaryData',0,'data for : %s' % str(self))
# self.data = data
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'getRedirectParameterDictAfterAdd') 'getRedirectParameterDictAfterAdd')
def getRedirectParameterDictAfterAdd(self, container, **kw): def getRedirectParameterDictAfterAdd(self, container, **kw):
......
...@@ -636,7 +636,7 @@ class ERP5TypeInformation(XMLObject, ...@@ -636,7 +636,7 @@ class ERP5TypeInformation(XMLObject,
'getAvailablePropertySheetList') 'getAvailablePropertySheetList')
def getAvailablePropertySheetList(self): def getAvailablePropertySheetList(self):
property_sheet_set = set([k for k in PropertySheet.__dict__ property_sheet_set = set([k for k in PropertySheet.__dict__
if not k.startswith('__')]) if not k.startswith('_')])
property_sheet_tool = self.getPortalObject().portal_property_sheets property_sheet_tool = self.getPortalObject().portal_property_sheets
property_sheet_set.update(property_sheet_tool.objectIds()) property_sheet_set.update(property_sheet_tool.objectIds())
...@@ -647,7 +647,7 @@ class ERP5TypeInformation(XMLObject, ...@@ -647,7 +647,7 @@ class ERP5TypeInformation(XMLObject,
'getAvailableConstraintList') 'getAvailableConstraintList')
def getAvailableConstraintList(self): def getAvailableConstraintList(self):
return sorted(k for k in Constraint.__dict__ return sorted(k for k in Constraint.__dict__
if k != 'Constraint' and not k.startswith('__')) if k != 'Constraint' and not k.startswith('_'))
security.declareProtected(Permissions.AccessContentsInformation, security.declareProtected(Permissions.AccessContentsInformation,
'getAvailableGroupList') 'getAvailableGroupList')
......
...@@ -267,6 +267,9 @@ if allowClassTool(): ...@@ -267,6 +267,9 @@ if allowClassTool():
def objectIds(self, spec=None): def objectIds(self, spec=None):
return ('PropertySheet', 'Document', 'Constraint', 'Extensions', 'tests') return ('PropertySheet', 'Document', 'Constraint', 'Extensions', 'tests')
def __contains__(self, key):
return key in self.objectIds()
def _getOb(self, key, default=_MARKER): def _getOb(self, key, default=_MARKER):
from Products.ERP5Type.Utils import importLocalPropertySheet from Products.ERP5Type.Utils import importLocalPropertySheet
from Products.ERP5Type.Utils import importLocalDocument from Products.ERP5Type.Utils import importLocalDocument
......
...@@ -33,6 +33,7 @@ from pprint import pformat ...@@ -33,6 +33,7 @@ from pprint import pformat
from AccessControl.SecurityManagement import newSecurityManager from AccessControl.SecurityManagement import newSecurityManager
from AccessControl.SecurityManagement import getSecurityManager from AccessControl.SecurityManagement import getSecurityManager
from AccessControl.SecurityManagement import setSecurityManager from AccessControl.SecurityManagement import setSecurityManager
from AccessControl import SpecialUsers
from Products.DCWorkflow.Transitions import TRIGGER_USER_ACTION from Products.DCWorkflow.Transitions import TRIGGER_USER_ACTION
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
...@@ -128,11 +129,15 @@ class SecurityTestCase(ERP5TypeTestCase): ...@@ -128,11 +129,15 @@ class SecurityTestCase(ERP5TypeTestCase):
def _loginAsUser(self, username): def _loginAsUser(self, username):
"""Login as a given username. The user must exist. """Login as a given username. The user must exist.
In case Username is None, we consider test as Anonymous.
""" """
uf = self.getPortal().acl_users if username is None:
user = uf.getUserById(username) newSecurityManager(None, SpecialUsers.nobody)
self.assertNotEquals(user, None, 'No user %s' % username) else:
newSecurityManager(None, user.__of__(uf)) uf = self.getPortal().acl_users
user = uf.getUserById(username)
self.assertNotEquals(user, None, 'No user %s' % username)
newSecurityManager(None, user.__of__(uf))
# Permission methods # Permission methods
failIfUserCanViewDocument = AssertNoPermissionMethod( failIfUserCanViewDocument = AssertNoPermissionMethod(
......
import errno import errno
import os import os
import subprocess
import shutil import shutil
import signal import signal
import socket import socket
...@@ -46,9 +47,8 @@ if save_mysql: ...@@ -46,9 +47,8 @@ if save_mysql:
# faster, so this produce somewhat not nice to read sql # faster, so this produce somewhat not nice to read sql
command = 'mysqldump %s > %s' % (getMySQLArguments(), dump_sql_path,) command = 'mysqldump %s > %s' % (getMySQLArguments(), dump_sql_path,)
if verbosity: if verbosity:
_print('Dumping MySQL database with %s...' % command) _print('Dumping MySQL database with %s ...' % command)
ret = os.system(command) subprocess.check_call(command, shell=True)
assert not ret
_print("Cleaning static files ... ") _print("Cleaning static files ... ")
for static_dir in static_dir_list: for static_dir in static_dir_list:
...@@ -61,9 +61,9 @@ for static_dir in static_dir_list: ...@@ -61,9 +61,9 @@ for static_dir in static_dir_list:
if load: if load:
if save_mysql: if save_mysql:
if os.path.exists(dump_sql_path): if os.path.exists(dump_sql_path):
_print("Restoring MySQL database ... ") command = "mysql %s < %s" % (getMySQLArguments(), dump_sql_path)
ret = os.system("mysql %s < %s" % (getMySQLArguments(), dump_sql_path)) _print("Restoring MySQL database with %s ... " % command)
assert not ret subprocess.check_call(command, shell=True)
else: else:
_print("Could not find MySQL dump (%r), will recreate catalog ... " % dump_sql_path) _print("Could not find MySQL dump (%r), will recreate catalog ... " % dump_sql_path)
os.environ['erp5_tests_recreate_catalog'] = '1' os.environ['erp5_tests_recreate_catalog'] = '1'
......
...@@ -394,7 +394,7 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None): ...@@ -394,7 +394,7 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None):
else: else:
products_home = os.path.join(instance_home, 'Products') products_home = os.path.join(instance_home, 'Products')
from Testing.ZopeTestCase import layer, PortalTestCase from Testing.ZopeTestCase import layer, PortalTestCase, ZopeLite
_apply_patches = layer._deferred_setup.pop(0)[0] _apply_patches = layer._deferred_setup.pop(0)[0]
assert _apply_patches.__name__ == '_apply_patches' assert _apply_patches.__name__ == '_apply_patches'
...@@ -469,6 +469,8 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None): ...@@ -469,6 +469,8 @@ def runUnitTestList(test_list, verbosity=1, debug=0, run_only=None):
def assertFalse(): def assertFalse():
assert False assert False
layer.onsetup = assertFalse layer.onsetup = assertFalse
ZopeLite._theApp._p_jar.close()
ZopeLite._theApp = None
from Products.ERP5Type.tests.utils import DbFactory from Products.ERP5Type.tests.utils import DbFactory
root_db_name, = cfg.dbtab.databases.keys() root_db_name, = cfg.dbtab.databases.keys()
......
...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages ...@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
import glob import glob
import os import os
version = '0.4.22' version = '0.4.24'
name = 'erp5.util' name = 'erp5.util'
long_description = open("README.erp5.util.txt").read() + "\n" long_description = open("README.erp5.util.txt").read() + "\n"
......
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