You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							93 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							93 lines
						
					
					
						
							3.8 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								###############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Swetha Anand (odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU AFFERO
							 | 
						|
								#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
							 | 
						|
								#    (AGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								###############################################################################
							 | 
						|
								import base64
							 | 
						|
								import logging
							 | 
						|
								import json
							 | 
						|
								import unicodedata
							 | 
						|
								
							 | 
						|
								from odoo.exceptions import AccessError
							 | 
						|
								from odoo.http import request
							 | 
						|
								from odoo import _, http
							 | 
						|
								from odoo.addons.web.controllers.main import Binary
							 | 
						|
								
							 | 
						|
								_logger = logging.getLogger(__name__)
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								def clean(name): return name.replace('\x3c', '')
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class Binary(Binary):
							 | 
						|
								    """This class is called to override upload_attachment()."""
							 | 
						|
								    @http.route('/web/binary/upload_attachment', type='http', auth="user")
							 | 
						|
								    def upload_attachment(self, model, id, ufile, callback=None):
							 | 
						|
								        """
							 | 
						|
								        Override the function upload_attachment() to include
							 | 
						|
								        a check to see if the size of the attachment exceeds
							 | 
						|
								        the user-assigned maximum size. If true, an error
							 | 
						|
								        message is displayed.
							 | 
						|
								        """
							 | 
						|
								        files = request.httprequest.files.getlist('ufile')
							 | 
						|
								        Model = request.env['ir.attachment']
							 | 
						|
								        out = """<script language="javascript" type="text/javascript">
							 | 
						|
								                       var win = window.top.window;
							 | 
						|
								                       win.jQuery(win).trigger(%s, %s);
							 | 
						|
								                   </script>"""
							 | 
						|
								        args = []
							 | 
						|
								        max_size = request.env.user.max_size * 1024 * 1024
							 | 
						|
								        for ufile in files:
							 | 
						|
								            filename = ufile.filename
							 | 
						|
								            if request.httprequest.user_agent.browser == 'safari':
							 | 
						|
								                # Safari sends NFD UTF-8
							 | 
						|
								                # (where é is composed by 'e' and [accent])
							 | 
						|
								                # we need to send it the same stuff, otherwise it'll fail
							 | 
						|
								                filename = unicodedata.normalize('NFD', ufile.filename)
							 | 
						|
								            try:
							 | 
						|
								                attachment = Model.create({
							 | 
						|
								                    'name': filename,
							 | 
						|
								                    'datas': base64.encodebytes(ufile.read()),
							 | 
						|
								                    'res_model': model,
							 | 
						|
								                    'res_id': int(id)
							 | 
						|
								                })
							 | 
						|
								                attachment._post_add_create()
							 | 
						|
								            except AccessError:
							 | 
						|
								                args.append({'error': _(
							 | 
						|
								                    "You are not allowed to upload an attachment here.")})
							 | 
						|
								            except Exception:
							 | 
						|
								                args.append({'error': _("Something horrible happened")})
							 | 
						|
								                _logger.exception("Fail to upload attachment %s"
							 | 
						|
								                                  % ufile.filename)
							 | 
						|
								            else:
							 | 
						|
								                args.append({
							 | 
						|
								                    'filename': clean(filename),
							 | 
						|
								                    'mimetype': ufile.content_type,
							 | 
						|
								                    'id': attachment.id,
							 | 
						|
								                    'size': attachment.file_size
							 | 
						|
								                })
							 | 
						|
								            for dict in args:
							 | 
						|
								                if dict.get('size'):
							 | 
						|
								                    if dict.get('size') > max_size:
							 | 
						|
								                        args.append({'error': _(
							 | 
						|
								                            'Attachment size cannot exceed %s MB.')
							 | 
						|
								                                              % request.env.user.max_size})
							 | 
						|
								                        attachment.unlink()
							 | 
						|
								        return out % (json.dumps(clean(callback)), json.dumps(
							 | 
						|
								            args)) if callback else json.dumps(args)
							 | 
						|
								
							 |