diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..e135712e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ +language: python +sudo: false +cache: + apt: true + directories: + - $HOME/.cache/pip + +python: + - "3.5" + +addons: + postgresql: "9.6" + apt: + packages: + - expect-dev # provides unbuffer utility + - python-lxml # because pip installation is slow + - python-simplejson + - python-serial + - python-yaml +env: + global: + - VERSION="12.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" + - TRANSIFEX_USER='transbot@odoo-community.org' + + matrix: + - LINT_CHECK="1" + - TRANSIFEX="1" + - TESTS="1" ODOO_REPO="OCA/OCB" + - TESTS="1" ODOO_REPO="odoo/odoo" + + +install: + - git clone --depth=1 https://github.com/Eficent/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools + - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} + - travis_install_nightly + +script: + - travis_run_tests + +after_success: + - travis_after_tests_success \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..182e22b3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +My Odoo Custom Addons diff --git a/__init__.py b/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/certification_alert/__init__.py b/certification_alert/__init__.py new file mode 100644 index 00000000..9405915f --- /dev/null +++ b/certification_alert/__init__.py @@ -0,0 +1,4 @@ +from . import models + + + diff --git a/certification_alert/__manifest__.py b/certification_alert/__manifest__.py new file mode 100644 index 00000000..c635bbcb --- /dev/null +++ b/certification_alert/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2019 Eficent +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + 'name': 'Certification Alert', + 'summary': "Warning when you purchase a product without a certificate.", + 'author': "Eficent, Odoo Community Association (OCA)", + 'website': "https://github.com/", + 'category': 'Certification Management', + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'depends': ['base', 'purchase', 'certification_v2', 'product'], + 'data': ['security/ir.model.access.csv', + 'views/product_template_views.xml' + ], + 'development_status': 'Beta', + 'maintainers': ['ceeficent'], +} \ No newline at end of file diff --git a/certification_alert/models/__init__.py b/certification_alert/models/__init__.py new file mode 100644 index 00000000..b6e3d559 --- /dev/null +++ b/certification_alert/models/__init__.py @@ -0,0 +1,4 @@ +from . import product_template + + + diff --git a/certification_alert/models/__pycache__/__init__.cpython-36.pyc b/certification_alert/models/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 00000000..3303ac0d Binary files /dev/null and b/certification_alert/models/__pycache__/__init__.cpython-36.pyc differ diff --git a/certification_alert/models/__pycache__/product_template.cpython-36.pyc b/certification_alert/models/__pycache__/product_template.cpython-36.pyc new file mode 100644 index 00000000..58d67411 Binary files /dev/null and b/certification_alert/models/__pycache__/product_template.cpython-36.pyc differ diff --git a/certification_alert/models/product_template.py b/certification_alert/models/product_template.py new file mode 100644 index 00000000..14f22301 --- /dev/null +++ b/certification_alert/models/product_template.py @@ -0,0 +1,8 @@ + +from odoo import models,fields,api + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + certification_ids = fields.Many2many('certification.standard') diff --git a/certification_alert/models/purchase.py b/certification_alert/models/purchase.py new file mode 100644 index 00000000..1a650262 --- /dev/null +++ b/certification_alert/models/purchase.py @@ -0,0 +1,8 @@ + +from odoo import models,fields,api +from odoo.exceptions import ValidationError + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + diff --git a/certification_alert/security/ir.model.access.csv b/certification_alert/security/ir.model.access.csv new file mode 100644 index 00000000..fb73a417 --- /dev/null +++ b/certification_alert/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_certification_alert_user,certification_alert.employee,model_product_template,base.group_user,1,1,1,1 + + + diff --git a/certification_alert/views/product_template_views.xml b/certification_alert/views/product_template_views.xml new file mode 100644 index 00000000..f7daaa28 --- /dev/null +++ b/certification_alert/views/product_template_views.xml @@ -0,0 +1,14 @@ + + + + Product certification + product.template + + + + + + + + + diff --git a/certification_v2/__init__.py b/certification_v2/__init__.py new file mode 100644 index 00000000..ca95c2b9 --- /dev/null +++ b/certification_v2/__init__.py @@ -0,0 +1,5 @@ +from . import models +from . import wizard +from . import reports + + diff --git a/certification_v2/__manifest__.py b/certification_v2/__manifest__.py new file mode 100644 index 00000000..1c63e3b4 --- /dev/null +++ b/certification_v2/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2019 Eficent +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + 'name': 'Certification V2', + 'summary': "Defines certifaction for different purposes.", + 'author': "Eficent, Odoo Community Association (OCA)", + 'website': "https://github.com/", + 'category': 'Certification Management', + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'depends': ['base'], + 'data': ['security/ir.model.access.csv', + 'views/certification_view.xml', + 'views/res_partner_view.xml', + 'views/standard_view.xml', + 'security/certification_security.xml', + 'reports/certification_report_pdf.xml', + 'reports/certification_template_pdf.xml', + 'reports/certification_report.xml' + ], + 'demo': + ['demo/certification_data.xml', + ], + 'development_status': 'Beta', + 'maintainers': ['ceeficent'], +} \ No newline at end of file diff --git a/certification_v2/demo/certification_data.xml b/certification_v2/demo/certification_data.xml new file mode 100644 index 00000000..9b0f5bcd --- /dev/null +++ b/certification_v2/demo/certification_data.xml @@ -0,0 +1,255 @@ + + + + Karl Acar + False + + + + Nuri Ak + False + + + + Ihan Baykara + False + + + + Aysel Cevdet + False + + + + Zeynep Buruk + False + + + + Melek Atan + False + + + + Osman Atalay + False + + + + Kerem Cerci + False + + + + Elma Ceren + False + + + + Azad Ayik + False + + + + Entity Demo + True + + + + TURKAK Turkish Accreditation Agency + True + + + + AEA Quality Advantage Corporation + True + + + + ABS Quality Evaluations + True + + + + FINAS Finnish Accreditation Service + True + + + + ABC Appareillage Banc Hydraulique + False + + + + AERYS + False + + + + AF Fasteners + False + + + + Danish Aviation Systems + False + + + + INESPASA + False + + + + EFINOR + False + + + + Cefival + False + + + + Limatech + False + + + + AS9100:2015 + + + + AS9100:2018 + + + + AS9107:2018 + + + + AS9110:2014 + + + + AS9120:2016 + + + + AS9134:2017 + + + + AS9162:2015 + + + + 50380 + 2021-12-31 + + + + + + + 60897 + 2019-02-05 + + + + + + + 11789 + 2020-10-01 + + + + + + + 54987 + 2019-05-13 + + + + + + + 34201 + 2022-12-11 + + + + + + + 36984 + 2020-08-18 + + + + + + + 67210 + 2020-04-13 + + + + + + + 38415 + 2023-03-06 + + + + + + + 94510 + 2022-05-01 + + + + + + + 51487 + 2020-07-26 + + + + + \ No newline at end of file diff --git a/certification_v2/models/__init__.py b/certification_v2/models/__init__.py new file mode 100644 index 00000000..fb68fd5c --- /dev/null +++ b/certification_v2/models/__init__.py @@ -0,0 +1,4 @@ +from . import certification +from . import res_partner +from . import certification_standard + diff --git a/certification_v2/models/__pycache__/__init__.cpython-36.pyc b/certification_v2/models/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 00000000..aa91c47e Binary files /dev/null and b/certification_v2/models/__pycache__/__init__.cpython-36.pyc differ diff --git a/certification_v2/models/__pycache__/certification.cpython-36.pyc b/certification_v2/models/__pycache__/certification.cpython-36.pyc new file mode 100644 index 00000000..93c9c6dc Binary files /dev/null and b/certification_v2/models/__pycache__/certification.cpython-36.pyc differ diff --git a/certification_v2/models/__pycache__/certification_standard.cpython-36.pyc b/certification_v2/models/__pycache__/certification_standard.cpython-36.pyc new file mode 100644 index 00000000..8daced27 Binary files /dev/null and b/certification_v2/models/__pycache__/certification_standard.cpython-36.pyc differ diff --git a/certification_v2/models/__pycache__/res_partner.cpython-36.pyc b/certification_v2/models/__pycache__/res_partner.cpython-36.pyc new file mode 100644 index 00000000..013ed434 Binary files /dev/null and b/certification_v2/models/__pycache__/res_partner.cpython-36.pyc differ diff --git a/certification_v2/models/certification.py b/certification_v2/models/certification.py new file mode 100644 index 00000000..6b2f38f2 --- /dev/null +++ b/certification_v2/models/certification.py @@ -0,0 +1,45 @@ +# Copyright 2019 Eficent +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from datetime import timedelta + +from odoo import models, fields, api +from odoo.exceptions import ValidationError + + +class Certification(models.Model): + _name = 'certification' + _description = 'Certification' + + number = fields.Char() + owner_id = fields.Many2one('res.partner') + date = fields.Date(string='Validation Date') + description = fields.Text(string='Validation Details') + standard_id = fields.Many2one('certification.standard') + entity_id = fields.Many2one('res.partner') + expiry_days = fields.Integer('Expiry Days', readonly=True, compute='_compute_expiry_days') + expiry_status = fields.Selection([ + ('expired', "Expired"), + ('available', "Available") + ], readonly=True, compute='_compute_expiry_days', store=True) + + @api.constrains('entity_id') + def _check_entity_id(self): + if self.entity_id and self.entity_id.is_certification_body == False: + raise ValidationError('It is not a certification entity') + + @api.multi + def update_date_one_month(self): + self.ensure_one() + if self.date: + self.write({'date': self.date + timedelta(days=30)}) + + @api.depends ('date') + def _compute_expiry_days(self): + for rec in self: + if rec.date: + rec.expiry_days = (rec.date - fields.Date.today()).days + if rec.expiry_days > 0: + rec.expiry_status = 'available' + else: + rec.expiry_status = 'expired' diff --git a/certification_v2/models/certification_standard.py b/certification_v2/models/certification_standard.py new file mode 100644 index 00000000..1e28fc0c --- /dev/null +++ b/certification_v2/models/certification_standard.py @@ -0,0 +1,8 @@ +from odoo import models,fields + + +class CertificationStandard(models.Model): + _name = 'certification.standard' + _description = 'Certification Standard' + + name = fields.Char() diff --git a/certification_v2/models/res_partner.py b/certification_v2/models/res_partner.py new file mode 100644 index 00000000..214d2765 --- /dev/null +++ b/certification_v2/models/res_partner.py @@ -0,0 +1,11 @@ + +from odoo import models,fields + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + is_certification_body = fields.Boolean(string="Certification Entity", default=False) + certification_ids = fields.One2many(comodel_name='certification', inverse_name='owner_id') + + diff --git a/certification_v2/reports/__init__.py b/certification_v2/reports/__init__.py new file mode 100644 index 00000000..c928a4c3 --- /dev/null +++ b/certification_v2/reports/__init__.py @@ -0,0 +1,2 @@ +from . import certification_report + diff --git a/certification_v2/reports/__pycache__/__init__.cpython-36.pyc b/certification_v2/reports/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 00000000..e7dbb882 Binary files /dev/null and b/certification_v2/reports/__pycache__/__init__.cpython-36.pyc differ diff --git a/certification_v2/reports/__pycache__/certification_report.cpython-36.pyc b/certification_v2/reports/__pycache__/certification_report.cpython-36.pyc new file mode 100644 index 00000000..53339306 Binary files /dev/null and b/certification_v2/reports/__pycache__/certification_report.cpython-36.pyc differ diff --git a/certification_v2/reports/certification_report.py b/certification_v2/reports/certification_report.py new file mode 100644 index 00000000..99e1cf85 --- /dev/null +++ b/certification_v2/reports/certification_report.py @@ -0,0 +1,66 @@ +from psycopg2.extensions import AsIs + +from odoo import tools +from odoo import api, fields, models + + +class CertificationReport(models.Model): + _name = "certification.report" + _description = "Certification Report" + _auto = False + + entity_id = fields.Many2one('res.partner', readonly=True) + certification_count = fields.Integer(readonly=True) + standard_id = fields.Many2one('certification.standard') + expiry_status = fields.Selection([ + ('expired', "Expired"), + ('available', "Available") + ], readonly=True) + + def _select(self): + select_str = """ + SELECT + rp.id AS id, + c.entity_id AS entity_id, + cs.id AS standard_id, + c.expiry_status AS expiry_status, + count(c.id) AS certification_count + """ + return select_str + + def _from(self): + from_str = """ + res_partner AS rp + JOIN certification AS c + ON c.entity_id = rp.id + JOIN certification_standard AS cs + ON cs.id = c.standard_id + """ + return from_str + + def _where(self): + where_str = """rp.is_certification_body is True""" + return where_str + + def _group_by(self): + group_by_str = """ + GROUP BY + rp.id, + c.entity_id, + cs.id, + c.expiry_status + """ + return group_by_str + + @api.model_cr + def init(self): + tools.drop_view_if_exists(self.env.cr, self._table) + self.env.cr.execute( + """ + CREATE or REPLACE VIEW %s as (%s + FROM ( %s ) WHERE ( %s ) + %s)""", + (AsIs(self._table), AsIs(self._select()), + AsIs(self._from()), AsIs(self._where()), + AsIs(self._group_by())), + ) \ No newline at end of file diff --git a/certification_v2/reports/certification_report.xml b/certification_v2/reports/certification_report.xml new file mode 100644 index 00000000..c685c895 --- /dev/null +++ b/certification_v2/reports/certification_report.xml @@ -0,0 +1,38 @@ + + + certification.report.pivot + certification.report + + + + + + + + + + + + certification.report.graph + certification.report + + + + + + + + + + + + + + \ No newline at end of file diff --git a/certification_v2/reports/certification_report_pdf.xml b/certification_v2/reports/certification_report_pdf.xml new file mode 100644 index 00000000..a3cf65bd --- /dev/null +++ b/certification_v2/reports/certification_report_pdf.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/certification_v2/reports/certification_template_pdf.xml b/certification_v2/reports/certification_template_pdf.xml new file mode 100644 index 00000000..41c8e73e --- /dev/null +++ b/certification_v2/reports/certification_template_pdf.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/certification_v2/security/certification_security.xml b/certification_v2/security/certification_security.xml new file mode 100644 index 00000000..87761ffa --- /dev/null +++ b/certification_v2/security/certification_security.xml @@ -0,0 +1,24 @@ + + + + + Certification + 10 + + + + Certification User + + + + + Certification Manager + + + + + + + + \ No newline at end of file diff --git a/certification_v2/security/ir.model.access.csv b/certification_v2/security/ir.model.access.csv new file mode 100644 index 00000000..c059c26a --- /dev/null +++ b/certification_v2/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_certification_user,certification.employee,model_certification,base.group_user,1,1,1,1 +access_certification_standard_user,certification.standard.user,model_certification_standard,base.group_user,1,1,1,1 +access_certification_report_user,certification.report.user,model_certification_report,base.group_user,1,1,1,1 + + diff --git a/certification_v2/tests/__init__.py b/certification_v2/tests/__init__.py new file mode 100644 index 00000000..561e9ab4 --- /dev/null +++ b/certification_v2/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_certification diff --git a/certification_v2/tests/__pycache__/__init__.cpython-36.pyc b/certification_v2/tests/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 00000000..0afaac52 Binary files /dev/null and b/certification_v2/tests/__pycache__/__init__.cpython-36.pyc differ diff --git a/certification_v2/tests/__pycache__/test_certification.cpython-36.pyc b/certification_v2/tests/__pycache__/test_certification.cpython-36.pyc new file mode 100644 index 00000000..9fb81e5c Binary files /dev/null and b/certification_v2/tests/__pycache__/test_certification.cpython-36.pyc differ diff --git a/certification_v2/tests/test_certification.py b/certification_v2/tests/test_certification.py new file mode 100644 index 00000000..79330697 --- /dev/null +++ b/certification_v2/tests/test_certification.py @@ -0,0 +1,21 @@ +# Copyright 2015 ACSONE SA/NV (). +# Copyright 2016 Tecnativa - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.tests.common import TransactionCase + + +class TestCertification(TransactionCase): + def setUp(self): + super(TestCertification, self).setUp() + self.res_partner = self.env['res.partner'] + self.partner = self.res_partner.create({ + 'name': "test1", + 'email': "test@test.com"}) + + def test_certification(self): + """ Test expiry status of the certification""" + certification = self.env['certification'].create({ + 'number': 'AAA', + 'date': '2025-12-31'}) + self.assertEqual(certification.expiry_status, 'available') diff --git a/certification_v2/views/certification_view.xml b/certification_v2/views/certification_view.xml new file mode 100644 index 00000000..4634678b --- /dev/null +++ b/certification_v2/views/certification_view.xml @@ -0,0 +1,52 @@ + + + + Certification + certification + + + + + + + + + + + + + + Certification + certification + +
+ + + + + + + +