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)
 | |
| 
 |