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.
		
		
		
		
		
			
		
			
				
					
					
						
							264 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							264 lines
						
					
					
						
							11 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from zipfile import ZipFile | |
| from odoo import api, fields, models | |
| from odoo.http import request | |
| 
 | |
| 
 | |
| class Document(models.Model): | |
|     """ Model used to store documents, perform document related functions """ | |
|     _name = 'document.file' | |
|     _inherit = ['mail.thread', 'mail.activity.mixin'] | |
|     _description = 'Documents Community' | |
| 
 | |
|     name = fields.Char(string="Name", help="Document name") | |
|     attachment = fields.Binary(string='File', help="Document data") | |
|     date = fields.Datetime(string='Date', help="Document create date") | |
|     workspace_id = fields.Many2one( | |
|         'document.workspace', string='Workspace', | |
|         required=True, help="workspace name") | |
|     user_id = fields.Many2one( | |
|         'res.users', string='Owner', | |
|         default=lambda self: self.env.user, | |
|         help="""Owner name, if the document belongs to a specific partner""") | |
|     brochure_url = fields.Char(string="URL", help="Document sharable URL") | |
|     extension = fields.Char( | |
|         string='Extension', | |
|         help="""Document extension, helps to determine the file type""") | |
|     priority = fields.Selection( | |
|         [('0', 'None'), ('1', 'Favorite')], | |
|         string="Priority", help="Favorite button") | |
|     activity_ids = fields.One2many( | |
|         'mail.activity', string='Activities', | |
|         help="Created activity for this attachment") | |
|     attachment_id = fields.Many2one( | |
|         'ir.attachment', string="Data", | |
|         help="Used to access datas without search function") | |
|     content_url = fields.Char( | |
|         string='Content Url', help="It store the URL for url type documents") | |
|     content_type = fields.Selection( | |
|         [('file', 'File'), ('url', 'Url')], string="Content Type", | |
|         help="Document content type") | |
|     preview = fields.Char( | |
|         string='Preview', help="Used to show a preview for URL file type") | |
|     active = fields.Boolean( | |
|         string='Active', default=True, help="It specify archived file") | |
|     deleted_date = fields.Date( | |
|         string="Deleted Date", help="File deleted date") | |
|     mimetype = fields.Char( | |
|         string='Mime Type', help="Document mimetype") | |
|     description = fields.Text(string='Description', help="Short description") | |
|     security = fields.Selection( | |
|         selection=[ | |
|             ('private', 'Private'), | |
|             ('managers_and_owner', 'Managers & Owner'), | |
|             ('specific_users', 'Specific Users') | |
|         ], default='managers_and_owner', string="Security", | |
|         help="""Privet : only the uploaded user can view | |
|                 Managers & Owner : Document shared with Managers """) | |
|     user_ids = fields.Many2many( | |
|         'res.users', help="Can access the documents", string="User Access") | |
|     partner_id = fields.Many2one( | |
|         'res.partner', help="Document related partner name", | |
|         string="Related Partner") | |
|     auto_delete = fields.Boolean( | |
|         string='Auto Delete', default=False, | |
|         help="Document delete status") | |
|     days = fields.Integer(string='Days', help="auto delete in days") | |
|     trash = fields.Boolean(string='Trash', help="To specify deleted items") | |
|     delete_date = fields.Date( | |
|         string='Date Delete', readonly=True, | |
|         help="Used to calculate file remove date from trash") | |
|     file_url = fields.Char( | |
|         string='File URL', | |
|         help="""it store url while adding an url document""") | |
|     size = fields.Char( | |
|         string='Size', compute='_compute_size', | |
|         help="it store size of the document") | |
|     company_id = fields.Many2one( | |
|         related='workspace_id.company_id', string='Company', | |
|         help="Company Name") | |
| 
 | |
|     @api.depends('attachment_id') | |
|     def _compute_size(self): | |
|         """Function is used to fetch the file size of an attachment""" | |
|         for rec in self: | |
|             rec.size = str(rec.attachment_id.file_size / 1000) + ' Kb' | |
| 
 | |
|     @api.onchange('days') | |
|     def _onchange_days(self): | |
|         """Function is used to add delete date for a record , | |
|         it automatically deleted at the specified date""" | |
|         self.delete_date = fields.Date.add(fields.Date.today(), days=self.days) | |
| 
 | |
|     def auto_delete_doc(self): | |
|         """Function to delete document automatically using schedule action""" | |
|         self.search([ | |
|             ('auto_delete', '=', True), | |
|             ('delete_date', '<=', fields.Date.today())]).unlink() | |
| 
 | |
|     def action_upload_document(self): | |
|         """Function it works while uploading a file, and it adds some basic | |
|         information about the file""" | |
|         # important to maintain extension and name as different | |
|         attachment_id = self.env['ir.attachment'].sudo().create({ | |
|             'name': self.name, | |
|             'datas': self.attachment, | |
|             'res_model': 'document.file', | |
|             'res_id': self.id, | |
|             'public': True, | |
|         }) | |
|         self.sudo().write({ | |
|             'name': self.name, | |
|             'date': fields.Date.today(), | |
|             'user_id': self.env.uid, | |
|             'extension': self.name.split(".")[len(self.name.split(".")) - 1], | |
|             'content_url': | |
|                 f"/web/content/{attachment_id.id}/{self.name}", | |
|             'mimetype': attachment_id.mimetype, | |
|             'attachment_id': attachment_id.id, | |
|             'brochure_url': attachment_id.local_url | |
|         }) | |
|         if self.env.context.get('active_model') == "request.document": | |
|             self.env['request.document'].search( | |
|                 [('id', '=', self.env.context.get('active_id'))]).write({ | |
|                     'state': 'accepted' | |
|                 }) | |
|         return { | |
|             'type': 'ir.actions.client', | |
|             'tag': 'reload' | |
|         } | |
| 
 | |
|     @api.model | |
|     def archive_function(self, document_selected): | |
|         """ Function to download document as a ZIP """ | |
|         zip_obj = ZipFile('attachments.zip', 'w') | |
|         for doc in self.browse(document_selected): | |
|             zip_obj.write(doc.attachment_id._full_path( | |
|                 doc.attachment_id.store_fname), | |
|                 doc.attachment_id.name) | |
|         zip_obj.close() | |
|         url = f"{request.httprequest.host_url[:-1]}/web/attachments/download" | |
|         return { | |
|             'type': 'ir.actions.act_url', | |
|             'url': url, | |
|             'target': 'self', | |
|         } | |
| 
 | |
|     @api.model | |
|     def document_file_delete(self, doc_ids): | |
|         """Function works while deleting a document, | |
|          it creates a record in document.trash""" | |
|         for docs in self.browse(doc_ids): | |
|             self.env['document.trash'].create({ | |
|                 'name': docs.name, | |
|                 'attachment': docs.attachment, | |
|                 'document_create_date': docs.date, | |
|                 'workspace_id': docs.workspace_id.id, | |
|                 'user_id': docs.user_id.id, | |
|                 'brochure_url': docs.brochure_url, | |
|                 'extension': docs.extension, | |
|                 'priority': docs.priority, | |
|                 'attachment_id': docs.attachment_id.id, | |
|                 'content_url': docs.content_url, | |
|                 'content_type': docs.content_type, | |
|                 'preview': docs.preview, | |
|                 'active': docs.active, | |
|                 'deleted_date': fields.Date.today(), | |
|                 'mimetype': docs.mimetype, | |
|                 'description': docs.description, | |
|                 'security': docs.security, | |
|                 'user_ids': docs.user_ids.ids, | |
|                 'partner_id': docs.partner_id.id, | |
|                 'days': docs.days, | |
|                 'file_url': docs.file_url, | |
|             }) | |
|             docs.unlink() | |
| 
 | |
|     @api.model | |
|     def document_file_archive(self, documents_selected): | |
|         """Function to archive document, it deleted automatically | |
|             based on delete date""" | |
|         for docs in self.browse(documents_selected): | |
|             if docs.active: | |
|                 docs.active = False | |
|             elif docs.delete_date: | |
|                 docs.delete_date = False | |
|                 docs.active = True | |
|             else: | |
|                 docs.active = True | |
| 
 | |
|     @api.model | |
|     def on_mail_document(self, doc_ids): | |
|         """Function used to send document as an email attachment""" | |
|         return { | |
|             'type': 'ir.actions.act_window', | |
|             'name': 'mail', | |
|             'res_model': 'mail.compose.message', | |
|             'view_mode': 'form', | |
|             'target': 'new', | |
|             'views': [[False, 'form']], | |
|             'context': { | |
|                 'default_attachment_ids': self.browse( | |
|                     doc_ids).mapped('attachment_id').ids, | |
|             } | |
|         } | |
| 
 | |
|     @api.model | |
|     def action_btn_create_task(self, doc): | |
|         """Function used to create a task based on document """ | |
|         module_id = self.env['ir.module.module'].search( | |
|             [('name', '=', 'project')]) | |
|         if module_id.state == 'installed': | |
|             for rec in self.browse(doc): | |
|                 task_id = self.env['project.task'].create({ | |
|                     'name': rec['name'] | |
|                 }) | |
|                 rec.attachment_id.res_model = 'project.task' | |
|                 rec.attachment_id.res_id = task_id | |
|             return True | |
|         return False | |
| 
 | |
|     @api.model | |
|     def action_btn_create_lead(self, doc): | |
|         """Function to create a CRM lead based on a document """ | |
|         module_id = self.env['ir.module.module'].search([('name', '=', 'crm')]) | |
|         if module_id.state == 'installed': | |
|             for rec in self.browse(doc): | |
|                 lead_id = self.env['crm.lead'].create({ | |
|                     'name': rec['name'] | |
|                 }) | |
|                 rec.attachment_id.res_model = 'crm.lead' | |
|                 rec.attachment_id.res_id = lead_id | |
|             return True | |
|         return False | |
| 
 | |
|     @api.model | |
|     def delete_doc(self): | |
|         """Function to delete document from trash """ | |
|         limit = self.env['ir.config_parameter'].sudo().get_param( | |
|             'document_management.trash') | |
|         for rec in self.env['document.trash'].search( | |
|                 ['deleted_date', '!=', False]): | |
|             delta = fields.Date.today() - rec.deleted_date | |
|             if delta.days == limit: | |
|                 rec.unlink()
 | |
| 
 |