Using this model, the user can select a number of pickings and request them to be picked up from a user-specified address.for/master
parent
85aae33280
commit
870281afd0
@ -1 +1 @@ |
||||
import res_config, shipcloud, shipcloud_delivery_carrier, shipcloud_shipping_service |
||||
import res_config, shipcloud, shipcloud_delivery_carrier, shipcloud_shipping_service, shipcloud_pickup |
||||
|
@ -0,0 +1,75 @@ |
||||
from openerp import api, fields, models |
||||
import logging |
||||
from openerp.exceptions import Warning |
||||
from shipcloud_delivery_carrier import build_sc_addr |
||||
|
||||
import shipcloud |
||||
|
||||
_logger = logging.getLogger(__name__) |
||||
|
||||
|
||||
class SCPickup(models.Model): |
||||
_name = "delivery.carrier.pickup" |
||||
|
||||
# carrier who should be picking up |
||||
carrier = fields.Selection([('ups','UPS'), ('dpd','DPD'), ('hermes','Hermes'), ('gls','GLS')], |
||||
string='Carrier', required=True, default='ups') |
||||
# pickings (shipments) to be picked up |
||||
pickings = fields.Many2many('stock.picking', string='Pickings', required=True) |
||||
# address from where to pick up |
||||
address = fields.Many2one('res.partner', string='Pick-up address', required=True) |
||||
# earliest pick-up time |
||||
earliest = fields.Datetime('Earliest', required=True, default=fields.Datetime.now()) |
||||
# latest pick-up time |
||||
latest = fields.Datetime('Latest', required=True) |
||||
# draft: not yet requested from shipcloud; confirmed: confirmed by shipcloud |
||||
state = fields.Selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done','Done')], |
||||
string='Status', default='draft', readonly=True, required=True, copy=False) |
||||
sc_pickup_id = fields.Char('Shipcloud Pick-up ID', readonly=True, copy=False) |
||||
|
||||
|
||||
def _shipcloud_api(self): |
||||
config = self._get_config() |
||||
api_key = config['sc_api_key_prod'] |
||||
sandbox_api_key = None if config['sc_api_use_prod'] else config['sc_api_key_sandbox'] |
||||
return shipcloud.api(api_key, sandbox_api_key) |
||||
|
||||
@api.one |
||||
def button_request(self): |
||||
# consistency check |
||||
for p in self.pickings: |
||||
if p.carrier_id.delivery_type != 'sc': |
||||
raise Warning("Picking %s doesn't use shipcloud" % (p.name)) |
||||
if not p.label_genrated: |
||||
raise Warning("Picking %s doesn't have a label yet" % (p.name)) |
||||
if not p.sc_shipment_id: |
||||
raise Warning("Picking %s has not shipcloud label/id" % (p.name)) |
||||
# collect the SC shipment IDs of all the pickings |
||||
sc_ship_ids = [] |
||||
for p in self.pickings: |
||||
sc_ship_ids.append({'id': p.sc_shipment_id}) |
||||
sc_addr = build_sc_addr(p.address) |
||||
sc_earliest = self.earliest.astimezone().isoformat() |
||||
_logger.info("earliest: %s -> %s" % (self.earliest, sc_earliest)) |
||||
sc_latest = self.latest.astimezone().isoformat() |
||||
sc_pickup = shipcloud.gen_pickup(sc_addr, sc_earliest, sc_latest, sc_ship_ids, self.carrier) |
||||
# actually use the SC API to request the pickup |
||||
api = self._shipcloud_api() |
||||
try: |
||||
result = api.create_pickup(sc_pickup) |
||||
except shipcloud.ApiError as err: |
||||
raise Warning(err) |
||||
self.sc_pickup_id = result['id'] |
||||
self.state = 'confirmed' |
||||
|
||||
# somehow this didn't work as a new (v8) style ORM ?!? |
||||
def default_get(self, cr, user, fields_list, context=None): |
||||
if context is None: |
||||
context = {} |
||||
res = super(SCPickup, self).default_get(cr, user, fields_list, context=context) |
||||
if context.get('active_model') == 'stock.picking' and context.get('active_ids'): |
||||
picking_ids = context['active_ids'] |
||||
res['pickings'] = picking_ids |
||||
# intentionally no default pick-up address to avoid the mistakes of |
||||
# leaving the default and hence scheduling a pick-up from the wrong address |
||||
return res |
|
@ -0,0 +1,63 @@ |
||||
<?xml version="1.0"?> |
||||
<openerp> |
||||
<data> |
||||
<record id="view_pickup_form" model="ir.ui.view"> |
||||
<field name="name">delivery.carrier.pickup.form</field> |
||||
<field name="model">delivery.carrier.pickup</field> |
||||
<field name="type">form</field> |
||||
<field name="arch" type="xml"> |
||||
<form string="Pick-Up"> |
||||
<header> |
||||
<button string="Request pick-up" name="button_request" states="draft" type="object" class="oe_highlight" groups="base.group_user"/> |
||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done"/> |
||||
</header> |
||||
<sheet> |
||||
<div class="oe_title"> |
||||
<h1>Pick-up request</h1> |
||||
</div> |
||||
<group name="main_field_group"> |
||||
<field name="carrier"/> |
||||
<field name="address"/> |
||||
<field name="earliest"/> |
||||
<field name="latest"/> |
||||
</group> |
||||
<group name="pickings_group"> |
||||
<field name="pickings"/> |
||||
</group> |
||||
<group name="misc"> |
||||
<field name="sc_pickup_id"/> |
||||
</group> |
||||
</sheet> |
||||
</form> |
||||
</field> |
||||
</record> |
||||
|
||||
<record id="delivery_carrier_pickup_tree" model="ir.ui.view"> |
||||
<field name="name">delivery.carrier.pickup.tree</field> |
||||
<field name="model">delivery.carrier.pickup</field> |
||||
<field name="type">tree</field> |
||||
<field name="arch" type="xml"> |
||||
<tree string="pickup"> |
||||
<field name="carrier"/> |
||||
<field name="earliest"/> |
||||
<field name="latest"/> |
||||
<field name="address"/> |
||||
<field name="state"/> |
||||
</tree> |
||||
</field> |
||||
</record> |
||||
<record model="ir.actions.act_window" id="action_delivery_carrier_pickup"> |
||||
<field name="name">Pick-Up</field> |
||||
<field name="res_model">delivery.carrier.pickup</field> |
||||
<field name="view_type">form</field> |
||||
<field name="view_mode">tree,form</field> |
||||
<field name="view_id" ref="delivery_carrier_pickup_tree"/> |
||||
</record> |
||||
<menuitem id="menu_shipping_pickup" parent="stock.menu_stock_warehouse_mgmt" string="Pick-Up" action="action_delivery_carrier_pickup"/> |
||||
|
||||
<act_window id="action_create_pickup" res_model="delivery.carrier.pickup" src_model="stock.picking" target="new" multi="False" key2="client_action_multi" view_mode="form" name="Schedule Pick-Up"/> |
||||
|
||||
|
||||
|
||||
</data> |
||||
</openerp> |
Loading…
Reference in new issue