From e8bc408a7a7b822f92ee93e74b37ef2dca69e0d6 Mon Sep 17 00:00:00 2001 From: Muhammad Date: Sun, 7 Apr 2024 12:46:04 +0500 Subject: [PATCH] [ADD] dependant modules --- auth_signup_verify_email/README.rst | 106 ++++ auth_signup_verify_email/__init__.py | 4 + auth_signup_verify_email/__manifest__.py | 17 + .../controllers/__init__.py | 4 + auth_signup_verify_email/controllers/main.py | 78 +++ auth_signup_verify_email/i18n/ar.po | 42 ++ .../i18n/auth_signup_verify_email.pot | 38 ++ auth_signup_verify_email/i18n/de.po | 45 ++ auth_signup_verify_email/i18n/es.po | 44 ++ auth_signup_verify_email/i18n/fr.po | 44 ++ auth_signup_verify_email/i18n/hr.po | 45 ++ auth_signup_verify_email/i18n/hr_HR.po | 47 ++ auth_signup_verify_email/i18n/it.po | 46 ++ auth_signup_verify_email/i18n/pt_BR.po | 47 ++ auth_signup_verify_email/i18n/ro.po | 45 ++ auth_signup_verify_email/i18n/sl.po | 46 ++ auth_signup_verify_email/i18n/tr.po | 44 ++ auth_signup_verify_email/readme/CONFIGURE.rst | 6 + .../readme/CONTRIBUTORS.rst | 5 + .../readme/DESCRIPTION.rst | 5 + auth_signup_verify_email/readme/INSTALL.rst | 2 + auth_signup_verify_email/readme/USAGE.rst | 4 + .../static/description/icon.png | Bin 0 -> 10549 bytes .../static/description/icon.svg | 172 +++++++ .../static/description/index.html | 454 ++++++++++++++++++ auth_signup_verify_email/tests/__init__.py | 4 + .../tests/test_verify_email.py | 49 ++ auth_signup_verify_email/views/signup.xml | 16 + ct_client_backup/__init__.py | 2 + ct_client_backup/__manifest__.py | 30 ++ ct_client_backup/controllers/__init__.py | 0 ct_client_backup/data/backup_ignite_cron.xml | 14 + ct_client_backup/models/__init__.py | 2 + ct_client_backup/models/models.py | 137 ++++++ ct_client_backup/models/saas_app.py | 124 +++++ ct_client_backup/security/ir.model.access.csv | 3 + ct_client_backup/static/description/icon.png | Bin 0 -> 5067 bytes ct_client_backup/views/app_views.xml | 37 ++ ct_client_backup/views/views.xml | 75 +++ ct_client_backup/wizards/__init__.py | 1 + ct_client_backup/wizards/backup_restore.py | 23 + ct_client_backup/wizards/backup_restore.xml | 45 ++ 42 files changed, 1952 insertions(+) create mode 100755 auth_signup_verify_email/README.rst create mode 100755 auth_signup_verify_email/__init__.py create mode 100755 auth_signup_verify_email/__manifest__.py create mode 100755 auth_signup_verify_email/controllers/__init__.py create mode 100755 auth_signup_verify_email/controllers/main.py create mode 100755 auth_signup_verify_email/i18n/ar.po create mode 100755 auth_signup_verify_email/i18n/auth_signup_verify_email.pot create mode 100755 auth_signup_verify_email/i18n/de.po create mode 100755 auth_signup_verify_email/i18n/es.po create mode 100755 auth_signup_verify_email/i18n/fr.po create mode 100755 auth_signup_verify_email/i18n/hr.po create mode 100755 auth_signup_verify_email/i18n/hr_HR.po create mode 100755 auth_signup_verify_email/i18n/it.po create mode 100755 auth_signup_verify_email/i18n/pt_BR.po create mode 100755 auth_signup_verify_email/i18n/ro.po create mode 100755 auth_signup_verify_email/i18n/sl.po create mode 100755 auth_signup_verify_email/i18n/tr.po create mode 100755 auth_signup_verify_email/readme/CONFIGURE.rst create mode 100755 auth_signup_verify_email/readme/CONTRIBUTORS.rst create mode 100755 auth_signup_verify_email/readme/DESCRIPTION.rst create mode 100755 auth_signup_verify_email/readme/INSTALL.rst create mode 100755 auth_signup_verify_email/readme/USAGE.rst create mode 100755 auth_signup_verify_email/static/description/icon.png create mode 100755 auth_signup_verify_email/static/description/icon.svg create mode 100755 auth_signup_verify_email/static/description/index.html create mode 100755 auth_signup_verify_email/tests/__init__.py create mode 100755 auth_signup_verify_email/tests/test_verify_email.py create mode 100755 auth_signup_verify_email/views/signup.xml create mode 100755 ct_client_backup/__init__.py create mode 100755 ct_client_backup/__manifest__.py create mode 100755 ct_client_backup/controllers/__init__.py create mode 100755 ct_client_backup/data/backup_ignite_cron.xml create mode 100644 ct_client_backup/models/__init__.py create mode 100644 ct_client_backup/models/models.py create mode 100755 ct_client_backup/models/saas_app.py create mode 100755 ct_client_backup/security/ir.model.access.csv create mode 100755 ct_client_backup/static/description/icon.png create mode 100755 ct_client_backup/views/app_views.xml create mode 100755 ct_client_backup/views/views.xml create mode 100755 ct_client_backup/wizards/__init__.py create mode 100755 ct_client_backup/wizards/backup_restore.py create mode 100755 ct_client_backup/wizards/backup_restore.xml diff --git a/auth_signup_verify_email/README.rst b/auth_signup_verify_email/README.rst new file mode 100755 index 0000000..fa44e6d --- /dev/null +++ b/auth_signup_verify_email/README.rst @@ -0,0 +1,106 @@ +====================== +Verify email at signup +====================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--auth-lightgray.png?logo=github + :target: https://github.com/OCA/server-auth/tree/13.0/auth_signup_verify_email + :alt: OCA/server-auth +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-auth-13-0/server-auth-13-0-auth_signup_verify_email + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/251/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of public sign up to force users to +provide a valid email address. + +To achieve this, users are not required to provide a password at +sign up: they are asked for only at first login attempt. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +* Install `email_validator `_ + with ``pip install email_validator`` or equivalent. + +Configuration +============= + +To configure this module, you need to: + +* `Properly configure your outgoing email server(s) + `_. +* Go to *Settings > General Settings -> General settings*, search for + the *Users* section and enable *Free sign up* in *Customer account*. + +Usage +===== + +To use this module, you need to: + +* Log out. +* `Sign up `_ with a valid email. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Antiun Ingeniería S.L. +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* Rafael Blasco +* Jairo Llopis +* Simone Orsi +* Alexandre Díaz +* Eugene Molotov + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/server-auth `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/auth_signup_verify_email/__init__.py b/auth_signup_verify_email/__init__.py new file mode 100755 index 0000000..54d1454 --- /dev/null +++ b/auth_signup_verify_email/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2015 Antiun Ingeniería, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import controllers diff --git a/auth_signup_verify_email/__manifest__.py b/auth_signup_verify_email/__manifest__.py new file mode 100755 index 0000000..057bde7 --- /dev/null +++ b/auth_signup_verify_email/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2015 Antiun Ingeniería, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Verify email at signup", + "summary": "Force uninvited users to use a good email for signup", + "version": "14.0.1.0.0", + "category": "Authentication", + "website": "https://github.com/OCA/server-auth", + "author": "Antiun Ingeniería S.L., " + "Tecnativa, " + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["auth_signup"], + "external_dependencies": {"python": ["lxml", "email_validator"]}, + "data": ["views/signup.xml"], + "installable": True, +} diff --git a/auth_signup_verify_email/controllers/__init__.py b/auth_signup_verify_email/controllers/__init__.py new file mode 100755 index 0000000..437ebe4 --- /dev/null +++ b/auth_signup_verify_email/controllers/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2015 Antiun Ingeniería, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import main diff --git a/auth_signup_verify_email/controllers/main.py b/auth_signup_verify_email/controllers/main.py new file mode 100755 index 0000000..a655b32 --- /dev/null +++ b/auth_signup_verify_email/controllers/main.py @@ -0,0 +1,78 @@ +# Copyright 2015 Antiun Ingeniería, S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +from email_validator import EmailSyntaxError, EmailUndeliverableError, validate_email + +from odoo import _ +from odoo.http import request, route + +from odoo.addons.auth_signup.controllers.main import AuthSignupHome + +_logger = logging.getLogger(__name__) + + +class SignupVerifyEmail(AuthSignupHome): + @route() + def web_auth_signup(self, *args, **kw): + if request.params.get("login") and not request.params.get("password"): + return self.passwordless_signup() + return super().web_auth_signup(*args, **kw) + + def passwordless_signup(self): + values = request.params + qcontext = self.get_auth_signup_qcontext() + + # Check good format of e-mail + try: + validate_email(values.get("login", "")) + except EmailSyntaxError as error: + qcontext["error"] = getattr( + error, "message", _("That does not seem to be an email address."), + ) + return request.render("auth_signup.signup", qcontext) + except EmailUndeliverableError as error: + qcontext["error"] = str(error) + return request.render("auth_signup.signup", qcontext) + except Exception as error: + qcontext["error"] = str(error) + return request.render("auth_signup.signup", qcontext) + if not values.get("email"): + values["email"] = values.get("login") + + # preserve user lang + values["lang"] = request.context.get("lang", "") + + # remove values that could raise "Invalid field '*' on model 'res.users'" + values.pop("redirect", "") + values.pop("token", "") + + # Remove password + values["password"] = "" + sudo_users = request.env["res.users"].with_context(create_user=True).sudo() + + try: + with request.cr.savepoint(): + sudo_users.signup(values, qcontext.get("token")) + sudo_users.reset_password(values.get("login")) + except Exception as error: + # Duplicate key or wrong SMTP settings, probably + _logger.exception(error) + if ( + request.env["res.users"] + .sudo() + .search([("login", "=", qcontext.get("login"))]) + ): + qcontext["error"] = _( + "Another user is already registered using this email" " address." + ) + else: + # Agnostic message for security + qcontext["error"] = _( + "Something went wrong, please try again later or" " contact us." + ) + return request.render("auth_signup.signup", qcontext) + + qcontext["message"] = _("Check your email to activate your account!") + return request.render("auth_signup.reset_password", qcontext) diff --git a/auth_signup_verify_email/i18n/ar.po b/auth_signup_verify_email/i18n/ar.po new file mode 100755 index 0000000..e12988d --- /dev/null +++ b/auth_signup_verify_email/i18n/ar.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-01-06 13:44+0000\n" +"Last-Translator: Rachid Al Assir \n" +"Language-Team: none\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "هنالك مستخدم أخر مسجل بهذا البريد الإلكتروني." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "تحقق من بريدك الإلكتروني لتفعيل حسابك!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "حدث خطأ ما، يرجى المحاولة مرة أخرى لاحقًا أو الاتصال بنا." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "لا يبدو أن هذا عنوان بريد إلكتروني." diff --git a/auth_signup_verify_email/i18n/auth_signup_verify_email.pot b/auth_signup_verify_email/i18n/auth_signup_verify_email.pot new file mode 100755 index 0000000..1f9903b --- /dev/null +++ b/auth_signup_verify_email/i18n/auth_signup_verify_email.pot @@ -0,0 +1,38 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "" diff --git a/auth_signup_verify_email/i18n/de.po b/auth_signup_verify_email/i18n/de.po new file mode 100755 index 0000000..6c9bb2d --- /dev/null +++ b/auth_signup_verify_email/i18n/de.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Rudolf Schnapka , 2016 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-09 12:31+0000\n" +"PO-Revision-Date: 2016-05-31 14:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: German (http://www.transifex.com/oca/OCA-server-tools-9-0/" +"language/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Prüfen Sie Ihre Email, um Ihr Konto zu aktivieren." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Etwas ist schief gelaufen, bitte später nochmal versuchen oden an uns wenden." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Das schein keine Email-Adresse zu sein." diff --git a/auth_signup_verify_email/i18n/es.po b/auth_signup_verify_email/i18n/es.po new file mode 100755 index 0000000..ca65b6d --- /dev/null +++ b/auth_signup_verify_email/i18n/es.po @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Antonio Trueba, 2016 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-09 12:31+0000\n" +"PO-Revision-Date: 2016-05-31 14:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Spanish (http://www.transifex.com/oca/OCA-server-tools-9-0/" +"language/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Revise su correo para activar su cuenta." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "Algo ha ido mal, por favor inténtelo de nuevo más tarde o contáctenos." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Eso no parece una dirección de email válida." diff --git a/auth_signup_verify_email/i18n/fr.po b/auth_signup_verify_email/i18n/fr.po new file mode 100755 index 0000000..8428c6a --- /dev/null +++ b/auth_signup_verify_email/i18n/fr.po @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Alexandre Papin , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-03-18 02:19+0000\n" +"PO-Revision-Date: 2017-03-18 02:19+0000\n" +"Last-Translator: Alexandre Papin , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Un email vous à été envoyé pour activer votre compte." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Une erreur est survenue, veuillez réessayer plus tard ou contactez nous." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Veuillez fournir une adresse email valide." diff --git a/auth_signup_verify_email/i18n/hr.po b/auth_signup_verify_email/i18n/hr.po new file mode 100755 index 0000000..a492917 --- /dev/null +++ b/auth_signup_verify_email/i18n/hr.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-10 00:47+0000\n" +"PO-Revision-Date: 2019-11-13 17:34+0000\n" +"Last-Translator: Bole \n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 3.8\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "Drugi korisnik je već registriran sa ovom mail adresom." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Provjerite svoj e-mail za aktivaciu računa!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "Nešto nije u redu, molimo pokušajte ponovo ili nas kontaktirajte." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Ovo ne izgleda kao e-mail adresa." diff --git a/auth_signup_verify_email/i18n/hr_HR.po b/auth_signup_verify_email/i18n/hr_HR.po new file mode 100755 index 0000000..c8ccb2c --- /dev/null +++ b/auth_signup_verify_email/i18n/hr_HR.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Bole , 2016 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-29 00:48+0000\n" +"PO-Revision-Date: 2016-06-13 08:38+0000\n" +"Last-Translator: Bole \n" +"Language-Team: Croatian (Croatia) (http://www.transifex.com/oca/OCA-server-" +"tools-9-0/language/hr_HR/)\n" +"Language: hr_HR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Provjerite svoj mail za aktiviranje računa" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Nešto nije u redu, molimo pokušajte se prijaviti kasnije ili nas " +"kontaktirajte." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Ovo ne izgleda kao valjana mail adresa." diff --git a/auth_signup_verify_email/i18n/it.po b/auth_signup_verify_email/i18n/it.po new file mode 100755 index 0000000..586489e --- /dev/null +++ b/auth_signup_verify_email/i18n/it.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Paolo Valier, 2016 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-09 12:31+0000\n" +"PO-Revision-Date: 2016-05-31 14:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Italian (http://www.transifex.com/oca/OCA-server-tools-9-0/" +"language/it/)\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Controlla la tua email per attivare il tuo account!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Qualcosa non è funzionato, prego provare più tardi altrimenti mettiti in " +"contatto con noi." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Questo non sembra essere un indirizzo email valido." diff --git a/auth_signup_verify_email/i18n/pt_BR.po b/auth_signup_verify_email/i18n/pt_BR.po new file mode 100755 index 0000000..95c1a62 --- /dev/null +++ b/auth_signup_verify_email/i18n/pt_BR.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: server-tools (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-27 14:01+0000\n" +"PO-Revision-Date: 2019-09-03 03:23+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/OCA-server-" +"tools-8-0/language/pt_BR/)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "Outro usuário já está registrado usando este endereço de email." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Verifique seu e-mail para ativar sua conta!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "Ocorreu um erro. Tente novamente mais tarde ou entre em contato." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Esse não parece ser um endereço de email." + +#~ msgid "email" +#~ msgstr "email" diff --git a/auth_signup_verify_email/i18n/ro.po b/auth_signup_verify_email/i18n/ro.po new file mode 100755 index 0000000..abab65a --- /dev/null +++ b/auth_signup_verify_email/i18n/ro.po @@ -0,0 +1,45 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Daniel Schweiger , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 01:11+0000\n" +"PO-Revision-Date: 2017-06-22 01:11+0000\n" +"Last-Translator: Daniel Schweiger , 2017\n" +"Language-Team: Romanian (https://www.transifex.com/oca/teams/23907/ro/)\n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Ati primit un email pentru activarea acestui cont!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Sa produs o eroare, va rugam sa incercati mai tarziu sau contacteaza-ne." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Nu ati introdus o directie email corespunzatoare." diff --git a/auth_signup_verify_email/i18n/sl.po b/auth_signup_verify_email/i18n/sl.po new file mode 100755 index 0000000..13a28a0 --- /dev/null +++ b/auth_signup_verify_email/i18n/sl.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Matjaž Mozetič , 2015 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-09 12:31+0000\n" +"PO-Revision-Date: 2016-05-31 14:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-server-tools-9-0/" +"language/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Preverite svojo e-pošto za aktiviranje računa!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "" +"Nekaj je narobe. Ponovno poskusite kasneje ali pa stopite v stik z nami." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Kaže, da to ni e-poštni naslov." diff --git a/auth_signup_verify_email/i18n/tr.po b/auth_signup_verify_email/i18n/tr.po new file mode 100755 index 0000000..539151e --- /dev/null +++ b/auth_signup_verify_email/i18n/tr.po @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * auth_signup_verify_email +# +# Translators: +# Ahmet Altınışık , 2016 +msgid "" +msgstr "" +"Project-Id-Version: server-tools (9.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-06-09 12:31+0000\n" +"PO-Revision-Date: 2016-05-31 14:47+0000\n" +"Last-Translator: OCA Transbot \n" +"Language-Team: Turkish (http://www.transifex.com/oca/OCA-server-tools-9-0/" +"language/tr/)\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Another user is already registered using this email address." +msgstr "" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Check your email to activate your account!" +msgstr "Hesabınızı aktive etmek için e-postanızı kontrol edin!" + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "Something went wrong, please try again later or contact us." +msgstr "Bişeyler ters gitti. Lütfen sonra tekrar deneyin ya da bize ulaşın." + +#. module: auth_signup_verify_email +#: code:addons/auth_signup_verify_email/controllers/main.py:0 +#, python-format +msgid "That does not seem to be an email address." +msgstr "Bu bir e-posta adresi gözükmüyor." diff --git a/auth_signup_verify_email/readme/CONFIGURE.rst b/auth_signup_verify_email/readme/CONFIGURE.rst new file mode 100755 index 0000000..1c071f8 --- /dev/null +++ b/auth_signup_verify_email/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +To configure this module, you need to: + +* `Properly configure your outgoing email server(s) + `_. +* Go to *Settings > General Settings -> General settings*, search for + the *Users* section and enable *Free sign up* in *Customer account*. diff --git a/auth_signup_verify_email/readme/CONTRIBUTORS.rst b/auth_signup_verify_email/readme/CONTRIBUTORS.rst new file mode 100755 index 0000000..db6c44e --- /dev/null +++ b/auth_signup_verify_email/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* Rafael Blasco +* Jairo Llopis +* Simone Orsi +* Alexandre Díaz +* Eugene Molotov diff --git a/auth_signup_verify_email/readme/DESCRIPTION.rst b/auth_signup_verify_email/readme/DESCRIPTION.rst new file mode 100755 index 0000000..0611813 --- /dev/null +++ b/auth_signup_verify_email/readme/DESCRIPTION.rst @@ -0,0 +1,5 @@ +This module extends the functionality of public sign up to force users to +provide a valid email address. + +To achieve this, users are not required to provide a password at +sign up: they are asked for only at first login attempt. diff --git a/auth_signup_verify_email/readme/INSTALL.rst b/auth_signup_verify_email/readme/INSTALL.rst new file mode 100755 index 0000000..647c3b7 --- /dev/null +++ b/auth_signup_verify_email/readme/INSTALL.rst @@ -0,0 +1,2 @@ +* Install `email_validator `_ + with ``pip install email_validator`` or equivalent. diff --git a/auth_signup_verify_email/readme/USAGE.rst b/auth_signup_verify_email/readme/USAGE.rst new file mode 100755 index 0000000..dbb9ad0 --- /dev/null +++ b/auth_signup_verify_email/readme/USAGE.rst @@ -0,0 +1,4 @@ +To use this module, you need to: + +* Log out. +* `Sign up `_ with a valid email. diff --git a/auth_signup_verify_email/static/description/icon.png b/auth_signup_verify_email/static/description/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..52e1b17dcb661d98f613efecf525de26b26fe8c6 GIT binary patch literal 10549 zcmV-5DazJ~P)`h+6;vAOJ~3 zK~#9!?VWjimDhRazvo@l7AX7dIZ3&vV`*xM?@-rrorg_I|aMD_6edYf=}#J?PIDH>dc`ZP$iJsapDp z0e|0l?gxghyI~*-B!y7%(D3i6t(%|c)`hp<1mt?{h4qhe+p>WHNL=_%1jqz3gb+C> zHBJaM4Ojp?u9SEnQt+MlV87q^W1jpqYk$TESKQa8jwG#6|!y9lgwT8kpX`nKmYwqUGwu$&RvvOSH1rMS=3U*rrf%If48uuh|Rfm9NoK>@l$U_DG>dP zvgyn}8R0-GUnn_D2r*PCMk2Tcm?%&afU?0{o8txU%qsfkvwt)zWMOj=oAc_rCw~Y~ z2$(?ga22b4H1AOV!S}*$sSCgkK;v^fiCeBT1HsAUwJa?b*=puTV{@Oj`XT~f2#rYh72G6*i+)bQu~ zGJSKbg@^=fgCg-+8-hSTehr2sW%v;8;nJ5MPE>o2M~PyGBA1=*uq`3 zORxLulyFxFL^!0SRXxxEj;|BLeF?}VW?1;=tMD5sB5DOO&|pL z{=n}O0*)SO@w;feIbN=uPC_`dA-b-FGHg-qHz6=%=3;94F+h(5F>gc_|NyZiao zf^kiNtl#i7OP72UA=2J3x^hO>m%qrymv)HRW1gRarm6*M1~3iWd?4KGacvP+2wW$Q z?RzMdp8P<*PU3YJ5rFU*1I;9ziFbh^9q^J8LkeP{;5AW}Qi{T&Y}Tzg$lrcr8M>|w zC>#PogOC9Y^>Lb-5)2s$M%o`x+@ukZU%fwIuPbosB28m-XiGvPKy-#q2juF$4 zuEOh(7%_nv)hW`m$r52KB&US~-c!K!1F~)NYUbXWmTPr~f3D?bT^uhodAmT(1ZIFYwClaykGDZzDtuk1 zni%Wan~-^+nUFm{M0}TneZj|R@IeD3rV}2mLj;D4Ol~*F<10C+LQ?6Nd`_HfqIzaY zKb)9eNjW(Yibmzo+?=4bEs3TL>F1-=H1H!p`*i{G{JJNYyYMbv*}PgLy@0XrR5&!h zqVb-9=6|n?q2HO@MJbG6j8R6Exy>=wN7_&kFk*u2MM35L5XbvBgi|Y zBbybfQz2Z?EEp3H^L4A7uSVzM;a_zqzdWH+3Pu)YbLikj99Itbp3KY;!$-vEOhQvr z0_pYtTGQ~R56e0kxb7Gt#0Pn4(<&u|&@~}rDJLAWosbF#EYv$%u~+Cuh@4@Qh&P{L zfu*t7&*faRO#==Zfgx|G<14@j8ZUmd_GN0 zo$TFHhi+*7u8>GHKvq_m`in_kKU_~|r`>P$HyE%h|M~t0j6nm^Z3~ush%P|lLZ}wk z3v{?%z~wz|nkKkd-$7|v9z%v@BKq;{i4#ZQ`;u38oW|%UV^$>GqUnIPco*%q3cyYrDNGWHot2@_!L+O^kL z%hEJM`qE1Yp;|3B*z9nGNK@hVZ$;9A^YJTIky2m=4f2O(l93U>wk5T-&BWu@l`Be+6%HheDoRgWRZ`vW3Yju_4gk^c zQ02O9j)D#$WQ*+vS9)}s^OV+hq(KrQxJl_!QYpRD$1d-Foz>Y8aP$kL~Cn`Xf$|5 zY8o)ySwpg|16`%3!Bf_(IrG`NWvz#jaUp26-C&37nQkax1$(QOM8d}NB#n)64%S@c zc)TpzAxFo?;KA(xt|03&(n0NlVH$b z!NRfp#TVu+56^Z6yc@@@Dw6F zF^@dFi*Pu=T^}l^v(sV6E2nsMM;#?4S$yd3$t+zqj=g)&@$9-otbVG7p+hst&(A

R$cD{O=>X{`tj@MIU%*qZkx-^$i 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + + 2007-02-06T06:13:53 + Thumbtack note with message "E-mail!" + https://openclipart.org/detail/3040/thumbtack-note-email-by-zeimusu + + + zeimusu + + + + + bulletin + email + memo + note + thumbtack + thumbtack note + + + + + + + + + + + diff --git a/auth_signup_verify_email/static/description/index.html b/auth_signup_verify_email/static/description/index.html new file mode 100755 index 0000000..8e872db --- /dev/null +++ b/auth_signup_verify_email/static/description/index.html @@ -0,0 +1,454 @@ + + + + + + +Verify email at signup + + + +

+

Verify email at signup

+ + +

Beta License: AGPL-3 OCA/server-auth Translate me on Weblate Try me on Runbot

+

This module extends the functionality of public sign up to force users to +provide a valid email address.

+

To achieve this, users are not required to provide a password at +sign up: they are asked for only at first login attempt.

+

Table of contents

+ +
+

Installation

+
    +
  • Install email_validator +with pip install email_validator or equivalent.
  • +
+
+
+

Configuration

+

To configure this module, you need to:

+ +
+
+

Usage

+

To use this module, you need to:

+
    +
  • Log out.
  • +
  • Sign up with a valid email.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Antiun Ingeniería S.L.
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/server-auth project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/auth_signup_verify_email/tests/__init__.py b/auth_signup_verify_email/tests/__init__.py new file mode 100755 index 0000000..f658c7d --- /dev/null +++ b/auth_signup_verify_email/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_verify_email diff --git a/auth_signup_verify_email/tests/test_verify_email.py b/auth_signup_verify_email/tests/test_verify_email.py new file mode 100755 index 0000000..8bb3060 --- /dev/null +++ b/auth_signup_verify_email/tests/test_verify_email.py @@ -0,0 +1,49 @@ +# Copyright 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from lxml.html import document_fromstring +from mock import patch + +from odoo.tests.common import HttpCase +from odoo.tools.misc import mute_logger + +from odoo.addons.mail.models import mail_template + + +class UICase(HttpCase): + def setUp(self): + super().setUp() + if "website" in self.env: + # Enable public signup in website if it is installed; otherwise + # tests here would fail + current_website = self.env["website"].get_current_website() + current_website.auth_signup_uninvited = "b2c" + self.env["ir.config_parameter"].set_param("auth_signup.invitation_scope", "b2c") + self.data = { + "csrf_token": self.csrf_token(), + "name": "Somebody", + } + + def html_doc(self, url="/web/signup", data=None, timeout=30): + """Get an HTML LXML document.""" + with patch(mail_template.__name__ + ".MailTemplate.send_mail"): + resp = self.url_open(url, data=data, timeout=timeout) + return document_fromstring(resp.content) + + def csrf_token(self): + """Get a valid CSRF token.""" + doc = self.html_doc() + return doc.xpath("//input[@name='csrf_token']")[0].get("value") + + def test_bad_email(self): + """Test rejection of bad emails.""" + self.data["login"] = "bad email" + doc = self.html_doc(data=self.data) + self.assertTrue(doc.xpath('//p[@class="alert alert-danger"]')) + + @mute_logger("odoo.addons.auth_signup_verify_email.controllers.main") + def test_good_email(self): + """Test acceptance of good emails.""" + self.data["login"] = "good@example.com" + doc = self.html_doc(data=self.data) + self.assertTrue(doc.xpath('//p[@class="alert alert-success"]')) diff --git a/auth_signup_verify_email/views/signup.xml b/auth_signup_verify_email/views/signup.xml new file mode 100755 index 0000000..49b44e7 --- /dev/null +++ b/auth_signup_verify_email/views/signup.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/ct_client_backup/__init__.py b/ct_client_backup/__init__.py new file mode 100755 index 0000000..aee8895 --- /dev/null +++ b/ct_client_backup/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/ct_client_backup/__manifest__.py b/ct_client_backup/__manifest__.py new file mode 100755 index 0000000..4fd9309 --- /dev/null +++ b/ct_client_backup/__manifest__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +{ + 'name': "Clients Periodic Backups | SaaS", + + 'summary': """ + Take Periodic Backups of Client Instances""", + + 'description': """ + Take Periodic Backups of Client Instances""", + + 'author': "Muhammad Awais", + 'website': "https://codetuple.io", + 'category': 'Uncategorized', + 'version': '2.0.0', + + # any module necessary for this one to work correctly + 'depends': ['base', 'kk_odoo_saas','queue_job'], + + # always loaded + 'data': [ + # "security/security.xml", + 'security/ir.model.access.csv', + 'wizards/backup_restore.xml', + 'views/views.xml', + 'views/app_views.xml', + 'data/backup_ignite_cron.xml', + ], + "application": True, + +} diff --git a/ct_client_backup/controllers/__init__.py b/ct_client_backup/controllers/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/ct_client_backup/data/backup_ignite_cron.xml b/ct_client_backup/data/backup_ignite_cron.xml new file mode 100755 index 0000000..6d3bbb7 --- /dev/null +++ b/ct_client_backup/data/backup_ignite_cron.xml @@ -0,0 +1,14 @@ + + + + + SaaS: Backup Process Ignite Cron + + code + model.ignite_backup_server_cron() + 1 + days + -1 + + + \ No newline at end of file diff --git a/ct_client_backup/models/__init__.py b/ct_client_backup/models/__init__.py new file mode 100644 index 0000000..7a90c9f --- /dev/null +++ b/ct_client_backup/models/__init__.py @@ -0,0 +1,2 @@ +from . import saas_app +from . import models diff --git a/ct_client_backup/models/models.py b/ct_client_backup/models/models.py new file mode 100644 index 0000000..486af4a --- /dev/null +++ b/ct_client_backup/models/models.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +import os + +from odoo import models, fields, api, _ +from odoo.exceptions import UserError, MissingError +import requests +import xmlrpc +import logging +import base64 + +_logger = logging.getLogger(__name__) + + +class SaaSAppBackup(models.Model): + _name = 'kk_odoo_saas.app.backup' + _description = 'SaaS App Backup' + + name = fields.Char() + app = fields.Many2one('kk_odoo_saas.app', 'SaaS App') + file_name = fields.Char(string="File Name") + file_path = fields.Char(string="File Path") + url = fields.Char(string="Url") + backup_date_time = fields.Datetime(string="Backup Time (UTC)") + status = fields.Selection(string="Status", selection=[('failed', 'Failed'), ('success', 'Success')]) + message = fields.Char(string="Message") + file_size = fields.Char(string="File Size") + + def download_db_file(self): + """ + to download the database backup, it stores the file in attachment + :return: Action + """ + file_path = self.file_path + _logger.info("------------ %r ----------------" % file_path) + if self.url: + return { + 'type': 'ir.actions.act_url', + 'url': self.url, + 'target': 'new', + } + try: + with open(file_path, 'rb') as reader: + result = base64.b64encode(reader.read()) + except IOError as e: + raise MissingError('Unable to find File on the path') + attachment_obj = self.env['ir.attachment'].sudo() + name = self.file_name + attachment_id = attachment_obj.create({ + 'name': name, + 'datas': result, + 'public': False + }) + download_url = '/web/content/' + str(attachment_id.id) + '?download=true' + _logger.info("--- %r ----" % download_url) + self.url = download_url + return { + 'type': 'ir.actions.act_url', + 'url': download_url, + 'target': 'new', + } + + def action_restore_backup_to_instance(self, restore_to_id=False): + """ + it will restore the backup to a new instance, + the instance should be created manually, + and there should be no database at new_instance.com/web/database/selector + :param: restore_to_id is kk_saa_app object on which we have to restore backup + :return: False + """ + if self.app and restore_to_id: + restore_url = restore_to_id.get_url() + if self.file_path and os.path.exists(self.file_path) and requests.get(restore_url).status_code < 400: + db_list = [] + try: + db_list = xmlrpc.client.ServerProxy(restore_url + '/xmlrpc/db').list() + except xmlrpc.client.ProtocolError as e: + _logger.info("There is no database on Db selector") + + _logger.info("All Databases on Postgres Server -> {} <-".format(db_list)) + _logger.info("New Db name: {}".format(restore_to_id.app_name)) + if restore_to_id.app_name not in db_list: + self.restore_backup_to_client(self.file_path, restore_url, restore_to_id.app_name, + restore_to_id.backup_master_pass) + else: + raise UserError("Cant restore Backup, Database already existed, please delete it.") + else: + raise UserError("Cant restore Backup! the url is not accessible or backup file not exists.") + else: + _logger.error("Cant restore Backup, Backup Id, or Restore App Missing") + raise UserError("Cant restore Backup, Backup Id, or Restore App Missing") + + def restore_backup_to_client(self, file_path, restore_url, db_name, master_pwd): + if file_path and restore_url and db_name and master_pwd: + restore_url = restore_url + '/web/database/restore' + data = { + 'master_pwd': master_pwd, + 'name': db_name, + 'copy': 'true', + 'backup_file': '@' + file_path + } + backup = open(file_path, "rb") + try: + response = requests.post(restore_url, data=data, files={"backup_file": backup}) + if response.status_code == 200: + _logger.info("Restore Done, this is the response Code: {}".format(response.status_code)) + else: + _logger.info("Restore Done, this is the response Code: {}".format(response.status_code)) + + return { + 'success': True, + } + except Exception as e: + return { + 'success': False, + } + else: + _logger.error("Cant restore Db One of the parameter is Missing") + + @api.model + def create(self, vals): + vals['name'] = self.env['ir.sequence'].next_by_code('saas_app.backup') + res = super(SaaSAppBackup, self).create(vals) + return res + + def calc_backup_size(self): + if not os.path.exists(self.file_path): + return + # calculate file size in KB, MB, GB + + def convert_bytes(size): + """ Convert bytes to KB, or MB or GB""" + for x in ['bytes', 'KB', 'MB', 'GB', 'TB']: + if size < 1024.0: + return "%3.1f %s" % (size, x) + size /= 1024.0 + + self.file_size = convert_bytes(os.path.getsize(self.file_path)) diff --git a/ct_client_backup/models/saas_app.py b/ct_client_backup/models/saas_app.py new file mode 100755 index 0000000..a4efe7b --- /dev/null +++ b/ct_client_backup/models/saas_app.py @@ -0,0 +1,124 @@ +from datetime import timedelta + +import requests +from odoo import models, fields, api, _ +import logging +import os +_logger = logging.getLogger(__name__) + + +class SaaSApp(models.Model): + _inherit = 'kk_odoo_saas.app' + backup_db_name = fields.Char(string="Database Name", default=lambda a: a.client_db_name) + backup_master_pass = fields.Char(string="Master Password") + backups_enabled = fields.Boolean() + + backups = fields.Many2many(comodel_name='kk_odoo_saas.app.backup', string='Backups') + + def action_create_backup(self): + """ + It is being called from 2 locations + :return: + """ + for app in self: + response = self.backup_db() + backup = self.env['kk_odoo_saas.app.backup'].create({'backup_date_time': fields.Datetime.now(), + 'app': app.id, + 'file_name': response.get('filename'), + 'file_path': response.get('filepath'), + 'message': response.get('message') + }) + if response.get('success'): + backup.write({'status': 'success'}) + else: + backup.write({'status': 'failed'}) + app.write({'backups': [(4, backup.id)]}) + + def action_delete_old_backup(self): + for app in self: + for backup in app.backups: + if backup.backup_date_time < fields.Datetime.now() - timedelta(days=7.0): + if os.path.exists(backup.file_path): + try: + os.remove(backup.file_path) + if backup.url: + # deleting the attachments related to this backup + att_id = backup.url.replace('?download=true', '').replace('/web/content/', '') + if att_id: + try: + attch_id = int(att_id) + if attch_id: + self.env['ir.attachment'].browse([attch_id]).unlink() + except ValueError as e: + _logger.error(e) + backup.unlink() + except OSError as e: + _logger.error("Error while deleting file: %s - %s." % (e.filename, e.strerror)) + else: + _logger.error("The file does not exist") + + def backup_db(self): + """ + Actual Backup function + :return: + """ + # get the creds for db manager + data = { + 'master_pwd': self.backup_master_pass, + 'name': self.backup_db_name, + 'backup_format': 'zip' + } + + client_url = 'https://{0}{1}'.format(self.sub_domain_name, self.domain_name) + msg = '' + + # where we want to store backups, in the linux user, with which the odoo-service is running + backup_dir = os.path.join(os.path.expanduser('~'), 'client_backups') + if not os.path.exists(backup_dir): + os.mkdir(backup_dir) + + backup_dir = os.path.join(backup_dir, self.sub_domain_name) + if not os.path.exists(backup_dir): + os.mkdir(backup_dir) + + client_url += '/web/database/backup' + # Without Streaming method + # response = requests.post(client_url, data=data) + # Streaming zip, so that everything is not stored in RAM. + + try: + filename = self.backup_db_name + '-' + fields.Datetime.now().strftime("%m-%d-%Y-%H-%M") + '.zip' + backed_up_file_path = os.path.join(backup_dir, filename) + with requests.post(client_url, data=data, stream=True) as response: + response.raise_for_status() + with open(os.path.join(backup_dir, filename), 'wb') as file: + for chunk in response.iter_content(chunk_size=1024): + if chunk: + file.write(chunk) + msg = 'Database backup Successful at ' + fields.Datetime.now().strftime("%m-%d-%Y-%H:%M:%S") + return { + 'success': True, + 'msg': msg, + 'filename': filename, + 'filepath': backed_up_file_path + } + except Exception as e: + msg = 'Failed at ' + fields.Datetime.now().strftime("%m-%d-%Y-%H:%M:%S") + ' ' + str(e) + return { + 'success': False, + 'msg': msg + } + + @api.model + def ignite_backup_server_cron(self): + """ + A Scheduled Action which will take new backups and del old + :return: False + """ + # search for saas instance in lanched and modified states and backups enabled + apps = self.env['kk_odoo_saas.app'].sudo().search( + [('status', 'in', ['l', 'm']), ('backups_enabled', '=', True)]) + + for app in apps: + app.action_create_backup() + app.action_delete_old_backup() diff --git a/ct_client_backup/security/ir.model.access.csv b/ct_client_backup/security/ir.model.access.csv new file mode 100755 index 0000000..f1bfcb1 --- /dev/null +++ b/ct_client_backup/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_saas_app_backups,access_saas_app_backups,model_kk_odoo_saas_app_backup,kk_odoo_saas.group_saas_manager,1,1,1,1 +access_saas_app_backup_restore_wizard,SaaS Manager Backup Restore Permissions,model_saas_client_backup_restore_wizard,kk_odoo_saas.group_saas_manager,1,1,1,1 diff --git a/ct_client_backup/static/description/icon.png b/ct_client_backup/static/description/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..1026a0ffc1d5bd53e69b7e9692b44193f36464f4 GIT binary patch literal 5067 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 GhyDk4Fxw3P literal 0 HcmV?d00001 diff --git a/ct_client_backup/views/app_views.xml b/ct_client_backup/views/app_views.xml new file mode 100755 index 0000000..f7e1ed2 --- /dev/null +++ b/ct_client_backup/views/app_views.xml @@ -0,0 +1,37 @@ + + + + + + SaaS App inherit for Backups + kk_odoo_saas.app + + + + + + + + + + + +