Aug 14, 2019

odoo add followers when task change followers


just a simple automation




partners_who_are_users = []
users = env['res.users'].search([])
for user in users:
  partners_who_are_users.append(user.partner_id.id)

followers = []
for partner in record.project_id.message_follower_ids.ids:
  if partner in partners_who_are_users:
    followers.append(partner)



followers.append(record.user_id.partner_id.id)
record.project_id.message_subscribe(followers)


Read more ...

SOLVED odoo 11 Domains no longer working with dynamic dates

regarding to :
https://github.com/odoo/odoo/issues/22956

on V10, we can use :

[["create_date","<",time.strftime('%Y-%m-%d')]]  


this is a simple solution,

update base_automation set filter_pre_domain='[["write_date","<=", datetime.datetime.now().replace(microsecond=0).replace(hour=0).replace(minute=0).replace(second=0).isoformat(" ").partition("+")[0]  ]]', filter_domain='[["write_date","<=", datetime.datetime.now().replace(microsecond=0).replace(hour=0).replace(minute=0).replace(second=0).isoformat(" ").partition("+")[0]  ]]' where id=5;

main idea is change "%" notation from strftime to native, make it pass the "eval" to be compiled.



Read more ...

Aug 9, 2019

all about followers odoo

just as your inspiration only.

Automatically add follower to Sales Order if user(s) is a follower of the Contact - Odoo 10

10/18/18, 3:53 AM 1,075 views
How do I automatically add all followers from the partner to any new Sales Order with the same Partner?

So when a sales order is placed it will add all users following the Partner of the Sales Order to the Sales Order.



2
Ray Carnes United States
 10/18/18, 9:56 AM
An Automated Action (this example should work with v11 and v12) can combine the followers (this example adds ONLY followers who are Users) on the Sale Order and followers from the Customer:

Code to copy/paste:

partners_who_are_users = []
users = env['res.users'].search([])
for user in users:
  partners_who_are_users.append(user.partner_id.id)

followers = []
for partner in record.partner_id.message_partner_ids.ids:
  if partner in partners_who_are_users:
    followers.append(partner)
record.message_subscribe(followers)

=========================  

add followers automatically

12/18/13, 5:27 AM 10,045 views
Hello in crm.lead the responsible user (user_id) is automatically added as follower to the new task. How can I add this functionality to add some users to my custom object?



3
Ray Carnes United States
 2/9/18, 3:16 AM
To expand on David's answer, I needed to add the Customer as a follower on a LEAD in v10.
I created an Automated Action that looked for crm.lead records created or updated that also had either a Customer or Email populated.
If the record had a Customer, I needed to just add that Customer as a follower (as long as it wasn't already).
If the record had an Email, I needed to check if a Customer already existed, and if not - create them.
This is the code I used for the Server Action:
if record.partner_id: 
    partner = record.partner_id  
else: 
    partner = env['res.partner'].search([('email','=',record.email_from)]) 
if not partner: 
    reg = { 
           'name': record.contact_name or record.email_from, 
           'email': record.email_from, 
           'type': 'contact', 
          } 
    partner = env['res.partner'].create(reg) 
partner_id = partner.id 
reg = { 
       'res_id': record.id, 
       'res_model': 'crm.lead', 
       'partner_id': partner_id, 
      } 
if not env['mail.followers'].search([('res_id','=',record.id),('res_model','=','crm.lead'),('partner_id','=',partner_id)]): 
    follower_id = env['mail.followers'].create(reg)
Read more ...

Jul 12, 2019

solved odoo redirect loop nginx ssl


1. proxy mode = true
2. url base = http
3. redirect to logout

if ($query_string ~ "^(.*)redirect=(.*)$") {
       set $args '';
       rewrite ^(.*)$ https://xxx.com/web/session/logout  permanent;

    }

test in HTTPS:

curl -v https://xxx.com/web/login?redirect=http%3A%2F%2Fxxx.com
*   Trying 66.96.239.122...
* TCP_NODELAY set
* Connected to xxx.com (66.96.239.xxx) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: OU=Domain Control Validated; CN=xxx.com
*  start date: Jun 26 00:51:45 2019 GMT
*  expire date: Jun 26 00:51:45 2020 GMT
*  subjectAltName: host "xxx.com" matched cert's "xxx.com"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=AlphaSSL CA - SHA256 - G2
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fe611006400)
> GET /web/login?redirect=http%3A%2F%2Fxxx.com HTTP/2
> Host: xxx.com
> User-Agent: curl/7.54.0
> Accept: */*
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 301 
< server: nginx/1.10.3 (Ubuntu)
< date: Thu, 11 Jul 2019 18:18:56 GMT
< content-type: text/html
< content-length: 194
< location: https://xxx.com/web/session/logout
< strict-transport-security: max-age=31536000; includeSubdomains; preload
< content-security-policy: upgrade-insecure-requests
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>

* Connection #0 to host xxx.com left intact

test in HTTP :

curl -v http://xxx.com/web/login?redirect=http%3A%2F%2Fxxx.com
*   Trying 66.96.239.122...
* TCP_NODELAY set
* Connected to xxx.com (66.96.239.xxx) port 80 (#0)
> GET /web/login?redirect=http%3A%2F%2Fxxx.com HTTP/1.1
> Host: xxx.com
> User-Agent: curl/7.54.0
> Accept: */*
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.10.3 (Ubuntu)
< Date: Thu, 11 Jul 2019 18:27:46 GMT
< Content-Type: text/html
< Content-Length: 194
< Connection: keep-alive
< Location: https://xxx.com/web/session/logout
< Strict-Transport-Security: max-age=2592000
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.3 (Ubuntu)</center>
</body>
</html>

* Connection #0 to host xxx.com left intact






Read more ...

Jul 5, 2019

SOLVED, odoo 11, It is not possible to unreserve more products of than you have in stock

just copy paste from Julia,


i had a similar problem, Odoo send me this fix:
ARM created a fix for this. In order to implement it you need to follow these steps:
1.debug mode
2.technical/server actions
3.create
4.action name: e.g. fix unreserved qty
5.model: ir.actions.server
6.action to do: "execute python code"
7.copy/paste the fix underneath the pre-existing code
8."save"
9."create contextual action"
10.refresh page
11.action/fix "fix unreserved qty"
12.wait for it to load
13."remove contextual action"

14.action/delete


here is the code
============
quants = env['stock.quant'].search([])
move_line_ids = []
warning = ''
for quant in quants:
    move_lines = env["stock.move.line"].search([
        ('product_id', '=', quant.product_id.id),
        ('location_id', '=', quant.location_id.id),
        ('lot_id', '=', quant.lot_id.id),
        ('package_id', '=', quant.package_id.id),
        ('owner_id', '=', quant.owner_id.id),
        ('product_qty', '!=', 0)
    ])
    move_line_ids += move_lines.ids
    reserved_on_move_lines = sum(move_lines.mapped('product_qty'))
    move_line_str = str.join(', ', [str(move_line_id) for move_line_id in move_lines.ids])

    if quant.location_id.should_bypass_reservation():
        # If a quant is in a location that should bypass the reservation, its `reserved_quantity` field
        # should be 0.
        if quant.reserved_quantity != 0:
            quant.write({'reserved_quantity': 0})
    else:
        # If a quant is in a reservable location, its `reserved_quantity` should be exactly the sum
        # of the `product_qty` of all the partially_available / assigned move lines with the same
        # characteristics.
        if quant.reserved_quantity == 0:
            if move_lines:
                move_lines.with_context(bypass_reservation_update=True).write({'product_uom_qty': 0})
        elif quant.reserved_quantity < 0:
            quant.write({'reserved_quantity': 0})
            if move_lines:
                move_lines.with_context(bypass_reservation_update=True).write({'product_uom_qty': 0})
        else:
            if reserved_on_move_lines != quant.reserved_quantity:
                move_lines.with_context(bypass_reservation_update=True).write({'product_uom_qty': 0})
                quant.write({'reserved_quantity': 0})
            else:
              if any(move_line.product_qty < 0 for move_line in move_lines):
                move_lines.with_context(bypass_reservation_update=True).write({'product_uom_qty': 0})
                quant.write({'reserved_quantity': 0})

move_lines = env['stock.move.line'].search([
    ('product_id.type', '=', 'product'),
    ('product_qty', '!=', 0),
    ('id', 'not in', move_line_ids),
])

move_lines_to_unreserve = []

for move_line in move_lines:
    if not move_line.location_id.should_bypass_reservation():
       move_lines_to_unreserve.append(move_line.id)

if len(move_lines_to_unreserve) > 1:
    env.cr.execute(""" UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id in %s ;""" % (tuple(move_lines_to_unreserve), ))
elif len(move_lines_to_unreserve) == 1:
    env.cr.execute(""" UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id = %s ;""" % (move_lines_to_unreserve[0]))


then on the logs you will see : 
2019-07-05 15:32:54,032 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2144]
2019-07-05 15:32:54,388 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2145]
2019-07-05 15:32:54,600 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2146]
2019-07-05 15:32:54,814 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2147]
2019-07-05 15:32:55,026 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2148]
2019-07-05 15:32:55,242 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2149]
2019-07-05 15:32:55,458 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2150]
2019-07-05 15:32:55,674 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2151]
2019-07-05 15:32:55,886 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2152]
2019-07-05 15:32:56,095 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2153]
2019-07-05 15:32:56,306 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2154]
2019-07-05 15:32:56,517 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2155]
2019-07-05 15:32:56,736 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2156]
2019-07-05 15:32:56,952 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2157]
2019-07-05 15:32:57,164 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2158]
2019-07-05 15:32:57,378 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2159]
2019-07-05 15:32:57,595 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2160]
2019-07-05 15:32:57,808 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2161]
2019-07-05 15:32:58,023 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2162]
2019-07-05 15:32:58,234 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2163]
2019-07-05 15:32:58,447 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2164]
2019-07-05 15:32:58,654 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2165]
2019-07-05 15:32:58,868 710 INFO dexexp odoo.models.unlink: User #6 deleted stock.move.line records with IDs: [2166]
2019-07-05 15:32:59,081 
Read more ...

Jun 26, 2019

SOLVED MAP odoo "Requests to the server have been blocked by an extension"

check your nginx config...

remove

#add_header X-Frame-Options SAMEORIGIN;
#add_header X-Content-Type-Options nosniff;
#add_header X-XSS-Protection "1; mode=block";

#add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://assets.zendesk.com https://connect.facebook.net; img-src 'self' https://ssl.google-analytics.com https://s-static.ak.facebook.com https://assets.zendesk.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://assets.zendesk.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://assets.zendesk.com https://www.facebook.com https://s-static.ak.facebook.com https://tautt.zendesk.com; object-src 'none'";
Read more ...

odoo nginx ssl error 499 or 304


Secure Connection Failed

An error occurred during a connection to kolaboratorium.com. SSL received an unexpected New Session Ticket handshake message. Error code: SSL_ERROR_RX_UNEXPECTED_NEW_SESSION_TICKET

    The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
    Please contact the website owners to inform them of this problem.

Learn more…

or sometimes showing error
ERR_SSL_PROTOCOL_ERROR

This site can’t provide a secure connection

kolaboratorium.com sent an invalid response.

ERR_SSL_PROTOCOL_ERROR



the solution is : 

proxy_ignore_client_abort on;
ssl_session_tickets on;




Read more ...

Jun 25, 2019

just cleaning dashboard


sudo vim ./web_settings_dashboard/static/src/xml/dashboard.xml

<t t-name="DashboardApps">
        <div class="text-center o_web_settings_dashboard_apps">
            <i class="fa fa-cog fa-4x text-muted o_browse_apps" style="cursor: pointer;"></i>
            <div class="o_web_settings_dashboard_header">
                <t t-set="installed_apps" t-value="widget.data.installed_apps"/>
                <t t-if="installed_apps">
                    <t t-esc="installed_apps"></t>
                    <t t-if="installed_apps == 1">Installed App</t>
                    <t t-if="installed_apps > 1">Installed Apps</t>
                </t>
                <t t-if="! installed_apps">
                    No app installed
                </t>
            </div>
            <div>
                <a class="btn btn-primary btn-block o_browse_apps" role="button"><strong>Browse Apps</strong></a>
            </div>
            <!-- div class="o_web_settings_dashboard_pills">
                <a href="https://www.odoo.com/apps/modules" target="_blank" class="pull-left"><i class="fa fa-rocket fa-2x text-muted"/> App store</a>
                <a href="https://www.odoo.com/apps/themes" target="_blank" class="pull-right"><i class="fa fa-picture-o fa-2x text-muted"/> Theme store</a>
            </div -->
            <div class="clearfix"/>
        </div>
    </t>



kedua 

 <t t-name="DashboardPlanner">
        <div class="text-center o_web_settings_dashboard_planner">
            <i class="fa fa-check-square-o fa-4x text-muted"></i>
            <div class="o_web_settings_dashboard_header">
                <span class="o_web_settings_dashboard_planner_overall_progress"><t t-esc="widget.overall_progress"></t></span>%
                Implementation
            </div>
            <div>
                <small class="text-muted text-center o_web_settings_dashboard_compact_subtitle">
                    Follow these implementation guides to get the most.
                </small>
            </div>
            <hr/>
            <t t-set="planners" t-value="widget.planners"/>
            <t t-call="DashboardPlanner.PlannersList"/>
            <hr/>
            <!-- 
            Need more help? <a target="_blank" href="https://www.odoo.com/documentation/user">Browse the documentation.</a>
            -->
        </div>
    </t>


Ketiga

    <t t-name="DashboardShare">
        <div class="text-center o_web_settings_dashboard_share">
            <i class="fa fa-share-alt fa-4x text-muted"/>
            <div class="o_web_settings_dashboard_header">Share the Love</div>
            <div>
                <small class="text-muted text-center o_web_settings_dashboard_compact_subtitle">
                    Help us spread the word: Share App's awesomeness with your friends!
                </small>
            </div>
            <div class="row mt16">
                <div class="col-xs-4"><a href="#"><i class="fa fa-twitter-square fa-4x tw_share"/></a></div>
                <div class="col-xs-4"><a href="#"><i class="fa fa-facebook-square fa-4x fb_share"/></a></div>
                <div class="col-xs-4"><a href="#"><i class="fa fa-linkedin-square fa-4x li_share"/></a></div>
            </div>
            <hr/>
            <t t-set="server_version" t-value="widget.data.server_version"/>
            <t t-set="debug" t-value="widget.data.debug"/>
            <!-- div class="row">
                <div class="text-center">
                    <div class="user-heading">
                        <h3>
                            Odoo <t t-esc="server_version"/>
                            (Community Edition)
                        </h3>
                    </div>
                    <div>
                        <div class="tab-content">
                            <div id="settings" class="tab-pane active text-muted text-center o_web_settings_dashboard_compact_subtitle">
                                <small>Copyright © 2004-2016 <a target="_blank" href="https://www.odoo.com" style="text-decoration: underline;">Odoo S.A.</a> <a target="_blank" href="http://www.gnu.org/licenses/lgpl.html" style="text-decoration: underline;">GNU LGPL Licensed</a></small>
                            </div>
                        </div>
                    </div>
                </div>
            </div -->
            <hr/>
            <div class="row">
                <div class="col-md-12">
                    <a t-if="debug != true" class="oe_activate_debug_mode pull-right" href="?debug" >Activate the developer mode</a>
                    <br t-if="debug != true"/>
                    <a t-if="debug != 'assets'" class="oe_activate_debug_mode pull-right" href="?debug=assets" >Activate the developer mode (with assets)</a>
                    <br t-if="debug != 'assets'"/>
                    <a t-if="debug != false" class="oe_activate_debug_mode pull-right" href="/web" >Deactivate the developer mode</a>
                </div>
            </div>
        </div>
    </t>

ke empat

  <t t-name="DashboardEnterprise">
        <hr class="mt16"/>
        <!-- div class="text-center o_web_settings_dashboard_enterprise">
            <div class="text-center o_web_settings_dashboard_enterprise">
                <div class="text-center o_web_settings_dashboard_header">Odoo Enterprise</div>
                <div class="mb16"><a href="http://www.odoo.com/editions" target="_blank">Get more features with the Enterprise Edition!</a></div>
                <div><img class="img img-responsive" t-att-src='_s + "/web/static/src/img/enterprise_upgrade.jpg"'/></div>
                <div>
                    <a class="btn btn-primary btn-block o_confirm_upgrade" role="button"><strong>Upgrade Now</strong></a>
                </div>
            </div>
        </div -->
    </t>

vim ./addons/mail/static/src/js/client_action.js

see  :
_onRequestNotificationPermission: function (event)

then
sudo vim ./addons/mail/static/src/xml/client_action.xml

see : <span class="o_mail_request_permission">

untuk dialog box title dlsb ada di sini

sudo vim addons/web/static/src/js/services/crash_manager.js
dan sudo vim addons/web/static/src/js/core/dialog.js
Read more ...

aerolib aero report and openoffice odoo 11


INSTALL AEROOLIB

cd ~
wget https://launchpad.net/aeroolib/trunk/1.0.0/+download/aeroolib.tar.gz
tar xfvz aeroolib.tar.gz 
cd aeroolib
sudo python setup.py install

*https://github.com/Numigi/aeroo_reports 

INSTALL OPENOFFICE

sudo add-apt-repository ppa:libreoffice/ppa

apt-get install libreoffice libreoffice-writer 
OR
sudo apt-get install openoffice.org-headless openoffice.org-writer openoffice.org-draw
sudo nano /etc/init.d/openoffice.sh
Paste the following code into that file:

#!/bin/bash
# openoffice.org headless server script
#
# chkconfig: 2345 80 30
# description: headless openoffice server script
# processname: openoffice
#
# Author: Vic Vijayakumar
# Modified by Federico Ch. Tomasczik
#
OOo_HOME=/usr/bin
SOFFICE_PATH=$OOo_HOME/soffice
PIDFILE=/var/run/openoffice-server.pid

set -e

case "$1" in
start)
if [ -f $PIDFILE ]; then
echo "OpenOffice headless server has already started."
sleep 5
exit
fi
echo "Starting OpenOffice headless server"
$SOFFICE_PATH -headless -nologo -nofirststartwizard -accept="socket,host=127.0.0.1,port=8100;urp" & > /dev/null 2>&1
touch $PIDFILE
;;
stop)
if [ -f $PIDFILE ]; then
echo "Stopping OpenOffice headless server."
killall -9 soffice && killall -9 soffice.bin
rm -f $PIDFILE
exit
fi
echo "Openoffice headless server is not running."
exit
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0

 Exit the nano text editor saving the file as you do. 

Now make the script executable:

sudo chmod 0755 /etc/init.d/openoffice.sh
Make it start automatically on reboot by executing this command:

sudo update-rc.d openoffice.sh defaults
Now start the service by running

sudo /etc/init.d/openoffice.sh start

INSTALL AEROREPORT

sudo apt-get install python-setuptools

sudo apt-get install python-genshi python-cairo python-lxml -y

sudo apt-get install libreoffice-script-provider-python -y

sudo mkdir /opt/aeroo

cd /opt/aeroo

git clone https://github.com/aeroo/aeroolib.git

cd /opt/aeroo/aeroolib

sudo python3 setup.py install

wget git clone https://github.com/aeroo/currency2text.git

cd /opt/aeroo/currency2text

sudo python3 setup.py install

sudo apt-get install python3-pip

sudo pip3 install jsonrpc2 daemonize

cd /opt/aeroo

sudo git clone https://github.com/aeroo/aeroo_docs.git

sudo python3 /opt/aeroo/aeroo_docs/aeroo-docs start -c /etc/aeroo-docs.conf

sudo cp /opt/aeroo/aeroo_docs/aeroo-docs /etc/init.d/aeroo-docs

sudo update-rc.d aeroo-docs defaults

sudo service aeroo-docs start



sudo chmod 0755 /etc/init.d/openoffice.sh
sudo chmod 0755 /etc/init.d/aeroo-docs 

TESTING

goto  setting, technical, Aerodoc connection, test connect

taraaaa.....





refs : 
*http://weltbilder.forumnews.com/cBUZZ.IO/aeroo_reports/src/branch/master?lang=zh-CN 
*https://serpentcs.com/serpentcs-setup-aeroo-report-engine-for-openerp-272
*http://www.hitechnologia.com/forum/odoo-forum-1/question/odoo-openerp-how-to-setup-install-configure-aeroo-reports-in-odoo-openerp-v8-148 



Read more ...

Jun 15, 2019

odoo chat without refresh

its just reminder about the chat on odoo use 8072

first please check port services by netstat, if still none, just do as this reference

Longpolling

 Longpolling is a way to deliver instant notification to web client (e.g. in chats).

 To activate longpolling:

 install dependencies

 odoo 11.0

 python -c "import gevent" || sudo pip3 install gevent

odoo 10.0

 python -c "import gevent" || sudo pip install gevent
 python -c "import psycogreen" || sudo pip install psycogreen
 set non-zero value for workers parameter
 configure nginx

 location /longpolling {
     proxy_pass http://127.0.0.1:8072;
 }
 location / {
     proxy_pass http://127.0.0.1:8069;
 }



refs : https://odoo-development.readthedocs.io/en/latest/admin/longpolling.html

Read more ...

May 9, 2019

odoo roman legend


just simple modify your sequence by this :



    def _get_prefix_suffix(self):
        def _interpolate(s, d):
            return (s % d) if s else ''

        def _int_to_roman(input):
            ints = (1000, 900500, 400, 10090, 5040, 109,   54,   1)
            nums = ('M''CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
            result = ""
            for i in range(len(ints)):
                count = int(input / ints[i])
                result += nums[i] * count
                input -= ints[i] * count
            return result

        def _interpolation_dict():
            now = range_date = effective_date = datetime.now(pytz.timezone(self._context.get('tz') or 'UTC'))
            if self._context.get('ir_sequence_date'):
                effective_date = datetime.strptime(self._context.get('ir_sequence_date'), '%Y-%m-%d')
            if self._context.get('ir_sequence_date_range'):
                range_date = datetime.strptime(self._context.get('ir_sequence_date_range'), '%Y-%m-%d')

            sequences = {
                'ryear': '%Y', 'rmonth': '%m','year': '%Y', 'month': '%m', 'day': '%d', 'y': '%y', 'doy': '%j', 'woy': '%W',
                'weekday': '%w', 'h24': '%H', 'h12': '%I', 'min': '%M', 'sec': '%S'
            }
            res = {}
            for key, format in sequences.items():
                if key in ['ryear', 'rmonth']:
                    res[key] = _int_to_roman(int(effective_date.strftime(format)))
                    res['range_' + key] = _int_to_roman(int(range_date.strftime(format)))
                    res['current_' + key] =_int_to_roman(int(now.strftime(format)))
                else:
                    res[key] = effective_date.strftime(format)
                    res['range_' + key] = range_date.strftime(format)
                    res['current_' + key] = now.strftime(format)


            return res
Read more ...