49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
import importlib.util
|
|
import io
|
|
import zipfile
|
|
|
|
import odoo.http as http
|
|
|
|
from odoo.exceptions import UserError
|
|
from odoo.http import request, content_disposition
|
|
|
|
|
|
class Partner(http.Controller):
|
|
|
|
@http.route(['/web_enterprise/partner/<model("res.partner"):partner>/vcard',
|
|
'/web/partner/vcard'], type='http', auth="user")
|
|
def download_vcard(self, partner_ids=None, partner=None, **kwargs):
|
|
if importlib.util.find_spec('vobject') is None:
|
|
raise UserError('vobject library is not installed')
|
|
|
|
if partner_ids:
|
|
partner_ids = list(filter(None, (int(pid) for pid in partner_ids.split(',') if pid.isdigit())))
|
|
partners = request.env['res.partner'].browse(partner_ids)
|
|
if len(partners) > 1:
|
|
with io.BytesIO() as buffer:
|
|
with zipfile.ZipFile(buffer, 'w') as zipf:
|
|
for partner in partners:
|
|
filename = f"{partner.name or partner.email}.vcf"
|
|
content = partner._get_vcard_file()
|
|
zipf.writestr(filename, content)
|
|
|
|
return request.make_response(buffer.getvalue(), [
|
|
('Content-Type', 'application/zip'),
|
|
('Content-Length', len(content)),
|
|
('Content-Disposition', content_disposition('Contacts.zip'))
|
|
])
|
|
|
|
if partner or partners:
|
|
partner = partner or partners
|
|
content = partner._get_vcard_file()
|
|
return request.make_response(content, [
|
|
('Content-Type', 'text/vcard'),
|
|
('Content-Length', len(content)),
|
|
('Content-Disposition', content_disposition(f"{partner.name or partner.email}.vcf")),
|
|
])
|
|
|
|
return request.not_found()
|