def portal_quote_accept(self, res_id, access_token=None, partner_name=None, signature=None, order_id=None): try: order_sudo = self._document_check_access('sale.order', res_id, access_token=access_token) except (AccessError, MissingError): return {'error': _('Invalid order')} if not order_sudo.has_to_be_signed(): return {'error': _('Order is not in a state requiring customer signature.')} if not signature: return {'error': _('Signature is missing.')} if not order_sudo.has_to_be_paid(): order_sudo.action_confirm() order_sudo.signature = signature order_sudo.signed_by = partner_name pdf = request.env.ref('sale.action_report_saleorder').sudo().render_qweb_pdf([order_sudo.id])[0] _message_post_helper( res_model='sale.order', res_id=order_sudo.id, message=_('Order signed by %s') % (partner_name,), attachments=[('%s.pdf' % order_sudo.name, pdf)], **({'token': access_token} if access_token else {})) return { 'force_refresh': True, 'redirect_url': order_sudo.get_portal_url(query_string='&message=sign_ok'), }
def portal_quote_accept(self, order_id, access_token=None, name=None, signature=None): # get from query string if not on json param access_token = access_token or request.httprequest.args.get( 'access_token') try: order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token) except (AccessError, MissingError): return {'error': _('Invalid order.')} if not order_sudo.has_to_be_signed(): return { 'error': _('The order is not in a state requiring customer signature.') } if not signature: return {'error': _('Signature is missing.')} try: order_sudo.write({ 'signed_by': name, 'signed_on': fields.Datetime.now(), 'signature': signature, }) except (TypeError, binascii.Error) as e: return {'error': _('Invalid signature data.')} if not order_sudo.has_to_be_paid(): order_sudo.action_confirm() order_sudo._send_order_confirmation_mail() pdf = request.env.ref( 'sale.action_report_saleorder').sudo().render_qweb_pdf( [order_sudo.id])[0] _message_post_helper('sale.order', order_sudo.id, _('Order signed by %s') % (name, ), attachments=[('%s.pdf' % order_sudo.name, pdf)], **({ 'token': access_token } if access_token else {})) query_string = '&message=sign_ok' if order_sudo.has_to_be_paid(True): query_string += '#allow_payment=yes' return { 'force_refresh': True, 'redirect_url': order_sudo.get_portal_url(query_string=query_string), }
def portal_order_page(self, order_id, report_type=None, access_token=None, message=False, download=False, **kw): try: order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token) except (AccessError, MissingError): return request.redirect('/my') if report_type in ('html', 'pdf', 'text'): return self._show_report(model=order_sudo, report_type=report_type, report_ref='sale.action_report_saleorder', download=download) # use sudo to allow accessing/viewing orders for public user # only if he knows the private token now = fields.Date.today() # Log only once a day if order_sudo and request.session.get('view_quote_%s' % order_sudo.id) != now and request.env.user.share and access_token: request.session['view_quote_%s' % order_sudo.id] = now body = _('Quotation viewed by customer') _message_post_helper(res_model='sale.order', res_id=order_sudo.id, message=body, token=order_sudo.access_token, message_type='notification', subtype="mail.mt_note", partner_ids=order_sudo.user_id.sudo().partner_id.ids) values = { 'sale_order': order_sudo, 'message': message, 'token': access_token, 'return_url': '/shop/payment/validate', 'bootstrap_formatting': True, 'partner_id': order_sudo.partner_id.id, 'report_type': 'html', } if order_sudo.company_id: values['res_company'] = order_sudo.company_id if order_sudo.has_to_be_paid(): domain = expression.AND([ ['&', ('website_published', '=', True), ('company_id', '=', order_sudo.company_id.id)], ['|', ('specific_countries', '=', False), ('country_ids', 'in', [order_sudo.partner_id.country_id.id])] ]) acquirers = request.env['payment.acquirer'].sudo().search(domain) values['acquirers'] = acquirers.filtered(lambda acq: (acq.payment_flow == 'form' and acq.view_template_id) or (acq.payment_flow == 's2s' and acq.registration_view_template_id)) values['pms'] = request.env['payment.token'].search( [('partner_id', '=', order_sudo.partner_id.id), ('acquirer_id', 'in', acquirers.filtered(lambda acq: acq.payment_flow == 's2s').ids)]) if order_sudo.state in ('draft', 'sent', 'cancel'): history = request.session.get('my_quotations_history', []) else: history = request.session.get('my_orders_history', []) values.update(get_records_pager(history, order_sudo)) return request.render('sale.sale_order_portal_template', values)
def decline(self, order_id, access_token=None, **post): try: order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token) except (AccessError, MissingError): return request.redirect('/my') message = post.get('decline_message') query_string = False if order_sudo.has_to_be_signed() and message: order_sudo.action_cancel() _message_post_helper(message=message, res_id=order_id, res_model='sale.order', **{'token': access_token} if access_token else {}) else: query_string = "&message=cant_reject" return request.redirect(order_sudo.get_portal_url(query_string=query_string))