Merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-imp-licenses-yvr into lp:~stock-logistic-core-editors/carriers-deliveries/7.0

Proposed by Yannick Vaucher @ Camptocamp
Status: Merged
Approved by: Guewen Baconnier @ Camptocamp
Approved revision: 12
Merged at revision: 12
Proposed branch: lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-imp-licenses-yvr
Merge into: lp:~stock-logistic-core-editors/carriers-deliveries/7.0
Diff against target: 311 lines (+138/-33)
8 files modified
delivery_carrier_label_postlogistics/__openerp__.py (+8/-8)
delivery_carrier_label_postlogistics/company.py (+4/-4)
delivery_carrier_label_postlogistics/delivery.py (+25/-0)
delivery_carrier_label_postlogistics/delivery_view.xml (+1/-0)
delivery_carrier_label_postlogistics/postlogistics/web_service.py (+21/-8)
delivery_carrier_label_postlogistics/res_config.py (+69/-3)
delivery_carrier_label_postlogistics/res_config_view.xml (+8/-10)
delivery_carrier_label_postlogistics/security/ir.model.access.csv (+2/-0)
To merge this branch: bzr merge lp:~camptocamp/carriers-deliveries/7.0-delivery_carrier_label_postlogistics-imp-licenses-yvr
Reviewer Review Type Date Requested Status
Guewen Baconnier @ Camptocamp Approve
Leonardo Pistone code review Approve
Romain Deheele - Camptocamp (community) code review, no tests Approve
Review via email: mp+202334@code.launchpad.net

Description of the change

Implements license management for postlogistics label web service

To post a comment you must log in.
12. By Yannick Vaucher @ Camptocamp

[ADD] security groups for postlogistics licenses

Revision history for this message
Romain Deheele - Camptocamp (romaindeheele) wrote :

LGTM,

Romain

review: Approve (code review, no tests)
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :
Revision history for this message
Leonardo Pistone (lepistone) wrote :

Yannick,

is the field picking.carrier_id required?

review: Needs Information
Revision history for this message
Yannick Vaucher @ Camptocamp (yvaucher-c2c) wrote :

carrier_id isn't required.

If you are asking for that line:
151 + license = picking.carrier_id.postlogistics_license_id

orm.browse_null

Implements __getattr__ that way.
    def __getattr__(self, name):
        return None # XXX: return self ?

So even if carrier_id returns orm.browse_null asking for one of its attributes is None

Revision history for this message
Leonardo Pistone (lepistone) wrote :

Yes Yannick, I was asking about that!

So if you reckon we handle the empty field properly, I approve.

Thanks!

review: Approve (code review)
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'delivery_carrier_label_postlogistics/__openerp__.py'
--- delivery_carrier_label_postlogistics/__openerp__.py 2013-12-23 10:54:36 +0000
+++ delivery_carrier_label_postlogistics/__openerp__.py 2014-01-23 10:39:04 +0000
@@ -73,6 +73,13 @@
73.. _PostLogistics BarCodes WebService: http://www.poste.ch/post-startseite/post-geschaeftskunden/post-logistik/post-e-log/post-e-log-webservices.htm73.. _PostLogistics BarCodes WebService: http://www.poste.ch/post-startseite/post-geschaeftskunden/post-logistik/post-e-log/post-e-log-webservices.htm
74.. _Swiss Post E-logistics: http://www.poste.ch/en/post-startseite/post-geschaeftskunden/post-logistik/post-e-log.htm74.. _Swiss Post E-logistics: http://www.poste.ch/en/post-startseite/post-geschaeftskunden/post-logistik/post-e-log.htm
7575
76
77Recommended modules
78-------------------
79
80* PostLogistics labels - logo per Shop
81 If you have multiple shops configure one logo per shop
82
76Technical references83Technical references
77--------------------84--------------------
7885
@@ -80,18 +87,11 @@
8087
81.. _"Barcode" web service documentation: http://www.poste.ch/post-barcode-cug.htm88.. _"Barcode" web service documentation: http://www.poste.ch/post-barcode-cug.htm
8289
90
83Contributors91Contributors
84------------92------------
8593
86* Yannick Vaucher <yannick.vaucher@camptocamp.com>94* Yannick Vaucher <yannick.vaucher@camptocamp.com>
87
88----
89
90*TODO*:
91
92* *Add onchange to improve carrier method creation*
93* *Identify attachement as label*
94* *Better License management*
95""",95""",
96 'website': 'http://www.camptocamp.com/',96 'website': 'http://www.camptocamp.com/',
97 'data': ['res_partner_data.xml',97 'data': ['res_partner_data.xml',
9898
=== modified file 'delivery_carrier_label_postlogistics/company.py'
--- delivery_carrier_label_postlogistics/company.py 2013-12-03 17:18:48 +0000
+++ delivery_carrier_label_postlogistics/company.py 2014-01-23 10:39:04 +0000
@@ -38,10 +38,10 @@
38 type='char'),38 type='char'),
39 'postlogistics_username': fields.char('Username'),39 'postlogistics_username': fields.char('Username'),
40 'postlogistics_password': fields.char('Password'),40 'postlogistics_password': fields.char('Password'),
41 # XXX improve license management41 'postlogistics_license_ids': fields.one2many(
42 'postlogistics_license_less_1kg': fields.char('License less than 1kg'),42 'postlogistics.license',
43 'postlogistics_license_more_1kg': fields.char('License more than 1kg'),43 'company_id',
44 'postlogistics_license_vinolog': fields.char('License VinoLog'),44 'PostLogistics Frankling License'),
45 'postlogistics_logo': fields.binary('Company logo for PostLogistics'),45 'postlogistics_logo': fields.binary('Company logo for PostLogistics'),
46 'postlogistics_office': fields.char('Post office'),46 'postlogistics_office': fields.char('Post office'),
4747
4848
=== modified file 'delivery_carrier_label_postlogistics/delivery.py'
--- delivery_carrier_label_postlogistics/delivery.py 2014-01-13 11:23:21 +0000
+++ delivery_carrier_label_postlogistics/delivery.py 2014-01-23 10:39:04 +0000
@@ -20,6 +20,22 @@
20##############################################################################20##############################################################################
21from openerp.osv import orm, fields21from openerp.osv import orm, fields
2222
23class PostlogisticsLicense(orm.Model):
24 _name = 'postlogistics.license'
25 _description = 'PostLogistics Franking License'
26
27 _order = 'sequence'
28
29 _columns = {
30 'name': fields.char('Description', translate=True, required=True),
31 'number': fields.char('Number', required=True),
32 'company_id': fields.many2one('res.company', 'Company', required=True),
33 'sequence': fields.integer(
34 'Sequence',
35 help="Gives the sequence on company to define priority on license"
36 " when multiple license are available for the same group of "
37 "service."),
38 }
2339
24class PostlogisticsServiceGroup(orm.Model):40class PostlogisticsServiceGroup(orm.Model):
25 _name = 'postlogistics.service.group'41 _name = 'postlogistics.service.group'
@@ -28,6 +44,12 @@
28 _columns = {44 _columns = {
29 'name': fields.char('Description', translate=True, required=True),45 'name': fields.char('Description', translate=True, required=True),
30 'group_extid': fields.integer('Group ID', required=True),46 'group_extid': fields.integer('Group ID', required=True),
47 'postlogistics_license_ids': fields.many2many(
48 'postlogistics.license',
49 'postlogistics_license_service_groups_rel',
50 'license_id',
51 'group_id',
52 'PostLogistics Frankling License'),
31 }53 }
3254
33 _sql_constraints = [55 _sql_constraints = [
@@ -194,6 +216,9 @@
194 'type': fields.selection(216 'type': fields.selection(
195 _get_carrier_type_selection, 'Type',217 _get_carrier_type_selection, 'Type',
196 help="Carrier type (combines several delivery methods)"),218 help="Carrier type (combines several delivery methods)"),
219 'postlogistics_license_id': fields.many2one(
220 'postlogistics.license',
221 string='PostLogistics Frankling License'),
197 'postlogistics_service_group_id': fields.many2one(222 'postlogistics_service_group_id': fields.many2one(
198 'postlogistics.service.group',223 'postlogistics.service.group',
199 string='PostLogistics Service Group',224 string='PostLogistics Service Group',
200225
=== modified file 'delivery_carrier_label_postlogistics/delivery_view.xml'
--- delivery_carrier_label_postlogistics/delivery_view.xml 2013-11-29 08:19:33 +0000
+++ delivery_carrier_label_postlogistics/delivery_view.xml 2014-01-23 10:39:04 +0000
@@ -49,6 +49,7 @@
49 <field name="arch" type="xml">49 <field name="arch" type="xml">
50 <field name="type" position="after">50 <field name="type" position="after">
51 <field name="postlogistics_service_group_id" attrs="{'invisible': [('type', '!=', 'postlogistics')], 'required': [('type', '=', 'postlogistics')]}"/>51 <field name="postlogistics_service_group_id" attrs="{'invisible': [('type', '!=', 'postlogistics')], 'required': [('type', '=', 'postlogistics')]}"/>
52 <field name="postlogistics_license_id" attrs="{'invisible': [('type', '!=', 'postlogistics')]}"/>
52 <field name="allowed_option_ids" invisible="1"/>53 <field name="allowed_option_ids" invisible="1"/>
53 </field>54 </field>
54 <field name="available_option_ids" position="attributes">55 <field name="available_option_ids" position="attributes">
5556
=== modified file 'delivery_carrier_label_postlogistics/postlogistics/web_service.py'
--- delivery_carrier_label_postlogistics/postlogistics/web_service.py 2013-12-17 07:45:50 +0000
+++ delivery_carrier_label_postlogistics/postlogistics/web_service.py 2014-01-23 10:39:04 +0000
@@ -97,7 +97,7 @@
97 lang = company.partner_id.lang97 lang = company.partner_id.lang
98 lang = self._get_language(lang)98 lang = self._get_language(lang)
99 request = self.client.service.ReadAllowedServicesByFrankingLicense99 request = self.client.service.ReadAllowedServicesByFrankingLicense
100 return self._send_request(request, License=license, Language=lang)100 return self._send_request(request, FrankingLicense=license, Language=lang)
101101
102 def read_service_groups(self, company, lang):102 def read_service_groups(self, company, lang):
103 """ Get group of services """103 """ Get group of services """
@@ -223,13 +223,26 @@
223 return resolution223 return resolution
224224
225 def _get_license(self, picking):225 def _get_license(self, picking):
226 """ Get the right license depending on weight """226 """ Get the license
227 company = picking.company_id227
228 #XXX get weight or set it as an option on picking228 Take it from carrier and if not defined get the first license
229 weight = 0229 depending on service group. This needs to have associated
230 if weight > 1.0:230 licenses to groups.
231 return company.postlogistics_license_more_1kg231
232 return company.postlogistics_license_less_1kg232 :return: license number
233 """
234 license = picking.carrier_id.postlogistics_license_id
235 if not license:
236 company_licenses = picking.company_id.postlogistics_license_ids
237 group = picking.carrier_id.postlogistics_service_group_id
238 if not company_licenses or not group:
239 return None
240 group_license_ids = [l.id for l in group.postlogistics_license_ids]
241 if not group_license_ids:
242 return None
243 license = [l for l in company_licenses
244 if l.id in group_license_ids][0]
245 return license.number
233246
234 def _prepare_attributes(self, picking):247 def _prepare_attributes(self, picking):
235 services = [option.code.split(',') for option in picking.option_ids248 services = [option.code.split(',') for option in picking.option_ids
236249
=== modified file 'delivery_carrier_label_postlogistics/res_config.py'
--- delivery_carrier_label_postlogistics/res_config.py 2013-12-13 13:44:03 +0000
+++ delivery_carrier_label_postlogistics/res_config.py 2014-01-23 10:39:04 +0000
@@ -43,6 +43,11 @@
43 'password': fields.related(43 'password': fields.related(
44 'company_id', 'postlogistics_password',44 'company_id', 'postlogistics_password',
45 string='Password', type='char'),45 string='Password', type='char'),
46 'license_ids': fields.related(
47 'company_id', 'postlogistics_license_ids',
48 string='Frankling Licenses',
49 type='one2many',
50 relation='postlogistics.license'),
46 'license_less_1kg': fields.related(51 'license_less_1kg': fields.related(
47 'company_id', 'postlogistics_license_less_1kg',52 'company_id', 'postlogistics_license_less_1kg',
48 string='License less than 1kg', type='char'),53 string='License less than 1kg', type='char'),
@@ -117,15 +122,14 @@
117 company = self.pool.get('res.company'122 company = self.pool.get('res.company'
118 ).browse(cr, uid, company_id, context=context)123 ).browse(cr, uid, company_id, context=context)
119124
125 license_ids = [l.id for l in company.postlogistics_license_ids]
120 label_layout = company.postlogistics_default_label_layout.id or False126 label_layout = company.postlogistics_default_label_layout.id or False
121 output_format = company.postlogistics_default_output_format.id or False127 output_format = company.postlogistics_default_output_format.id or False
122 resolution = company.postlogistics_default_resolution.id or False128 resolution = company.postlogistics_default_resolution.id or False
123 values = {129 values = {
124 'username': company.postlogistics_username,130 'username': company.postlogistics_username,
125 'password': company.postlogistics_password,131 'password': company.postlogistics_password,
126 'license_less_1kg': company.postlogistics_license_less_1kg,132 'license_ids': license_ids,
127 'license_more_1kg': company.postlogistics_license_more_1kg,
128 'license_vinolog': company.postlogistics_license_vinolog,
129 'logo': company.postlogistics_logo,133 'logo': company.postlogistics_logo,
130 'office': company.postlogistics_office,134 'office': company.postlogistics_office,
131 'default_label_layout': label_layout,135 'default_label_layout': label_layout,
@@ -422,3 +426,65 @@
422 continue426 continue
423 self._update_service_groups(cr, uid, ids, web_service, company, context=ctx)427 self._update_service_groups(cr, uid, ids, web_service, company, context=ctx)
424 return True428 return True
429
430 def _get_allowed_service_group_codes(self, web_service, company,
431 license, context=None):
432 """ Get a list of allowed service group codes"""
433 if context is None:
434 context = {}
435
436 lang = context.get('lang', 'en')
437 res = web_service.read_allowed_services_by_franking_license(
438 license.number, company, lang)
439 if 'errors' in res:
440 errors = '\n'.join(res['errors'])
441 error_message = (_('Could not retrieve allowed Postlogistics '
442 'service groups for the %s licence:\n%s')
443 % (license.name, errors))
444 raise orm.except_orm(_('Error'), error_message)
445
446 if not res['value']:
447 return []
448
449 if hasattr(res['value'], 'Errors') and res['value'].Errors:
450 for error in res['value'].Errors.Error:
451 message = '[%s] %s' % (error.Code, error.Message)
452 raise orm.except_orm('Error', message)
453
454 service_group_codes = []
455 for group in res['value'].ServiceGroups:
456 service_group_codes.append(group.ServiceGroup.ServiceGroupID)
457
458 return service_group_codes
459
460 def assign_licenses_to_service_groups(self, cr, uid, ids, context=None):
461 """ Check all licenses to assign it to PostLogistics service groups """
462
463 if context is None:
464 context = {}
465
466 user_obj = self.pool.get('res.users')
467 service_group_obj = self.pool.get('postlogistics.service.group')
468 for config in self.browse(cr, uid, ids, context=context):
469 company = config.company_id
470 web_service = PostlogisticsWebService(company)
471
472 relations = {}
473 for license in company.postlogistics_license_ids:
474 service_groups = self._get_allowed_service_group_codes(
475 web_service, company, license, context=context)
476 group_ids = service_group_obj.search(
477 cr, uid, [('group_extid', 'in', service_groups)],
478 context=context)
479 for group_id in group_ids:
480 if group_id in relations:
481 relations[group_id].append(license.id)
482 else:
483 relations[group_id] = [license.id]
484 for group_id, license_ids in relations.iteritems():
485 vals = {'postlogistics_license_ids': [(6, 0, license_ids)]}
486 service_group_obj.write(cr, uid, group_id, vals,
487 context=context)
488
489
490 return True
425491
=== modified file 'delivery_carrier_label_postlogistics/res_config_view.xml'
--- delivery_carrier_label_postlogistics/res_config_view.xml 2013-12-03 17:18:48 +0000
+++ delivery_carrier_label_postlogistics/res_config_view.xml 2014-01-23 10:39:04 +0000
@@ -41,16 +41,13 @@
41 <group>41 <group>
42 <div>42 <div>
43 <div>43 <div>
44 <label for="license_less_1kg"/>44 <field name="license_ids" class="oe_inline">
45 <field name="license_less_1kg" class="oe_inline"/>45 <tree editable="bottom">
46 </div>46 <field name="name"/>
47 <div>47 <field name="number"/>
48 <label for="license_more_1kg"/>48 <field name="sequence" invisible="True"/>
49 <field name="license_more_1kg" class="oe_inline"/>49 </tree>
50 </div>50 </field>
51 <div>
52 <label for="license_vinolog"/>
53 <field name="license_vinolog" class="oe_inline"/>
54 </div>51 </div>
55 </div>52 </div>
56 </group>53 </group>
@@ -88,6 +85,7 @@
88 <div>85 <div>
89 <div>86 <div>
90 <button string="Update PostLogistics Services" type="object" name="update_postlogistics_options" class="oe_highlight"/>87 <button string="Update PostLogistics Services" type="object" name="update_postlogistics_options" class="oe_highlight"/>
88 <button string="Assign PostLogistics Licenses to service groups" type="object" name="assign_licenses_to_service_groups" class="oe_highlight"/>
91 </div>89 </div>
92 </div>90 </div>
93 </group>91 </group>
9492
=== modified file 'delivery_carrier_label_postlogistics/security/ir.model.access.csv'
--- delivery_carrier_label_postlogistics/security/ir.model.access.csv 2013-12-23 10:54:36 +0000
+++ delivery_carrier_label_postlogistics/security/ir.model.access.csv 2014-01-23 10:39:04 +0000
@@ -1,3 +1,5 @@
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2access_postlogistics_service_group_salesman,postlogistics.service.group.salesman,model_postlogistics_service_group,base.group_sale_salesman,1,0,0,02access_postlogistics_service_group_salesman,postlogistics.service.group.salesman,model_postlogistics_service_group,base.group_sale_salesman,1,0,0,0
3access_postlogistics_service_group_manager,postlogistics.service.group.manager,model_postlogistics_service_group,base.group_sale_manager,1,1,1,13access_postlogistics_service_group_manager,postlogistics.service.group.manager,model_postlogistics_service_group,base.group_sale_manager,1,1,1,1
4access_postlogistics_license_salesman,postlogistics.license.salesman,model_postlogistics_license,base.group_sale_salesman,1,0,0,0
5access_postlogistics_license_manager,postlogistics.license.manager,model_postlogistics_license,base.group_sale_manager,1,1,1,1

Subscribers

People subscribed via source and target branches