[MERGE] from trunk

bzr revid: chm@openerp.com-20140225130638-c8mql44hwo340fg2
This commit is contained in:
Christophe Matthieu
2014-02-25 14:06:38 +01:00
21 changed files with 522 additions and 1916 deletions
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-02-21 05:48+0000\n"
"X-Generator: Launchpad (build 16916)\n"
"X-Launchpad-Export-Date: 2014-02-22 06:39+0000\n"
"X-Generator: Launchpad (build 16926)\n"
#. module: analytic_contract_hr_expense
#: view:account.analytic.account:0
+5
View File
@@ -146,6 +146,7 @@
<!-- CRM-related subtypes for messaging / Chatter -->
<record id="mt_lead_create" model="mail.message.subtype">
<field name="name">Lead Created</field>
<field name="hidden" eval="True"/>
<field name="res_model">crm.lead</field>
<field name="default" eval="False"/>
<field name="description">Lead created</field>
@@ -171,6 +172,7 @@
<!-- Salesteam-related subtypes for messaging / Chatter -->
<record id="mt_salesteam_lead" model="mail.message.subtype">
<field name="name">Lead Created</field>
<field name="sequence">10</field>
<field name="res_model">crm.case.section</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_lead_create')"/>
@@ -178,18 +180,21 @@
</record>
<record id="mt_salesteam_lead_stage" model="mail.message.subtype">
<field name="name">Opportunity Stage Changed</field>
<field name="sequence">11</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('mt_lead_stage')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_lead_won" model="mail.message.subtype">
<field name="name">Opportunity Won</field>
<field name="sequence">12</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('mt_lead_won')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_lead_lost" model="mail.message.subtype">
<field name="name">Opportunity Lost</field>
<field name="sequence">13</field>
<field name="res_model">crm.case.section</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_lead_lost')"/>
File diff suppressed because it is too large Load Diff
+110 -53
View File
@@ -5,6 +5,10 @@ PosBox Documentation
Posbox Setup Guide
==================
.. image:: _images/posbox_setup.png
:width: 100%
:align: center
Prerequisites
-------------
@@ -20,64 +24,64 @@ You will need :
- A local network set up with DHCP ( this is the default setting )
- A RJ45 Ethrnet Cable
- An Epson USB TM-T20 Printer or another compatible printer.
- A Honewell Voyager USB Barcode Scanner or another compatible scanner.
- A Honeywell Eclipse USB Barcode Scanner or another compatible scanner.
- An Epson compatible cash drawer.
Setup
-----
Step By Step Setup Guide
------------------------
.. image:: _images/posbox_doc_schema.png
:width: 100%
:align: center
1) Power the PosBox.
~~~~~~~~~~~~~~~~~~~~
Power the PosBox.
~~~~~~~~~~~~~~~~
Plug the PosBox to the 2A Power Adapter, a bright red status led should
light up.
2) Connect it to the Local Network
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect it to the Local Network
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the PosBox to the Local Network with the RJ45 Cable. Make sure
You connect the PosBox to the same Network as your POS device. Once
connected a bright yellow status led should light up, and a green status
led should flash.
3) Connect the USB Printer
~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the USB Printer
~~~~~~~~~~~~~~~~~~~~~~~
Put a paper roll in the printer, power it up, then connect it to one of
the PosBox's USB port
4) Connect the cash drawer
~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the cash drawer
~~~~~~~~~~~~~~~~~~~~~~~
The cash drawer should be connected to the printer with the RJ25 cable
5) Connect the USB Barcode Scanner
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the USB Barcode Scanner
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Connect the usb barcode scanner to one of the PosBox's USB port. The
Barcode Scanner should immediately light up and emit a loud beep.
6) Configure the USB Barcode Scanner
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Configure the USB Barcode Scanner
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The barcode scanner should be configured in QWERTY and emit a new line /
return symbol after each scan. This is most likely the default
configuration of your barcode scanner.
7) Make sure the PosBox is ready
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Make sure the PosBox is ready
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Once powered, The PosBox needs less than a minute to boot. Once the
PosBox is ready, it should print a status receipt with its IP Adress.
Also, the last status led, just after the red power status led, should
be permanently lit green.
8) Set up the Point of Sale
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Setup the Point of Sale
~~~~~~~~~~~~~~~~~~~~~~~~
Make sure to activate the 'Print via Proxy', 'Remote Scanning' or
'Cashdrawer' options in the Point of Sale configuration. If you are
@@ -87,8 +91,12 @@ was printed on the status receipt.
If you are running multiple Point of Sales on the same PosBox, make sure
that only one of them has Remote Scanning activated.
9) Launch the Point of Sale.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you manually specify the PosBox's IP address, you must configure your
network to make sure the PosBox's IP address doesn't change. Please
refer to your Router documentation.
Launch the Point of Sale.
~~~~~~~~~~~~~~~~~~~~~~~~~
If you didn't spcecify the PosBox's IP address in the config, the POS
will need some time to perform a network scan to find the PosBox. This
@@ -97,9 +105,21 @@ is only done once.
The Point of Sale is now connected to the PosBox and your Hardware
should be ready to use.
Multi-Pos Configuration
-----------------------
The advised way to setup a multi Point-of-Sale shop is to have one PosBox
per Point-of-Sale. In this case it is mandatory to manually specify the
IP address of each PosBox in each Point of Sale. You must also configure
your network to make sure the PosBox's IP address doesn't change. Please
refer to your Router documentation.
PosBoxless Setup Guide
======================
.. image:: _images/posboxless_setup.png
:width: 100%
:align: center
If you are running your Point of Sale on a debian-based linux
distribution, you do not need the PosBox as you can run its software
locally. However the installation process is not foolproof. You'll need
@@ -111,15 +131,15 @@ Prerequisites
-------------
- A debian based linux distribution (Debian, Ubuntu, Mint, etc.)
- A running trunk version of the OpenERP server
- A running OpenERP server (version trunk or saas-3 or 8.0 or later)
- You must uninstall any esc-pos printer driver as it will conflict
with OpenERP's built-in driver.
Setup
-----
Step By Step Setup Guide
------------------------
1) Extra dependencies
~~~~~~~~~~~~~~~~~~~~~
Extra dependencies
~~~~~~~~~~~~~~~~~~
The driver modules requires the installation of new python modules:
@@ -128,14 +148,14 @@ The driver modules requires the installation of new python modules:
$ sudo pip install pyserial
$ sudo pip install --pre pyusb
2) Database Setup
~~~~~~~~~~~~~~~~~
Database Setup
~~~~~~~~~~~~~~
You must create a database called ``posbox`` with the modules
``hw_proxy``, ``hw_escpos``, and ``hw_scanner`` installed.
3) Access Rights
~~~~~~~~~~~~~~~~
Access Rights
~~~~~~~~~~~~~
The drivers need raw access to the printer and barcode scanner devices.
Doing so requires a bit system administration. First we are going to
@@ -163,8 +183,8 @@ following content:
Then you need to reboot your machine.
4) Start the local OpenERP Installl
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start the local OpenERP Installl
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We must launch the OpenERP server on the port ``8069`` with the correct
database settings:
@@ -174,8 +194,8 @@ database settings:
$ ./server/openerp-server --addons-path=addons,web/addons --db-filter='^posbox$' \
--xmlrpc-port=8069 -d posbox
5) Check that everything works
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Check that everything works
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Plug all your hardware to your machine's USB ports, and go to
``http://localhost/hw_proxy/status`` refresh the page a few times and
@@ -184,20 +204,19 @@ errors are: The paths on the distribution differ from the paths expected
by the drivers, another process has grabbed exclusive access to the
devices, the udev rules do not apply or a superceeded by others.
5) Automatically Start OpenERP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Automatically Start OpenERP
~~~~~~~~~~~~~~~~~~~~~~~~~~~
You must now make sure that this OpenERP install is automatically
started after boot. There are various ways to do so, and how to do it
depends on your particular setup. We use *systemd* on the PosBox, but
*upstart* or *sysvinit* are other options.
6) Set up the Point of Sale
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Setup the Point of Sale
~~~~~~~~~~~~~~~~~~~~~~~~
Make sure that one of the posbox Make sure the IP Adress field in the
POS Config is either ``127.0.0.1`` or ``localhost`` or simply leave it
empty.
The IP Adress field in the POS Config must be either ``127.0.0.1``
or ``localhost``. You can also leave it empty.
PosBox Technical Documentation
==============================
@@ -231,7 +250,7 @@ Compatible Peripherals
- Barcode Scannners:
- Metapace S61
- Honeywell Voyager 95x0 Series.
- Honeywell Eclipse or Voyager 95x0 Series.
- Most other barcode scanners should work out of the box. Some
barcode scanners need more power than the PosBox can provide and
must be plugged in a self-powered USB HUB. This is the case for
@@ -265,6 +284,9 @@ found in instead ``/var/logs/syslog``
We removed all graphical software from the default install to reduce to
image size but nothing prevents you from reinstalling them.
Accessing the PosBox
--------------------
Local Access
~~~~~~~~~~~~
@@ -284,8 +306,8 @@ Remote Access
If you have the PosBox's IP address and a SSH client you can access the
PosBox's system remotely. The login / password are ``pi``/``admin``
Unsupported Printers
~~~~~~~~~~~~~~~~~~~~
Getting Unsupported Printers to Work
------------------------------------
The PosBox should be able to print to any ESC-POS printer, not just the
Epson TM-T20. If You have such a printer, you can activate it with the
@@ -305,7 +327,7 @@ following steps:
supported devices.
Updating The PosBox Software
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
----------------------------
The best way to update the PosBox software is to download a new version
of the image and flash the SD-Card with it. This operation is described
@@ -315,10 +337,10 @@ raspberry pi image to the latest one found at
``http://nightly.openerp.com/trunk/posbox/``
Troubleshoot
------------
============
The POS cannot connect to the PosBox.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-------------------------------------
- The easiest way to make sure the PosBox is properly set-up is to turn
it on with the printer plugged in as it will print a receipt
@@ -346,7 +368,7 @@ The POS cannot connect to the PosBox.
the PosBox's ip address in the POS config.
The Barcode Scanner is not working
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
----------------------------------
- The PosBox needs a 2A power supply to work with some barcode
scanners. If you are not using the provided power supply, make sure
@@ -357,15 +379,17 @@ The Barcode Scanner is not working
- Some poorly built barcode scanners do not advertise themselves as
barcode scanners but as a usb keyboard instead, and will not be
recognized by the PosBox.
- The barcode scanner must be configured in US QWERTY and emit a linefeed
after each codebar.
The Barcode Scanner is not working reliably
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-------------------------------------------
- Make sure that no more than one device with 'Scan via Proxy' enabled
are connected to the PosBox at the same time.
Printing the receipt takes too much time.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----------------------------------------
- A small delay before the first print is expected, as the PosBox will
do some preprocessing to speed up the next printings. If you suffer
@@ -373,14 +397,14 @@ Printing the receipt takes too much time.
between the POS and the PosBox.
Some characters are not correctly printed on the receipt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---------------------------------------------------------
- The PosBox does not support all languages and characters. It
currently supports latin and cyrillic based scripts, with basic
japanese support.
The Printer is Offline
~~~~~~~~~~~~~~~~~~~~~~
----------------------
- The PosBox only supports EPSON TM-T20 printers. Make sure the printer
is connected, powered, has enough paper and has its lid closed, and
@@ -388,8 +412,41 @@ The Printer is Offline
support.
The Cashdrawer does not open.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----------------------------
- The cashdrawer should be connected to the printer and should be
activated in the POS Configuration
Credits
=======
The PosBox project was developped by Frédéric van der Essen with the
kind help of Gary Malherbe, Fabien Meghazi, Nicolas Wisniewsky,
Dimitri Del Marmol and Antony Lesuisse.
This development would not have been possible without the Indiegogo
campaign and those who contributed to it. Special thanks goes to the
partners who backed the campaign with founding partner bundles:
- Camptocamp
- BHC
- openBig
- Eeezee-IT
- Solarsis LDA
- ACSONE
- Vauxoo
- Ekomurz
- Datalp
- Dao Systems
- Eggs Solutions
- OpusVL
And also the partners who've backed the development with the Founding
PosBox Bundle:
- Willow IT
- E\. Akhalwaya & Sons
- Multibase
- Mindesa
- bpso.biz
- Shine IT.
Binary file not shown.
+1
View File
@@ -54,6 +54,7 @@
<!-- Discussion subtype for messaging / Chatter -->
<record id="mt_comment" model="mail.message.subtype">
<field name="name">Discussions</field>
<field name="sequence" eval="0"/>
</record>
</data>
</openerp>
+6
View File
@@ -29,6 +29,8 @@ class mail_message_subtype(osv.osv):
on the Wall. """
_name = 'mail.message.subtype'
_description = 'Message subtypes'
_order = 'sequence, id'
_columns = {
'name': fields.char('Message Type', required=True, translate=True,
help='Message subtype gives a more precise type on the message, '\
@@ -50,7 +52,11 @@ class mail_message_subtype(osv.osv):
help="Model the subtype applies to. If False, this subtype applies to all models."),
'default': fields.boolean('Default',
help="Activated by default when subscribing."),
'sequence': fields.integer('Sequence', help="Used to order subtypes."),
'hidden': fields.boolean('Hidden', help="Hide the subtype in the follower options")
}
_defaults = {
'default': True,
'sequence': 1,
}
+13 -6
View File
@@ -9,6 +9,7 @@
<field name="arch" type="xml">
<tree string="Subtype">
<field name="name"/>
<field name="sequence"/>
<field name="res_model"/>
<field name="default"/>
</tree>
@@ -22,12 +23,18 @@
<form string="Email message" version="7.0">
<sheet>
<group>
<field name="name"/>
<field name="res_model"/>
<field name="default"/>
<field name="description"/>
<field name="parent_id"/>
<field name="relation_field"/>
<group string='Description'>
<field name="name"/>
<field name="sequence"/>
<field name="res_model"/>
<field name="description"/>
<field name="default"/>
<field name="hidden"/>
</group>
<group string='Auto subscription'>
<field name="parent_id"/>
<field name="relation_field"/>
</group>
</group>
</sheet>
</form>
+13 -6
View File
@@ -20,6 +20,7 @@
##############################################################################
import base64
from collections import OrderedDict
import datetime
import dateutil
import email
@@ -185,8 +186,17 @@ class mail_thread(osv.AbstractModel):
# find current model subtypes, add them to a dictionary
subtype_obj = self.pool.get('mail.message.subtype')
subtype_ids = subtype_obj.search(cr, uid, ['|', ('res_model', '=', self._name), ('res_model', '=', False)], context=context)
subtype_dict = dict((subtype.name, dict(default=subtype.default, followed=False, id=subtype.id)) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context))
subtype_ids = subtype_obj.search(
cr, uid, [
'&', ('hidden', '=', False), '|', ('res_model', '=', self._name), ('res_model', '=', False)
], context=context)
subtype_dict = OrderedDict(
(subtype.name, {
'default': subtype.default,
'followed': False,
'parent_model': subtype.parent_id and subtype.parent_id.res_model or self._name,
'id': subtype.id}
) for subtype in subtype_obj.browse(cr, uid, subtype_ids, context=context))
for id in ids:
res[id]['message_subtype_data'] = subtype_dict.copy()
@@ -1580,10 +1590,7 @@ class mail_thread(osv.AbstractModel):
if set(partner_ids) == set([user_pid]):
try:
self.check_access_rights(cr, uid, 'read')
if context.get('operation', '') == 'create':
self.check_access_rule(cr, uid, ids, 'create')
else:
self.check_access_rule(cr, uid, ids, 'read')
self.check_access_rule(cr, uid, ids, 'read')
except (osv.except_osv, orm.except_orm):
return False
else:
+4
View File
@@ -760,4 +760,8 @@
.openerp .oe_sidebar_suggestion .oe_suggest_items:hover a.oe_suggestion_remove_item {
visibility: visible;
}
.subtype-border {
border-bottom: 1px solid #dddddd;
margin-bottom: 10px;
}
@@ -265,7 +265,15 @@ openerp_mail_followers = function(session, mail) {
var records = data[id].message_subtype_data;
this.records_length = $.map(records, function(value, index) { return index; }).length;
if (this.records_length > 1) { self.display_followers(); }
var old_model = '';
_(records).each(function (record, record_name) {
if (old_model != record.parent_model){
if (old_model != ''){
var index = $($list).find('.oe_subtype').length;
$($($list).find('.oe_subtype')[index-1]).addClass('subtype-border');
}
old_model = record.parent_model;
}
record.name = record_name;
record.followed = record.followed || undefined;
$(session.web.qweb.render('mail.followers.subtype', {'record': record})).appendTo($list);
+37
View File
@@ -0,0 +1,37 @@
# Finnish translation for openobject-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:05+0000\n"
"PO-Revision-Date: 2014-02-22 20:02+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-02-23 07:07+0000\n"
"X-Generator: Launchpad (build 16926)\n"
#. module: portal_project
#: model:ir.actions.act_window,help:portal_project.open_view_project
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to start a new project.\n"
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Klikkaa aloittaaksesi uuden projektin.\n"
" </p>\n"
" "
#. module: portal_project
#: model:ir.actions.act_window,name:portal_project.open_view_project
#: model:ir.ui.menu,name:portal_project.portal_services_projects
msgid "Projects"
msgstr "Projektit"
+47
View File
@@ -0,0 +1,47 @@
# Finnish translation for openobject-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2014-02-22 20:06+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Finnish <fi@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-02-23 07:07+0000\n"
"X-Generator: Launchpad (build 16926)\n"
#. module: portal_project_issue
#: view:project.issue:0
msgid "Creation:"
msgstr "Luonti:"
#. module: portal_project_issue
#: model:ir.actions.act_window,help:portal_project_issue.project_issue_categ_act0
msgid ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to create an issue.\n"
" </p><p>\n"
" You can track your issues from this menu and the action we\n"
" will take.\n"
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Klikkaa luodaksesi palautteen.\n"
" </p><p>\n"
" Voit seurata palautteitasi ja niiden\n"
" etenemistä tästä valikosta.\n"
" </p>\n"
" "
#. module: portal_project_issue
#: model:ir.actions.act_window,name:portal_project_issue.project_issue_categ_act0
msgid "Issues"
msgstr "Ilmoitukset"
+149
View File
@@ -0,0 +1,149 @@
# Amharic translation for openobject-addons
# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
"PO-Revision-Date: 2014-02-21 11:53+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Amharic <am@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-02-22 06:39+0000\n"
"X-Generator: Launchpad (build 16926)\n"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_from_product_template
msgid "Ham"
msgstr ""
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_lait_product_template
msgid "Cow milk"
msgstr ""
#. module: product_expiry
#: field:product.product,life_time:0
msgid "Product Life Time"
msgstr "የእቃው የመቆያ ግዜ"
#. module: product_expiry
#: help:stock.production.lot,removal_date:0
msgid ""
"This is the date on which the goods with this Serial Number should be "
"removed from the stock."
msgstr ""
#. module: product_expiry
#: help:product.product,removal_time:0
msgid ""
"When a new a Serial Number is issued, this is the number of days before the "
"goods should be removed from the stock."
msgstr ""
#. module: product_expiry
#: field:product.product,use_time:0
msgid "Product Use Time"
msgstr "የእቃው መጠቀምያ ግዜ"
#. module: product_expiry
#: model:ir.model,name:product_expiry.model_product_product
msgid "Product"
msgstr "እቃ"
#. module: product_expiry
#: help:product.product,use_time:0
msgid ""
"When a new a Serial Number is issued, this is the number of days before the "
"goods starts deteriorating, without being dangerous yet."
msgstr ""
#. module: product_expiry
#: field:product.product,removal_time:0
msgid "Product Removal Time"
msgstr "የእቃው የሚወገድበት ግዜ"
#. module: product_expiry
#: help:stock.production.lot,alert_date:0
msgid ""
"This is the date on which an alert should be notified about the goods with "
"this Serial Number."
msgstr ""
#. module: product_expiry
#: model:ir.model,name:product_expiry.model_stock_production_lot
msgid "Serial Number"
msgstr "መለያ ቁጥር"
#. module: product_expiry
#: help:product.product,alert_time:0
msgid ""
"When a new a Serial Number is issued, this is the number of days before an "
"alert should be notified."
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,removal_date:0
msgid "Removal Date"
msgstr "የሚወገድበት ቀን"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_pain_product_template
msgid "Bread"
msgstr ""
#. module: product_expiry
#: view:product.product:0
msgid "Dates"
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,life_date:0
msgid "End of Life Date"
msgstr "የመጨረሻው ቀን"
#. module: product_expiry
#: field:stock.production.lot,use_date:0
msgid "Best before Date"
msgstr "ያለፍ ጥሩ ቀናቶች"
#. module: product_expiry
#: model:product.template,name:product_expiry.product_product_jambon_product_template
msgid "French cheese Camenbert"
msgstr ""
#. module: product_expiry
#: help:product.product,life_time:0
msgid ""
"When a new a Serial Number is issued, this is the number of days before the "
"goods may become dangerous and must not be consumed."
msgstr ""
#. module: product_expiry
#: field:stock.production.lot,alert_date:0
msgid "Alert Date"
msgstr "ማሳወቅያ ቀን"
#. module: product_expiry
#: help:stock.production.lot,use_date:0
msgid ""
"This is the date on which the goods with this Serial Number start "
"deteriorating, without being dangerous yet."
msgstr ""
#. module: product_expiry
#: help:stock.production.lot,life_date:0
msgid ""
"This is the date on which the goods with this Serial Number may become "
"dangerous and must not be consumed."
msgstr ""
#. module: product_expiry
#: field:product.product,alert_time:0
msgid "Product Alert Time"
msgstr "እቃውን የማሳወቅያ ግዜ"
+5
View File
@@ -78,6 +78,7 @@
<field name="name">Task Created</field>
<field name="res_model">project.task</field>
<field name="default" eval="False"/>
<field name="hidden" eval="True"/>
<field name="description">Task created</field>
</record>
<record id="mt_task_assigned" model="mail.message.subtype">
@@ -101,6 +102,7 @@
<!-- Project-related subtypes for messaging / Chatter -->
<record id="mt_project_task_new" model="mail.message.subtype">
<field name="name">Task Created</field>
<field name="sequence">10</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_task_new')"/>
@@ -108,6 +110,7 @@
</record>
<record id="mt_project_task_assigned" model="mail.message.subtype">
<field name="name">Task Assigned</field>
<field name="sequence">11</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_task_assigned')"/>
@@ -115,12 +118,14 @@
</record>
<record id="mt_project_task_blocked" model="mail.message.subtype">
<field name="name">Task Blocked</field>
<field name="sequence">12</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_task_blocked')"/>
<field name="relation_field">project_id</field>
</record>
<record id="mt_project_task_stage" model="mail.message.subtype">
<field name="name">Task Stage Changed</field>
<field name="sequence">13</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_task_stage')"/>
<field name="relation_field">project_id</field>
@@ -33,6 +33,7 @@ Access all issues from the top Project menu, and access the issues of a specific
<field name="name">Issue Created</field>
<field name="res_model">project.issue</field>
<field name="default" eval="False"/>
<field name="hidden" eval="True"/>
<field name="description">Issue created</field>
</record>
<record id="mt_issue_assigned" model="mail.message.subtype">
@@ -56,6 +57,7 @@ Access all issues from the top Project menu, and access the issues of a specific
<!-- Project-related subtypes for messaging / Chatter -->
<record id="mt_project_issue_new" model="mail.message.subtype">
<field name="name">Issue Created</field>
<field name="sequence">20</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_issue_new')"/>
@@ -63,6 +65,7 @@ Access all issues from the top Project menu, and access the issues of a specific
</record>
<record id="mt_project_issue_assigned" model="mail.message.subtype">
<field name="name">Issue Assigned</field>
<field name="sequence">21</field>
<field name="res_model">project.project</field>
<field name="default" eval="False"/>
<field name="parent_id" eval="ref('mt_issue_assigned')"/>
@@ -70,12 +73,14 @@ Access all issues from the top Project menu, and access the issues of a specific
</record>
<record id="mt_project_issue_blocked" model="mail.message.subtype">
<field name="name">Issue Blocked</field>
<field name="sequence">22</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('mt_issue_blocked')"/>
<field name="relation_field">project_id</field>
</record>
<record id="mt_project_issue_stage" model="mail.message.subtype">
<field name="name">Issue Stage Changed</field>
<field name="sequence">23</field>
<field name="res_model">project.project</field>
<field name="description">Stage changed</field>
<field name="parent_id" eval="ref('mt_issue_stage')"/>
+2
View File
@@ -5,12 +5,14 @@
<!-- Salesteam-related subtypes for messaging / Chatter -->
<record id="mt_salesteam_order_sent" model="mail.message.subtype">
<field name="name">Quotation Send</field>
<field name="sequence">20</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('sale.mt_order_sent')"/>
<field name="relation_field">section_id</field>
</record>
<record id="mt_salesteam_order_confirmed" model="mail.message.subtype">
<field name="name">Sales Order Confirmed</field>
<field name="sequence">21</field>
<field name="res_model">crm.case.section</field>
<field name="parent_id" eval="ref('sale.mt_order_confirmed')"/>
<field name="relation_field">section_id</field>
@@ -69,10 +69,10 @@
popover: { fixed: true },
},
{
snippet: 'three-columns',
snippet: 'features',
placement: 'bottom',
title: _t("Drag & Drop This Block"),
content: _t("Drag the <em>'Three Columns'</em> block and drop it below the banner."),
content: _t("Drag the <em>'Features'</em> block and drop it below the banner."),
popover: { fixed: true },
},
{
+105 -109
View File
@@ -23,7 +23,7 @@
</li>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_banner.png"/>
<span class="oe_snippet_thumbnail_title">Banner</span>
<span class="oe_snippet_thumbnail_title">Banner</span>
</div>
<div id="myCarousel" class="oe_snippet_body carousel slide mb32" style="height: 320px;">
<!-- Indicators -->
@@ -147,16 +147,16 @@
A great way to catch your reader's attention is to tell a story.
Everything you consider writing can be told as a story.
</p><p>
<b>Great stories have personality</b>. Consider telling
a great story that provides personality. Writing a story
with personality for potential clients will asist with
<b>Great stories have personality</b>. Consider telling
a great story that provides personality. Writing a story
with personality for potential clients will asist with
making a relationship connection. This shows up in small
quirks like word choices or phrases. Write from your point
quirks like word choices or phrases. Write from your point
of view, not from someone else's experience.
</p><p>
<b>Great stories are for everyone even when only written for
just one person</b>. If you try to write with a wide general
audience in mind, your story will ring false and be bland.
audience in mind, your story will ring false and be bland.
No one will be interested. Write for one person. If it’s genuine for the one, it’s genuine for the rest.
</p>
</div>
@@ -183,11 +183,41 @@
</section>
</div>
<div data-snippet-id="features" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_features.png"/>
<span class="oe_snippet_thumbnail_title">Features</span>
</div>
<section class="oe_snippet_body mb16">
<div class="container">
<div class="row mt16 mb16">
<div class="col-md-4 text-center">
<span class="fa fa-suitcase fa-5x"></span>
<h3 class="mt8 mb0">First Feature</h3>
<div class="text-muted">Tell what's the value for the</div>
<div class="text-muted">customer for this feature.</div>
</div>
<div class="col-md-4 text-center">
<span class="fa fa-lock fa-5x"></span>
<h3 class="mt8 mb0">Second Feature</h3>
<div class="text-muted">Write what the customer would like to know,</div>
<div class="text-muted">not what you want to show.</div>
</div>
<div class="col-md-4 text-center">
<span class="fa fa-heart fa-5x"></span>
<h3 class="mt8 mb0">Third Feature</h3>
<div class="text-muted">A small explanation of this great</div>
<div class="text-muted">feature, in clear words.</div>
</div>
</div>
</div>
</section>
</div>
<div data-snippet-id="big-picture" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_big_picture.png"/>
<span class="oe_snippet_thumbnail_title">Big Picture</span>
<span class="oe_snippet_thumbnail_title">Big Picture</span>
</div>
<section class="oe_snippet_body oe_dark mt16 mb16">
<div class="container">
@@ -216,11 +246,10 @@
</section>
</div>
<div data-snippet-id="three-columns" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_three_columns.png"/>
<span class="oe_snippet_thumbnail_title">Three Columns</span>
<span class="oe_snippet_thumbnail_title">Three Columns</span>
</div>
<section class="oe_snippet_body mt16 mb16">
<div class="container">
@@ -258,66 +287,6 @@
</section>
</div>
<div data-snippet-id="slider" data-selector-children=".oe_structure, [data-oe-type=html]">
<li class="oe_snippet_options divider"></li>
<li class="oe_snippet_options">
<a href="#" class="button js_add">Add Slide</a>
</li>
<li class="oe_snippet_options">
<a href="#" class="button js_remove">Remove Slide</a>
</li>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
<span class="oe_snippet_thumbnail_title">Quotes Slider</span>
</div>
<div id="myQuoteCarousel" class="oe_snippet_body carousel quotecarousel slide mb0">
<!-- Indicators -->
<ol class="carousel-indicators mb0">
<li data-target="#myQuoteCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myQuoteCarousel" data-slide-to="1"></li>
</ol>
<div class="carousel-inner">
<div class="item text_only active">
<div class="container">
<div class="content">
<div class="row">
<blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
<p>
Write a quote here from one of your customers. Quotes are a
great way to build confidence in your products or services.
</p>
<small>Author of this quote</small>
</blockquote>
</div>
</div>
</div>
</div>
<div class="item text_only">
<div class="container">
<div class="content">
<div class="row">
<blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
<p>
OpenERP provides essential platform for our project management.
Things are better organized and more visible with it.
</p>
<small>John Doe, CEO</small>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="snippet_content" class="tab-pane fade">
@@ -335,7 +304,7 @@
<div data-snippet-id="quote" data-selector-siblings="p, h1, h2, h3, blockquote" data-selector-children=".content">
<div class="oe_snippet_thumbnail">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quote.png"/>
<span class="oe_snippet_thumbnail_title">Quote</span>
</div>
@@ -369,7 +338,7 @@
<div data-snippet-id="hr" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_separator.png"/>
<span class="oe_snippet_thumbnail_title">Separator</span>
<span class="oe_snippet_thumbnail_title">Separator</span>
</div>
<hr class="oe_snippet_body"/>
</div>
@@ -414,7 +383,7 @@
<div data-snippet-id="image-gallery" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_image_gallery.png"/>
<span class="oe_snippet_thumbnail_title">Image Gallery</span>
<span class="oe_snippet_thumbnail_title">Image Gallery</span>
</div>
<section class="oe_snippet_body">
<div class="container">
@@ -467,7 +436,7 @@
<div class="col-md-4">
<div class="panel panel-info">
<div class="panel-heading text-center">
<h2 style="margin: 0">Beginner</h2>
<p style="margin: 0" class="text-muted">
@@ -479,7 +448,7 @@
<div>per month</div>
</div>
<ul class="list-group">
<li class="list-group-item active">Battery: 8 hours</li>
<li class="list-group-item">Screen: 2.5 inch</li>
@@ -496,7 +465,7 @@
</div>
<div class="col-md-4">
<div class="panel panel-primary">
<div class="panel-heading text-center">
<h2 style="margin: 0">Professional</h2>
<p style="margin: 0">
@@ -508,7 +477,7 @@
<div>per month</div>
</div>
<ul class="list-group">
<li class="list-group-item active">Battery: 12 hours</li>
<li class="list-group-item">Screen: 2.8 inch</li>
@@ -525,7 +494,7 @@
</div>
<div class="col-md-4">
<div class="panel panel-info">
<div class="panel-heading text-center">
<h2 style="margin: 0">Expert</h2>
<p style="margin: 0" class="text-muted">
@@ -537,7 +506,7 @@
<div>per month</div>
</div>
<ul class="list-group">
<li class="list-group-item active">Battery: 20 hours</li>
<li class="list-group-item">Screen: 2.8 inch</li>
@@ -579,7 +548,7 @@
<div data-snippet-id="faq" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_faq.png"/>
<span class="oe_snippet_thumbnail_title">FAQ</span>
<span class="oe_snippet_thumbnail_title">FAQ</span>
</div>
<section class="oe_snippet_body">
<div class="container">
@@ -626,7 +595,7 @@
<div data-snippet-id="references" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_references.png"/>
<span class="oe_snippet_thumbnail_title">References</span>
<span class="oe_snippet_thumbnail_title">References</span>
</div>
<section class="oe_snippet_body mb32 mt16">
<div class="container">
@@ -677,37 +646,64 @@
</section>
</div>
<div data-snippet-id="features" data-selector-children=".oe_structure, [data-oe-type=html]">
<div data-snippet-id="slider" data-selector-children=".oe_structure, [data-oe-type=html]">
<li class="oe_snippet_options divider"></li>
<li class="oe_snippet_options">
<a href="#" class="button js_add">Add Slide</a>
</li>
<li class="oe_snippet_options">
<a href="#" class="button js_remove">Remove Slide</a>
</li>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_features.png"/>
<span class="oe_snippet_thumbnail_title">Features</span>
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
<span class="oe_snippet_thumbnail_title">Quotes Slider</span>
</div>
<section class="oe_snippet_body mb16">
<div class="container">
<div class="row mt16 mb16">
<div class="col-md-3 text-center">
<span class="fa fa-suitcase fa-5x"></span>
<h3 class="mt8 mb0">First Feature</h3>
<p class="text-muted">Tell what's the value for the customer for this feature.</p>
</div>
<div class="col-md-3 text-center">
<span class="fa fa-lock fa-5x"></span>
<h3 class="mt8 mb0">Second Feature</h3>
<p class="text-muted">Write what the customer would like to know, not what you want to show.</p>
</div>
<div class="col-md-3 text-center">
<span class="fa fa-heart fa-5x"></span>
<h3 class="mt8 mb0">Third Feature</h3>
<p class="text-muted">A small explanation of this great feature, in clear words.</p>
</div>
<div class="col-md-3 text-center">
<span class="fa fa-credit-card fa-5x"></span>
<h3 class="mt8 mb0">Fourth Feature</h3>
<p class="text-muted">A small explanation of this great feature on two lines.</p>
<div id="myQuoteCarousel" class="oe_snippet_body carousel quotecarousel slide mb0">
<!-- Indicators -->
<ol class="carousel-indicators mb0">
<li data-target="#myQuoteCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myQuoteCarousel" data-slide-to="1"></li>
</ol>
<div class="carousel-inner">
<div class="item text_only active">
<div class="container">
<div class="content">
<div class="row">
<blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
<p>
Write a quote here from one of your customers. Quotes are a
great way to build confidence in your products or services.
</p>
<small>Author of this quote</small>
</blockquote>
</div>
</div>
</div>
</div>
<div class="item text_only">
<div class="container">
<div class="content">
<div class="row">
<blockquote class="mt48 mb16 col-md-4 col-md-offset-4">
<p>
OpenERP provides essential platform for our project management.
Things are better organized and more visible with it.
</p>
<small>John Doe, CEO</small>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
<div data-snippet-id="features-list" data-selector-children=".oe_structure, [data-oe-type=html]">
@@ -773,7 +769,7 @@
<div data-snippet-id="parallax" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_parallax.png"/>
<span class="oe_snippet_thumbnail_title">Parallax</span>
<span class="oe_snippet_thumbnail_title">Parallax</span>
</div>
<li class="oe_snippet_options dropdown-submenu">
<a tabindex="-1" href="#">Scroll Speed</a>
@@ -796,7 +792,7 @@
<div data-snippet-id="parallax_quote" data-selector-children=".oe_structure, [data-oe-type=html]">
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_quotes_slider.png"/>
<span class="oe_snippet_thumbnail_title">Parallax Slider</span>
<span class="oe_snippet_thumbnail_title">Parallax Slider</span>
</div>
<section class="oe_snippet_body parallax" data-snippet-id="parallax"
style="height: 320px; background-image: url('/website/static/src/img/parallax/quote.png')"
@@ -862,7 +858,7 @@
<div data-snippet-id='colmd' data-selector-vertical-children='.row'>
<div class="oe_snippet_thumbnail">
<img class="oe_snippet_thumbnail_img" src="/website/static/src/img/blocks/block_column.png"/>
<span class="oe_snippet_thumbnail_title">Add Column</span>
<span class="oe_snippet_thumbnail_title">Add Column</span>
</div>
<div class="oe_snippet_body col-md-4">
<img class="img img-rounded img-responsive" src="/website/static/src/img/china_thumb.jpg"/>
+2 -3
View File
@@ -22,7 +22,6 @@
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website.models import website
import werkzeug
import datetime
import time
@@ -43,8 +42,8 @@ class sale_quote(http.Controller):
if token != order.access_token:
return request.website.render('website.404')
# Log only once a day
if request.httprequest.session.get('view_quote',False)!=now:
request.httprequest.session['view_quote'] = now
if request.session.get('view_quote',False)!=now:
request.session['view_quote'] = now
body=_('Quotation viewed by customer')
self.__message_post(body, order_id, type='comment')
days = 0
@@ -11,10 +11,14 @@ inject = [
class TestUi(openerp.tests.HttpCase):
def test_01_admin_shop_tour(self):
self.phantom_js("/", "openerp.website.Tour.run_test('shop')", "openerp.website.Tour.Shop", login="admin")
#self.phantom_js("/", "openerp.website.Tour.run_test('shop')", "openerp.website.Tour.Shop", login="admin")
# AssertionError: Error: Time overlaps to arrive to step 5: 'New product created'
print 'FIXME TODO ERROR FAILED test_01_admin_shop_tour has been deactivated due to systematic errors'
def test_02_admin_checkout(self):
self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour", login="admin")
# self.phantom_js("/", "openerp.website.Tour.run_test('shop_buy_product')", "openerp.website.Tour", login="admin")
# AssertionError: TypeError: 'undefined' is not an object (evaluating 'website.Tour.tours[id].run')
print 'FIXME TODO ERROR FAILED test_02_admin_checkout has been deactivated due to systematic errors'
@unittest2.expectedFailure
def test_03_demo_checkout(self):