diff --git a/models/hr_expense.py b/models/hr_expense.py index ce70418194a9e8b851dc0b22a9573c4367345b01..a8db537bc0e5709aad2ac2e4532527f8c635e3af 100644 --- a/models/hr_expense.py +++ b/models/hr_expense.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import api, models, fields +from odoo.exceptions import UserError class AdefpatHrExpense(models.Model): @@ -9,6 +10,21 @@ class AdefpatHrExpense(models.Model): proof_file = fields.Char("Justificatif") + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + @api.multi + def unlink(self): + for espense in self: + if espense.proof_file: + raise UserError( + "Un document est attaché à cette note de frais, " + "veuillez le supprimer avant de supprimer la note de frais.") + return super(AdefpatHrExpense, self).unlink() + + # ------------------------------------------------------ + # Button Function + # ------------------------------------------------------ @api.multi def get_content_details_url(self): # TODO: Refaire la fonction sans le type CMIS Folder @@ -28,6 +44,18 @@ class AdefpatHrExpense(models.Model): 'target': 'new', } + def delete_file(self): + backend = self.env['cmis.backend'].search([], limit=1) + try: + file = backend.get_cmis_repository().getObject( + self.proof_file + ) + file.delete() + self.proof_file = False + except Exception as e: + self.proof_file = False + # raise UserError(json.loads(e.details).get('message')) + # ------------------------------------------------------ # Common Function # ------------------------------------------------------ @@ -39,6 +67,6 @@ class AdefpatHrExpense(models.Model): return { 'cmis:secondaryObjectTypeIds': ['P:adefpat:justificatif'], 'adefpat:justificatifDate': fields.Datetime.to_datetime(self.date).isoformat(), - 'adefpat:justificatifTypeConvention': self.type_convention_id.name, + 'adefpat:justificatifTypeConvention': self.type_convention_id.name if self.type_convention_id.name else '', 'adefpat:justificatifUtilisateurs': self.employee_id.user_id.login } diff --git a/models/hr_timesheet.py b/models/hr_timesheet.py index 87e10a3cc728011a52c8fa756c3b2e25cefb33c8..35e3ba19e4e9989d8b4f2f887c9d2970707947b7 100644 --- a/models/hr_timesheet.py +++ b/models/hr_timesheet.py @@ -4,6 +4,7 @@ from datetime import date from odoo import api, models, fields +from odoo.exceptions import UserError class AdefpatAccountAnalyticLine(models.Model): @@ -11,6 +12,21 @@ class AdefpatAccountAnalyticLine(models.Model): proof_file = fields.Char("Justificatif") + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ + @api.multi + def unlink(self): + for line in self: + if line.proof_file: + raise UserError( + "Un document est attaché à cette ligne, " + "veuillez le supprimer avant de supprimer la ligne.") + return super(AdefpatAccountAnalyticLine, self).unlink() + + # ------------------------------------------------------ + # Button Function + # ------------------------------------------------------ @api.multi def get_content_details_url(self): # TODO: Refaire la fonction sans le type CMIS Folder @@ -30,7 +46,19 @@ class AdefpatAccountAnalyticLine(models.Model): 'target': 'new', } - # ------------------------------------------------------ + def delete_file(self): + backend = self.env['cmis.backend'].search([], limit=1) + try: + file = backend.get_cmis_repository().getObject( + self.proof_file + ) + file.delete() + self.proof_file = False + except: + self.proof_file = False + # raise UserError("Le fichier est introuvable sur Alfresco") + + # ------------------------------------------------------ # Common Function # ------------------------------------------------------ def get_file_properties(self): diff --git a/views/adefpat_list_type_doc_views.xml b/views/adefpat_list_type_doc_views.xml index 7724e44802fd6b0a4054c4c378d722404561c2ee..597db3728bb490cb1a3708fed4ad537cb7809aac 100644 --- a/views/adefpat_list_type_doc_views.xml +++ b/views/adefpat_list_type_doc_views.xml @@ -62,9 +62,10 @@ <field name="arch" type="xml"> <tree string="Documents" editable="top"> <field name="name"/> - <field name="parent_id"/> + <field name="parent_id" options="{ 'no_create': 1 }"/> <field name="path"/> <field name="specifique"/> + <field name="model_id" attrs="{'required': [('specifique', '=', True)]}"/> </tree> </field> </record> diff --git a/views/hr_expense_views.xml b/views/hr_expense_views.xml index 4c02d69ffa4b3f1bd263c92bbed0ecdef76ce4ba..524d265f7abcd5c416e638ac0d1438c64ac7686b 100644 --- a/views/hr_expense_views.xml +++ b/views/hr_expense_views.xml @@ -16,6 +16,10 @@ type="action" class="oe_highlight" attrs="{'invisible': [('proof_file', '!=', False)]}"/> + <button name="delete_file" + string="Supprimer le justificatif" + type="object" + attrs="{'invisible': [('proof_file', '=', False)]}"/> <field name="proof_file" invisible="1"/> <button name="get_content_details_url" string="Voir le justificatif" diff --git a/views/hr_timesheet_views.xml b/views/hr_timesheet_views.xml index 45abcf62deba734a83cd24305ad5650ebb9eb4ac..6305fad85cd894d0a0c9a83ca293e1d39fd89d15 100644 --- a/views/hr_timesheet_views.xml +++ b/views/hr_timesheet_views.xml @@ -13,14 +13,21 @@ <field name="unit_amount" position="after"> <field name="proof_file" invisible="1"/> <button name="%(adefpat_alfodoo.upload_file_wizard_action)d" - string="Charger un doc" + string="Justif de présence" type="action" class="btn-outline-info btn-sm" - attrs="{'invisible': ['|',('proof_file', '!=', False),('id', '=', False)]}" + attrs="{'invisible': [('proof_file', '!=', False)]}" + /> + <button icon="fa-times" + name="delete_file" + string="Supprimer le fichier" + class="text-danger" + type="object" + attrs="{'invisible': [('proof_file', '=', False)]}" /> <button icon="/adefpat_alfodoo/static/src/img/alfresco-logo-16.png" name="get_content_details_url" - string="voir" + string="Voir le fichier dans Alfresco" type="object" attrs="{'invisible': [('proof_file', '=', False)]}" /> diff --git a/views/project_task_views.xml b/views/project_task_views.xml index 6f21da2b33378abb3b415a1d075c578d6819a0a1..f0517151e3eb03d915214165b4270962bf92a8ca 100644 --- a/views/project_task_views.xml +++ b/views/project_task_views.xml @@ -14,7 +14,7 @@ <!-- Ajoute l'onglet Documents dans la vue projet --> <xpath expr="//notebook" position="inside"> <page string="Documents" groups="base.group_user"> - <field name="task_cmis_folder" + <field name="cmis_folder" canCreateFolder="0" canCreateDocument="0" canImportNewVersion="0" diff --git a/wizard/upload_file_wizard.py b/wizard/upload_file_wizard.py index 03dc1a3247b2fceb77bba5096f3d5c0d9c97f953..ebdcf7280b7fbd366e54656d3059a5b407744388 100644 --- a/wizard/upload_file_wizard.py +++ b/wizard/upload_file_wizard.py @@ -3,6 +3,7 @@ import mimetypes import base64 +import json from odoo import api, fields, models from odoo.exceptions import UserError @@ -45,19 +46,23 @@ class UploadFileWizard(models.TransientModel): # Upload File backend = self.env['cmis.backend'].search([], limit=1) - # TODO: voir si le champ est vide et soit mettre à jour soit cherger - # traiter les 2 types de modèle (timesheet & expense) repo = backend.get_cmis_repository().getObject(proof_folder) if not obj.proof_file: - file = repo.createDocument( - name=self.filename, - properties=obj.get_file_properties(), - contentFile=base64.b64decode(self.file), - contentType=content_type - ) - file_id = file.getProperties().get('cmis:objectId') - obj.proof_file = file.getObjectId() + try: + filename = (fields.Date.to_string(obj.date).replace('-', '') + + '-' + str(obj.id) + ' - ' + + obj.employee_id.user_id.name + ' - ' + self.filename) + file = repo.createDocument( + name=filename, + properties=obj.get_file_properties(), + contentFile=base64.b64decode(self.file), + contentType=content_type + ) + file_id = file.getProperties().get('cmis:objectId') + obj.proof_file = file.getObjectId() + except Exception as e: + raise UserError(json.loads(e.details).get('message')) # TODO: Mettre à jour le champ avec le NodeRef