create token and menu rappi
This commit is contained in:
parent
a474e55de2
commit
0d37b9374a
|
@ -6,6 +6,7 @@ from . import party
|
||||||
from . import web_channel
|
from . import web_channel
|
||||||
from . import mercado_libre
|
from . import mercado_libre
|
||||||
from . import shopify
|
from . import shopify
|
||||||
|
from . import rappi
|
||||||
from . import api_log
|
from . import api_log
|
||||||
from . import ir
|
from . import ir
|
||||||
from . import routes
|
from . import routes
|
||||||
|
@ -19,6 +20,7 @@ def register():
|
||||||
web_channel.SaleWebChannel,
|
web_channel.SaleWebChannel,
|
||||||
mercado_libre.MercadoLibre,
|
mercado_libre.MercadoLibre,
|
||||||
shopify.Shopify,
|
shopify.Shopify,
|
||||||
|
rappi.Rappi,
|
||||||
sale.Sale,
|
sale.Sale,
|
||||||
sale.SaleForChannelStart,
|
sale.SaleForChannelStart,
|
||||||
web_channel.SynchronizeChannelOrdersStart,
|
web_channel.SynchronizeChannelOrdersStart,
|
||||||
|
@ -33,6 +35,7 @@ def register():
|
||||||
sale.SaleForChannel,
|
sale.SaleForChannel,
|
||||||
web_channel.SynchronizeChannelOrders,
|
web_channel.SynchronizeChannelOrders,
|
||||||
web_channel.FinishInvoices,
|
web_channel.FinishInvoices,
|
||||||
|
web_channel.SynchronizeMenuWizard,
|
||||||
module='sale_web_channel', type_='wizard')
|
module='sale_web_channel', type_='wizard')
|
||||||
Pool.register(
|
Pool.register(
|
||||||
sale.SaleForChannelReport,
|
sale.SaleForChannelReport,
|
||||||
|
|
|
@ -0,0 +1,239 @@
|
||||||
|
# -*- coding: UTF-8 -*-
|
||||||
|
# This file is part electronic_mail_template module for Tryton.
|
||||||
|
# The COPYRIGHT file at the top level of this repository contains
|
||||||
|
# the full copyright notices and license terms.
|
||||||
|
from decimal import Decimal
|
||||||
|
from trytond.pool import Pool
|
||||||
|
from itertools import chain
|
||||||
|
from trytond.transaction import Transaction
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
from datetime import datetime, date
|
||||||
|
from trytond.pyson import Eval
|
||||||
|
from .web_channel import SaleWebChannel
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
|
import base64
|
||||||
|
import hmac
|
||||||
|
import hashlib
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
|
||||||
|
URL_DEV = 'https://rests-integrations-dev.auth0.com/oauth/token'
|
||||||
|
URL_PRODUCTION = 'https://rests-integrations.auth0.com/oauth/token'
|
||||||
|
|
||||||
|
HEADERS = {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Content-type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Rappi(SaleWebChannel):
|
||||||
|
'Rappi'
|
||||||
|
__name__ = 'sale.web_channel.rappi'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def __setup__(cls):
|
||||||
|
super(Rappi, cls).__setup__()
|
||||||
|
cls._buttons.update({
|
||||||
|
'generate_token_access': {
|
||||||
|
'invisible': Eval('state') != 'active',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
def _get_context(self):
|
||||||
|
print(self)
|
||||||
|
return {
|
||||||
|
'company': self.company.id,
|
||||||
|
'user': self.user.id,
|
||||||
|
'shops': [self.shop.id],
|
||||||
|
'shop': self.shop.id,
|
||||||
|
'language': 'es'
|
||||||
|
}
|
||||||
|
|
||||||
|
def generate_token_access(self):
|
||||||
|
print('holis')
|
||||||
|
token_request = {
|
||||||
|
"client_id": self.app_id,
|
||||||
|
"client_secret": self.secret_key,
|
||||||
|
"audience": 'https://int-public-api-v2/api',
|
||||||
|
"grant_type": "client_credentials",
|
||||||
|
}
|
||||||
|
result = requests.post(
|
||||||
|
URL_DEV,
|
||||||
|
json=token_request,
|
||||||
|
headers=HEADERS).json()
|
||||||
|
print(result)
|
||||||
|
self.access_token = result['access_token']
|
||||||
|
self.save()
|
||||||
|
|
||||||
|
def synchronize_menu_rappi(self):
|
||||||
|
menu = {
|
||||||
|
# 'storeId': self.store_id,
|
||||||
|
'storeId': '900152684',
|
||||||
|
'items': []
|
||||||
|
}
|
||||||
|
menu_append = menu['items'].append
|
||||||
|
pool = Pool()
|
||||||
|
Category = pool.get('product.template-product.category')
|
||||||
|
# price_list = self.shop.price_list.lines
|
||||||
|
# for index, line in enumerate(price_list):
|
||||||
|
# if line.category and not line.product:
|
||||||
|
# self.create_menu_by_global_category(line, Category)
|
||||||
|
# elif not line.category and line.product:
|
||||||
|
# # elif line.category and line.product:
|
||||||
|
# # pass
|
||||||
|
# # else:
|
||||||
|
# # raise UserWarning('BAD CONFIGURATION IN LINE ID ', line.id)
|
||||||
|
|
||||||
|
# # menu_append({
|
||||||
|
# # 'category': {
|
||||||
|
# # 'id': line.product.categories[0].id,
|
||||||
|
# # 'maxQty': 0,
|
||||||
|
# # 'minQty': 0,
|
||||||
|
# # 'name': line.product.categories[0].name,
|
||||||
|
# # },
|
||||||
|
# # 'children': [],
|
||||||
|
# # 'name': line.product.categories[0].name,
|
||||||
|
# # 'description': line.product.description if line.product.description else 'no esta disponible',
|
||||||
|
# # 'imageUrl': line.product.images[0].image_url if line.product.images else '',
|
||||||
|
# # 'price': float(line.price_w_tax_computed),
|
||||||
|
# # 'sku': line.product.code,
|
||||||
|
# # 'sortingPosition': 0,
|
||||||
|
# # "type": "PRODUCT",
|
||||||
|
# # # 'maxLimit': '',
|
||||||
|
# # })
|
||||||
|
# # if hasattr(line.product, 'products_mix') and line.product.products_mix:
|
||||||
|
# # for mix in line.product.products_mix:
|
||||||
|
# # menu['items'][0]['children'].append({
|
||||||
|
# # "category": {
|
||||||
|
# # "id": mix.categories[0].id,
|
||||||
|
# # "maxQty": 1,
|
||||||
|
# # "minQty": 0,
|
||||||
|
# # "name": mix.categories[0].name,
|
||||||
|
# # "sortingPosition": 0
|
||||||
|
# # },
|
||||||
|
# # "name": mix.name,
|
||||||
|
# # "description": mix.description,
|
||||||
|
# # "price": float(mix.list_price),
|
||||||
|
# # "sku": mix.id,
|
||||||
|
# # "maxLimit": 1,
|
||||||
|
# # "sortingPosition": 1,
|
||||||
|
# # "type": "PRODUCT"
|
||||||
|
# # })
|
||||||
|
|
||||||
|
menu = {
|
||||||
|
"storeId": "900152684",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"name": "Grilled Chicken Burger",
|
||||||
|
"description": "Grilled chicken burger description",
|
||||||
|
"price": 14000,
|
||||||
|
"sku": "10",
|
||||||
|
"sortingPosition": 0,
|
||||||
|
"type": "PRODUCT",
|
||||||
|
"category": {
|
||||||
|
"id": "2090019638",
|
||||||
|
"maxQty": 0,
|
||||||
|
"minQty": 0,
|
||||||
|
"name": "Burgers",
|
||||||
|
"sortingPosition": 0
|
||||||
|
},
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"category": {
|
||||||
|
"id": "211",
|
||||||
|
"maxQty": 1,
|
||||||
|
"minQty": 0,
|
||||||
|
"name": "Do you want to add?",
|
||||||
|
"sortingPosition": 0
|
||||||
|
},
|
||||||
|
"name": "French Fries",
|
||||||
|
"description": "crunchy french fries",
|
||||||
|
"price": 5000,
|
||||||
|
"sku": "1",
|
||||||
|
"maxLimit": 1,
|
||||||
|
"sortingPosition": 1,
|
||||||
|
"type": "TOPPING"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": {
|
||||||
|
"id": "211",
|
||||||
|
"maxQty": 1,
|
||||||
|
"minQty": 0,
|
||||||
|
"name": "Do you want to add?",
|
||||||
|
"sortingPosition": 0
|
||||||
|
},
|
||||||
|
"name": "Potato Wedges",
|
||||||
|
"price": 7000,
|
||||||
|
"sku": "2",
|
||||||
|
"maxLimit": 1,
|
||||||
|
"sortingPosition": 1,
|
||||||
|
"type": "TOPPING"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hawaiian Pizza",
|
||||||
|
"description": "hawaiian pizza description",
|
||||||
|
"price": 18000,
|
||||||
|
"sku": "11",
|
||||||
|
"sortingPosition": 1,
|
||||||
|
"type": "PRODUCT",
|
||||||
|
"category": {
|
||||||
|
"id": "2090019639",
|
||||||
|
"maxQty": 0,
|
||||||
|
"minQty": 0,
|
||||||
|
"name": "Pizzas",
|
||||||
|
"sortingPosition": 1
|
||||||
|
},
|
||||||
|
"children": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
menu_json = json.dumps(menu)
|
||||||
|
URL = 'https://microservices.dev.rappi.com/api/v2/restaurants-integrations-public-api/menu'
|
||||||
|
token = self.access_token
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'x-authorization': 'bearer ' + token,
|
||||||
|
}
|
||||||
|
pprint(menu_json)
|
||||||
|
response = requests.request("POST", URL, headers=headers, data=menu_json)
|
||||||
|
pprint(response.text.encode('utf8'))
|
||||||
|
|
||||||
|
def create_menu_by_global_category(self, line, Category):
|
||||||
|
pass
|
||||||
|
# category = Category.search_read([('categories', 'in', '')])
|
||||||
|
# dict_menu = {
|
||||||
|
# 'category': {
|
||||||
|
# 'id': line.product.category.id,
|
||||||
|
# 'maxQty': 0,
|
||||||
|
# 'minQty': 0,
|
||||||
|
# 'name': line.product.category.name,
|
||||||
|
# },
|
||||||
|
|
||||||
|
# dict_menu['children'].append(dict_child)
|
||||||
|
# 'children': [],
|
||||||
|
# 'name': line.product.categories[0].name,
|
||||||
|
# 'description': line.product.description if line.product.description else 'no esta disponible',
|
||||||
|
# 'imageUrl': line.product.images[0].image_url if line.product.images else '',
|
||||||
|
# 'price': float(line.price_w_tax_computed),
|
||||||
|
# 'sku': line.product.code,
|
||||||
|
# 'sortingPosition': 0,
|
||||||
|
# "type": "PRODUCT",
|
||||||
|
# # 'maxLimit': '',
|
||||||
|
# })
|
||||||
|
|
||||||
|
def create_menu_by_local_category(self, line):
|
||||||
|
if line.product.categories[0]:
|
||||||
|
category = {
|
||||||
|
'id': line.product.categories[0].id,
|
||||||
|
'maxQty': 0,
|
||||||
|
'minQty': 0,
|
||||||
|
'name': line.product.categories[0].name,
|
||||||
|
'children': []
|
||||||
|
}
|
||||||
|
category['children'].append({
|
||||||
|
|
||||||
|
})
|
|
@ -66,6 +66,8 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
|
||||||
icon="tryton-forward"/>
|
icon="tryton-forward"/>
|
||||||
<button name="refresh_token_b" string="Refresh Token"
|
<button name="refresh_token_b" string="Refresh Token"
|
||||||
icon="tryton-ok"/>
|
icon="tryton-ok"/>
|
||||||
|
<button name="generate_token_access" string="generate_token_access"
|
||||||
|
icon="tryton-ok"/>
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# The COPYRIGHT file at the top level of this repository contains
|
# The COPYRIGHT file at the top level of this repository contains
|
||||||
# the full copyright notices and license terms.
|
# the full copyright notices and license terms.
|
||||||
from trytond.model import Workflow, ModelView, ModelSQL, fields
|
from trytond.model import Workflow, ModelView, ModelSQL, fields
|
||||||
from trytond.pyson import Eval
|
from trytond.pyson import Eval, And
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from trytond.pool import Pool
|
from trytond.pool import Pool
|
||||||
from trytond.wizard import (Wizard, StateTransition, StateView, Button)
|
from trytond.wizard import (Wizard, StateTransition, StateView, Button)
|
||||||
|
@ -70,7 +70,9 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
'invisible': (Eval('channel_name') != 'mercadolibre'),
|
'invisible': (Eval('channel_name') != 'mercadolibre'),
|
||||||
})
|
})
|
||||||
access_token = fields.Char('Access Token', states={
|
access_token = fields.Char('Access Token', states={
|
||||||
'invisible': (Eval('channel_name') != 'mercadolibre'),
|
'invisible': And(
|
||||||
|
Eval('channel_name') != 'mercadolibre',
|
||||||
|
Eval('channel_name') != 'rappi'),
|
||||||
})
|
})
|
||||||
creation_time = fields.DateTime('Creation Time', states={
|
creation_time = fields.DateTime('Creation Time', states={
|
||||||
'invisible': (Eval('channel_name') != 'mercadolibre'),
|
'invisible': (Eval('channel_name') != 'mercadolibre'),
|
||||||
|
@ -120,7 +122,9 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
'invisible': (Eval('channel_name') != 'shopify'),
|
'invisible': (Eval('channel_name') != 'shopify'),
|
||||||
})
|
})
|
||||||
host_name = fields.Char('Host Name', states={
|
host_name = fields.Char('Host Name', states={
|
||||||
'invisible': (Eval('channel_name') != 'shopify'),
|
'invisible': And(
|
||||||
|
Eval('channel_name') != 'shopify',
|
||||||
|
Eval('channel_name') != 'rappi'),
|
||||||
})
|
})
|
||||||
party = fields.Many2One('party.party', 'party', required=False)
|
party = fields.Many2One('party.party', 'party', required=False)
|
||||||
payment_term = fields.Many2One('account.invoice.payment_term',
|
payment_term = fields.Many2One('account.invoice.payment_term',
|
||||||
|
@ -146,7 +150,10 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
'invisible': Eval('state') != 'active',
|
'invisible': Eval('state') != 'active',
|
||||||
},
|
},
|
||||||
'refresh_token_b': {
|
'refresh_token_b': {
|
||||||
'invisible': Eval('channel_name') != 'mercadolibre',
|
'invisible': And(Eval('channel_name') != 'mercadolibre', Eval('channel_name') != 'rappi'),
|
||||||
|
},
|
||||||
|
'synchronize_menu': {
|
||||||
|
'invisible': And(Eval('channel_name') != 'rappi', Eval('state') == 'active'),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -180,6 +187,13 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
def finished(cls, records):
|
def finished(cls, records):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
@ModelView.button
|
||||||
|
def synchronize_menu(cls, records):
|
||||||
|
for record in records:
|
||||||
|
if record.channel_name == 'rappi':
|
||||||
|
record.synchronize_menu_rappi()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ModelView.button
|
@ModelView.button
|
||||||
def refresh_token_b(cls, records):
|
def refresh_token_b(cls, records):
|
||||||
|
@ -192,6 +206,14 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
('channel_name', '=', 'mercadolibre'),
|
('channel_name', '=', 'mercadolibre'),
|
||||||
])
|
])
|
||||||
res = channels[0]._validate_token()
|
res = channels[0]._validate_token()
|
||||||
|
if record.channel_name == 'rappi':
|
||||||
|
Rappi = Pool().get('sale.web_channel.rappi')
|
||||||
|
channels = Rappi.search([
|
||||||
|
('state', '=', 'active'),
|
||||||
|
('channel_name', '=', 'rappi'),
|
||||||
|
])
|
||||||
|
res = channels[0].generate_token_access()
|
||||||
|
print(res, 'fuck yeah!')
|
||||||
|
|
||||||
def send_mail_notification(self, message):
|
def send_mail_notification(self, message):
|
||||||
Template = Pool().get('email.template')
|
Template = Pool().get('email.template')
|
||||||
|
@ -220,7 +242,7 @@ class SaleWebChannel(Workflow, ModelSQL, ModelView):
|
||||||
report = Report.execute([record.id], {'id': record.id})
|
report = Report.execute([record.id], {'id': record.id})
|
||||||
ext, data, filename, file_name = report
|
ext, data, filename, file_name = report
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
class SynchronizeChannelOrdersStart(ModelView):
|
class SynchronizeChannelOrdersStart(ModelView):
|
||||||
'Synchronize Channel orders Start'
|
'Synchronize Channel orders Start'
|
||||||
|
@ -453,3 +475,28 @@ class SynchronizeChannelOrdersDone(ModelView):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def default_result():
|
def default_result():
|
||||||
return 'successful synchronization'
|
return 'successful synchronization'
|
||||||
|
|
||||||
|
|
||||||
|
class SynchronizeMenuWizard(Wizard):
|
||||||
|
'Synchronize Menu'
|
||||||
|
__name__ = 'sale_web_channel.synchronize_menu'
|
||||||
|
start_state = 'synchronize_menu'
|
||||||
|
synchronize_menu = StateTransition()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def transition_synchronize_menu(self):
|
||||||
|
pool = Pool()
|
||||||
|
active_id = Transaction().context.get('active_id')
|
||||||
|
Chanel = pool.get('sale.web_channel')
|
||||||
|
chanel = Chanel(active_id)
|
||||||
|
print(chanel)
|
||||||
|
if chanel.channel_name == 'rappi':
|
||||||
|
print('ya paso')
|
||||||
|
Rappi = Pool().get('sale.web_channel.rappi')
|
||||||
|
channels = Rappi.search([
|
||||||
|
('state', '=', 'active'),
|
||||||
|
('channel_name', '=', 'rappi'),
|
||||||
|
])
|
||||||
|
res = channels[0].synchronize_menu_rappi()
|
||||||
|
print(res, 'fuck yeah')
|
||||||
|
return 'end'
|
||||||
|
|
|
@ -62,5 +62,15 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
|
||||||
<menuitem action="finish_invoices_wizard" parent="sale.menu_sale"
|
<menuitem action="finish_invoices_wizard" parent="sale.menu_sale"
|
||||||
id="menu_finish_invoices" sequence="110"/>
|
id="menu_finish_invoices" sequence="110"/>
|
||||||
|
|
||||||
|
<record model="ir.action.wizard" id="wizard_synchronize_menu">
|
||||||
|
<field name="name">Synchronize Menu</field>
|
||||||
|
<field name="wiz_name">sale_web_channel.synchronize_menu</field>
|
||||||
|
</record>
|
||||||
|
<record model="ir.action.keyword" id="action_synchronize_menu_keyword">
|
||||||
|
<field name="keyword">form_action</field>
|
||||||
|
<field name="model">sale.web_channel,-1</field>
|
||||||
|
<field name="action" ref="wizard_synchronize_menu"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</tryton>
|
</tryton>
|
||||||
|
|
Loading…
Reference in New Issue