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