Compare commits

...

585 Commits

Author SHA1 Message Date
Nicolas JEUDY 154e262502 [MIG] Migration to V12.0 - initial release 5 years ago
Nicolas JEUDY 1964e3084e [MIG] module_prototyper: Migration to 12.0 5 years ago
Nicolas JEUDY b2a62a7b41 [REF] module_prototyper: Black python code 5 years ago
oca-travis 07163a3518 [UPD] Update module_prototyper.pot 6 years ago
Stéphane Bidoul (ACSONE) 72a50b3c1a remove obsolete .pot files [ci skip] 6 years ago
OCA Transbot aa34f4de13 OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot 0310d7aa0b OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot 5d07142c2d OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot b7fea9aa0e OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 880aecb9f9 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 556f08fbd3 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 4d2c75e043 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot b000941b60 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 5f3da02eab OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 14d2977b0a OCA Transbot updated translations from Transifex 7 years ago
Dennis Sluijk f85505c380 [10.0][MIG] Module Prototyper (#634) 7 years ago
Pedro M. Baeza 9d2aef07f5 [MIG] Rename manifest files 8 years ago
Pedro M. Baeza 5168842d7c [MIG] Make modules uninstallable 8 years ago
OCA Transbot 07e2068f17 OCA Transbot updated translations from Transifex 8 years ago
Nicolas JEUDY bc5a31740d fix: fix view inheritance and small V9 adapts 8 years ago
Pedro M. Baeza f96123d339 [MIG] Make modules uninstallable 9 years ago
Maxime Chambreuil e66d9c9b47 [FIX] Review comments 9 years ago
Maxime Chambreuil 9f74a2c729 [DEL] cleanup 9 years ago
Vincent Vinet 48a67d4c5e fix template description being indented 9 years ago
EL HADJI DEM 6549ca902c [UPD] Add a new file for default value decription field 9 years ago
Maxime Chambreuil 309b4d4ea1 [FIX] E402 module level import not at top of file 9 years ago
Jordi Riera 74d5d0b4e9 [IMP] module_prototyper: add placeholders to fields. 9 years ago
Maxime Chambreuil 1d8cbe4cca [IMP] Add help 9 years ago
Jordi Riera 2197234a3e [IMP] prototype: added helper fields and placeholders on new fields. 9 years ago
Maxime Chambreuil e4f8dfe367 [FIX] Default license 9 years ago
Vincent Vinet 9cfa020594 empty selection in m2m field template 9 years ago
Maxime Chambreuil - http://www.savoirfairelinux.com 923f0f5d3f [IMP] Add license field in the view 9 years ago
Vincent Vinet 7afa2a05e4 fix template description being indented 9 years ago
EL HADJI DEM c46992cac9 [UPD] Add a new file for default value decription field 9 years ago
Maxime Chambreuil f49f084714 [FIX] E402 module level import not at top of file 9 years ago
Jordi Riera d13457adb5 [IMP] module_prototyper: add placeholders to fields. 9 years ago
Maxime Chambreuil 4d875ec916 [IMP] Add help 9 years ago
Jordi Riera 00310ce8ea [IMP] prototype: added helper fields and placeholders on new fields. 9 years ago
OCA-git-bot 8c34e6fcb7 [ADD] setup.py 3 years ago
oca-travis b0c006d70b [UPD] Update bus_alt_connection.pot 3 years ago
OCA-git-bot 86e9553fe6 Merge PR #1629 into 12.0 3 years ago
OCA-git-bot b370e8630d sentry 12.0.2.0.0 3 years ago
OCA-git-bot c6f75b097b [UPD] README.rst 3 years ago
OCA-git-bot a5eb38458d Merge PR #1942 into 12.0 3 years ago
OCA Transbot b8ef499873 Update translation files 3 years ago
OCA Transbot 516eefb04b Update translation files 3 years ago
OCA-git-bot 47e0e2c182 [UPD] README.rst 3 years ago
oca-travis 1c052493a5 [UPD] Update autovacuum_message_attachment.pot 3 years ago
oca-travis 65db91d26b [UPD] Update auditlog.pot 3 years ago
OCA-git-bot 21f75eec00 Merge PR #2112 into 12.0 3 years ago
Bhavesh Odedra 9458a598b5 [ADD] auditlog: test case for capture record 3 years ago
Hardik Suthar 75c92bfcc4 [ADD] auditlog: enable to track Unlink record 3 years ago
OCA Transbot 47725ceffc Update translation files 3 years ago
OCA-git-bot 7e0a0a39e9 sql_export 12.0.1.2.0 3 years ago
OCA-git-bot d10ff37fc3 sql_request_abstract 12.0.1.2.0 3 years ago
oca-travis 71658aff5c [UPD] Update sql_export.pot 3 years ago
OCA-git-bot e038f5beba Merge PR #2061 into 12.0 3 years ago
Sylvain LE GAL 09120b1432 [IMP] sql_export : add preview button 3 years ago
OCA Transbot 9b6ef16e94 Update translation files 3 years ago
OCA-git-bot 1ced9a11fe [ADD] setup.py 3 years ago
OCA-git-bot f10805f7c9 [ADD] icon.png 3 years ago
OCA-git-bot 8abc7128db [UPD] README.rst 3 years ago
oca-travis f10aac0faf [UPD] Update base_import_module_group.pot 3 years ago
oca-travis fa889399bb [UPD] Update autovacuum_message_attachment.pot 3 years ago
OCA-git-bot 058244ac48 Merge PR #2077 into 12.0 3 years ago
OCA-git-bot 767d7b0baa onchange_helper 12.0.1.0.1 3 years ago
OCA-git-bot 72127aafb0 Merge PR #2075 into 12.0 3 years ago
Akim Juillerat d10eab5dbb Add module base_import_module_group 3 years ago
OCA-git-bot 25cb00ff3b [ADD] setup.py 3 years ago
OCA-git-bot 1539e42827 [ADD] icon.png 3 years ago
oca-travis c67a546408 [UPD] Update base_model_restrict_update.pot 3 years ago
OCA-git-bot fc04fd7173 Merge PR #2011 into 12.0 3 years ago
OCA-git-bot 76cbff0377 sql_export_excel 12.0.1.1.0 3 years ago
OCA-git-bot abbdf0be84 Merge PR #2065 into 12.0 3 years ago
nans 5cf8220362 [FIX] onchange_helper: compute related values for onchange applications 3 years ago
OCA Transbot 70c44bb65c Update translation files 3 years ago
OCA-git-bot 6466f51d7e [ADD] setup.py 3 years ago
OCA-git-bot 37fda37f7e [UPD] README.rst 3 years ago
oca-travis d189af2c91 [UPD] Update base_multi_image.pot 3 years ago
oca-travis 39a3e86f04 [UPD] Update autovacuum_message_attachment.pot 3 years ago
OCA-git-bot db80706a4c Merge PR #1846 into 12.0 3 years ago
OCA-git-bot 15e8b9a50a autovacuum_message_attachment 12.0.1.1.1 3 years ago
OCA-git-bot 67c9917c82 Merge PR #1853 into 12.0 3 years ago
Pedro Castro Silva 96253ff683 Translated using Weblate (Portuguese) 3 years ago
Pedro Castro Silva 79ee1593f6 Added translation using Weblate (Portuguese) 3 years ago
Sylvain LE GAL 1a9d367f62 [FIX] sql_export_excel: add missing dependency to python lib openpyxl 3 years ago
OCA-git-bot 9c3677ed25 module_analysis 12.0.1.0.2 3 years ago
OCA-git-bot 843c7aa4df [UPD] README.rst 3 years ago
OCA-git-bot 79b1cd4796 Merge PR #2038 into 12.0 3 years ago
Sylvain LE GAL 315f7e8f22 [FIX] replace deprecated call to pygount.source_analysis for call of pygount.SourceAnalysis.from_file 4 years ago
OCA-git-bot ab76ead020 module_analysis 12.0.1.0.1 3 years ago
OCA-git-bot 3df76803cb Merge PR #2036 into 12.0 3 years ago
Renato Lima 755569b57b Replaced Pygount source analysis deprecation method 3 years ago
Yann Papouin 687717c65c Translated using Weblate (French) 3 years ago
tslai f917618463 [12.0][ADD] base_model_restrict_update 3 years ago
OCA-git-bot a2f66c77f1 auditlog 12.0.1.0.2 3 years ago
OCA-git-bot 06f10f6c78 Merge PR #1985 into 12.0 3 years ago
Pedro Castro Silva 976867fb07 Translated using Weblate (Portuguese) 3 years ago
tslai 3c95c34b8b [12.0][FIX] Add sudo() to retrieve record vals 3 years ago
OCA-git-bot 47a4c8580c [ADD] setup.py 3 years ago
OCA-git-bot 311b1f3daa [ADD] icon.png 3 years ago
oca-travis f6b30a7063 [UPD] Update mail_cleanup.pot 3 years ago
OCA-git-bot 4bbc22b3f1 Merge PR #1901 into 12.0 3 years ago
OCA Transbot 58e12007d7 Update translation files 3 years ago
OCA-git-bot b4efc8e5c6 auditlog 12.0.1.0.1 3 years ago
OCA-git-bot b43b7f5051 [UPD] README.rst 3 years ago
oca-travis 202712af8f [UPD] Update auditlog.pot 3 years ago
OCA-git-bot 81ba7ccc87 Merge PR #1973 into 12.0 3 years ago
Tom Blauwendraat 20dc7da4a9 [IMP] Dont query non-stored related or computed fields on full auditlog, this can slow down the system a lot and gives no useful info 3 years ago
OCA Transbot b7f6329d80 Update translation files 3 years ago
OCA-git-bot 11bf1d94db sql_export 12.0.1.1.1 3 years ago
oca-travis 473b518e69 [UPD] Update sql_export.pot 3 years ago
OCA-git-bot 7678bed016 Merge PR #1967 into 12.0 3 years ago
Fernanda Hernandez efc7190b8c [FIX] sql_export: fix warning two fields have same label 3 years ago
OCA-git-bot a0a6a82963 attachment_synchronize 12.0.2.0.0 3 years ago
oca-travis 4a2117414c [UPD] Update attachment_synchronize.pot 3 years ago
OCA-git-bot 236243b653 Merge PR #1917 into 12.0 3 years ago
Fernanda Hernandez ef33c6b123 [IMP] sentry: migrate sentry-raven to new api sentry-sdk 3 years ago
OCA Transbot 0bfaafcdef Update translation files 4 years ago
OCA Transbot 6f491fcaab Update translation files 4 years ago
OCA Transbot f6eb69eb6a Update translation files 4 years ago
OCA Transbot 7ebf9d1759 Update translation files 4 years ago
OCA Transbot a6fb35c056 Update translation files 4 years ago
OCA Transbot 64d7beb82d Update translation files 4 years ago
OCA Transbot 0b6c296856 Update translation files 4 years ago
OCA-git-bot 3dfef59d16 sql_export 12.0.1.1.0 4 years ago
OCA-git-bot bf7f41797d sql_request_abstract 12.0.1.1.0 4 years ago
oca-travis f560ebee7c [UPD] Update sql_request_abstract.pot 4 years ago
oca-travis d0f5632381 [UPD] Update sql_export.pot 4 years ago
OCA-git-bot 2ace08aa2b Merge PR #1614 into 12.0 4 years ago
OCA-git-bot b99971beea [ADD] setup.py 4 years ago
OCA-git-bot 5fcd6f301c [UPD] README.rst 4 years ago
oca-travis 34ff715914 [UPD] Update base_locale_uom_default.pot 4 years ago
OCA-git-bot e1cd6a1b25 Merge PR #1553 into 12.0 4 years ago
OCA-git-bot 20cdad9cdf excel_import_export 12.0.1.0.6 4 years ago
OCA-git-bot d94dd9b4b0 excel_import_export_demo 12.0.1.0.1 4 years ago
OCA-git-bot d258aea7d0 Merge PR #1921 into 12.0 4 years ago
newtratip 70cc7291dc [12.0][FIX] excel_import_export, Change color in bold_red style 4 years ago
Alessandro Fiorino 091790ba6e Translated using Weblate (Italian) 4 years ago
Alessandro Fiorino 36f3e8c49c Translated using Weblate (Italian) 4 years ago
Alessandro Fiorino fdfa07c352 Added translation using Weblate (Italian) 4 years ago
Alexandre Saunier d9d3dd9bb5 [12.0][MIG] mail_cleanup: Migrate to 12.0 5 years ago
Akim Juillerat 2ca6e14cca Remove unused context updates 6 years ago
Artem Kostyuk 873a757227 [11.0][MIG] mail_cleanup: Migrate to 11.0 6 years ago
oca-travis a0ca51e814 [UPD] Update mail_cleanup.pot 6 years ago
Stéphane Bidoul (ACSONE) 2e91981f23 [FIX] rst syntax errors 6 years ago
OCA Transbot 0db7f66149 OCA Transbot updated translations from Transifex 8 years ago
Matthieu Dietrich bb44bcf2a7 9.0 mail cleanup (#410) 8 years ago
Sébastien BEAU 033e82510d [REF] make menu more consistent 4 years ago
Sébastien BEAU 1328114dd9 [IMP] add smart boutton on form view and action button with metric on tree view 4 years ago
Sébastien BEAU 77fb6956dc [REF] refactor code, rename enabled to active, and simplifie run code 4 years ago
OCA-git-bot db1b874eee attachment_queue 12.0.1.0.1 4 years ago
OCA-git-bot 0a4814f8be Merge PR #1916 into 12.0 4 years ago
Sébastien BEAU f9794f013e [FIX] fix incorrect view mode 4 years ago
Pedro Castro Silva 80da91dc7a Translated using Weblate (Portuguese) 4 years ago
OCA Transbot 9f83cf4ef0 Update translation files 4 years ago
OCA Transbot 2753a47ee0 Update translation files 4 years ago
OCA Transbot 60da287901 Update translation files 4 years ago
OCA-git-bot df06a82d02 autovacuum_message_attachment 12.0.1.1.0 4 years ago
oca-travis f3ed581a1d [UPD] Update excel_import_export_demo.pot 4 years ago
oca-travis 958f5e2be3 [UPD] Update excel_import_export.pot 4 years ago
oca-travis a70d4ad4e9 [UPD] Update autovacuum_message_attachment.pot 4 years ago
oca-travis b2880fa13f [UPD] Update attachment_synchronize.pot 4 years ago
OCA-git-bot f98ec787be Merge PR #1913 into 12.0 4 years ago
Enric Tobella 2c79dbc756 [FIX] autovacuum_message_attachment: The field name cannot be used as it is already present in other models 4 years ago
OCA-git-bot 962a0cf123 Merge PR #1903 into 12.0 4 years ago
mara1 526cc3cc4c Adding oca_dependencies.txt to server_tools 4 years ago
OCA-git-bot 08ca424717 excel_import_export 12.0.1.0.5 4 years ago
OCA-git-bot 5394b3a5c1 Merge PR #1899 into 12.0 4 years ago
OCA-git-bot a14b98b657 [ADD] setup.py 4 years ago
OCA-git-bot 5e27ed1908 [ADD] icon.png 4 years ago
OCA-git-bot b560a65361 [UPD] README.rst 4 years ago
oca-travis e557c7a5cb [UPD] Update iap_alternative_provider.pot 4 years ago
OCA-git-bot 8368d794fc Merge PR #1861 into 12.0 4 years ago
Sébastien BEAU f79732093c [12.0][ADD] add base_iap_alternative 4 years ago
Lois Rilo 76433f448e [12.0][FIX] excel_import_export: external ids naming. 4 years ago
OCA Transbot c028564e4e Update translation files 4 years ago
OCA Transbot 85c8b8c858 Update translation files 4 years ago
OCA-git-bot 75c674fb0f [ADD] setup.py 4 years ago
OCA-git-bot 7e54c00701 [ADD] icon.png 4 years ago
OCA-git-bot 0dc951b33d [UPD] README.rst 4 years ago
oca-travis dba6736d74 [UPD] Update sql_request_abstract.pot 4 years ago
oca-travis aa171cb5ad [UPD] Update sql_export_excel.pot 4 years ago
oca-travis edba84a3ba [UPD] Update sql_export.pot 4 years ago
OCA-git-bot f43f6d5af5 Merge PR #1659 into 12.0 4 years ago
OCA Transbot 2b5b5d698d Update translation files 4 years ago
OCA-git-bot 20a3504055 base_exception 12.0.3.1.0 4 years ago
OCA-git-bot 83baa88c4a [UPD] README.rst 4 years ago
oca-travis 3d93b73eda [UPD] Update base_exception.pot 4 years ago
OCA-git-bot 13771aaa72 Merge PR #1831 into 12.0 4 years ago
OCA Transbot db33c62037 Update translation files 4 years ago
OCA-git-bot b2e4359fd6 [ADD] setup.py 4 years ago
OCA-git-bot b9e2c10156 [UPD] README.rst 4 years ago
oca-travis 2c1f82ab7d [UPD] Update autovacuum_message_attachment.pot 4 years ago
oca-travis 1ff0ea0ef2 [UPD] Update attachment_synchronize.pot 4 years ago
oca-travis 1649a18b2c [UPD] Update attachment_queue.pot 4 years ago
OCA-git-bot 4299d10ad5 Merge PR #1757 into 12.0 4 years ago
David Beal 2bf2d72964 FIX attach_synchro: clean demo data 4 years ago
clementmbr 83f2c4d434 [UPD] Add akretion maintainers 4 years ago
clementmbr d74441b08d [FIX] duplicate ids in attachment_synchronize_task_views and flake8 4 years ago
clementmbr d6d0e9bd62 [UPD] attachment_synchronize readme 4 years ago
clementmbr b2869b8136 [IMP] attachment_ids tree view in Export task 4 years ago
clementmbr 753e31e232 [IMP] attachment_queue tree view with tasks 4 years ago
clementmbr 3bbf135d52 [IMP] rename task emails into failure_emails and improve tasks views 4 years ago
clementmbr 71dc6fc205 [IMP] Add smart button to related Tasks from Storage Backend 4 years ago
clementmbr a3f4e52a37 [IMP] task_id readonly if method_type import 4 years ago
clementmbr f153b38c2b [IMP] rename check_duplicated_files and improve Task views 4 years ago
clementmbr 61276cff04 [IMP] task run_export + onchange link method_type and file_type if export 4 years ago
clementmbr cd54fba093 [IMP] attachment_synchronize: rename files + add buttonbox task enabled 4 years ago
clementmbr a36ccb6341 [IMP] Add attachment_synchronize_task views 4 years ago
clementmbr dde33b0acf [FIX] attachment_synchronize: fix tests 4 years ago
clementmbr fca8842b92 [FIX] Travis conflict with module_analysis 4 years ago
clementmbr 4bbcfa8642 [FIX] Add MQT_DEP="PIP" in travis.yml 4 years ago
David Beal 8387faac18 IMP add button to duplicate task or unactive them, add readme fragments 4 years ago
Sébastien BEAU 1a7f8bece8 [REF] run black 4 years ago
Sébastien BEAU 78179942d5 [REF] refactor code and add test 4 years ago
Sébastien BEAU c8d512dd20 [REF] start cleanning 4 years ago
Florian da Costa 6b99de7dcf Allow to send mail notification if attachment linked to task fail 4 years ago
Giovanni 1ee9ba7f6a - fix check_duplicated_files in view 4 years ago
Giovanni 9447929d76 - fix task view 4 years ago
Giovanni 7205b17b0c - use filtered.mapped in place of search 4 years ago
Giovanni f4a3cb0257 - check for duplicates 4 years ago
Giovanni 65c6e9af8a - pass pattern to _list 4 years ago
Giovanni 8c8a866216 - better view layout 4 years ago
Florian da Costa e1021cbe05 Migrate and refactore external_file_location 5 years ago
OCA-git-bot ad0ece2402 [ADD] icon.png 5 years ago
mtbochaca b0f4f76ae2 Translated using Weblate (Catalan) 6 years ago
OCA Transbot 2c8069be3f OCA Transbot updated translations from Transifex 6 years ago
Florian da Costa 78adc9f87e Port external_file_location to v9 8 years ago
Mourad El Hadj Mimoune a417c3e37e [WIP] Use pattern in file name & add move and rename file option 8 years ago
David Beal f6c6941982 [FIX] encode to utf8 user/password 8 years ago
Valentin Chemiere 361c998592 Add file import/export 9 years ago
OCA Transbot e9d6c4ea77 Update translation files 4 years ago
OCA Transbot 12a7f11450 Update translation files 4 years ago
OCA Transbot 07014a7cb3 Update translation files 4 years ago
Sébastien BEAU 0f0576424c [IMP] use selection field to be safer, add maintainers 4 years ago
beau sebastien e79d5333aa
Merge pull request #25 from akretion/12.0-add-method-exception-imps 4 years ago
OCA Transbot cca5dffd0d Update translation files 4 years ago
OCA-git-bot c415265706 sql_request_abstract 12.0.1.0.2 4 years ago
oca-travis 6deeb7ff63 [UPD] Update sql_request_abstract.pot 4 years ago
OCA-git-bot c9f14940db Merge PR #1854 into 12.0 4 years ago
Sylvain LE GAL 7380521d41 [FIX] sql_request_abstract: allow XML-RPC calls 4 years ago
Florent de Labarre 1f7020af6b
[FIX] autovacuum_message_attachment : wrong message formating 4 years ago
Marc Poch 6d31f2156e [FIX]base_multi_image: Fix image url in locales with thousand separator. 4 years ago
OCA Transbot 52dfc1f137 Update translation files 4 years ago
OCA-git-bot 1215a4eb97 base_custom_info 12.0.2.1.0 4 years ago
oca-travis 5750f64be8 [UPD] Update base_custom_info.pot 4 years ago
OCA-git-bot 1d75400278 Merge PR #1844 into 12.0 4 years ago
Enric Tobella 7894810ec6
[12.0][IMP] base_custom_info: Create a specific view 4 years ago
OCA Transbot fe75439a70 Update translation files 4 years ago
OCA-git-bot 2503c327a0 base_technical_user 12.0.1.1.0 4 years ago
oca-travis 40106f50fc [UPD] Update base_technical_user.pot 4 years ago
OCA-git-bot c1283cc1c3 Merge PR #1838 into 12.0 4 years ago
OCA Transbot 8a5686abce Update translation files 4 years ago
oca-travis ef562a4f3b [UPD] Update base_custom_info.pot 4 years ago
Pedro M. Baeza fbc5895860 [FIX] base_custom_info: Avoid permission errors on restricted environments 4 years ago
Sébastien BEAU ef1d774208 [IMP] add helper for getting a self env with the tech user 4 years ago
OCA-git-bot 2e38043f27 [UPD] README.rst 4 years ago
OCA-git-bot 7920473e26 Merge PR #1835 into 12.0 4 years ago
Maxime Chambreuil 6af60052db [IMP] auditlog 4 years ago
KevinKhao 3044d1db2e [IMP] Code coverage 4 years ago
KevinKhao 694fc82710 [IMP] Added tests, fixed logic on rule validity testing 4 years ago
KevinKhao 6498d43a33 [IMP] black, flake8 nitpick 4 years ago
Sébastien BEAU fe923aab8d [12.0][IMP] add by_method exception 4 years ago
OCA Transbot 6e6826f104 Update translation files 4 years ago
OCA-git-bot 6bcd91c3be [ADD] setup.py 4 years ago
OCA-git-bot 145fa2a0c1 [UPD] README.rst 4 years ago
oca-travis 2ec51a6a1d [UPD] Update autovacuum_message_attachment.pot 4 years ago
oca-travis 8dbed64d9b [UPD] Update attachment_queue.pot 4 years ago
OCA-git-bot f4ab1d6f05 Merge PR #1756 into 12.0 4 years ago
beau sebastien 7995176c37 Update attachment_queue/__manifest__.py 4 years ago
Sébastien BEAU 224bf9854e [REF] apply black on the code 4 years ago
Sébastien BEAU e717eee18e [REF] Rename to attachement_queue 4 years ago
Florian da Costa 7bff12e874 Add possibility to notify by mail in case of attachment processing failure 4 years ago
Florian da Costa f03c8b57c5 Migrate and rename base_attachment_synchronize 5 years ago
OCA Transbot ee8826746a Update translation files 5 years ago
OCA-git-bot 28a6b37ddc [UPD] Update attachment_base_synchronize.pot 5 years ago
kiplangatdan 5dfb850786 [WIP][MIG]attachment_base_synchronize:Migration to 11.0 6 years ago
oca-travis e735fe4d81 [UPD] Update attachment_base_synchronize.pot 6 years ago
OCA Transbot 40afb9069b OCA Transbot updated translations from Transifex 6 years ago
Stéphane Bidoul (ACSONE) 52fbf76321 OCA Transbot updated translations from Transifex 7 years ago
Florian da Costa ee750439ba [MIG] Migrate module to v10 7 years ago
Pedro M. Baeza f502d2ef7c [MIG] Rename manifest files 8 years ago
Pedro M. Baeza 1490181d97 [MIG] Make modules uninstallable 8 years ago
Angel Moya acd242f401 ADD tests 8 years ago
Florian da Costa 72009437eb Order ir attachment metadata by create date 8 years ago
Florian da Costa 2afb06da22 change way to open new cursor 8 years ago
Florian da Costa 50200f9aaf Migrate and rename attachment_metadata to attachment_base_synchronize 8 years ago
OCA Transbot d6356185db Update translation files 4 years ago
OCA-git-bot b96105f585 database_cleanup 12.0.1.0.4 4 years ago
oca-travis a2708a19e6 [UPD] Update database_cleanup.pot 4 years ago
OCA-git-bot 32a7cec4af Merge PR #1822 into 12.0 4 years ago
Jesús Alan Ramos Rodríguez 83227bc14c Translated using Weblate (Spanish (Mexico)) 4 years ago
Holger Brunn b4989587eb [ADD] pin pygount to a version that doesn't produce warnings 4 years ago
Holger Brunn 7795ef2742 [FIX] unlink cronjobs for the model before purging it 4 years ago
OCA Transbot a982b5d029 Update translation files 4 years ago
OCA-git-bot 54ee29ce13 base_remote 12.0.1.0.1 4 years ago
OCA-git-bot bdce9305bc Merge PR #1814 into 12.0 4 years ago
Jaime Arroyo 84227ca6c2 [12.0][FIX] base_remote: search =ilike 4 years ago
OCA Transbot b72387e39c Update translation files 4 years ago
OCA-git-bot d557fb6c5a [ADD] setup.py 4 years ago
OCA-git-bot d8f8204fd9 [ADD] icon.png 4 years ago
OCA-git-bot 9a7b7f5111 [UPD] README.rst 4 years ago
oca-travis 244d1965d1 [UPD] Update base_remote.pot 4 years ago
oca-travis a1d9cd7043 [UPD] Update autovacuum_message_attachment.pot 4 years ago
OCA-git-bot 7c0093c534 Merge PR #1594 into 12.0 4 years ago
OCA-git-bot 04a3eaa999 [ADD] setup.py 4 years ago
OCA-git-bot 871b177889 [UPD] README.rst 4 years ago
oca-travis ed694e6397 [UPD] Update fetchmail_incoming_log.pot 4 years ago
OCA-git-bot 685cf7e682 Merge PR #1607 into 12.0 4 years ago
OCA Transbot 39ebb03862 Update translation files 4 years ago
OCA-git-bot ffad356484 database_cleanup 12.0.1.0.3 4 years ago
oca-travis 1f5517e762 [UPD] Update database_cleanup.pot 4 years ago
OCA-git-bot 705a237da6 Merge PR #1797 into 12.0 4 years ago
OCA Transbot 067ef1a202 Update translation files 4 years ago
OCA Transbot 9d19062068 Update translation files 4 years ago
oca-travis 529fafec8f [UPD] Update excel_import_export.pot 4 years ago
OCA-git-bot 0350112c00 Merge PR #1787 into 12.0 4 years ago
OCA-git-bot b18dfd7276 [ADD] setup.py 4 years ago
OCA-git-bot c1e58467ef [ADD] icon.png 4 years ago
OCA-git-bot 59e7c57105 [UPD] README.rst 4 years ago
oca-travis 23c696453a [UPD] Update sql_export_mail.pot 4 years ago
OCA-git-bot 0c9adc37ca Merge PR #1604 into 12.0 4 years ago
Holger Brunn efdea96f11 [ADD] test more cases for modules, refactor test code for that a bit 4 years ago
OCA-git-bot 257cd674d6 company_country 12.0.1.1.0 4 years ago
oca-travis 33a94a0fe1 [UPD] Update company_country.pot 4 years ago
OCA-git-bot d8e066045f Merge PR #1796 into 12.0 4 years ago
Holger Brunn 0bc6322dc8 [IMP] purge uninstalled unavailable modules in bulk 6 years ago
OCA-git-bot 51a2422428 [UPD] README.rst 4 years ago
Luis González bff84d8c1b [IMP] company_country: Fix and improve README and error messages 4 years ago
OCA-git-bot 13d2e78275 [UPD] README.rst 4 years ago
oca-travis 73f44e5996 [UPD] Update company_country.pot 4 years ago
Luis González [Vauxoo] e37b51a017
[IMP] company_country: Don't create DB table for model (#1791) 4 years ago
kittiu bd33d62318 [12.0][FIX] excel_import_export, problem on import with datetime field 4 years ago
OCA Transbot 93d9a532a0 Update translation files 4 years ago
oca-travis 4cc52e91b2 [UPD] Update database_cleanup.pot 4 years ago
Jordi Ballester Alomar 50f3dfcc7a
Merge pull request #1789 from ForgeFlow/12.0-fix-database-cleanup 4 years ago
mreficent cbdabc0acd [FIX] database_cleanup: only uninstall installed modules 4 years ago
oca-travis f997ee7551 [UPD] Update company_country.pot 4 years ago
OCA-git-bot e9eb0c0332 [UPD] README.rst 4 years ago
OCA Transbot 961239ad29 Update translation files 4 years ago
Luis González [Vauxoo] de012e4283
[FIX] company_country: Don't fail if account is already installed (#1786) 4 years ago
Jaime Arroyo f020449fc1 [12.0][MIG] base_remote 5 years ago
OCA-git-bot 7671104502 [ADD] icon.png 5 years ago
Enric Tobella 1e5539c9ad [FIX] base_remote: Do not raise Error on login failure 5 years ago
Enric Tobella c0927c3f40 [IMP] name of remotes should be case insensitive 6 years ago
Enric Tobella 88f64672eb [FIX] base_remote: Views 6 years ago
Enric Tobella 18699e60f1 Added translation using Weblate (Español (España)) 6 years ago
Enric Tobella a035e26a49 [FIX] missing super declaration 6 years ago
oca-travis ad4a329da4 [UPD] Update base_remote.pot 6 years ago
Enric Tobella d07d1494e8 [FIX] module name 6 years ago
OCA-git-bot d4a489f7be [ADD] setup.py 4 years ago
OCA-git-bot db1f446065 [UPD] README.rst 4 years ago
oca-travis d82923c635 [UPD] Update base_view_inheritance_extension.pot 4 years ago
OCA-git-bot e481f7ad51 Merge PR #1529 into 12.0 4 years ago
Alexis de Lattre 0268eb262d Remove the "move" feature which is now native 4 years ago
OCA-git-bot 6604a8856a [ADD] setup.py 4 years ago
OCA-git-bot a5caab0165 [ADD] icon.png 4 years ago
OCA-git-bot 0dd7a932fd [UPD] README.rst 4 years ago
oca-travis c7e94dc732 [UPD] Update base_m2m_custom_field.pot 4 years ago
OCA-git-bot 8543e0db4a Merge PR #1738 into 12.0 4 years ago
OCA Transbot 2f9227396d Update translation files 4 years ago
OCA Transbot f0e22ddf0a Update translation files 4 years ago
OCA-git-bot 806cc9b2a6 [ADD] setup.py 4 years ago
OCA-git-bot 446ab2adae [UPD] README.rst 4 years ago
oca-travis a3ea0f45bf [UPD] Update excel_import_export_demo.pot 4 years ago
oca-travis 853a7505ad [UPD] Update excel_import_export.pot 4 years ago
oca-travis 382fa36d8d [UPD] Update autovacuum_message_attachment.pot 4 years ago
OCA-git-bot 27a56ee330 Merge PR #1674 into 12.0 4 years ago
Enric Tobella 1518a95f04 [REF] autovacuum_message_attachment: Improve the way we manage domains 4 years ago
Florian da Costa 414312b519 Add possibility to delete attachments 5 years ago
Florian da Costa 1a59591ec9 Migrate autovacuum_mail_message to version 12 and rename it 5 years ago
oca-travis b7cc1eb492 [UPD] Update autovacuum_mail_message.pot 5 years ago
Florian da Costa acb064a487 Add possibility to filter message to delete by res model domain 5 years ago
Florian 5ea1234d19 [ADD] module autovacuum_mail_message (#1208) 5 years ago
OCA-git-bot b65736c0fa database_cleanup 12.0.1.0.2 4 years ago
OCA-git-bot a9d74c261f base_conditional_image 12.0.1.0.1 4 years ago
oca-travis 894494f593 [UPD] Update base_conditional_image.pot 4 years ago
OCA-git-bot d17b8b829a Merge PR #1770 into 12.0 4 years ago
Enric Tobella dcd4f271bd [FIX][12.0] base_conditional_image: Fix descriptions and strings 4 years ago
Enric Tobella f7dd9d769e [FIX][12.0] database_cleanup: Mute logger on tests 4 years ago
OCA Transbot 7205d8b275 Update translation files 4 years ago
oca-travis d6862c9040 [UPD] Update auditlog.pot 4 years ago
OCA-git-bot 532319d3e6 Merge PR #1688 into 12.0 4 years ago
Akim Juillerat f6e029c717 fixup! Add module base_m2m_custom_field 4 years ago
OCA Transbot a81d124374 Update translation files 4 years ago
OCA Transbot 8b4d6cac17 Update translation files 4 years ago
OCA-git-bot 3f14d80dbf [ADD] setup.py 4 years ago
OCA-git-bot f1673a58e7 [ADD] icon.png 4 years ago
OCA-git-bot 767cec72e2 [UPD] README.rst 4 years ago
oca-travis 50d47d4b8f [UPD] Update base_conditional_image.pot 4 years ago
OCA-git-bot 0b169487a8 Merge PR #1681 into 12.0 4 years ago
OCA-git-bot 1a7b8263d3 base_custom_info 12.0.1.0.1 4 years ago
oca-travis a9e82deb19 [UPD] Update base_custom_info.pot 4 years ago
OCA-git-bot 208211519a Merge PR #1747 into 12.0 4 years ago
Adrià Gil Sorribes 0b37f6b69e [12.0][FIX] base_custom_info 4 years ago
OCA-git-bot 3997e28bc6 [ADD] setup.py 4 years ago
oca-travis c6fb335587 [UPD] Update base_custom_info.pot 4 years ago
OCA-git-bot 9719924fd2 Merge PR #1721 into 12.0 4 years ago
Alexandre Díaz 153e1d0134 [IMP] base_custom_info: Tests 4 years ago
Pedro M. Baeza 339a8ec1d2 [MIG][FIX] base_custom_info: Several adjustments: 4 years ago
Alexandre Díaz 136699066b [MIG] base_custom_info: Migration to 12.0 5 years ago
oca-travis 8b20b5b7e5 [UPD] Update ir_sequence_standard_default.pot 4 years ago
OCA-git-bot 7a82112028 [ADD] setup.py 4 years ago
Moises Lopez - https://www.vauxoo.com/ 3b6f22b019
Merge pull request #1728 from vauxoo-dev/12.0-ir_sequence_standard_default-ebirbe 4 years ago
Erick Birbe d8ffe2087d [ADD] ir_sequence_standard_default: Use Standard instead No Gap sequence 5 years ago
OCA-git-bot 04b6ee5be3 Merge PR #1732 into 12.0 4 years ago
Stéphane Bidoul (ACSONE) d3d3521452
Bump slow_statement_logger version 4 years ago
OCA-git-bot 915703200f [ADD] setup.py 4 years ago
OCA-git-bot 8d3781ba27 [UPD] README.rst 4 years ago
oca-travis 16333eb974 [UPD] Update configuration_helper.pot 4 years ago
OCA-git-bot 4c63ecde15 Merge PR #1725 into 12.0 4 years ago
OCA-git-bot 55cc7e4da7 base_custom_info 10.0.1.1.0 5 years ago
Laurent Mignon (ACSONE) 1d5fa4a522 [FIX] base_custom_info: Check contrain on model into template before the write 5 years ago
Fanha Giang bb3fc27297 [MIG] [10.0] base custom info 7 years ago
Jairo Llopis 3fe97bb72c [FIX][base_custom_info] Make tests work 7 years ago
Sergio Teruel Albert 1dc94c6a56 [FIX] base_custom_info: fix demo template csv 7 years ago
Jairo Llopis 5878212db5 [IMP]base_custom_info: New types and access rules system. 8 years ago
Jairo Llopis 498f2f4f8c [CHG] base_custom_info: Relicense to LGPL with all authors' consent 8 years ago
Pedro M. Baeza 03b2905d3f [MIG] Make modules uninstallable 8 years ago
Stéphane Bidoul (ACSONE) f60e9b464b [FIX] remove en.po that was erroneously created by transbot 8 years ago
Jairo Llopis 6ce2c6f1cd [9.0][MIG][base_custom_info] Migration. 8 years ago
Jairo Llopis db238eb876 Fix many bugs and styling, and prepare for OCA. 9 years ago
Carlos Incaser f06b40e4f3 [FIX][8.0] base_custom_info: Minor fix and security 9 years ago
Carlos Incaser 9dad67ac3f [IMP][8.0] base_custom_info: Actions and menus. Refactor strings Info to Property 9 years ago
Carlos Incaser 687966d57a [ADD][8.0] base_custom_info: Init develop 9 years ago
Akim Juillerat f52cbe0fdd Add module base_m2m_custom_field 4 years ago
OCA Transbot 6cf006239d Update translation files 4 years ago
OCA-git-bot f8b4c5ad27 [ADD] setup.py 4 years ago
OCA-git-bot 7cf55fca0e [ADD] icon.png 4 years ago
OCA-git-bot a35556a283 [UPD] README.rst 4 years ago
oca-travis 2f8528950c [UPD] Update slow_statement_logger.pot 4 years ago
OCA-git-bot ffa69d35ba Merge PR #1729 into 12.0 4 years ago
Jared Kipe 64136bde44 FIX `base_exception` at the end of detect_exceptions, link to the detected exceptions (with test) 5 years ago
OCA Transbot b138e0a740 Update translation files 5 years ago
OCA-git-bot 200c5eb086 [ADD] setup.py 5 years ago
OCA-git-bot 941c004b99 [UPD] README.rst 5 years ago
oca-travis 446d964a0f [UPD] Update base_kanban_stage_state.pot 5 years ago
OCA-git-bot 3161ce7a60 Merge PR #1702 into 12.0 5 years ago
Stéphane Bidoul (ACSONE) 5c9fa027b8
slow_statement_logger: log with debug level 5 years ago
sebalix 475de905de [MIG] configuration_helper: Migration to 12.0 5 years ago
Stéphane Bidoul (ACSONE) 541082686c
[ADD] slow_statement_logger 5 years ago
Rodrigo Macedo 5386ea9746 Translated using Weblate (Portuguese (Brazil)) 5 years ago
OCA Transbot 2dcee7e823 Update translation files 5 years ago
OCA-git-bot 1e760d8925 [UPD] README.rst 5 years ago
oca-travis 3153d90d8f [UPD] Update excel_import_export.pot 5 years ago
OCA-git-bot d72f5a72ed Merge PR #1726 into 12.0 5 years ago
OCA-git-bot d97aaa9fa2
[ADD] .editorconfig [ci skip] 5 years ago
kittiu 577ae5d5fb [12.0][ENH] excel_import_export, faster export 5 years ago
OCA-git-bot 16bc5b7233 [UPD] README.rst 5 years ago
OCA-git-bot e976f4b79d [ADD] icon.png 5 years ago
Thomas Pot 4cb24502de Translated using Weblate (Dutch) 6 years ago
oca-travis 3323db626d [UPD] Update configuration_helper.pot 6 years ago
OCA-git-bot 7eed569dad [UPD] README.rst 6 years ago
Akim Juillerat 60e2a42345 Add to contributors 6 years ago
Patrick Tombez f287670853 [MIG] Update module to match V11 architecture 6 years ago
Timon Tschanz b58ca6068f make test_configuration_helper installable and set name on inheritance 6 years ago
Akim Juillerat deb052081d Update readme for generator 6 years ago
Akim Juillerat bbf50988a3 [MIG] configuration_helper: Migration to 11.0 6 years ago
OCA Transbot 4915e01352 OCA Transbot updated translations from Transifex 8 years ago
Angel Moya Pardo 2b1868a704 MIG configuration helper 7 years ago
Pedro M. Baeza 29f4f6d308 [MIG] Rename manifest files 8 years ago
Pedro M. Baeza 7b207eb12a [MIG] Make modules uninstallable 8 years ago
Yannick Vaucher 85525852b9 [MGR] configuration_helper 8 years ago
Stéphane Bidoul 2a2f8c42dd [MOV] move addons out of __unported__ (they remain not installable) 9 years ago
Stéphane Bidoul 7167a57576 move all modules to __unported__ on master branch and set installable=False 10 years ago
david.beal@akretion.com d44d833c58 [ADD] config helper module 10 years ago
Patrick Tombez f0f715bf7a
Apply suggestions from code review 5 years ago
OCA-git-bot 07e95733e7 [ADD] setup.py 5 years ago
OCA-git-bot ac14cc503d [ADD] icon.png 5 years ago
oca-travis 23cb48c068 [UPD] Update company_country.pot 5 years ago
OCA-git-bot a4e0e750c1 Merge PR #1372 into 12.0 5 years ago
Bole 44a937160d Translated using Weblate (Croatian) 5 years ago
Bole ac501fb830 Translated using Weblate (Croatian) 5 years ago
Bole 3ce2f9d44e Translated using Weblate (Croatian) 5 years ago
Moisés López e33a1c5b7c [ADD] company_country: Set company.country value early to use account hook to install l10n_* modules and avoid installing generic_account 6 years ago
Bole 96e510482d Added translation using Weblate (Croatian) 5 years ago
Vladislav Shepilov b55855816d [MIG] base_multi_image: Migration to 12.0 5 years ago
oca-travis fa63e10540 [UPD] Update base_multi_image.pot 6 years ago
Francisco Fernández 862522ebdf [10.0] [IMP] base_multi_image: improve uninstall hook (#1286) 6 years ago
OCA Transbot 120e62342b OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot 548e6f37d1 OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot e1918e02fc OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot b01be5e5aa OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot ad0f2ba865 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 3cdcf18af6 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot 87f25a39cf OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot a433f6bb02 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot ba1d82d9a0 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot d7e93211a8 OCA Transbot updated translations from Transifex 7 years ago
OCA Transbot b0443e8580 OCA Transbot updated translations from Transifex 7 years ago
Dave Lasley f4afb49e4f [10.0][FIX] base_multi_image: Uninstall hook (#709) 7 years ago
Dave Lasley df614cf4df [FIX] base_multi_image: Use env in uninstall_hook (#677) 7 years ago
Dave Lasley 9d1d90c780 [FIX] base_multi_image: Adhere to image delete bypass 8 years ago
OCA Transbot 04e8c62c0e OCA Transbot updated translations from Transifex 8 years ago
Dave Lasley 2440b6e9c8 [MIG] base_multi_image: Upgrade to v10 8 years ago
Dave Lasley eda315008f base_multi_image: Fix hook example * Add uninstall hook import to Readme example * Only except for ImportError * Fix note regarding need of hook use 8 years ago
OCA Transbot f2a7068cbc OCA Transbot updated translations from Transifex 8 years ago
Pedro M. Baeza e5d4bf3838 [MIG] Rename manifest files 8 years ago
Pedro M. Baeza 9efe2e8694 [MIG] Make modules uninstallable 8 years ago
OCA Transbot 4d7b8cafeb OCA Transbot updated translations from Transifex 8 years ago
Holger Brunn 639b5a54d8 [FIX] adapt to changes in binary attachment branch 8 years ago
OCA Transbot a132871e26 OCA Transbot updated translations from Transifex 8 years ago
Stéphane Bidoul (ACSONE) b1737b7678 [FIX] remove en.po that was erroneously created by transbot 8 years ago
OCA Transbot 20ffd97c1c OCA Transbot updated translations from Transifex 8 years ago
Pedro M. Baeza 973bf9e47f [FIX] base_multi_image: Correct README instructions 8 years ago
Jairo Llopis c67fb87a4a Add ondelete attribute, required for Many2one fields in v9. 8 years ago
Jairo Llopis 7bd2718c09 Raise version. 8 years ago
Jairo Llopis 01be895270 Add uninstall hook to avoid garbage images hanging around after submodule is uninstalled. 8 years ago
Jairo Llopis b60462f79d Add a reference field to get to the owner with 1 click. 8 years ago
Jairo Llopis 92b4bfb176 Use v9 ormcache. 8 years ago
OCA Transbot 8efb53bed5 OCA Transbot updated translations from Transifex 8 years ago
OCA Transbot 4c510286b2 OCA Transbot updated translations from Transifex 8 years ago
sebalix dc8b509bb3 [FIX] base_multi_image - Fix method name 8 years ago
sebalix 39437f51e2 [FIX] base_multi_image - Make validation error messages translatable 8 years ago
sebalix 2e7b0a6880 [FIX] base_multi_image - Clean up + updated comments 8 years ago
sebalix 46919e5ddc [IMP] base_multi_image - Select only images as attachments 8 years ago
sebalix d7dc30f847 [FIX] base_multi_image - New storage backend 'Filestore' to link an existing attachment record + Fix the 'pre_init_hook_for_submodules()' hook to extract the images from the ir_attachment table for binary fields initialized with the 'attachment=True' parameter 8 years ago
OCA Transbot 3d333fc7d9 OCA Transbot updated translations from Transifex 8 years ago
OCA Transbot 2f937818e3 OCA Transbot updated translations from Transifex 8 years ago
OCA Transbot e720726d4f OCA Transbot updated translations from Transifex 8 years ago
OCA Transbot 043f9c1040 OCA Transbot updated translations from Transifex 8 years ago
Atchuthan, Sodexis d5ac82425f [MIG][9.0] base_multi_image 8 years ago
OCA Transbot dd50578f10 OCA Transbot updated translations from Transifex 8 years ago
OCA Transbot aeddff02c0 OCA Transbot updated translations from Transifex 8 years ago
Jairo Llopis 474568e654 Fix bug that made previous images to disappear. 8 years ago
Jairo Llopis 6f9d45e246 Add known issues section. 8 years ago
Jairo Llopis b45c6bee6a Remove wrong copyright. 8 years ago
Jairo Llopis b740db6475 Cache images' URL. 8 years ago
Jairo Llopis 0d8258cf32 Reduce methods. 8 years ago
Jairo Llopis 23e67d11fe Add sequence to images. 8 years ago
Jairo Llopis 551d2755e3 Do not require a name. 8 years ago
Jairo Llopis f28779af8e No default value for storage. 8 years ago
Jairo Llopis 7157529ab8 Tenames and typos. 8 years ago
Jairo Llopis 50c93aef68 Extend model example. 8 years ago
Jairo Llopis 0741335212 Split model in abstract & concrete. 9 years ago
mreficent 291237172f [MIG] base_kanban_stage_state: Migration to 12.0 5 years ago
oca-travis 15a9d5f20d [UPD] Update base_kanban_stage_state.pot 6 years ago
Stéphane Bidoul (ACSONE) 6a1db622c2 [FIX] rst syntax errors 6 years ago
OCA Transbot a2b6230493 OCA Transbot updated translations from Transifex 7 years ago
Kelly Lougheed a219b63515 [10.0] Add base_kanban_stage_state: Map stages to states 7 years ago
sebalix 0e2f928eb5 [FIX] auditlog: add support for create multi 5 years ago
sebalix a68087698c [FIX] auditlog: log computed fields stored in db as expected 5 years ago
Patrick Tombez a547d04701 fixup! Add module custom_image 5 years ago
Patrick Tombez fc50991780 Add module custom_image 6 years ago
Florian 68448cfa74
Small fixes for v12/python3 standard 5 years ago
Florian da Costa 87627125f0 Migrate sql_export_excel to v12 5 years ago
Florian da Costa 8c305dd2fd Add sql_export_excel 5 years ago
Florian da Costa afe50f62ce Adapt module sql_export_mail to be compatible with multiple file format 5 years ago
Florian da Costa 58659727be Add group on cron field to avoid access error when user does not have the right to read crons. 5 years ago
Nils Hamerlinck e6e75bd814 [ADD] bus_alt_connection 5 years ago
Florian da Costa 8a23db0fb9 Migrate to v12 5 years ago
Florian da Costa b8efac6bba Fix uses of params in sql query 5 years ago
mreficent 932b75ec9c [MIG] fetchmail_incoming_log: Migration to 12.0 5 years ago
oca-travis 893797c810 [UPD] Update fetchmail_incoming_log.pot 6 years ago
OCA-git-bot d9113fe794 [UPD] README.rst 6 years ago
hveficent 80e237d736 [RENAME] mail_log_message_to_process -> fetchmail_incoming_log 6 years ago
hveficent 86f1c1590a [MIG] mail_log_message_to_process: Migration to 11.0 6 years ago
oca-travis 2d86db8a5c [UPD] Update mail_log_message_to_process.pot 6 years ago
Lois Rilo f74138747b [10.0][MIG][REN] mail_log_messages_to_process migrated and renamed to mail_log_message_to_process 6 years ago
mtbochaca 3359bc71f8 Translated using Weblate (Catalan) 6 years ago
oca-travis 2355d6cecd [UPD] Update mail_log_messages_to_process.pot 6 years ago
OCA Transbot 42ca8972c8 OCA Transbot updated translations from Transifex 7 years ago
Jordi Ballester 50096e54c2 [9.0][add] mail_log_messages_to_process 7 years ago
Florian da Costa e3c175a69c Migrate sql_export_mail to v9 5 years ago
Florian da Costa cc6c1019a3 styles and decorator fixes 7 years ago
Florian da Costa 1b56afbfa4 Remove useless files 7 years ago
Florian da Costa 225780aa80 Add module sql_export_mail 7 years ago
Ruben Dario Bravo 3aaed8c14e [MIG] base_locale_uom_default: Migration to 12.0 5 years ago
OCA-git-bot 8ec1030f5b [ADD] icon.png 5 years ago
oca-travis dc3cd2b777 [UPD] Update base_locale_uom_default.pot 6 years ago
OCA Transbot c99e00df55 OCA Transbot updated translations from Transifex 6 years ago
OCA Transbot 129f00587d OCA Transbot updated translations from Transifex 7 years ago
Dave Lasley 7eeb9dddcb [ADD] base_locale_uom_default: Add default unit of measure by lang 7 years ago
Raphaël Valyi 61a83bb372 [MIG] base_view_inheritance_extension: Migration to 12.0 5 years ago
oca-travis 0282b38172 [UPD] Update base_view_inheritance_extension.pot 5 years ago
Sergio Teruel 2ddfa364e5 [MIG] base_view_inheritance_extension: Migration to 11.0 6 years ago
oca-travis 3c33bf3641 [UPD] Update base_view_inheritance_extension.pot 6 years ago
Holger Brunn feb51680cf [FIX] base_view_inheritance_extension: 2 things: 7 years ago
Holger Brunn da8ae075f9 [FIX] don't break when an attribute node in an xpath makes the 7 years ago
lfreeke 942eec3e85 [MIG] base_view_inheritance_extension to 10.0 7 years ago
Ronald Portier 199785e354 [8.0][ADD] Add list manipulation operations to base_view_inheritance_extension. (#804) 7 years ago
Pedro M. Baeza 46376b2950 [MIG] base_view_inheritance_extension: Migration to 9.0 7 years ago
Jairo Llopis ae0f2f1320 [base_view_inheritance_extension] Relicense to LGPL. (#4) 7 years ago
Holger Brunn 80f478905e [ADD] base_view_inheritance_extension 7 years ago
  1. 20
      .editorconfig
  2. 12
      .travis.yml
  3. 110
      attachment_queue/README.rst
  4. 1
      attachment_queue/__init__.py
  5. 23
      attachment_queue/__manifest__.py
  6. 16
      attachment_queue/data/cron.xml
  7. 7
      attachment_queue/data/ir_config_parameter.xml
  8. 16
      attachment_queue/data/mail_template.xml
  9. 10
      attachment_queue/demo/attachment_queue_demo.xml
  10. 449
      attachment_queue/i18n/attachment_queue.pot
  11. 1
      attachment_queue/models/__init__.py
  12. 111
      attachment_queue/models/attachment_queue.py
  13. 4
      attachment_queue/readme/CONTRIBUTORS.rst
  14. 3
      attachment_queue/readme/DESCRIPTION.rst
  15. 17
      attachment_queue/readme/USAGE.rst
  16. 3
      attachment_queue/security/ir.model.access.csv
  17. BIN
      attachment_queue/static/description/form.png
  18. BIN
      attachment_queue/static/description/icon.png
  19. 436
      attachment_queue/static/description/index.html
  20. BIN
      attachment_queue/static/description/tree.png
  21. 3
      attachment_queue/tests/__init__.py
  22. 39
      attachment_queue/tests/test_attachment_queue.py
  23. 107
      attachment_queue/views/attachment_queue_view.xml
  24. 126
      attachment_synchronize/README.rst
  25. 1
      attachment_synchronize/__init__.py
  26. 28
      attachment_synchronize/__manifest__.py
  27. 16
      attachment_synchronize/data/cron.xml
  28. 25
      attachment_synchronize/demo/attachment_synchronize_task_demo.xml
  29. 345
      attachment_synchronize/i18n/attachment_synchronize.pot
  30. 1
      attachment_synchronize/models/__init__.py
  31. 39
      attachment_synchronize/models/attachment_queue.py
  32. 232
      attachment_synchronize/models/attachment_synchronize_task.py
  33. 67
      attachment_synchronize/models/storage_backend.py
  34. 10
      attachment_synchronize/readme/CONTRIBUTORS.rst
  35. 5
      attachment_synchronize/readme/DESCRIPTION.rst
  36. 19
      attachment_synchronize/readme/USAGE.rst
  37. 2
      attachment_synchronize/security/ir.model.access.csv
  38. BIN
      attachment_synchronize/static/description/export_task.png
  39. BIN
      attachment_synchronize/static/description/icon.png
  40. BIN
      attachment_synchronize/static/description/import_task.png
  41. 448
      attachment_synchronize/static/description/index.html
  42. 2
      attachment_synchronize/tests/__init__.py
  43. 43
      attachment_synchronize/tests/common.py
  44. 42
      attachment_synchronize/tests/test_export.py
  45. 83
      attachment_synchronize/tests/test_import.py
  46. 56
      attachment_synchronize/views/attachment_queue_views.xml
  47. 147
      attachment_synchronize/views/attachment_synchronize_task_views.xml
  48. 34
      attachment_synchronize/views/storage_backend_views.xml
  49. 39
      auditlog/README.rst
  50. 2
      auditlog/__manifest__.py
  51. 12
      auditlog/i18n/am.po
  52. 12
      auditlog/i18n/ar.po
  53. 12
      auditlog/i18n/auditlog.pot
  54. 12
      auditlog/i18n/bg.po
  55. 12
      auditlog/i18n/bs.po
  56. 12
      auditlog/i18n/ca.po
  57. 12
      auditlog/i18n/cs.po
  58. 12
      auditlog/i18n/cs_CZ.po
  59. 12
      auditlog/i18n/da.po
  60. 12
      auditlog/i18n/de.po
  61. 12
      auditlog/i18n/el_GR.po
  62. 12
      auditlog/i18n/en_GB.po
  63. 12
      auditlog/i18n/es.po
  64. 12
      auditlog/i18n/es_AR.po
  65. 12
      auditlog/i18n/es_CL.po
  66. 12
      auditlog/i18n/es_CO.po
  67. 12
      auditlog/i18n/es_CR.po
  68. 12
      auditlog/i18n/es_DO.po
  69. 12
      auditlog/i18n/es_EC.po
  70. 12
      auditlog/i18n/es_ES.po
  71. 128
      auditlog/i18n/es_MX.po
  72. 12
      auditlog/i18n/es_PE.po
  73. 12
      auditlog/i18n/es_PY.po
  74. 12
      auditlog/i18n/es_VE.po
  75. 12
      auditlog/i18n/et.po
  76. 12
      auditlog/i18n/eu.po
  77. 12
      auditlog/i18n/fa.po
  78. 12
      auditlog/i18n/fi.po
  79. 12
      auditlog/i18n/fr.po
  80. 12
      auditlog/i18n/fr_CA.po
  81. 12
      auditlog/i18n/fr_CH.po
  82. 12
      auditlog/i18n/fr_FR.po
  83. 12
      auditlog/i18n/gl.po
  84. 12
      auditlog/i18n/gl_ES.po
  85. 12
      auditlog/i18n/he.po
  86. 12
      auditlog/i18n/hr.po
  87. 12
      auditlog/i18n/hr_HR.po
  88. 12
      auditlog/i18n/hu.po
  89. 12
      auditlog/i18n/id.po
  90. 12
      auditlog/i18n/it.po
  91. 12
      auditlog/i18n/ja.po
  92. 12
      auditlog/i18n/ko.po
  93. 12
      auditlog/i18n/lt.po
  94. 12
      auditlog/i18n/lt_LT.po
  95. 12
      auditlog/i18n/lv.po
  96. 12
      auditlog/i18n/mk.po
  97. 12
      auditlog/i18n/mn.po
  98. 12
      auditlog/i18n/nb.po
  99. 12
      auditlog/i18n/nb_NO.po
  100. 12
      auditlog/i18n/nl.po

20
.editorconfig

@ -0,0 +1,20 @@
# Configuration for known file extensions
[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[.eslintrc,*.{json,yml,yaml,rst,md}]
indent_size = 2
# Do not configure editor for libs and autogenerated content
[*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst]
charset = unset
end_of_line = unset
indent_size = unset
indent_style = unset
insert_final_newline = false
trim_trailing_whitespace = false

12
.travis.yml

@ -13,20 +13,24 @@ addons:
env:
global:
- VERSION="12.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
- VERSION="12.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0" MQT_DEP="PIP"
- COUNTRY="US"
matrix:
- LINT_CHECK="1"
- TESTS="1" ODOO_REPO="OCA/OCB" EXCLUDE="database_cleanup"
- TESTS="1" ODOO_REPO="OCA/OCB" EXCLUDE="database_cleanup,module_analysis"
- TESTS="1" ODOO_REPO="OCA/OCB" INCLUDE="database_cleanup"
- TESTS="1" ODOO_REPO="odoo/odoo" EXCLUDE="database_cleanup" MAKEPOT="1"
- TESTS="1" ODOO_REPO="OCA/OCB" INCLUDE="module_analysis"
- TESTS="1" ODOO_REPO="odoo/odoo" EXCLUDE="database_cleanup,module_analysis" MAKEPOT="1"
- TESTS="1" ODOO_REPO="odoo/odoo" INCLUDE="database_cleanup" MAKEPOT="1"
- TESTS="1" ODOO_REPO="odoo/odoo" INCLUDE="module_analysis" MAKEPOT="1"
install:
- git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools
- export PATH=${HOME}/maintainer-quality-tools/travis:${PATH}
- travis_install_nightly
# Requirements to test server_environment modules
- printf '[options]\n\nrunning_env = dev\n' > ${HOME}/.openerp_serverrc
script:
- travis_run_tests

110
attachment_queue/README.rst

@ -0,0 +1,110 @@
================
Attachment Queue
================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/12.0/attachment_queue
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-attachment_queue
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/149/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds async processing capabilities to attachments by implementing a new model attachment.queue that wraps attachments and stores additional information so that it can be processed in an asynchronous way.
A use case of this module can be found in the attachment_synchronize module.
**Table of contents**
.. contents::
:local:
Usage
=====
Go the menu Settings > Technical > Database Structure > Attachments Queue
You can create / see standard attachments with additional fields
Configure the batch limit for attachments that can be sync by the cron task at a go:
Settings > Technical > System parameters > attachment_queue_cron_batch_limit
image:: ../static/description/tree.png
This module can be used in combination with attachment_synchronize to control file processing workflow
image:: ../static/description/form.png
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/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 <https://github.com/OCA/server-tools/issues/new?body=module:%20attachment_queue%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
* Valentin CHEMIERE <valentin.chemiere@akretion.com>
* Florian da Costa <florian.dacosta@akretion.com>
* Angel Moya <http://angelmoya.es>
* Dan Kiplangat <dan@sunflowerweb.nl>
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.
.. |maintainer-florian-dacosta| image:: https://github.com/florian-dacosta.png?size=40px
:target: https://github.com/florian-dacosta
:alt: florian-dacosta
.. |maintainer-sebastienbeau| image:: https://github.com/sebastienbeau.png?size=40px
:target: https://github.com/sebastienbeau
:alt: sebastienbeau
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-florian-dacosta| |maintainer-sebastienbeau|
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/12.0/attachment_queue>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
attachment_queue/__init__.py

@ -0,0 +1 @@
from . import models

23
attachment_queue/__manifest__.py

@ -0,0 +1,23 @@
# Copyright 2015 Florian DA COSTA @ Akretion
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Attachment Queue",
"version": "12.0.1.0.1",
"author": "Akretion,Odoo Community Association (OCA)",
"summary": "Base module adding the concept of queue for processing files",
"website": "https://github.com/OCA/server-tools",
"maintainers": ["florian-dacosta", "sebastienbeau"],
"license": "AGPL-3",
"category": "Generic Modules",
"depends": ["base", "mail"],
"data": [
"views/attachment_queue_view.xml",
"security/ir.model.access.csv",
"data/cron.xml",
"data/ir_config_parameter.xml",
"data/mail_template.xml",
],
"demo": ["demo/attachment_queue_demo.xml"],
"installable": True,
}

16
attachment_queue/data/cron.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<record model="ir.cron" id="cronjob_run_attachment_queue">
<field name='name'>Run Attachments Queue</field>
<field name='interval_number'>30</field>
<field name='interval_type'>minutes</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
<field name="doall" eval="False" />
<field name="model_id" ref="model_attachment_queue"/>
<field name="state">code</field>
<field name="code">model.run_attachment_queue_scheduler()</field>
</record>
</odoo>

7
attachment_queue/data/ir_config_parameter.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="attachment_queue_cron_batch_limit" model="ir.config_parameter">
<field name="key">attachment_queue_cron_batch_limit</field>
<field name="value">200</field>
</record>
</odoo>

16
attachment_queue/data/mail_template.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="attachment_failure_notification" model="mail.template">
<field name="email_to">${object.failure_emails}</field>
<field name="name">Attachment Failure notification</field>
<field name="subject">The attachment ${object.name} has failed</field>
<field name="model_id" ref="attachment_queue.model_attachment_queue"/>
<field name="body_html"><![CDATA[
<p style="margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;">Hello,<br><br></p>
<p style="margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;">The attachment ${object.name} has failed with the following error message : <br>${object.state_message}<br></p><p style="margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;"></p>
<p style="margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;">Regards,<br></p>
]]></field>
</record>
</odoo>

10
attachment_queue/demo/attachment_queue_demo.xml

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<odoo noupdate="1">
<record id="attachment_queue_demo" model="attachment.queue">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">attachment_queue_demo.doc</field>
<field name="name">attachment_queue_demo.doc</field>
</record>
</odoo>

449
attachment_queue/i18n/attachment_queue.pot

@ -0,0 +1,449 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_queue
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.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: attachment_queue
#: model:mail.template,body_html:attachment_queue.attachment_failure_notification
msgid "\n"
" <p style=\"margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;\">Hello,<br><br></p>\n"
" <p style=\"margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;\">The attachment ${object.name} has failed with the following error message : <br>${object.state_message}<br></p><p style=\"margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;\"></p>\n"
" <p style=\"margin:0px 0px 10px 0px;font-size:13px;font-family:&quot;Lucida Grande&quot;, Helvetica, Verdana, Arial, sans-serif;\">Regards,<br></p>\n"
" "
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__access_token
msgid "Access Token"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction
msgid "Action Needed"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__active
msgid "Active"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__attachment_id
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Attachment"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_attachment_count
msgid "Attachment Count"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__local_url
msgid "Attachment URL"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Attachments"
msgstr ""
#. module: attachment_queue
#: model:ir.actions.act_window,name:attachment_queue.action_attachment_queue
#: model:ir.ui.menu,name:attachment_queue.menu_attachment_queue
msgid "Attachments Queue"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Binary"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__checksum
msgid "Checksum/SHA1"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__failure_emails
msgid "Comma-separated list of email addresses to be notified in case offailure"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__company_id
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Company"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_uid
msgid "Created by"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__create_date
msgid "Created on"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Creation Month"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__db_datas
msgid "Database Data"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__date_done
msgid "Date Done"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__description
msgid "Description"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__display_name
msgid "Display Name"
msgstr ""
#. module: attachment_queue
#: selection:attachment.queue,state:0
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Done"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
msgid "Error"
msgstr ""
#. module: attachment_queue
#: selection:attachment.queue,file_type:0
msgid "Export File (External location)"
msgstr ""
#. module: attachment_queue
#: selection:attachment.queue,state:0
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Failed"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__failure_emails
msgid "Failure Emails"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__datas
msgid "File Content"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_size
msgid "File Size"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__file_type
msgid "File Type"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "File type"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__datas_fname
msgid "Filename"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Filter on my documents"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_follower_ids
msgid "Followers"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_channel_ids
msgid "Followers (Channels)"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_partner_ids
msgid "Followers (Partners)"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Group By"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__id
msgid "ID"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_unread
msgid "If checked new messages require your attention."
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction
msgid "If checked, new messages require your attention."
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error
msgid "If checked, some messages have a delivery error."
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__index_content
msgid "Indexed Content"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_is_follower
msgid "Is Follower"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__public
msgid "Is public document"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue____last_update
msgid "Last Modified on"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_uid
msgid "Last Updated by"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__write_date
msgid "Last Updated on"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__attachment_id
msgid "Link to ir.attachment model "
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_main_attachment_id
msgid "Main Attachment"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error
msgid "Message Delivery error"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_ids
msgid "Messages"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__mimetype
msgid "Mime Type"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "My Document(s)"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__name
msgid "Name"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_needaction_counter
msgid "Number of Actions"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_has_error_counter
msgid "Number of error"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_needaction_counter
msgid "Number of messages which requires an action"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_has_error_counter
msgid "Number of messages with delivery error"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__message_unread_counter
msgid "Number of unread messages"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Owner"
msgstr ""
#. module: attachment_queue
#: selection:attachment.queue,state:0
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Pending"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_model_name
msgid "Res Model Name"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_field
msgid "Resource Field"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_id
msgid "Resource ID"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_model
msgid "Resource Model"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__res_name
msgid "Resource Name"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
msgid "Run"
msgstr ""
#. module: attachment_queue
#: model:ir.actions.server,name:attachment_queue.cronjob_run_attachment_queue_ir_actions_server
#: model:ir.cron,cron_name:attachment_queue.cronjob_run_attachment_queue
#: model:ir.cron,name:attachment_queue.cronjob_run_attachment_queue
msgid "Run Attachments Queue"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_form
msgid "Set to Done"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "State"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__state_message
msgid "State Message"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__store_fname
msgid "Stored Filename"
msgstr ""
#. module: attachment_queue
#: model:mail.template,subject:attachment_queue.attachment_failure_notification
msgid "The attachment ${object.name} has failed"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__res_model
msgid "The database object this attachment will be attached to."
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__file_type
msgid "The file type determines an import method to be used to parse and transform data before their import in ERP or an export"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__res_id
msgid "The record id this is attached to."
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__thumbnail
msgid "Thumbnail"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__type
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "Type"
msgstr ""
#. module: attachment_queue
#: model_terms:ir.ui.view,arch_db:attachment_queue.view_attachment_queue_search
msgid "URL"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_unread
msgid "Unread Messages"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__message_unread_counter
msgid "Unread Messages Counter"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__url
msgid "Url"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,field_description:attachment_queue.field_attachment_queue__website_message_ids
msgid "Website Messages"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__website_message_ids
msgid "Website communication history"
msgstr ""
#. module: attachment_queue
#: model:ir.model.fields,help:attachment_queue.field_attachment_queue__type
msgid "You can either upload a file from your computer or copy/paste an internet link to your file."
msgstr ""
#. module: attachment_queue
#: model:ir.model,name:attachment_queue.model_attachment_queue
msgid "attachment.queue"
msgstr ""

1
attachment_queue/models/__init__.py

@ -0,0 +1 @@
from . import attachment_queue

111
attachment_queue/models/attachment_queue.py

@ -0,0 +1,111 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
from odoo import api, fields, models, registry
_logger = logging.getLogger(__name__)
class AttachmentQueue(models.Model):
_name = "attachment.queue"
_inherits = {"ir.attachment": "attachment_id"}
_inherit = ["mail.thread"]
attachment_id = fields.Many2one(
"ir.attachment",
required=True,
ondelete="cascade",
help="Link to ir.attachment model ",
)
file_type = fields.Selection(
selection=[],
help="The file type determines an import method to be used "
"to parse and transform data before their import in ERP or an export",
)
date_done = fields.Datetime()
state = fields.Selection(
[("pending", "Pending"), ("failed", "Failed"), ("done", "Done")],
readonly=False,
required=True,
default="pending",
)
state_message = fields.Text()
failure_emails = fields.Char(
compute="_compute_failure_emails",
string="Failure Emails",
help="Comma-separated list of email addresses to be notified in case of"
"failure",
)
def _compute_failure_emails(self):
for attach in self:
attach.failure_emails = attach._get_failure_emails()
def _get_failure_emails(self):
# to be overriden in submodules implementing the file_type
self.ensure_one()
return ""
@api.model
def run_attachment_queue_scheduler(self, domain=None):
if domain is None:
domain = [("state", "=", "pending")]
batch_limit = self.env.ref(
"attachment_queue.attachment_queue_cron_batch_limit"
).value
if batch_limit and batch_limit.isdigit():
limit = int(batch_limit)
else:
limit = 200
attachments = self.search(domain, limit=limit)
if attachments:
return attachments.run()
return True
def run(self):
"""
Run the process for each attachment queue
"""
failure_tmpl = self.env.ref(
"attachment_queue.attachment_failure_notification"
)
for attachment in self:
with api.Environment.manage():
with registry(self.env.cr.dbname).cursor() as new_cr:
new_env = api.Environment(
new_cr, self.env.uid, self.env.context
)
attach = attachment.with_env(new_env)
try:
attach._run()
# pylint: disable=broad-except
except Exception as e:
attach.env.cr.rollback()
_logger.exception(str(e))
attach.write(
{"state": "failed", "state_message": str(e)}
)
emails = attach.failure_emails
if emails:
failure_tmpl.send_mail(attach.id)
attach.env.cr.commit()
else:
vals = {
"state": "done",
"date_done": fields.Datetime.now(),
}
attach.write(vals)
attach.env.cr.commit()
return True
def _run(self):
self.ensure_one()
_logger.info("Starting processing of attachment queue id %d", self.id)
def set_done(self):
"""
Manually set to done
"""
message = "Manually set to done by %s" % self.env.user.name
self.write({"state_message": message, "state": "done"})

4
attachment_queue/readme/CONTRIBUTORS.rst

@ -0,0 +1,4 @@
* Valentin CHEMIERE <valentin.chemiere@akretion.com>
* Florian da Costa <florian.dacosta@akretion.com>
* Angel Moya <http://angelmoya.es>
* Dan Kiplangat <dan@sunflowerweb.nl>

3
attachment_queue/readme/DESCRIPTION.rst

@ -0,0 +1,3 @@
This module adds async processing capabilities to attachments by implementing a new model attachment.queue that wraps attachments and stores additional information so that it can be processed in an asynchronous way.
A use case of this module can be found in the attachment_synchronize module.

17
attachment_queue/readme/USAGE.rst

@ -0,0 +1,17 @@
Go the menu Settings > Technical > Database Structure > Attachments Queue
You can create / see standard attachments with additional fields
Configure the batch limit for attachments that can be sync by the cron task at a go:
Settings > Technical > System parameters > attachment_queue_cron_batch_limit
image:: ../static/description/tree.png
This module can be used in combination with attachment_synchronize to control file processing workflow
image:: ../static/description/form.png

3
attachment_queue/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_attachment_queue_user,attachment.queue.user,model_attachment_queue,,1,0,0,0
access_attachment_queue_manager,attachment.queue.manager,model_attachment_queue,base.group_no_one,1,1,1,1

BIN
attachment_queue/static/description/form.png

After

Width: 925  |  Height: 780  |  Size: 75 KiB

BIN
attachment_queue/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

436
attachment_queue/static/description/index.html

@ -0,0 +1,436 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Attachment Queue</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="attachment-queue">
<h1 class="title">Attachment Queue</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/attachment_queue"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-attachment_queue"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/149/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds async processing capabilities to attachments by implementing a new model attachment.queue that wraps attachments and stores additional information so that it can be processed in an asynchronous way.</p>
<p>A use case of this module can be found in the attachment_synchronize module.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>Go the menu Settings &gt; Technical &gt; Database Structure &gt; Attachments Queue</p>
<p>You can create / see standard attachments with additional fields</p>
<p>Configure the batch limit for attachments that can be sync by the cron task at a go:</p>
<p>Settings &gt; Technical &gt; System parameters &gt; attachment_queue_cron_batch_limit</p>
<p>image:: ../static/description/tree.png</p>
<p>This module can be used in combination with attachment_synchronize to control file processing workflow</p>
<p>image:: ../static/description/form.png</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20attachment_queue%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Valentin CHEMIERE &lt;<a class="reference external" href="mailto:valentin.chemiere&#64;akretion.com">valentin.chemiere&#64;akretion.com</a>&gt;</li>
<li>Florian da Costa &lt;<a class="reference external" href="mailto:florian.dacosta&#64;akretion.com">florian.dacosta&#64;akretion.com</a>&gt;</li>
<li>Angel Moya &lt;<a class="reference external" href="http://angelmoya.es">http://angelmoya.es</a>&gt;</li>
<li>Dan Kiplangat &lt;<a class="reference external" href="mailto:dan&#64;sunflowerweb.nl">dan&#64;sunflowerweb.nl</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external" href="https://github.com/florian-dacosta"><img alt="florian-dacosta" src="https://github.com/florian-dacosta.png?size=40px" /></a> <a class="reference external" href="https://github.com/sebastienbeau"><img alt="sebastienbeau" src="https://github.com/sebastienbeau.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/attachment_queue">OCA/server-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

BIN
attachment_queue/static/description/tree.png

After

Width: 1171  |  Height: 270  |  Size: 41 KiB

3
attachment_queue/tests/__init__.py

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_attachment_queue

39
attachment_queue/tests/test_attachment_queue.py

@ -0,0 +1,39 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import odoo
from odoo import api
from odoo.tests.common import TransactionCase
class TestAttachmentBaseQueue(TransactionCase):
def setUp(self):
super().setUp()
self.registry.enter_test_mode(self.env.cr)
self.env = api.Environment(
self.registry.test_cr, self.env.uid, self.env.context
)
self.attachment = self.env.ref(
"attachment_queue.attachment_queue_demo"
)
def tearDown(self):
self.registry.leave_test_mode()
super().tearDown()
def test_attachment_queue(self):
"""Test run_attachment_queue_scheduler to ensure set state to done
"""
self.assertEqual(self.attachment.state, "pending")
self.env["attachment.queue"].run_attachment_queue_scheduler()
self.env.cache.invalidate()
with odoo.registry(self.env.cr.dbname).cursor() as new_cr:
new_env = api.Environment(new_cr, self.env.uid, self.env.context)
attach = self.attachment.with_env(new_env)
self.assertEqual(attach.state, "done")
def test_set_done(self):
"""Test set_done manually
"""
self.assertEqual(self.attachment.state, "pending")
self.attachment.set_done()
self.assertEqual(self.attachment.state, "done")

107
attachment_queue/views/attachment_queue_view.xml

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_attachment_queue_form" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="inherit_id" ref="base.view_attachment_form"/>
<field name="mode">primary</field>
<field name="arch" type="xml">
<xpath expr="/form/*" position="before">
<header>
<button name="run" states="pending,failed"
string="Run" type="object" class="oe_highlight"/>
<button name="set_done" states="pending,failed"
string="Set to Done" type="object"/>
</header>
</xpath>
<field name="url" position="after">
<field name="date_done"/>
<field name="state"/>
<field name="file_type"/>
</field>
<group name="description_group">
<group name="state_message" string="Error" colspan="4">
<field name="state_message" nolabel="1"/>
</group>
</group>
</field>
</record>
<record id="view_attachment_queue_tree" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="arch" type="xml">
<tree default_order='create_date desc'>
<field name="name"/>
<field name="datas_fname"/>
<field name="file_type"/>
<field name="type"/>
<field name="create_date"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_attachment_queue_search" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="arch" type="xml">
<search string="Attachments">
<field name="name" filter_domain="['|', ('name','ilike',self), ('datas_fname','ilike',self)]" string="Attachment"/>
<field name="create_date"/>
<filter name="url"
string="URL"
domain="[('type','=','url')]"/>
<filter name="binary"
string="Binary"
domain="[('type','=','binary')]"/>
<separator/>
<filter name="my_documents_filter"
string="My Document(s)"
domain="[('create_uid','=',uid)]"
help="Filter on my documents"/>
<field name="create_uid"/>
<field name="type"/>
<filter string="Pending" name="pending" domain="[('state', '=', 'pending')]"/>
<filter string="Failed" name="failed" domain="[('state', '=', 'failed')]"/>
<filter string="Done" name="done" domain="[('state', '=', 'done')]"/>
<group expand="0" string="Group By">
<filter string="Owner" name="owner" domain="[]" context="{'group_by':'create_uid'}"/>
<filter string="Type" name="type" domain="[]" context="{'group_by':'type'}" groups="base.group_no_one"/>
<filter string="Company" name="company" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<filter string="Creation Month" name="creation_month" domain="[]" context="{'group_by':'create_date'}"/>
<filter string="State" name="state" domain="[]" context="{'group_by': 'state'}"/>
<filter string="File type" name="file_type" domain="[]" context="{'group_by': 'file_type'}"/>
</group>
</search>
</field>
</record>
<record id="action_attachment_queue" model="ir.actions.act_window">
<field name="name">Attachments Queue</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">attachment.queue</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="view_attachment_queue_search"/>
</record>
<record id="act_open_attachment_que_view_tree" model="ir.actions.act_window.view">
<field eval="10" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_attachment_queue_tree"/>
<field name="act_window_id" ref="action_attachment_queue"/>
</record>
<record id="act_open_attachment_que_view_form" model="ir.actions.act_window.view">
<field eval="10" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="view_attachment_queue_form"/>
<field name="act_window_id" ref="action_attachment_queue"/>
</record>
<menuitem id="menu_attachment_queue"
parent="base.next_id_9"
sequence="20"
action="action_attachment_queue"/>
</odoo>

126
attachment_synchronize/README.rst

@ -0,0 +1,126 @@
======================
Attachment Synchronize
======================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/12.0/attachment_synchronize
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-attachment_synchronize
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/149/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to **import/export files** from/to backend servers.
A backend server is defined by the basic `storage_backend <https://github.com/OCA/storage/tree/12.0/storage_backend>`_ OCA module, while it can be configured (amazon S3, sftp,...) with additional modules from the `storage <https://github.com/oca/storage>`_ repository.
The imported files (and the files to be exported) are stored in Odoo as ``attachment.queue`` objects, defined by the `attachment_queue <https://github.com/OCA/server-tools/tree/12.0/attachment_queue>`_ module while the importation itself (resp. exportation) is realized by **"Attachments Import Tasks"** (resp. "Attachments Export Tasks") defined by this current module.
**Table of contents**
.. contents::
:local:
Usage
=====
As importation and exportation are different processes, they are triggered in different ways :
**To import files**, you need to create an *"Attachment Import Task"* (menu *Settings > Technical > Attachments Import Tasks*) which defines :
- where to find the files to import from the backend server (path to the files, selection pattern)
- what to do with the source files in the backend server (avoid duplicates, delete/rename after import...)
- how the files will be processed once imported (through the **File Type** field).
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/import_task.png
.. epigraph::
🔎 The **File Type** options are defined by other modules built to process the Attachments Queues with the same "File Type".
**To export files**, you need first to register them as *"Attachments Queues"* objects linked to an *"Attachment Export Task"* (which set automatically their **File Type** to *"Export File (External Location)"*).
Then, you can export one file at a time from the *Attachment Queue*'s form view, or export all the *Attachments Queues* in a pending state related to the same *Export Task* from the given *Export Task* form view (menu *Settings > Technical > Attachments Export Tasks*) :
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/export_task.png
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/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 <https://github.com/OCA/server-tools/issues/new?body=module:%20attachment_synchronize%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
`Akretion <https://www.akretion.com/>`_ :
- Valentin CHEMIERE
- Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
- Florian DA COSTA <florian.dacosta@akretion.com>
- Clément MOMBEREAU <clement.mombereau@akretion.com.br>
GS Lab:
- Giovanni SERRA <giovanni@gslab.it>
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.
.. |maintainer-florian-dacosta| image:: https://github.com/florian-dacosta.png?size=40px
:target: https://github.com/florian-dacosta
:alt: florian-dacosta
.. |maintainer-sebastienbeau| image:: https://github.com/sebastienbeau.png?size=40px
:target: https://github.com/sebastienbeau
:alt: sebastienbeau
.. |maintainer-GSLabIt| image:: https://github.com/GSLabIt.png?size=40px
:target: https://github.com/GSLabIt
:alt: GSLabIt
.. |maintainer-bealdav| image:: https://github.com/bealdav.png?size=40px
:target: https://github.com/bealdav
:alt: bealdav
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-florian-dacosta| |maintainer-sebastienbeau| |maintainer-GSLabIt| |maintainer-bealdav|
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/12.0/attachment_synchronize>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

1
attachment_synchronize/__init__.py

@ -0,0 +1 @@
from . import models

28
attachment_synchronize/__manifest__.py

@ -0,0 +1,28 @@
# @ 2016 florian DA COSTA @ Akretion
# © 2016 @author Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# @ 2020 Giovanni Serra @ GSlab.it
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Attachment Synchronize",
"version": "12.0.2.0.0",
"author": "Akretion,Odoo Community Association (OCA)",
"website": "https://github.com/oca/server-tools",
"maintainers": ["florian-dacosta", "sebastienbeau", "GSLabIt", "bealdav"],
"license": "AGPL-3",
"category": "Generic Modules",
"depends": [
"attachment_queue",
"storage_backend", # https://github.com/OCA/storage
],
"data": [
"views/attachment_queue_views.xml",
"views/attachment_synchronize_task_views.xml",
"views/storage_backend_views.xml",
"data/cron.xml",
"security/ir.model.access.csv",
],
"demo": ["demo/attachment_synchronize_task_demo.xml"],
"installable": True,
"development_status": "Beta",
}

16
attachment_synchronize/data/cron.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<record model="ir.cron" id="cronjob_run_attachment_synchronize_task_import">
<field name='name'>Run attachment tasks import</field>
<field name='interval_number'>30</field>
<field name='interval_type'>minutes</field>
<field name="numbercall">-1</field>
<field name="active">False</field>
<field name="doall" eval="False" />
<field name="model_id" ref="model_attachment_synchronize_task"/>
<field name="state">code</field>
<field name="code">model.run_task_import_scheduler()</field>
</record>
</odoo>

25
attachment_synchronize/demo/attachment_synchronize_task_demo.xml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="import_from_filestore" model="attachment.synchronize.task">
<field name="name">TEST Import</field>
<field name="backend_id" ref="storage_backend.default_storage_backend"/>
<field name="method_type">import</field>
<field name="after_import">delete</field>
<field name="filepath">test_import</field>
</record>
<record id="export_to_filestore" model="attachment.synchronize.task">
<field name="name">TEST Export</field>
<field name="backend_id" ref="storage_backend.default_storage_backend"/>
<field name="method_type">export</field>
<field name="filepath">test_export</field>
</record>
<record id="attachment_queue_imported_demo" model="attachment.queue">
<field name="datas">bWlncmF0aW9uIHRlc3Q=</field>
<field name="datas_fname">attachment_queue_imported_demo.doc</field>
<field name="name">attachment_queue_imported_demo.doc</field>
<field name="task_id" ref="import_from_filestore" />
</record>
</odoo>

345
attachment_synchronize/i18n/attachment_synchronize.pot

@ -0,0 +1,345 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_synchronize
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.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: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "<span class=\"o_stat_text\">Fail</span>"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "<span class=\"o_stat_text\">Pending</span>"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "<span class=\"o_stat_text\">Success</span>"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__after_import
msgid "Action after import a file"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_tree
msgid "Active/Inactive"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__after_import
msgid "After Import"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__assigned_attachment_ids
msgid "Assigned Attachments"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__attachment_ids
msgid "Attachment"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_search
msgid "Attachment Task"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model,name:attachment_synchronize.model_attachment_synchronize_task
msgid "Attachment synchronize task"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_search
msgid "Attachments"
msgstr ""
#. module: attachment_synchronize
#: model:ir.actions.act_window,name:attachment_synchronize.action_attachment_export_task
#: model:ir.ui.menu,name:attachment_synchronize.menu_attachment_export_task
msgid "Attachments Export Tasks"
msgstr ""
#. module: attachment_synchronize
#: model:ir.actions.act_window,name:attachment_synchronize.action_attachment_import_task
#: model:ir.ui.menu,name:attachment_synchronize.menu_attachment_import_task
msgid "Attachments Import Tasks"
msgstr ""
#. module: attachment_synchronize
#: model:ir.actions.act_window,name:attachment_synchronize.action_attachment_queue_related
msgid "Attachments Queue"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__avoid_duplicated_files
msgid "Avoid importing duplicated files"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__backend_id
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_search
msgid "Backend"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_tree
msgid "Copy"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__count_attachment_done
msgid "Count Attachment Done"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__count_attachment_failed
msgid "Count Attachment Failed"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__count_attachment_pending
msgid "Count Attachment Pending"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__create_uid
msgid "Created by"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__create_date
msgid "Created on"
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,after_import:0
msgid "Delete"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__display_name
msgid "Display Name"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__active
msgid "Enabled"
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.queue,file_type:0
msgid "Export File (External location)"
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,method_type:0
msgid "Export Task"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_storage_backend__export_task_count
msgid "Export Tasks"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__failure_emails
msgid "Failure Emails"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__filepath
msgid "File Path"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_queue__file_type
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__file_type
msgid "File Type"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__id
msgid "ID"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__avoid_duplicated_files
msgid "If checked, a file will not be imported if an Attachment Queue with the same name already exists."
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,method_type:0
msgid "Import Task"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_storage_backend__import_task_count
msgid "Import Tasks"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "Importation"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__move_path
msgid "Imported File will be moved to this path"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__new_name
msgid "Imported File will be renamed to this name.\n"
"New Name can use 'mako' template where 'obj' is the original file's name.\n"
"For instance : ${obj.name}-${obj.create_date}.csv"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task____last_update
msgid "Last Modified on"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__write_uid
msgid "Last Updated by"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__write_date
msgid "Last Updated on"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_queue__method_type
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__method_type
msgid "Method Type"
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,after_import:0
msgid "Move"
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,after_import:0
msgid "Move & Rename"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__move_path
msgid "Move Path"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__name
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "Name"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__new_name
msgid "New Name"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "Notification"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__filepath
msgid "Path to imported/exported files in the Backend"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__pattern
msgid "Pattern used to select the files to be imported following the 'fnmatch' special characters (e.g. '*.txt' to catch all the text files).\n"
"If empty, import all the files found in 'File Path'."
msgstr ""
#. module: attachment_synchronize
#: selection:attachment.synchronize.task,after_import:0
msgid "Rename"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_tree
msgid "Run"
msgstr ""
#. module: attachment_synchronize
#: model:ir.actions.server,name:attachment_synchronize.cronjob_run_attachment_synchronize_task_import_ir_actions_server
#: model:ir.cron,cron_name:attachment_synchronize.cronjob_run_attachment_synchronize_task_import
#: model:ir.cron,name:attachment_synchronize.cronjob_run_attachment_synchronize_task_import
msgid "Run attachment tasks import"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_synchronize_task__pattern
msgid "Selection Pattern"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_queue__storage_backend_id
msgid "Storage Backend"
msgstr ""
#. module: attachment_synchronize
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_form
msgid "Storage Location"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_attachment_queue__task_id
msgid "Task"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,field_description:attachment_synchronize.field_storage_backend__synchronize_task_ids
#: model_terms:ir.ui.view,arch_db:attachment_synchronize.view_attachment_task_tree
msgid "Tasks"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_queue__file_type
msgid "The file type determines an import method to be used to parse and transform data before their import in ERP or an export"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__failure_emails
msgid "Used to fill the 'Failure Emails' field in the 'Attachments Queues' related to this task.\n"
"An alert will be sent to these emails if any operation on these Attachment Queue's file type fails."
msgstr ""
#. module: attachment_synchronize
#: model:ir.model.fields,help:attachment_synchronize.field_attachment_synchronize_task__file_type
msgid "Used to fill the 'File Type' field in the imported 'Attachments Queues'.\n"
"Further operations will be realized on these Attachments Queues depending on their 'File Type' value."
msgstr ""
#. module: attachment_synchronize
#: model:ir.model,name:attachment_synchronize.model_attachment_queue
msgid "attachment.queue"
msgstr ""
#. module: attachment_synchronize
#: model:ir.model,name:attachment_synchronize.model_storage_backend
msgid "storage.backend"
msgstr ""

1
attachment_synchronize/models/__init__.py

@ -0,0 +1 @@
from . import attachment_queue, attachment_synchronize_task, storage_backend

39
attachment_synchronize/models/attachment_queue.py

@ -0,0 +1,39 @@
# @ 2016 Florian DA COSTA @ Akretion
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import os
from odoo import api, models, fields
class AttachmentQueue(models.Model):
_inherit = "attachment.queue"
task_id = fields.Many2one("attachment.synchronize.task", string="Task")
method_type = fields.Selection(related="task_id.method_type")
storage_backend_id = fields.Many2one(
"storage.backend",
string="Storage Backend",
related="task_id.backend_id",
store=True,
)
file_type = fields.Selection(
selection_add=[("export", "Export File (External location)")]
)
def _run(self):
super()._run()
if self.file_type == "export":
path = os.path.join(self.task_id.filepath, self.datas_fname)
self.storage_backend_id._add_b64_data(path, self.datas)
def _get_failure_emails(self):
res = super()._get_failure_emails()
if self.task_id.failure_emails:
res = self.task_id.failure_emails
return res
@api.onchange("task_id")
def onchange_task_id(self):
for attachment in self:
if attachment.task_id.method_type == "export":
attachment.file_type = "export"

232
attachment_synchronize/models/attachment_synchronize_task.py

@ -0,0 +1,232 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import datetime
import logging
import os
import odoo
from odoo import api, fields, models, tools
from odoo.osv import expression
_logger = logging.getLogger(__name__)
try:
# We use a jinja2 sandboxed environment to render mako templates.
# Note that the rendering does not cover all the mako syntax, in particular
# arbitrary Python statements are not accepted, and not all expressions are
# allowed: only "public" attributes (not starting with '_') of objects may
# be accessed.
# This is done on purpose: it prevents incidental or malicious execution of
# Python code that may break the security of the server.
from jinja2.sandbox import SandboxedEnvironment
mako_template_env = SandboxedEnvironment(
variable_start_string="${",
variable_end_string="}",
line_statement_prefix="%",
trim_blocks=True, # do not output newline after blocks
)
mako_template_env.globals.update(
{
"str": str,
"datetime": datetime,
"len": len,
"abs": abs,
"min": min,
"max": max,
"sum": sum,
"filter": filter,
"map": map,
"round": round,
}
)
except ImportError:
_logger.warning("jinja2 not available, templating features will not work!")
class AttachmentSynchronizeTask(models.Model):
_name = "attachment.synchronize.task"
_description = "Attachment synchronize task"
name = fields.Char(required=True)
method_type = fields.Selection(
[("import", "Import Task"), ("export", "Export Task")], required=True
)
pattern = fields.Char(
string="Selection Pattern",
help="Pattern used to select the files to be imported following the 'fnmatch' "
"special characters (e.g. '*.txt' to catch all the text files).\n"
"If empty, import all the files found in 'File Path'.",
)
filepath = fields.Char(
string="File Path", help="Path to imported/exported files in the Backend"
)
backend_id = fields.Many2one("storage.backend", string="Backend")
attachment_ids = fields.One2many("attachment.queue", "task_id", string="Attachment")
move_path = fields.Char(
string="Move Path", help="Imported File will be moved to this path"
)
new_name = fields.Char(
string="New Name",
help="Imported File will be renamed to this name.\n"
"New Name can use 'mako' template where 'obj' is the original file's name.\n"
"For instance : ${obj.name}-${obj.create_date}.csv",
)
after_import = fields.Selection(
selection=[
("rename", "Rename"),
("move", "Move"),
("move_rename", "Move & Rename"),
("delete", "Delete"),
],
help="Action after import a file",
)
file_type = fields.Selection(
selection=[],
string="File Type",
help="Used to fill the 'File Type' field in the imported 'Attachments Queues'."
"\nFurther operations will be realized on these Attachments Queues depending "
"on their 'File Type' value.",
)
active = fields.Boolean("Enabled", default=True, old="enabled")
avoid_duplicated_files = fields.Boolean(
string="Avoid importing duplicated files",
help="If checked, a file will not be imported if an Attachment Queue with the "
"same name already exists.",
)
failure_emails = fields.Char(
string="Failure Emails",
help="Used to fill the 'Failure Emails' field in the 'Attachments Queues' "
"related to this task.\nAn alert will be sent to these emails if any operation "
"on these Attachment Queue's file type fails.",
)
count_attachment_failed = fields.Integer(compute="_compute_count_state")
count_attachment_pending = fields.Integer(compute="_compute_count_state")
count_attachment_done = fields.Integer(compute="_compute_count_state")
def _compute_count_state(self):
for record in self:
for state in ["failed", "pending", "done"]:
record["count_attachment_{}".format(state)] = \
len(record.attachment_ids.filtered(lambda r: r.state == state))
def _prepare_attachment_vals(self, data, filename):
self.ensure_one()
vals = {
"name": filename,
"datas": data,
"datas_fname": filename,
"task_id": self.id,
"file_type": self.file_type or False,
}
return vals
@api.model
def _template_render(self, template, record):
try:
template = mako_template_env.from_string(tools.ustr(template))
except Exception:
_logger.exception("Failed to load template '{}'".format(template))
variables = {"obj": record}
try:
render_result = template.render(variables)
except Exception:
_logger.exception(
"Failed to render template '{}'' using values '{}'".format(
template, variables
)
)
render_result = u""
if render_result == u"False":
render_result = u""
return render_result
@api.model
def run_task_import_scheduler(self, domain=None):
if domain is None:
domain = []
domain = expression.AND(
[domain, [("method_type", "=", "import")]]
)
for task in self.search(domain):
task.run_import()
def run(self):
for record in self:
method = "run_{}".format(record.method_type)
if not hasattr(self, method):
raise NotImplemented
else:
getattr(record, method)()
def run_import(self):
self.ensure_one()
attach_obj = self.env["attachment.queue"]
backend = self.backend_id
filepath = self.filepath or ""
filenames = backend._list(relative_path=filepath, pattern=self.pattern)
if self.avoid_duplicated_files:
filenames = self._file_to_import(filenames)
total_import = 0
for file_name in filenames:
with api.Environment.manage():
with odoo.registry(self.env.cr.dbname).cursor() as new_cr:
new_env = api.Environment(new_cr, self.env.uid, self.env.context)
try:
full_absolute_path = os.path.join(filepath, file_name)
data = backend._get_b64_data(full_absolute_path)
attach_vals = self._prepare_attachment_vals(data, file_name)
attachment = attach_obj.with_env(new_env).create(attach_vals)
new_full_path = False
if self.after_import == "rename":
new_name = self._template_render(self.new_name, attachment)
new_full_path = os.path.join(filepath, new_name)
elif self.after_import == "move":
new_full_path = os.path.join(self.move_path, file_name)
elif self.after_import == "move_rename":
new_name = self._template_render(self.new_name, attachment)
new_full_path = os.path.join(self.move_path, new_name)
if new_full_path:
backend._add_b64_data(new_full_path, data)
if self.after_import in (
"delete",
"rename",
"move",
"move_rename",
):
backend._delete(full_absolute_path)
total_import += 1
except Exception as e:
new_env.cr.rollback()
raise e
else:
new_env.cr.commit()
_logger.info("Run import complete! Imported {0} files".format(total_import))
def _file_to_import(self, filenames):
imported = (
self.env["attachment.queue"]
.search([("name", "in", filenames)])
.mapped("name")
)
return list(set(filenames) - set(imported))
def run_export(self):
for task in self:
task.attachment_ids.filtered(lambda a: a.state == "pending").run()
def button_duplicate_record(self):
# due to orm limitation method call from ui should not have params
# so we need to define this method to be able to copy
# if we do not do this the context will be injected in default params
# in V14 maybe we can call copy directly
self.copy()
def copy(self, default=None):
if default is None:
default = {}
if "active" not in default:
default["active"] = False
return super().copy(default=default)

67
attachment_synchronize/models/storage_backend.py

@ -0,0 +1,67 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class StorageBackend(models.Model):
_inherit = "storage.backend"
synchronize_task_ids = fields.One2many(
"attachment.synchronize.task", "backend_id", string="Tasks"
)
import_task_count = fields.Integer(
"Import Tasks", compute="_compute_import_task_count"
)
export_task_count = fields.Integer(
"Export Tasks", compute="_compute_export_task_count"
)
def _compute_import_task_count(self):
for rec in self:
rec.import_task_count = len(
rec.synchronize_task_ids.filtered(lambda t: t.method_type == "import")
)
def _compute_export_task_count(self):
for rec in self:
rec.export_task_count = len(
rec.synchronize_task_ids.filtered(lambda t: t.method_type == "export")
)
def action_related_import_task(self):
self.ensure_one()
act_window_xml_id = "attachment_synchronize.action_attachment_import_task"
act_window = self.env.ref(act_window_xml_id).read()[0]
domain = [
("id", "in", self.synchronize_task_ids.ids),
("method_type", "=", "import"),
]
act_window["domain"] = domain
if self.import_task_count == 1:
form = self.env.ref("attachment_synchronize.view_attachment_task_form")
act_window["views"] = [(form.id, "form")]
act_window["res_id"] = (
self.env["attachment.synchronize.task"].search(domain).id
)
return act_window
def action_related_export_task(self):
self.ensure_one()
act_window_xml_id = "attachment_synchronize.action_attachment_export_task"
act_window = self.env.ref(act_window_xml_id).read()[0]
domain = [
("id", "in", self.synchronize_task_ids.ids),
("method_type", "=", "export"),
]
act_window["domain"] = domain
if self.export_task_count == 1:
form = self.env.ref("attachment_synchronize.view_attachment_task_form")
act_window["views"] = [(form.id, "form")]
act_window["res_id"] = (
self.env["attachment.synchronize.task"].search(domain).id
)
return act_window

10
attachment_synchronize/readme/CONTRIBUTORS.rst

@ -0,0 +1,10 @@
`Akretion <https://www.akretion.com/>`_ :
- Valentin CHEMIERE
- Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
- Florian DA COSTA <florian.dacosta@akretion.com>
- Clément MOMBEREAU <clement.mombereau@akretion.com.br>
GS Lab:
- Giovanni SERRA <giovanni@gslab.it>

5
attachment_synchronize/readme/DESCRIPTION.rst

@ -0,0 +1,5 @@
This module allows to **import/export files** from/to backend servers.
A backend server is defined by the basic `storage_backend <https://github.com/OCA/storage/tree/12.0/storage_backend>`_ OCA module, while it can be configured (amazon S3, sftp,...) with additional modules from the `storage <https://github.com/oca/storage>`_ repository.
The imported files (and the files to be exported) are stored in Odoo as ``attachment.queue`` objects, defined by the `attachment_queue <https://github.com/OCA/server-tools/tree/12.0/attachment_queue>`_ module while the importation itself (resp. exportation) is realized by **"Attachments Import Tasks"** (resp. "Attachments Export Tasks") defined by this current module.

19
attachment_synchronize/readme/USAGE.rst

@ -0,0 +1,19 @@
As importation and exportation are different processes, they are triggered in different ways :
**To import files**, you need to create an *"Attachment Import Task"* (menu *Settings > Technical > Attachments Import Tasks*) which defines :
- where to find the files to import from the backend server (path to the files, selection pattern)
- what to do with the source files in the backend server (avoid duplicates, delete/rename after import...)
- how the files will be processed once imported (through the **File Type** field).
.. image:: ../static/description/import_task.png
.. epigraph::
🔎 The **File Type** options are defined by other modules built to process the Attachments Queues with the same "File Type".
**To export files**, you need first to register them as *"Attachments Queues"* objects linked to an *"Attachment Export Task"* (which set automatically their **File Type** to *"Export File (External Location)"*).
Then, you can export one file at a time from the *Attachment Queue*'s form view, or export all the *Attachments Queues* in a pending state related to the same *Export Task* from the given *Export Task* form view (menu *Settings > Technical > Attachments Export Tasks*) :
.. image:: ../static/description/export_task.png

2
attachment_synchronize/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_attachment_synchronize_task_manager,attachment.synchronize.task.manager,model_attachment_synchronize_task,base.group_system,1,1,1,1

BIN
attachment_synchronize/static/description/export_task.png

After

Width: 1281  |  Height: 616  |  Size: 61 KiB

BIN
attachment_synchronize/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

BIN
attachment_synchronize/static/description/import_task.png

After

Width: 1296  |  Height: 585  |  Size: 68 KiB

448
attachment_synchronize/static/description/index.html

@ -0,0 +1,448 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Attachment Synchronize</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="attachment-synchronize">
<h1 class="title">Attachment Synchronize</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/attachment_synchronize"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-attachment_synchronize"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/149/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module allows to <strong>import/export files</strong> from/to backend servers.</p>
<p>A backend server is defined by the basic <a class="reference external" href="https://github.com/OCA/storage/tree/12.0/storage_backend">storage_backend</a> OCA module, while it can be configured (amazon S3, sftp,…) with additional modules from the <a class="reference external" href="https://github.com/oca/storage">storage</a> repository.</p>
<p>The imported files (and the files to be exported) are stored in Odoo as <tt class="docutils literal">attachment.queue</tt> objects, defined by the <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/attachment_queue">attachment_queue</a> module while the importation itself (resp. exportation) is realized by <strong>“Attachments Import Tasks”</strong> (resp. “Attachments Export Tasks”) defined by this current module.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>As importation and exportation are different processes, they are triggered in different ways :</p>
<p><strong>To import files</strong>, you need to create an <em>“Attachment Import Task”</em> (menu <em>Settings &gt; Technical &gt; Attachments Import Tasks</em>) which defines :</p>
<ul class="simple">
<li>where to find the files to import from the backend server (path to the files, selection pattern)</li>
<li>what to do with the source files in the backend server (avoid duplicates, delete/rename after import…)</li>
<li>how the files will be processed once imported (through the <strong>File Type</strong> field).</li>
</ul>
<img alt="https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/import_task.png" src="https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/import_task.png" />
<blockquote class="epigraph">
🔎 The <strong>File Type</strong> options are defined by other modules built to process the Attachments Queues with the same “File Type”.</blockquote>
<p><strong>To export files</strong>, you need first to register them as <em>“Attachments Queues”</em> objects linked to an <em>“Attachment Export Task”</em> (which set automatically their <strong>File Type</strong> to <em>“Export File (External Location)”</em>).</p>
<p>Then, you can export one file at a time from the <em>Attachment Queue</em>’s form view, or export all the <em>Attachments Queues</em> in a pending state related to the same <em>Export Task</em> from the given <em>Export Task</em> form view (menu <em>Settings &gt; Technical &gt; Attachments Export Tasks</em>) :</p>
<img alt="https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/export_task.png" src="https://raw.githubusercontent.com/OCA/server-tools/12.0/attachment_synchronize/static/description/export_task.png" />
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/server-tools/issues/new?body=module:%20attachment_synchronize%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<p><a class="reference external" href="https://www.akretion.com/">Akretion</a> :</p>
<ul class="simple">
<li>Valentin CHEMIERE</li>
<li>Mourad EL HADJ MIMOUNE &lt;<a class="reference external" href="mailto:mourad.elhadj.mimoune&#64;akretion.com">mourad.elhadj.mimoune&#64;akretion.com</a>&gt;</li>
<li>Florian DA COSTA &lt;<a class="reference external" href="mailto:florian.dacosta&#64;akretion.com">florian.dacosta&#64;akretion.com</a>&gt;</li>
<li>Clément MOMBEREAU &lt;<a class="reference external" href="mailto:clement.mombereau&#64;akretion.com.br">clement.mombereau&#64;akretion.com.br</a>&gt;</li>
</ul>
<p>GS Lab:</p>
<ul class="simple">
<li>Giovanni SERRA &lt;<a class="reference external" href="mailto:giovanni&#64;gslab.it">giovanni&#64;gslab.it</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external" href="https://github.com/florian-dacosta"><img alt="florian-dacosta" src="https://github.com/florian-dacosta.png?size=40px" /></a> <a class="reference external" href="https://github.com/sebastienbeau"><img alt="sebastienbeau" src="https://github.com/sebastienbeau.png?size=40px" /></a> <a class="reference external" href="https://github.com/GSLabIt"><img alt="GSLabIt" src="https://github.com/GSLabIt.png?size=40px" /></a> <a class="reference external" href="https://github.com/bealdav"><img alt="bealdav" src="https://github.com/bealdav.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/server-tools/tree/12.0/attachment_synchronize">OCA/server-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

2
attachment_synchronize/tests/__init__.py

@ -0,0 +1,2 @@
from . import test_import
from . import test_export

43
attachment_synchronize/tests/common.py

@ -0,0 +1,43 @@
# Copyright 2020 Akretion (http://www.akretion.com).
# @author Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import mock
import os
from odoo.addons.storage_backend.tests.common import Common
class SyncCommon(Common):
def _clean_testing_directory(self):
for test_dir in [
self.directory_input,
self.directory_output,
self.directory_archived,
]:
for filename in self.backend._list(test_dir):
self.backend._delete(os.path.join(test_dir, filename))
def _create_test_file(self):
self.backend._add_b64_data(
os.path.join(self.directory_input, "bar.txt"),
self.filedata,
mimetype=u"text/plain",
)
def setUp(self):
super().setUp()
self.env.cr.commit = mock.Mock()
self.registry.enter_test_mode(self.env.cr)
self.directory_input = "test_import"
self.directory_output = "test_export"
self.directory_archived = "test_archived"
self._clean_testing_directory()
self._create_test_file()
self.task = self.env.ref(
"attachment_synchronize.import_from_filestore"
)
def tearDown(self):
self.registry.leave_test_mode()
self._clean_testing_directory()
super().tearDown()

42
attachment_synchronize/tests/test_export.py

@ -0,0 +1,42 @@
# Copyright 2020 Akretion (http://www.akretion.com).
# @author Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import mock
from .common import SyncCommon
from odoo.tools import mute_logger
def raising_side_effect(*args, **kwargs):
raise Exception("Boom")
class TestExport(SyncCommon):
def setUp(self):
super().setUp()
self.task = self.env.ref("attachment_synchronize.export_to_filestore")
self.attachment = self.env["attachment.queue"].create(
{
"name": "foo.txt",
"datas_fname": "foo.txt",
"task_id": self.task.id,
"file_type": "export",
"datas": self.filedata,
}
)
def test_export(self):
self.attachment.run()
result = self.backend._list("test_export")
self.assertEqual(result, ["foo.txt"])
@mute_logger("odoo.addons.attachment_queue.models.attachment_queue")
def test_failing_export(self):
with mock.patch.object(
type(self.backend),
"_add_b64_data",
side_effect=raising_side_effect,
):
self.attachment.run()
self.assertEqual(self.attachment.state, "failed")
self.assertEqual(self.attachment.state_message, "Boom")

83
attachment_synchronize/tests/test_import.py

@ -0,0 +1,83 @@
# Copyright 2020 Akretion (http://www.akretion.com).
# @author Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from .common import SyncCommon
class TestImport(SyncCommon):
@property
def archived_files(self):
return self.backend._list(self.directory_archived)
@property
def input_files(self):
return self.backend._list(self.directory_input)
def _check_attachment_created(self, count=1):
attachment = self.env["attachment.queue"].search([("name", "=", "bar.txt")])
self.assertEqual(len(attachment), count)
def test_import_with_rename(self):
self.task.write({"after_import": "rename", "new_name": "foo.txt"})
self.task.run_import()
self._check_attachment_created()
self.assertEqual(self.input_files, ["foo.txt"])
self.assertEqual(self.archived_files, [])
def test_import_with_move(self):
self.task.write({"after_import": "move", "move_path": self.directory_archived})
self.task.run_import()
self._check_attachment_created()
self.assertEqual(self.input_files, [])
self.assertEqual(self.archived_files, ["bar.txt"])
def test_import_with_move_and_rename(self):
self.task.write(
{
"after_import": "move_rename",
"new_name": "foo.txt",
"move_path": self.directory_archived,
}
)
self.task.run_import()
self._check_attachment_created()
self.assertEqual(self.input_files, [])
self.assertEqual(self.archived_files, ["foo.txt"])
def test_import_with_delete(self):
self.task.write({"after_import": "delete"})
self.task.run_import()
self._check_attachment_created()
self.assertEqual(self.input_files, [])
self.assertEqual(self.archived_files, [])
def test_import_twice(self):
self.task.write({"after_import": "delete"})
self.task.run_import()
self._check_attachment_created(count=1)
self._create_test_file()
self.task.run_import()
self._check_attachment_created(count=2)
def test_import_twice_no_duplicate(self):
self.task.write(
{"after_import": "delete", "avoid_duplicated_files": True}
)
self.task.run_import()
self._check_attachment_created(count=1)
self._create_test_file()
self.task.run_import()
self._check_attachment_created(count=1)
def test_running_cron(self):
self.task.write({"after_import": "delete"})
self.env["attachment.synchronize.task"].run_task_import_scheduler()
self._check_attachment_created(count=1)
def test_running_cron_disable_task(self):
self.task.write({"after_import": "delete", "active": False})
self.env["attachment.synchronize.task"].run_task_import_scheduler()
self._check_attachment_created(count=0)

56
attachment_synchronize/views/attachment_queue_views.xml

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_attachment_queue_form" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="inherit_id" ref="attachment_queue.view_attachment_queue_form" />
<field name="arch" type="xml">
<!-- Add Related Task and Backend -->
<xpath expr="//field[@name='url']" position="after">
<field name="method_type" invisible="1"/>
<field
name="task_id"
domain="[('method_type', '!=', 'import')]"
attrs="{'required': [('file_type', '=', 'export')], 'readonly': [('method_type', '=', 'import')]}"
/>
<field name="storage_backend_id"/>
</xpath>
</field>
</record>
<record id="view_attachment_queue_tree" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="inherit_id" ref="attachment_queue.view_attachment_queue_tree" />
<field name="arch" type="xml">
<xpath expr="//tree" position="attributes">
<attribute name="decoration-muted">state == 'done'</attribute>
</xpath>
<xpath expr="//field[@name='file_type']" position="after">
<field name="task_id"/>
<field name="storage_backend_id"/>
</xpath>
</field>
</record>
<record id="attachment_queue_view_search" model="ir.ui.view">
<field name="model">attachment.queue</field>
<field name="inherit_id" ref="attachment_queue.view_attachment_queue_search"/>
<field name="arch" type="xml">
<field name="type" position="after">
<field name="task_id" filter_domain="[('task_id.name','ilike',self)]"/>
</field>
</field>
</record>
<record id="action_attachment_queue_related" model="ir.actions.act_window">
<field name="name">Attachments Queue</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">attachment.queue</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="domain">[('task_id', '=', active_id)]</field>
<field name="search_view_id" ref="attachment_queue.view_attachment_queue_search"/>
</record>
</odoo>

147
attachment_synchronize/views/attachment_synchronize_task_views.xml

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_attachment_task_form" model="ir.ui.view">
<field name="model">attachment.synchronize.task</field>
<field name="arch" type="xml">
<form>
<header>
<button name="run" type="object" string="Run" class="oe_read_only oe_highlight" icon="fa-play-circle" attrs="{'invisible': [('active','=', False)]}"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="%(action_attachment_queue_related)d" type="action" class="oe_stat_button" icon="fa-thumbs-o-down" context="{'search_default_failed': 1}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="count_attachment_failed" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_text">Fail</span>
</div>
</button>
<button name="%(action_attachment_queue_related)d" type="action" class="oe_stat_button" icon="fa-spinner" context="{'search_default_pending': 1}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="count_attachment_pending" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_text">Pending</span>
</div>
</button>
<button name="%(action_attachment_queue_related)d" type="action" class="oe_stat_button" icon="fa-thumbs-o-up" context="{'search_default_done': 1}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="count_attachment_done" widget="statinfo" nolabel="1"/>
</span>
<span class="o_stat_text">Success</span>
</div>
</button>
<button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
<field
name="active"
widget="boolean_button"
options="{'terminology': {
'string_true': 'Enabled',
'hover_true': &quot;Disable&quot;,
'string_false': 'Disabled',
'hover_false': &quot;Enable&quot;,
}}"
/>
</button>
</div>
<field name="method_type" invisible="1"/>
<div class="oe_title">
<label class="oe_edit_only" for="name" string="Name"/>
<h1>
<field name="name" class="oe_inline"/>
</h1>
<field name="create_date" invisible="1" />
<field name="method_type" widget="radio" options="{'horizontal': true}" attrs="{'readonly':[('create_date', '!=', False)]}"/>
</div>
<group string="Storage Location" class="col-12 col-lg-6">
<field name="backend_id"/>
<field name="filepath"/>
<field name="pattern" attrs="{'invisible':[('method_type','!=','import')]}"/>
</group>
<group name="action" string="Importation" attrs="{'invisible':[('method_type','!=','import')]}" class="col-12 col-lg-6">
<field name="avoid_duplicated_files" />
<field name="after_import" />
<field name="move_path" colspan="4" attrs="{'invisible':[('after_import','!=','move'), ('after_import','!=','move_rename')]}"/>
<field name="new_name" colspan="4" attrs="{'invisible': [('after_import','!=','rename'), ('after_import','!=','move_rename')]}"/>
<field name="file_type"/>
</group>
<group string="Notification">
<field name="failure_emails"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_attachment_task_tree" model="ir.ui.view">
<field name="model">attachment.synchronize.task</field>
<field name="arch" type="xml">
<tree string="Tasks" decoration-muted="active == False">
<field name="name" select="1"/>
<field name="backend_id"/>
<field name="filepath"/>
<field name="active" invisible="1"/>
<button name="run" type="object" string="Run" icon="fa-play-circle"/>
<field name="count_attachment_failed" string=" "/>
<button name="%(action_attachment_queue_related)d" type="action" icon="fa-thumbs-o-down" context="{'search_default_failed': 1}"/>
<field name="count_attachment_pending" string=" "/>
<button name="%(action_attachment_queue_related)d" type="action" icon="fa-spinner" context="{'search_default_pending': 1}"/>
<field name="count_attachment_done" string=" "/>
<button name="%(action_attachment_queue_related)d" type="action" icon="fa-thumbs-o-up" context="{'search_default_done': 1}"/>
<button name="button_duplicate_record" type="object" string="Copy" icon="fa-clone" invisible="not context.get('show_duplicate_button')"/>
<button name="toggle_active" type="object" string="Active/Inactive" icon="fa-archive" invisible="not context.get('show_toggle_active_button')"/>
</tree>
</field>
</record>
<record id="view_attachment_task_search" model="ir.ui.view">
<field name="model">attachment.synchronize.task</field>
<field name="arch" type="xml">
<search string="Attachments">
<field name="name" filter_domain="['|', ('name','ilike',self), ('datas_fname','ilike',self)]" string="Attachment Task"/>
<field name="create_date"/>
<filter string="Backend" name="backend" context="{'group_by':'backend_id'}"/>
</search>
</field>
</record>
<!-- Attachments Import Tasks Menu -->
<record id="action_attachment_import_task" model="ir.actions.act_window">
<field name="name">Attachments Import Tasks</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">attachment.synchronize.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="view_attachment_task_search"/>
<field name="domain">[('method_type', '=', 'import')]</field>
<field name="context">{'default_method_type': 'import', "active_test": False}</field>
</record>
<menuitem id="menu_attachment_import_task"
parent="base.next_id_9"
sequence="21"
action="action_attachment_import_task"/>
<!-- Attachments Export Tasks Menu -->
<record id="action_attachment_export_task" model="ir.actions.act_window">
<field name="name">Attachments Export Tasks</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">attachment.synchronize.task</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="view_attachment_task_search"/>
<field name="domain">[('method_type', '=', 'export')]</field>
<field name="context">{'default_method_type': 'export', "active_test": False}</field>
</record>
<menuitem id="menu_attachment_export_task"
parent="base.next_id_9"
sequence="22"
action="action_attachment_export_task"/>
</odoo>

34
attachment_synchronize/views/storage_backend_views.xml

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_storage_backend_form" model="ir.ui.view">
<field name="model">storage.backend</field>
<field name="inherit_id" ref="storage_backend.storage_backend_view_form" />
<field name="priority" eval="250"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_title')]" position="before">
<div class="oe_button_box" name="button_box">
<button
class="oe_stat_button"
type="object"
attrs="{'invisible': [('import_task_count', '&lt;', 1)]}"
name="action_related_import_task"
icon="fa-download"
>
<field name="import_task_count" widget="statinfo" />
</button>
<button
class="oe_stat_button"
type="object"
attrs="{'invisible': [('export_task_count', '&lt;', 1)]}"
name="action_related_export_task"
icon="fa-upload"
>
<field name="export_task_count" widget="statinfo" />
</button>
</div>
</xpath>
</field>
</record>
</odoo>

39
auditlog/README.rst

@ -33,22 +33,19 @@ models such as ``create``, ``read``, ``write`` and ``delete``.
.. contents::
:local:
Usage
=====
Configuration
=============
Rules
~~~~~
Go to `Settings / Technical / Audit / Rules` to subscribe rules. A rule defines
which operations to log for a given data model.
.. image:: https://raw.githubusercontent.com/auditlog/static/description/rule.png
Then, check logs in the `Settings / Technical / Audit / Logs` menu. You can
group them by user sessions, date, data model or HTTP requests:
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/auditlog/static/description/rule.png
.. image:: https://raw.githubusercontent.com/auditlog/static/description/logs.png
Get the details:
.. image:: https://raw.githubusercontent.com/auditlog/static/description/log.png
Cleanup
~~~~~~~
A scheduled action exists to delete logs older than 6 months (180 days)
automatically but is not enabled by default.
@ -56,13 +53,25 @@ To activate it and/or change the delay, go to the
`Configuration / Technical / Automation / Scheduled Actions` menu and edit the
`Auto-vacuum audit logs` entry:
.. image:: https://raw.githubusercontent.com/auditlog/static/description/autovacuum.png
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/auditlog/static/description/autovacuum.png
Usage
=====
Check logs in the `Settings / Technical / Audit / Logs` menu. You can
group them by user sessions, date, data model or HTTP requests:
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/auditlog/static/description/logs.png
Get the details:
.. image:: https://raw.githubusercontent.com/OCA/server-tools/12.0/auditlog/static/description/log.png
Known issues / Roadmap
======================
* log only operations triggered by some users (currently it logs all users)
* log read operations does not work on all data models, need investigation
* Log only operations triggered by some users. Currently it logs all users.
* Logging read operations does not work on all data models. Need investigation.
Bug Tracker
===========
@ -88,6 +97,8 @@ Contributors
* Sebastien Alix <sebastien.alix@camptocamp.com>
* Holger Brunn <hbrunn@therp.nl>
* Holden Rehg <holdenrehg@gmail.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Hardik Suthar <hsuthar@opensourceintegrators.com>
Other credits
~~~~~~~~~~~~~

2
auditlog/__manifest__.py

@ -3,7 +3,7 @@
{
'name': "Audit Log",
'version': "12.0.1.0.0",
'version': "12.0.1.0.2",
'author': "ABF OSIELL,Odoo Community Association (OCA)",
'license': "AGPL-3",
'website': "https://github.com/OCA/server-tools/",

12
auditlog/i18n/am.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/ar.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/auditlog.pot

@ -60,6 +60,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -331,6 +336,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid "Select this if you want to keep track of creation on any record of the model of this rule"
@ -437,7 +447,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/bg.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/bs.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/ca.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/cs.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/cs_CZ.po

@ -66,6 +66,11 @@ msgstr "Auditlog - Pravidlo"
msgid "Auto-vacuum audit logs"
msgstr "Auto-vakuové protokoly auditu"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -342,6 +347,11 @@ msgstr "Pravidla"
msgid "Select model for which you want to generate log."
msgstr "Vyberte model, pro který chcete generovat protokol."
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -467,7 +477,7 @@ msgid "Values"
msgstr "Hodnoty"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr "Zobrazení protokolů"

12
auditlog/i18n/da.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/de.po

@ -66,6 +66,11 @@ msgstr "Auditlog - Regel"
msgid "Auto-vacuum audit logs"
msgstr "Auto-vacuum Audit-Protokolle"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -343,6 +348,11 @@ msgstr "Regeln"
msgid "Select model for which you want to generate log."
msgstr "Wählen Sie das Modell, das protokolliert werden soll."
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -468,7 +478,7 @@ msgid "Values"
msgstr "Werte"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr "Protokolle sichten"

12
auditlog/i18n/el_GR.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/en_GB.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es.po

@ -67,6 +67,11 @@ msgstr "Auditlog - Regla"
msgid "Auto-vacuum audit logs"
msgstr "Limpiar automáticamente los auditlogs"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -344,6 +349,11 @@ msgstr "Reglas"
msgid "Select model for which you want to generate log."
msgstr "Seleccione el modelo al que quiere generar un registro."
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -469,7 +479,7 @@ msgid "Values"
msgstr "Valores"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr "Ver registros"

12
auditlog/i18n/es_AR.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_CL.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_CO.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_CR.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_DO.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_EC.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_ES.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

128
auditlog/i18n/es_MX.po

@ -9,61 +9,67 @@ msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-26 01:45+0000\n"
"PO-Revision-Date: 2016-11-26 01:45+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2016\n"
"PO-Revision-Date: 2020-04-29 22:19+0000\n"
"Last-Translator: Jesús Alan Ramos Rodríguez <alan.ramos@jarsa.com.mx>\n"
"Language-Team: Spanish (Mexico) (https://www.transifex.com/oca/teams/23907/"
"es_MX/)\n"
"Language: es_MX\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"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__action_id
msgid "Action"
msgstr ""
msgstr "Acción"
#. module: auditlog
#: model:ir.ui.menu,name:auditlog.menu_audit
msgid "Audit"
msgstr ""
msgstr "Auditoría"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_autovacuum
msgid "Auditlog - Delete old logs"
msgstr ""
msgstr "Auditlog - Eliminar registros antiguos"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_http_session
msgid "Auditlog - HTTP User session log"
msgstr ""
msgstr "Auditlog: registro de sesión de usuario HTTP"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_http_request
msgid "Auditlog - HTTP request log"
msgstr ""
msgstr "Auditlog: registro de solicitudes HTTP"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_log
msgid "Auditlog - Log"
msgstr ""
msgstr "Auditlog - Registros"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_log_line
msgid "Auditlog - Log details (fields updated)"
msgstr ""
msgstr "Auditlog - Detalles del registro (campos actualizados)"
#. module: auditlog
#: model:ir.model,name:auditlog.model_auditlog_rule
msgid "Auditlog - Rule"
msgstr ""
msgstr "Auditlog - Regla"
#. module: auditlog
#: model:ir.actions.server,name:auditlog.ir_cron_auditlog_autovacuum_ir_actions_server
#: model:ir.cron,cron_name:auditlog.ir_cron_auditlog_autovacuum
#: model:ir.cron,name:auditlog.ir_cron_auditlog_autovacuum
msgid "Auto-vacuum audit logs"
msgstr "Auto-eliminar registros de auditoría"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
@ -120,23 +126,23 @@ msgstr "Borrador"
#. module: auditlog
#: selection:auditlog.log,log_type:0 selection:auditlog.rule,log_type:0
msgid "Fast log"
msgstr ""
msgstr "Registro rápido"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__field_id
msgid "Field"
msgstr ""
msgstr "Campo"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__line_ids
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form
msgid "Fields updated"
msgstr ""
msgstr "Campos actualizados"
#. module: auditlog
#: selection:auditlog.log,log_type:0 selection:auditlog.rule,log_type:0
msgid "Full log"
msgstr ""
msgstr "Registro completo"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_type
@ -146,6 +152,11 @@ msgid ""
"Fast log: only log the changes made through the create and write operations "
"(less information, but it is faster)"
msgstr ""
"Registro completo: haga una diferencia entre los datos antes y después de la "
"operación (registre más información como los campos calculados que se "
"actualizaron, pero es más lento)\n"
"Registro rápido: solo registre los cambios realizados a través de las "
"operaciones de creación y escritura (menos información, pero es más rápido)"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search
@ -158,14 +169,14 @@ msgstr "Agrupar por..."
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form
msgid "HTTP Context"
msgstr ""
msgstr "Contexto HTTP"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__http_request_id
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_form
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search
msgid "HTTP Request"
msgstr ""
msgstr "Solicitud HTTP"
#. module: auditlog
#: model:ir.actions.act_window,name:auditlog.action_auditlog_http_request_tree
@ -175,7 +186,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_tree
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_form
msgid "HTTP Requests"
msgstr ""
msgstr "Solicitudes HTTP"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_autovacuum__id
@ -205,7 +216,7 @@ msgstr "Ultima modificacion realizada"
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__write_uid
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__write_uid
msgid "Last Updated by"
msgstr "Ultima actualizacion por"
msgstr "Última actualizacion por"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_autovacuum__write_date
@ -215,38 +226,38 @@ msgstr "Ultima actualizacion por"
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__write_date
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__write_date
msgid "Last Updated on"
msgstr "Ultima actualización realizada"
msgstr "Última actualización realizada"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__log_id
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form
msgid "Log"
msgstr ""
msgstr "Registro"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form
msgid "Log - Field updated"
msgstr ""
msgstr "Registro - Campo actualizado"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_create
msgid "Log Creates"
msgstr ""
msgstr "Registro de Creación"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_unlink
msgid "Log Deletes"
msgstr ""
msgstr "Registro de Eliminación"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_read
msgid "Log Reads"
msgstr ""
msgstr "Registro de Lectura"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__log_write
msgid "Log Writes"
msgstr ""
msgstr "Registro de Escritura"
#. module: auditlog
#: model:ir.actions.act_window,name:auditlog.action_auditlog_log_tree
@ -256,12 +267,12 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_tree
msgid "Logs"
msgstr ""
msgstr "Registros"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__method
msgid "Method"
msgstr ""
msgstr "Método"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__model_id
@ -280,50 +291,50 @@ msgstr "Nombre"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__new_value
msgid "New Value"
msgstr ""
msgstr "Nuevo Valor"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__new_value_text
msgid "New value Text"
msgstr ""
msgstr "Texto de Nuevo Valor"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__old_value
msgid "Old Value"
msgstr ""
msgstr "Valor Anterior"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__old_value_text
msgid "Old value Text"
msgstr ""
msgstr "Texto de Valor Anterior"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__name
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search
msgid "Path"
msgstr ""
msgstr "Ruta"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__res_id
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search
msgid "Resource ID"
msgstr ""
msgstr "ID del Recurso"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__name
msgid "Resource Name"
msgstr ""
msgstr "Nombre del Registro"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__root_url
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_request_search
msgid "Root URL"
msgstr ""
msgstr "URL Raíz"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_form
msgid "Rule"
msgstr ""
msgstr "Regla"
#. module: auditlog
#: model:ir.actions.act_window,name:auditlog.action_auditlog_rule_tree
@ -331,11 +342,16 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_search
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_tree
msgid "Rules"
msgstr ""
msgstr "Reglas"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__model_id
msgid "Select model for which you want to generate log."
msgstr "Seleccione el modelo para el que desea generar el registro."
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
@ -344,6 +360,8 @@ msgid ""
"Select this if you want to keep track of creation on any record of the model "
"of this rule"
msgstr ""
"Seleccione esto si desea realizar un seguimiento de la creación en cualquier "
"registro del modelo de esta regla"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_unlink
@ -351,6 +369,8 @@ msgid ""
"Select this if you want to keep track of deletion on any record of the model "
"of this rule"
msgstr ""
"Seleccione esto si desea realizar un seguimiento de la eliminación en "
"cualquier registro del modelo de esta regla"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_write
@ -358,6 +378,8 @@ msgid ""
"Select this if you want to keep track of modification on any record of the "
"model of this rule"
msgstr ""
"Seleccione esto si desea realizar un seguimiento de la modificación en "
"cualquier registro del modelo de esta regla"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_read
@ -365,17 +387,19 @@ msgid ""
"Select this if you want to keep track of read/open on any record of the "
"model of this rule"
msgstr ""
"Seleccione esto si desea realizar un seguimiento de lectura / apertura en "
"cualquier registro del modelo de esta regla"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__http_session_id
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__http_session_id
msgid "Session"
msgstr ""
msgstr "Sesión"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_session__name
msgid "Session ID"
msgstr ""
msgstr "ID de sesión"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__state
@ -386,18 +410,18 @@ msgstr "Estado"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_form
msgid "Subscribe"
msgstr ""
msgstr "Suscribir"
#. module: auditlog
#: selection:auditlog.rule,state:0
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_search
msgid "Subscribed"
msgstr ""
msgstr "Suscrito"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log_line__field_name
msgid "Technical name"
msgstr ""
msgstr "Nombre técnico"
#. module: auditlog
#: sql_constraint:auditlog.rule:0
@ -405,6 +429,8 @@ msgid ""
"There is already a rule defined on this model\n"
"You cannot define another: please edit the existing one."
msgstr ""
"Ya hay una regla definida en este modelo\n"
"No puede definir otro: edite el existente."
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_log__log_type
@ -415,7 +441,7 @@ msgstr "Tipo"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_rule_form
msgid "Unsubscribe"
msgstr ""
msgstr "Darse de baja"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_id
@ -432,7 +458,7 @@ msgstr "Usuario"
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_form
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_search
msgid "User session"
msgstr ""
msgstr "Sesión de usuario"
#. module: auditlog
#: model:ir.actions.act_window,name:auditlog.action_auditlog_http_session_tree
@ -440,25 +466,25 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_search
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_http_session_tree
msgid "User sessions"
msgstr ""
msgstr "Sesiones de usuario"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__user_ids
msgid "Users"
msgstr ""
msgstr "Usuarios"
#. module: auditlog
#: model_terms:ir.ui.view,arch_db:auditlog.view_auditlog_log_form
msgid "Values"
msgstr ""
msgstr "Valores"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""
msgstr "Ver Registros"
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__user_ids
msgid "if User is not added then it will applicable for all users"
msgstr ""
msgstr "si el usuario no se agrega, será aplicable para todos los usuarios"

12
auditlog/i18n/es_PE.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_PY.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/es_VE.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/et.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/eu.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/fa.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/fi.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/fr.po

@ -66,6 +66,11 @@ msgstr "Auditlog - Règle"
msgid "Auto-vacuum audit logs"
msgstr "Vidage automatique des logs d'audit"
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -344,6 +349,11 @@ msgstr "Règles"
msgid "Select model for which you want to generate log."
msgstr "Sélectionnez le modèle pour lequel vous voulez générer un historique."
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -470,7 +480,7 @@ msgid "Values"
msgstr "Valeurs"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr "Consulter les journaux"

12
auditlog/i18n/fr_CA.po

@ -68,6 +68,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -340,6 +345,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -455,7 +465,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/fr_CH.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/fr_FR.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/gl.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/gl_ES.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/he.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/hr.po

@ -67,6 +67,11 @@ msgstr "Nadzor - pravilo"
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr "Pravila"
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/hr_HR.po

@ -68,6 +68,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -340,6 +345,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -455,7 +465,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/hu.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/id.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/it.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr "Valori"
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/ja.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/ko.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/lt.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/lt_LT.po

@ -67,6 +67,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -339,6 +344,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -454,7 +464,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/lv.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/mk.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/mn.po

@ -65,6 +65,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -337,6 +342,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -452,7 +462,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/nb.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/nb_NO.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

12
auditlog/i18n/nl.po

@ -66,6 +66,11 @@ msgstr ""
msgid "Auto-vacuum audit logs"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_rule__capture_record
msgid "Capture Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,field_description:auditlog.field_auditlog_http_request__user_context
msgid "Context"
@ -338,6 +343,11 @@ msgstr ""
msgid "Select model for which you want to generate log."
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__capture_record
msgid "Select this if you want to keep track of Unlink Record"
msgstr ""
#. module: auditlog
#: model:ir.model.fields,help:auditlog.field_auditlog_rule__log_create
msgid ""
@ -453,7 +463,7 @@ msgid "Values"
msgstr ""
#. module: auditlog
#: code:addons/auditlog/models/rule.py:527
#: code:addons/auditlog/models/rule.py:568
#, python-format
msgid "View logs"
msgstr ""

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save