modoboa 2.4.11__py3-none-any.whl → 2.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- modoboa/admin/api/v2/serializers.py +14 -0
- modoboa/amavis/__init__.py +3 -0
- modoboa/amavis/app_settings.py +276 -0
- modoboa/amavis/apps.py +18 -0
- modoboa/amavis/checks/__init__.py +2 -0
- modoboa/amavis/checks/settings_checks.py +59 -0
- modoboa/amavis/dbrouter.py +35 -0
- modoboa/amavis/factories.py +164 -0
- modoboa/amavis/handlers.py +146 -0
- modoboa/amavis/lib.py +381 -0
- modoboa/amavis/management/__init__.py +0 -0
- modoboa/amavis/management/commands/__init__.py +0 -0
- modoboa/amavis/management/commands/amnotify.py +99 -0
- modoboa/amavis/management/commands/qcleanup.py +84 -0
- modoboa/amavis/migrations/0001_initial.py +340 -0
- modoboa/amavis/migrations/__init__.py +0 -0
- modoboa/amavis/models.py +226 -0
- modoboa/amavis/serializers.py +139 -0
- modoboa/amavis/sql_connector.py +240 -0
- modoboa/amavis/sql_email.py +66 -0
- modoboa/amavis/tasks.py +33 -0
- modoboa/amavis/templates/amavis/notifications/pending_requests.html +16 -0
- modoboa/amavis/tests/__init__.py +0 -0
- modoboa/amavis/tests/sa-learn +3 -0
- modoboa/amavis/tests/sample_messages/quarantined-input.txt +80 -0
- modoboa/amavis/tests/sample_messages/quarantined-output-plain_nolinks.txt +17 -0
- modoboa/amavis/tests/spamc +3 -0
- modoboa/amavis/tests/test_checks.py +25 -0
- modoboa/amavis/tests/test_handlers.py +214 -0
- modoboa/amavis/tests/test_lib.py +90 -0
- modoboa/amavis/tests/test_management_commands.py +45 -0
- modoboa/amavis/tests/test_sql_email.py +67 -0
- modoboa/amavis/tests/test_utils.py +19 -0
- modoboa/amavis/tests/test_viewsets.py +319 -0
- modoboa/amavis/urls.py +11 -0
- modoboa/amavis/utils.py +105 -0
- modoboa/amavis/viewsets.py +265 -0
- modoboa/core/api/v1/serializers.py +7 -5
- modoboa/core/api/v2/serializers.py +4 -2
- modoboa/core/api/v2/tests.py +16 -4
- modoboa/core/api/v2/urls.py +5 -5
- modoboa/core/api/v2/views.py +6 -2
- modoboa/core/api/v2/viewsets.py +24 -3
- modoboa/core/commands/deploy.py +3 -0
- modoboa/core/commands/templates/settings.py.tpl +12 -11
- modoboa/core/handlers.py +6 -2
- modoboa/core/management/commands/add_allowed_hosts.py +33 -0
- modoboa/core/management/commands/load_initial_data.py +10 -0
- modoboa/core/migrations/0025_rename_user_email_is_active_core_user_email_c0c03f_idx.py +23 -5
- modoboa/core/tests/test_core.py +24 -0
- modoboa/core/utils.py +3 -0
- modoboa/frontend_dist/assets/AccountAliasForm-C0oHHyZL.js +1 -0
- modoboa/frontend_dist/assets/AccountEditView-lgSJ2Se8.js +1 -0
- modoboa/frontend_dist/assets/AccountLayout-U386K8zy.js +1 -0
- modoboa/frontend_dist/assets/AccountPasswordSubForm-YsaE_cDx.js +1 -0
- modoboa/frontend_dist/assets/AccountView-1jfKFDwb.js +1 -0
- modoboa/frontend_dist/assets/AddressBook-CwN64Zls.js +1 -0
- modoboa/frontend_dist/assets/AdminLayout-Cxm1lggg.js +1 -0
- modoboa/frontend_dist/assets/AlarmsView-9yKGbmkC.css +1 -0
- modoboa/frontend_dist/assets/AlarmsView-Bcjsicac.js +1 -0
- modoboa/frontend_dist/assets/AliasEditView-k3rVt1tG.js +1 -0
- modoboa/frontend_dist/assets/{AliasRecipientForm-IOae6sjF.js → AliasRecipientForm-IehUzKok.js} +1 -1
- modoboa/frontend_dist/assets/AliasView-DMzA10eD.js +1 -0
- modoboa/frontend_dist/assets/AuditTrailView-5dnGX5El.js +1 -0
- modoboa/frontend_dist/assets/CalendarView-DZONeDA9.js +1 -0
- modoboa/frontend_dist/assets/{ChoiceField-DJ_c78Cm.js → ChoiceField-DnwXRkht.js} +1 -1
- modoboa/frontend_dist/assets/ComposeEmailForm-kghmfNuE.js +1 -0
- modoboa/frontend_dist/assets/ComposeEmailView-DLv3wk1k.js +1 -0
- modoboa/frontend_dist/assets/ConfirmDialog-CcPrCKuI.js +1 -0
- modoboa/frontend_dist/assets/{ConnectedLayout-Dvwmicnc.css → ConnectedLayout-Bxh21hcH.css} +1 -1
- modoboa/frontend_dist/assets/ConnectedLayout-CWlBK7Hf.js +1 -0
- modoboa/frontend_dist/assets/CreationForm-CW4lxnPg.js +1 -0
- modoboa/frontend_dist/assets/DashboardView-DXVZMbMo.js +1 -0
- modoboa/frontend_dist/assets/DomainAdminList-C3jcDDc3.js +1 -0
- modoboa/frontend_dist/assets/DomainEditView-ph8AaElX.js +1 -0
- modoboa/frontend_dist/assets/{DomainTransportForm-C2xo0Yd7.js → DomainTransportForm-NCz6Bl-h.js} +1 -1
- modoboa/frontend_dist/assets/DomainView-BgMSSuU-.js +5 -0
- modoboa/frontend_dist/assets/{DomainView-BDKoBFYr.css → DomainView-CCLYXPHx.css} +1 -1
- modoboa/frontend_dist/assets/DomainsView-CEEU9btK.js +1 -0
- modoboa/frontend_dist/assets/DomainsView-DZ-ss9bI.css +1 -0
- modoboa/frontend_dist/assets/EmailField-DeqDPm5j.js +1 -0
- modoboa/frontend_dist/assets/EmailView-DczVhVO0.js +1 -0
- modoboa/frontend_dist/assets/EmptyLayout-BXgcfMLH.js +1 -0
- modoboa/frontend_dist/assets/FiltersView-nJj_gSCx.js +1 -0
- modoboa/frontend_dist/assets/ForwardEmailView-Bgv3JQb6.js +1 -0
- modoboa/frontend_dist/assets/{HtmlEditor-CJ9umKeO.js → HtmlEditor-BWRdelVw.js} +1 -1
- modoboa/frontend_dist/assets/{IdentitiesView-0ziuQ5s-.css → IdentitiesView-DPrrRMS5.css} +1 -1
- modoboa/frontend_dist/assets/IdentitiesView-Dld9IloZ.js +1 -0
- modoboa/frontend_dist/assets/InformationView-BBWKSX8D.js +1 -0
- modoboa/frontend_dist/assets/InformationView-C9vvvQhJ.css +1 -0
- modoboa/frontend_dist/assets/{LoadingData-CYwX3Jpn.js → LoadingData-G57nJ_JV.js} +1 -1
- modoboa/frontend_dist/assets/{LoginCallbackView-E01qkKn0.js → LoginCallbackView-DjyE2SG_.js} +1 -1
- modoboa/frontend_dist/assets/{LoginView-Cy4uFV9h.js → LoginView-CqCCXYLo.js} +1 -1
- modoboa/frontend_dist/assets/{MailboxView-B-aI4XBq.css → MailboxView-CfStlWhk.css} +1 -1
- modoboa/frontend_dist/assets/MailboxView-DRrs9eLO.js +1 -0
- modoboa/frontend_dist/assets/MenuItems-BqIZW5av.js +1 -0
- modoboa/frontend_dist/assets/MessageView-D_6tx_gd.js +1 -0
- modoboa/frontend_dist/assets/MessagesView-BH7JIR03.js +1 -0
- modoboa/frontend_dist/assets/MigrationsView-Cv_So9T-.js +1 -0
- modoboa/frontend_dist/assets/{ParametersForm-BZM0QSvg.js → ParametersForm-3qXttTuQ.js} +1 -1
- modoboa/frontend_dist/assets/ParametersView-3Ns04cpQ.js +1 -0
- modoboa/frontend_dist/assets/ParametersView-B5B5Dt6K.js +1 -0
- modoboa/frontend_dist/assets/ProviderEditView-zh7CY832.js +1 -0
- modoboa/frontend_dist/assets/ProviderGeneralForm-BQU7t3ma.js +1 -0
- modoboa/frontend_dist/assets/ProvidersView-CoF_ZkZA.js +1 -0
- modoboa/frontend_dist/assets/QuarantineLayout-CYBsrbJM.js +1 -0
- modoboa/frontend_dist/assets/QuarantineView-D4gOE4EQ.css +1 -0
- modoboa/frontend_dist/assets/QuarantineView-DNvpoycb.js +1 -0
- modoboa/frontend_dist/assets/ReplyEmailView-D1XTcglu.js +1 -0
- modoboa/frontend_dist/assets/ResourcesForm-BW8rUGgZ.js +1 -0
- modoboa/frontend_dist/assets/SelfServiceLayout-DfDHiYeX.js +1 -0
- modoboa/frontend_dist/assets/{SettingsView-BxLJBFY0.js → SettingsView-gQiJ2NVb.js} +2 -2
- modoboa/frontend_dist/assets/StatisticsView-DYalet_q.js +1 -0
- modoboa/frontend_dist/assets/TimeSerieChart-BZ2htbFk.js +1 -0
- modoboa/frontend_dist/assets/UserLayout-zUtHi-z-.js +1 -0
- modoboa/frontend_dist/assets/VAlert-4r6LxKtg.js +1 -0
- modoboa/frontend_dist/assets/VApp-CX_C7AUN.js +1 -0
- modoboa/frontend_dist/assets/VAutocomplete-DNKmBvyZ.js +1 -0
- modoboa/frontend_dist/assets/VAvatar-DbuoZWmf.js +1 -0
- modoboa/frontend_dist/assets/VBadge-BQrRJ9S0.css +1 -0
- modoboa/frontend_dist/assets/VBadge-Bv2nvUmC.js +1 -0
- modoboa/frontend_dist/assets/VCard-DzjUT5OP.js +1 -0
- modoboa/frontend_dist/assets/VCheckbox-dr7UFjl4.js +1 -0
- modoboa/frontend_dist/assets/{VCheckboxBtn-Dt810gWf.js → VCheckboxBtn-CpFdBnTv.js} +1 -1
- modoboa/frontend_dist/assets/VChip-CaQvfmkw.js +1 -0
- modoboa/frontend_dist/assets/VColorPicker-ByGpCW5O.js +1 -0
- modoboa/frontend_dist/assets/{VContainer-DvTbsotR.js → VContainer-74Dnn8Ux.js} +1 -1
- modoboa/frontend_dist/assets/VDataTable-CL7yHvG7.js +1 -0
- modoboa/frontend_dist/assets/VDataTableServer-BqvNcIdw.js +1 -0
- modoboa/frontend_dist/assets/VDataTableVirtual--KsOP8i6.js +1 -0
- modoboa/frontend_dist/assets/{VDialog-Bk6EWNhz.js → VDialog-DmTGCGR0.js} +1 -1
- modoboa/frontend_dist/assets/VExpansionPanels-B7sSTCwd.js +1 -0
- modoboa/frontend_dist/assets/VFileInput-SULIc6F3.js +1 -0
- modoboa/frontend_dist/assets/VForm-DsRLc-sa.js +1 -0
- modoboa/frontend_dist/assets/VInput-CcxkaOXT.css +1 -0
- modoboa/frontend_dist/assets/VInput-DVKUObZe.js +1 -0
- modoboa/frontend_dist/assets/VMenu-nv0XOgg0.js +1 -0
- modoboa/frontend_dist/assets/VPicker-DnDSWJHJ.js +1 -0
- modoboa/frontend_dist/assets/VProgressCircular-qK6p5X_Y.js +1 -0
- modoboa/frontend_dist/assets/VRadioGroup-CbiPLy0t.js +1 -0
- modoboa/frontend_dist/assets/{VRow-BF35mT1S.js → VRow-DJ0NB63-.js} +1 -1
- modoboa/frontend_dist/assets/VSelect-CxCFMHyF.js +1 -0
- modoboa/frontend_dist/assets/VSelectionControl-C-6A4us5.js +1 -0
- modoboa/frontend_dist/assets/VSheet-DI6SxLnG.js +1 -0
- modoboa/frontend_dist/assets/VSpacer-CoJVmx8k.js +1 -0
- modoboa/frontend_dist/assets/VSwitch-DPnjPQuU.js +1 -0
- modoboa/frontend_dist/assets/VTable-ldTxgQPW.js +1 -0
- modoboa/frontend_dist/assets/VTabs-aS8WSL9I.js +1 -0
- modoboa/frontend_dist/assets/VTextField-BzBVKKob.css +1 -0
- modoboa/frontend_dist/assets/VTextField-DKbr4H5w.js +1 -0
- modoboa/frontend_dist/assets/VTextarea-BttkFsM4.js +1 -0
- modoboa/frontend_dist/assets/VToolbar-BxX3W2kR.js +1 -0
- modoboa/frontend_dist/assets/VWindowItem-Cvqvdegd.js +1 -0
- modoboa/frontend_dist/assets/WebmailLayout-BT2k6U7q.js +1 -0
- modoboa/frontend_dist/assets/accounts-CC2F0a0c.js +1 -0
- modoboa/frontend_dist/assets/{admin-o-HRGnmT.js → admin-CHCHFGI6.js} +1 -1
- modoboa/frontend_dist/assets/{aliases-DDVeehyg.js → aliases-C9bUD4Ws.js} +1 -1
- modoboa/frontend_dist/assets/amavis-BhzV4rgf.js +1 -0
- modoboa/frontend_dist/assets/amavis-DCVJxuui.js +1 -0
- modoboa/frontend_dist/assets/{contacts-C84DY-Q1.js → contacts-Dxz6eWpf.js} +1 -1
- modoboa/frontend_dist/assets/{domains-Bgn4ixHL.js → domains-C2cornvL.js} +1 -1
- modoboa/frontend_dist/assets/{domains.store-DTE-V7Y1.js → domains.store-BLKRipG8.js} +1 -1
- modoboa/frontend_dist/assets/{filter-CnffiQAW.js → filter-rmxrcjKk.js} +1 -1
- modoboa/frontend_dist/assets/forwardRefs-CpzzjgpX.js +1 -0
- modoboa/frontend_dist/assets/global.store-DndbMXYb.js +1 -0
- modoboa/frontend_dist/assets/{importExport-BlQYb0NO.js → importExport-C3uqrcok.js} +1 -1
- modoboa/frontend_dist/assets/index-LhNzkzAh.js +984 -0
- modoboa/frontend_dist/assets/layout-DbjDe3Wl.js +1 -0
- modoboa/frontend_dist/assets/{layout.store-DkjrAoXt.js → layout.store-Vq5mvIp7.js} +1 -1
- modoboa/frontend_dist/assets/{logos-q8SEyAa4.js → logos-Bvcy0usu.js} +1 -1
- modoboa/frontend_dist/assets/{logs-B7IJ7LBa.js → logs-BuItINky.js} +1 -1
- modoboa/frontend_dist/assets/{parameters-A6iBEYQq.js → parameters-C8IYEP7q.js} +1 -1
- modoboa/frontend_dist/assets/{parameters.store-BiXS4_6w.js → parameters.store-1cwSP2JP.js} +1 -1
- modoboa/frontend_dist/assets/permissions-DQjAcO9S.js +1 -0
- modoboa/frontend_dist/assets/{ssrBoot-AzTdjPjk.js → ssrBoot-BxIQ9ccA.js} +1 -1
- modoboa/frontend_dist/assets/{tag-BnSYRTcD.js → tag-3cfI1_f7.js} +1 -1
- modoboa/frontend_dist/assets/transports-D4Jk4-AP.js +1 -0
- modoboa/frontend_dist/assets/{webmail-CSH_3l6R.js → webmail-B2IUjaxM.js} +1 -1
- modoboa/frontend_dist/index.html +1 -1
- modoboa/lib/email_utils.py +2 -2
- modoboa/lib/permissions.py +7 -0
- modoboa/lib/test_runners.py +29 -0
- modoboa/lib/tests/__init__.py +5 -1
- modoboa/locale/br/LC_MESSAGES/django.po +87 -75
- modoboa/locale/cs/LC_MESSAGES/django.po +82 -74
- modoboa/locale/cs_CZ/LC_MESSAGES/django.po +145 -121
- modoboa/locale/de/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/de/LC_MESSAGES/django.po +339 -651
- modoboa/locale/de_DE/LC_MESSAGES/django.po +87 -75
- modoboa/locale/el_GR/LC_MESSAGES/django.po +160 -135
- modoboa/locale/en/LC_MESSAGES/django.po +82 -74
- modoboa/locale/es/LC_MESSAGES/django.po +158 -131
- modoboa/locale/es_MX/LC_MESSAGES/django.po +82 -74
- modoboa/locale/fi/LC_MESSAGES/django.po +87 -75
- modoboa/locale/fr/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/fr/LC_MESSAGES/django.po +469 -201
- modoboa/locale/hu/LC_MESSAGES/django.po +82 -74
- modoboa/locale/it/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/it/LC_MESSAGES/django.po +148 -122
- modoboa/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/ja_JP/LC_MESSAGES/django.po +80 -72
- modoboa/locale/ka/LC_MESSAGES/django.po +82 -74
- modoboa/locale/nl_NL/LC_MESSAGES/django.po +160 -132
- modoboa/locale/no/LC_MESSAGES/django.po +82 -74
- modoboa/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/pl_PL/LC_MESSAGES/django.po +172 -149
- modoboa/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/pt_BR/LC_MESSAGES/django.po +172 -144
- modoboa/locale/pt_PT/LC_MESSAGES/django.po +135 -112
- modoboa/locale/ro_RO/LC_MESSAGES/django.po +87 -75
- modoboa/locale/ru/LC_MESSAGES/django.po +142 -118
- modoboa/locale/si/LC_MESSAGES/django.po +82 -74
- modoboa/locale/sk/LC_MESSAGES/django.po +82 -74
- modoboa/locale/sk_SK/LC_MESSAGES/django.po +84 -76
- modoboa/locale/sl_SI/LC_MESSAGES/django.po +90 -76
- modoboa/locale/sv/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/sv/LC_MESSAGES/django.po +172 -139
- modoboa/locale/tr/LC_MESSAGES/django.po +87 -75
- modoboa/locale/tr_TR/LC_MESSAGES/django.po +84 -74
- modoboa/locale/uk/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh_CN/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh_TW/LC_MESSAGES/django.po +87 -75
- modoboa/parameters/api/v2/tests.py +2 -2
- modoboa/parameters/api/v2/viewsets.py +2 -0
- modoboa/policyd/tests.py +2 -0
- modoboa/urls_api_v2.py +6 -0
- modoboa/webmail/lib/imaputils.py +2 -2
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/METADATA +6 -4
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/RECORD +235 -185
- modoboa/frontend_dist/assets/AccountAliasForm-BV6KvTu6.js +0 -1
- modoboa/frontend_dist/assets/AccountEditView-DDOFyfBD.js +0 -1
- modoboa/frontend_dist/assets/AccountLayout-rX51xgxT.js +0 -1
- modoboa/frontend_dist/assets/AccountPasswordSubForm-D9S6LaeH.js +0 -1
- modoboa/frontend_dist/assets/AccountView-cmvaZNq3.js +0 -1
- modoboa/frontend_dist/assets/AddressBook-DCJxL8SU.js +0 -1
- modoboa/frontend_dist/assets/AdminLayout-r0wfG2lO.js +0 -1
- modoboa/frontend_dist/assets/AlarmsView-Bheey-gp.css +0 -1
- modoboa/frontend_dist/assets/AlarmsView-C0bqC4PA.js +0 -1
- modoboa/frontend_dist/assets/AliasEditView-DVoWoCGY.js +0 -1
- modoboa/frontend_dist/assets/AliasView-DrONZXOh.js +0 -1
- modoboa/frontend_dist/assets/AuditTrailView-OTkoZaMU.js +0 -1
- modoboa/frontend_dist/assets/CalendarView-CqF4_Ui9.js +0 -1
- modoboa/frontend_dist/assets/ComposeEmailForm-DO5_GB3e.js +0 -1
- modoboa/frontend_dist/assets/ComposeEmailView-A91HCBsN.js +0 -1
- modoboa/frontend_dist/assets/ConfirmDialog-BBcgdAnO.js +0 -1
- modoboa/frontend_dist/assets/ConnectedLayout-1oRW-Rql.js +0 -1
- modoboa/frontend_dist/assets/CreationForm-71YJbjsA.js +0 -1
- modoboa/frontend_dist/assets/DashboardView-CdLpSfUl.js +0 -1
- modoboa/frontend_dist/assets/DomainAdminList-BjC4KsqI.js +0 -1
- modoboa/frontend_dist/assets/DomainEditView-CQjKwYxl.js +0 -1
- modoboa/frontend_dist/assets/DomainView-BhhuZI_N.js +0 -5
- modoboa/frontend_dist/assets/DomainsView-Cft4BP8Z.js +0 -1
- modoboa/frontend_dist/assets/DomainsView-DasJ0NdZ.css +0 -1
- modoboa/frontend_dist/assets/EmailField-C8umy0EU.js +0 -1
- modoboa/frontend_dist/assets/EmailView-ki7uEQPD.js +0 -1
- modoboa/frontend_dist/assets/EmptyLayout-DaA1XH9n.js +0 -1
- modoboa/frontend_dist/assets/FiltersView-FYFZxG4B.js +0 -1
- modoboa/frontend_dist/assets/ForwardEmailView-cUbnSYCF.js +0 -1
- modoboa/frontend_dist/assets/IdentitiesView-njNo8N5n.js +0 -1
- modoboa/frontend_dist/assets/InformationView-D1h38POt.js +0 -1
- modoboa/frontend_dist/assets/InformationView-U5Ww-Sx1.css +0 -1
- modoboa/frontend_dist/assets/MailboxView-IlrLWm_H.js +0 -1
- modoboa/frontend_dist/assets/MenuItems-BAtHWzAE.js +0 -1
- modoboa/frontend_dist/assets/MessagesView-OSpjixFq.js +0 -1
- modoboa/frontend_dist/assets/MigrationsView-DKNOsVzF.js +0 -1
- modoboa/frontend_dist/assets/ParametersView-C4bXASiq.js +0 -1
- modoboa/frontend_dist/assets/ParametersView-CYXgNmc1.js +0 -1
- modoboa/frontend_dist/assets/ProviderEditView-CyxCWTST.js +0 -1
- modoboa/frontend_dist/assets/ProviderGeneralForm-BYPjNHqB.js +0 -1
- modoboa/frontend_dist/assets/ProvidersView-CxrMkRyk.js +0 -1
- modoboa/frontend_dist/assets/ReplyEmailView-Dkw9-N26.js +0 -1
- modoboa/frontend_dist/assets/ResourcesForm-CuUvrOdY.js +0 -1
- modoboa/frontend_dist/assets/StatisticsView-BN7QsZMT.js +0 -1
- modoboa/frontend_dist/assets/TimeSerieChart-BMN8BeFZ.js +0 -1
- modoboa/frontend_dist/assets/UserLayout-B6-JQg4F.js +0 -1
- modoboa/frontend_dist/assets/VAlert-DIQTrRif.js +0 -1
- modoboa/frontend_dist/assets/VApp-CpkYA7js.js +0 -1
- modoboa/frontend_dist/assets/VAutocomplete-C4IpXyl8.js +0 -1
- modoboa/frontend_dist/assets/VAvatar-Lpb-Dion.js +0 -1
- modoboa/frontend_dist/assets/VCard-er_isjE_.js +0 -1
- modoboa/frontend_dist/assets/VCheckbox-D-u8JXP1.js +0 -1
- modoboa/frontend_dist/assets/VChip-B4iSpj8_.js +0 -1
- modoboa/frontend_dist/assets/VColorPicker-BAjGDsXv.js +0 -1
- modoboa/frontend_dist/assets/VDataTable-4JRjbtgF.js +0 -1
- modoboa/frontend_dist/assets/VDataTableServer-tIDT1m3-.js +0 -1
- modoboa/frontend_dist/assets/VDataTableVirtual-BlnO18u_.js +0 -1
- modoboa/frontend_dist/assets/VExpansionPanels-CwGtXDhr.js +0 -1
- modoboa/frontend_dist/assets/VFileInput-D1_7ZkO_.js +0 -1
- modoboa/frontend_dist/assets/VForm-DAkW4nfy.js +0 -1
- modoboa/frontend_dist/assets/VMenu-BPFJwj2f.js +0 -1
- modoboa/frontend_dist/assets/VPicker-CfT82M8N.js +0 -1
- modoboa/frontend_dist/assets/VProgressCircular-w75-3ogi.js +0 -1
- modoboa/frontend_dist/assets/VRadioGroup-0j6DNC_k.js +0 -1
- modoboa/frontend_dist/assets/VSelect-Cs4ARbAS.js +0 -1
- modoboa/frontend_dist/assets/VSelectionControl-Dg-XyRRS.js +0 -1
- modoboa/frontend_dist/assets/VSheet-Btq_Mu4s.js +0 -1
- modoboa/frontend_dist/assets/VSpacer-C7xukQmu.js +0 -1
- modoboa/frontend_dist/assets/VSwitch-Cs1NQrmk.js +0 -1
- modoboa/frontend_dist/assets/VTable-CNz2SGk4.js +0 -1
- modoboa/frontend_dist/assets/VTabs-B1fyVn4M.js +0 -1
- modoboa/frontend_dist/assets/VTextField-BdyvgvkG.js +0 -1
- modoboa/frontend_dist/assets/VTextField-C-J20yj_.css +0 -1
- modoboa/frontend_dist/assets/VTextarea-DnOMpe0Q.js +0 -1
- modoboa/frontend_dist/assets/VToolbar-BiCiBxBJ.js +0 -1
- modoboa/frontend_dist/assets/VWindowItem-ChWm_kz3.js +0 -1
- modoboa/frontend_dist/assets/WebmailLayout-o4uEkp9e.js +0 -1
- modoboa/frontend_dist/assets/forwardRefs-Dvjn_Xq4.js +0 -1
- modoboa/frontend_dist/assets/global.store-BaiD63EN.js +0 -1
- modoboa/frontend_dist/assets/index-I1VDlN4g.js +0 -984
- modoboa/frontend_dist/assets/layout-D8ZJPiJ_.js +0 -1
- modoboa/frontend_dist/assets/permissions-CITHLHVg.js +0 -1
- modoboa/frontend_dist/assets/transports-Dz7c6kIy.js +0 -1
- {modoboa-2.4.11.data → modoboa-2.5.1.data}/scripts/modoboa-admin.py +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/WHEEL +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/entry_points.txt +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/licenses/LICENSE +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.1.dist-info}/top_level.txt +0 -0
|
@@ -10,7 +10,7 @@ msgid ""
|
|
|
10
10
|
msgstr ""
|
|
11
11
|
"Project-Id-Version: Modoboa\n"
|
|
12
12
|
"Report-Msgid-Bugs-To: \n"
|
|
13
|
-
"POT-Creation-Date: 2025-
|
|
13
|
+
"POT-Creation-Date: 2025-08-28 09:41+0200\n"
|
|
14
14
|
"PO-Revision-Date: 2018-07-06 08:26+0000\n"
|
|
15
15
|
"Last-Translator: akong <akong@aspa.idv.tw>\n"
|
|
16
16
|
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/tonio/modoboa/"
|
|
@@ -34,68 +34,69 @@ msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
|
|
|
34
34
|
msgid "Default quota in MB applied to mailboxes. A value of 0 means no quota."
|
|
35
35
|
msgstr "預設套用在信箱幾 MB 的配額。值為0表示沒配額。"
|
|
36
36
|
|
|
37
|
-
#: admin/api/v1/serializers.py:
|
|
37
|
+
#: admin/api/v1/serializers.py:94
|
|
38
38
|
#, fuzzy
|
|
39
39
|
msgid "domain alias with this name already exists"
|
|
40
40
|
msgstr "這個名稱的別名已存在"
|
|
41
41
|
|
|
42
|
-
#: admin/api/v1/serializers.py:
|
|
42
|
+
#: admin/api/v1/serializers.py:104
|
|
43
43
|
msgid "No authorized MX record found for this domain"
|
|
44
44
|
msgstr "沒有找到這個網域已驗證過的 MX 紀錄"
|
|
45
45
|
|
|
46
|
-
#: admin/api/v1/serializers.py:
|
|
46
|
+
#: admin/api/v1/serializers.py:122
|
|
47
47
|
msgid "Cannot be greater than domain quota"
|
|
48
48
|
msgstr "不可以超過網域配額"
|
|
49
49
|
|
|
50
|
-
#: admin/api/v1/serializers.py:
|
|
51
|
-
#: admin/api/v2/serializers.py:
|
|
50
|
+
#: admin/api/v1/serializers.py:168 admin/api/v1/serializers.py:364
|
|
51
|
+
#: admin/api/v2/serializers.py:564 admin/models/alias.py:44
|
|
52
52
|
msgid "Permission denied."
|
|
53
53
|
msgstr "權限不足"
|
|
54
54
|
|
|
55
|
-
#: admin/api/v1/serializers.py:
|
|
56
|
-
#: admin/api/v2/serializers.py:
|
|
57
|
-
#: core/api/v2/serializers.py:
|
|
55
|
+
#: admin/api/v1/serializers.py:231 admin/api/v2/serializers.py:90
|
|
56
|
+
#: admin/api/v2/serializers.py:486 core/api/v2/serializers.py:255
|
|
57
|
+
#: core/api/v2/serializers.py:257 core/api/v2/serializers.py:266
|
|
58
58
|
#: transport/backends.py:40
|
|
59
59
|
msgid "This field is required"
|
|
60
60
|
msgstr "這個欄位是必填的"
|
|
61
61
|
|
|
62
|
-
#: admin/api/v1/serializers.py:
|
|
62
|
+
#: admin/api/v1/serializers.py:243
|
|
63
63
|
msgid ""
|
|
64
64
|
"List of administered domains (resellers and domain administrators only)."
|
|
65
65
|
msgstr "管理員網域列表 (只有經銷商和網域管理員)。"
|
|
66
66
|
|
|
67
|
-
#: admin/api/v1/serializers.py:
|
|
67
|
+
#: admin/api/v1/serializers.py:337 admin/api/v2/serializers.py:546
|
|
68
68
|
msgid "Not allowed for this role."
|
|
69
69
|
msgstr "不允許這個身份"
|
|
70
70
|
|
|
71
|
-
#: admin/api/v1/serializers.py:
|
|
71
|
+
#: admin/api/v1/serializers.py:355
|
|
72
72
|
msgid "Must be equal to mailbox full_address"
|
|
73
73
|
msgstr "必須跟信箱完整位址一樣"
|
|
74
74
|
|
|
75
|
-
#: admin/api/v1/serializers.py:
|
|
75
|
+
#: admin/api/v1/serializers.py:397 admin/api/v2/serializers.py:598
|
|
76
76
|
#: calendars/serializers.py:175 calendars/serializers.py:177
|
|
77
|
+
#: pdfcredentials/api/v2/serializers.py:91
|
|
77
78
|
msgid "This field is required."
|
|
78
79
|
msgstr "這個欄位是必填的"
|
|
79
80
|
|
|
80
|
-
#: admin/api/v1/serializers.py:
|
|
81
|
+
#: admin/api/v1/serializers.py:409 admin/api/v2/serializers.py:615
|
|
81
82
|
msgid "Local domain {} does not exist"
|
|
82
83
|
msgstr "本機網域 {} 不存在"
|
|
83
84
|
|
|
84
|
-
#: admin/api/v1/serializers.py:
|
|
85
|
+
#: admin/api/v1/serializers.py:499
|
|
85
86
|
msgid "A list of recipient"
|
|
86
87
|
msgstr "收件人列表"
|
|
87
88
|
|
|
88
|
-
#: admin/api/v1/serializers.py:
|
|
89
|
+
#: admin/api/v1/serializers.py:515 admin/api/v2/viewsets.py:286
|
|
89
90
|
#, fuzzy
|
|
90
91
|
#| msgid "User '%s' already exists"
|
|
91
92
|
msgid "This alias already exists"
|
|
92
93
|
msgstr "使用者 '%s' 已存在"
|
|
93
94
|
|
|
94
|
-
#: admin/api/v1/serializers.py:
|
|
95
|
+
#: admin/api/v1/serializers.py:551
|
|
95
96
|
msgid "You don't have access to this domain."
|
|
96
97
|
msgstr "您不能存取這個網域。"
|
|
97
98
|
|
|
98
|
-
#: admin/api/v1/serializers.py:
|
|
99
|
+
#: admin/api/v1/serializers.py:560
|
|
99
100
|
msgid "You don't have access to this mailbox."
|
|
100
101
|
msgstr "您不能存取這個信箱。"
|
|
101
102
|
|
|
@@ -103,58 +104,58 @@ msgstr "您不能存取這個信箱。"
|
|
|
103
104
|
msgid "Here is your new Modoboa password: {}"
|
|
104
105
|
msgstr ""
|
|
105
106
|
|
|
106
|
-
#: admin/api/v2/serializers.py:
|
|
107
|
+
#: admin/api/v2/serializers.py:82
|
|
107
108
|
msgid "DKIM keys storage directory not configured"
|
|
108
109
|
msgstr "未設置 DKIM 金鑰儲存目錄"
|
|
109
110
|
|
|
110
|
-
#: admin/api/v2/serializers.py:
|
|
111
|
+
#: admin/api/v2/serializers.py:94
|
|
111
112
|
msgid "This field is valid when type is relaydomain"
|
|
112
113
|
msgstr ""
|
|
113
114
|
|
|
114
|
-
#: admin/api/v2/serializers.py:
|
|
115
|
+
#: admin/api/v2/serializers.py:101
|
|
115
116
|
msgid "You can't define an unlimited quota."
|
|
116
117
|
msgstr "您不可以定義無限制配額。"
|
|
117
118
|
|
|
118
|
-
#: admin/api/v2/serializers.py:
|
|
119
|
+
#: admin/api/v2/serializers.py:135
|
|
119
120
|
#, python-format
|
|
120
121
|
msgid "User '%s' already exists"
|
|
121
122
|
msgstr "使用者 '%s' 已存在"
|
|
122
123
|
|
|
123
|
-
#: admin/api/v2/serializers.py:
|
|
124
|
+
#: admin/api/v2/serializers.py:250 admin/api/v2/serializers.py:256
|
|
124
125
|
msgid "Must be a positive integer"
|
|
125
126
|
msgstr "必須是正整數"
|
|
126
127
|
|
|
127
|
-
#: admin/api/v2/serializers.py:
|
|
128
|
+
#: admin/api/v2/serializers.py:265
|
|
128
129
|
msgid "openssl not found, please make sure it is installed."
|
|
129
130
|
msgstr "openssl 找不到,請確認已安裝。"
|
|
130
131
|
|
|
131
|
-
#: admin/api/v2/serializers.py:
|
|
132
|
+
#: admin/api/v2/serializers.py:268 pdfcredentials/api/v2/serializers.py:84
|
|
132
133
|
msgid "Directory not found."
|
|
133
134
|
msgstr "目錄不存在"
|
|
134
135
|
|
|
135
|
-
#: admin/api/v2/serializers.py:
|
|
136
|
+
#: admin/api/v2/serializers.py:279
|
|
136
137
|
msgid "This field only allows valid IP addresses (or networks)"
|
|
137
138
|
msgstr ""
|
|
138
139
|
|
|
139
|
-
#: admin/api/v2/serializers.py:
|
|
140
|
+
#: admin/api/v2/serializers.py:292
|
|
140
141
|
msgid "Please disable imap migration before disabling this option."
|
|
141
142
|
msgstr ""
|
|
142
143
|
|
|
143
|
-
#: admin/api/v2/serializers.py:
|
|
144
|
+
#: admin/api/v2/serializers.py:305
|
|
144
145
|
msgid "Define at least one authorized network / address"
|
|
145
146
|
msgstr "定義至少一個已驗證網路/位址"
|
|
146
147
|
|
|
147
|
-
#: admin/api/v2/serializers.py:
|
|
148
|
+
#: admin/api/v2/serializers.py:581
|
|
148
149
|
msgid "The left part of an email address can't be more than 64 characters."
|
|
149
150
|
msgstr ""
|
|
150
151
|
|
|
151
|
-
#: admin/api/v2/serializers.py:
|
|
152
|
+
#: admin/api/v2/serializers.py:603
|
|
152
153
|
#, fuzzy
|
|
153
154
|
#| msgid "A mailbox is required"
|
|
154
155
|
msgid "A mailbox is required to create aliases."
|
|
155
156
|
msgstr "信箱是必要的"
|
|
156
157
|
|
|
157
|
-
#: admin/api/v2/serializers.py:
|
|
158
|
+
#: admin/api/v2/serializers.py:772
|
|
158
159
|
#, fuzzy
|
|
159
160
|
#| msgid "Unknown"
|
|
160
161
|
msgid "Unknown status"
|
|
@@ -168,14 +169,6 @@ msgstr "您無權訪問此網域"
|
|
|
168
169
|
msgid "You can't delete your own domain"
|
|
169
170
|
msgstr "您不可以刪除您擁有的網域"
|
|
170
171
|
|
|
171
|
-
#: admin/api/v2/viewsets.py:407
|
|
172
|
-
msgid "No alarm ID provided"
|
|
173
|
-
msgstr ""
|
|
174
|
-
|
|
175
|
-
#: admin/api/v2/viewsets.py:411
|
|
176
|
-
msgid "Received invalid alarm id(s)"
|
|
177
|
-
msgstr ""
|
|
178
|
-
|
|
179
172
|
#: admin/app_settings.py:19 limits/app_settings.py:38 limits/constants.py:13
|
|
180
173
|
msgid "Domains"
|
|
181
174
|
msgstr "網域"
|
|
@@ -392,7 +385,7 @@ msgstr "當信箱更名時會建立別名"
|
|
|
392
385
|
msgid "Create an alias using the old address when a mailbox is renamed."
|
|
393
386
|
msgstr "當信箱更名時建立別名並使用在舊的位址。"
|
|
394
387
|
|
|
395
|
-
#: admin/app_settings.py:287 core/api/v2/viewsets.py:
|
|
388
|
+
#: admin/app_settings.py:287 core/api/v2/viewsets.py:174
|
|
396
389
|
msgid "Administration"
|
|
397
390
|
msgstr "管理員"
|
|
398
391
|
|
|
@@ -423,7 +416,7 @@ msgstr "網域別名"
|
|
|
423
416
|
msgid "Account import failed (%s): domain does not exist"
|
|
424
417
|
msgstr "帳號匯入失敗 (%s): 網域不存在"
|
|
425
418
|
|
|
426
|
-
#: admin/handlers.py:242 admin/models/mailbox.py:
|
|
419
|
+
#: admin/handlers.py:242 admin/models/mailbox.py:342
|
|
427
420
|
msgid "Mailbox {} already exists"
|
|
428
421
|
msgstr "信箱 {} 已存在"
|
|
429
422
|
|
|
@@ -702,7 +695,7 @@ msgstr "配額是必要的"
|
|
|
702
695
|
msgid "{}: domain quota exceeded"
|
|
703
696
|
msgstr "網域配額已超過"
|
|
704
697
|
|
|
705
|
-
#: admin/models/mailbox.py:
|
|
698
|
+
#: admin/models/mailbox.py:310
|
|
706
699
|
msgid "Domain does not exist"
|
|
707
700
|
msgstr "網域不存在"
|
|
708
701
|
|
|
@@ -878,7 +871,7 @@ msgid ""
|
|
|
878
871
|
"Maximum size in bytes of imported ICS files (or KB, MB, GB if specified)"
|
|
879
872
|
msgstr ""
|
|
880
873
|
|
|
881
|
-
#: calendars/app_settings.py:89 core/api/v2/viewsets.py:
|
|
874
|
+
#: calendars/app_settings.py:89 core/api/v2/viewsets.py:195
|
|
882
875
|
msgid "Calendars"
|
|
883
876
|
msgstr ""
|
|
884
877
|
|
|
@@ -916,7 +909,7 @@ msgstr "LDAP 設定"
|
|
|
916
909
|
msgid "Interval in seconds between 2 synchronization requests"
|
|
917
910
|
msgstr ""
|
|
918
911
|
|
|
919
|
-
#: contacts/app_settings.py:51 core/api/v2/viewsets.py:
|
|
912
|
+
#: contacts/app_settings.py:51 core/api/v2/viewsets.py:185
|
|
920
913
|
#, fuzzy
|
|
921
914
|
#| msgid "Domains"
|
|
922
915
|
msgid "Contacts"
|
|
@@ -968,12 +961,12 @@ msgstr "無效的線"
|
|
|
968
961
|
msgid "2FA is already enabled"
|
|
969
962
|
msgstr ""
|
|
970
963
|
|
|
971
|
-
#: core/api/v1/serializers.py:
|
|
964
|
+
#: core/api/v1/serializers.py:86
|
|
972
965
|
#, python-format
|
|
973
|
-
msgid "Failed TFA settings editing attempt from '%s' as user '%s'"
|
|
966
|
+
msgid "Failed TFA settings editing attempt from '%(addr)s' as user '%(user)s'"
|
|
974
967
|
msgstr ""
|
|
975
968
|
|
|
976
|
-
#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:
|
|
969
|
+
#: core/api/v1/serializers.py:91 core/api/v2/serializers.py:445
|
|
977
970
|
#, fuzzy
|
|
978
971
|
#| msgid "Old password"
|
|
979
972
|
msgid "Invalid password"
|
|
@@ -987,44 +980,44 @@ msgstr ""
|
|
|
987
980
|
msgid "Local"
|
|
988
981
|
msgstr "本機"
|
|
989
982
|
|
|
990
|
-
#: core/api/v2/serializers.py:
|
|
983
|
+
#: core/api/v2/serializers.py:194 core/app_settings.py:17
|
|
991
984
|
msgid "User profile"
|
|
992
985
|
msgstr "使用者檔案"
|
|
993
986
|
|
|
994
|
-
#: core/api/v2/serializers.py:
|
|
995
|
-
#: core/api/v2/serializers.py:
|
|
987
|
+
#: core/api/v2/serializers.py:213 core/api/v2/serializers.py:221
|
|
988
|
+
#: core/api/v2/serializers.py:228
|
|
996
989
|
msgid "Invalid syntax"
|
|
997
990
|
msgstr "無效語法"
|
|
998
991
|
|
|
999
|
-
#: core/api/v2/serializers.py:
|
|
992
|
+
#: core/api/v2/serializers.py:233
|
|
1000
993
|
msgid "Invalid rounds number"
|
|
1001
994
|
msgstr ""
|
|
1002
995
|
|
|
1003
|
-
#: core/api/v2/serializers.py:
|
|
996
|
+
#: core/api/v2/serializers.py:433 core/forms.py:81
|
|
1004
997
|
msgid "This code is invalid"
|
|
1005
998
|
msgstr ""
|
|
1006
999
|
|
|
1007
|
-
#: core/api/v2/serializers.py:
|
|
1000
|
+
#: core/api/v2/serializers.py:503 core/views/auth.py:194 core/views/auth.py:247
|
|
1008
1001
|
msgid "Please use the following code to recover your Modoboa password: {}"
|
|
1009
1002
|
msgstr ""
|
|
1010
1003
|
|
|
1011
|
-
#: core/api/v2/viewsets.py:
|
|
1004
|
+
#: core/api/v2/viewsets.py:176
|
|
1012
1005
|
#, fuzzy
|
|
1013
1006
|
#| msgid "Administration"
|
|
1014
1007
|
msgid "Administration console"
|
|
1015
1008
|
msgstr "管理員"
|
|
1016
1009
|
|
|
1017
|
-
#: core/api/v2/viewsets.py:
|
|
1018
|
-
msgid "Calendar"
|
|
1019
|
-
msgstr ""
|
|
1020
|
-
|
|
1021
|
-
#: core/api/v2/viewsets.py:181
|
|
1010
|
+
#: core/api/v2/viewsets.py:187
|
|
1022
1011
|
#, fuzzy
|
|
1023
1012
|
#| msgid "Address"
|
|
1024
1013
|
msgid "Address book"
|
|
1025
1014
|
msgstr "地址"
|
|
1026
1015
|
|
|
1027
|
-
#: core/api/v2/viewsets.py:
|
|
1016
|
+
#: core/api/v2/viewsets.py:197
|
|
1017
|
+
msgid "Calendar"
|
|
1018
|
+
msgstr ""
|
|
1019
|
+
|
|
1020
|
+
#: core/api/v2/viewsets.py:205 core/api/v2/viewsets.py:207
|
|
1028
1021
|
#: webmail/app_settings.py:258 webmail/app_settings.py:265
|
|
1029
1022
|
#, fuzzy
|
|
1030
1023
|
#| msgid "E-mail"
|
|
@@ -1562,19 +1555,27 @@ msgstr "最大日誌紀錄時間"
|
|
|
1562
1555
|
msgid "The maximum age in days of a log record"
|
|
1563
1556
|
msgstr ""
|
|
1564
1557
|
|
|
1565
|
-
#: core/app_settings.py:
|
|
1558
|
+
#: core/app_settings.py:727
|
|
1559
|
+
msgid "Retention time in message history"
|
|
1560
|
+
msgstr ""
|
|
1561
|
+
|
|
1562
|
+
#: core/app_settings.py:730
|
|
1563
|
+
msgid "Retention time (in days) of a message in the message history section"
|
|
1564
|
+
msgstr ""
|
|
1565
|
+
|
|
1566
|
+
#: core/app_settings.py:737
|
|
1566
1567
|
msgid "Items per page"
|
|
1567
1568
|
msgstr "每頁的條目數量"
|
|
1568
1569
|
|
|
1569
|
-
#: core/app_settings.py:
|
|
1570
|
+
#: core/app_settings.py:739
|
|
1570
1571
|
msgid "Number of displayed items per page"
|
|
1571
1572
|
msgstr ""
|
|
1572
1573
|
|
|
1573
|
-
#: core/app_settings.py:
|
|
1574
|
+
#: core/app_settings.py:746
|
|
1574
1575
|
msgid "Default top redirection"
|
|
1575
1576
|
msgstr ""
|
|
1576
1577
|
|
|
1577
|
-
#: core/app_settings.py:
|
|
1578
|
+
#: core/app_settings.py:748
|
|
1578
1579
|
msgid "The default redirection used when no application is specified"
|
|
1579
1580
|
msgstr ""
|
|
1580
1581
|
|
|
@@ -1607,8 +1608,8 @@ msgstr ""
|
|
|
1607
1608
|
|
|
1608
1609
|
#: core/checks.py:34
|
|
1609
1610
|
msgid ""
|
|
1610
|
-
"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/
|
|
1611
|
-
"html#dovecot-oauth2"
|
|
1611
|
+
"Visit : https://modoboa.readthedocs.io/en/latest/manual_installation/"
|
|
1612
|
+
"dovecot.html#dovecot-oauth2"
|
|
1612
1613
|
msgstr ""
|
|
1613
1614
|
|
|
1614
1615
|
#: core/checks.py:41
|
|
@@ -2110,19 +2111,14 @@ msgstr ""
|
|
|
2110
2111
|
#: imap_migration/app_settings.py:76
|
|
2111
2112
|
msgid ""
|
|
2112
2113
|
"A comma seperated list of folders to explicitly include in sync even if "
|
|
2113
|
-
"filtered by the Folder Filter Exclusions. Example: debian.user,
|
|
2114
|
-
"personal "
|
|
2114
|
+
"filtered by the Folder Filter Exclusions. Example: debian.user, "
|
|
2115
|
+
"debian.personal "
|
|
2115
2116
|
msgstr ""
|
|
2116
2117
|
|
|
2117
2118
|
#: imap_migration/apps.py:20
|
|
2118
2119
|
msgid "IMAP Migration"
|
|
2119
2120
|
msgstr ""
|
|
2120
2121
|
|
|
2121
|
-
#: imap_migration/auth_backends.py:49 webmail/lib/imaputils.py:240
|
|
2122
|
-
#, python-brace-format
|
|
2123
|
-
msgid "Connection to IMAP server failed: {error}"
|
|
2124
|
-
msgstr ""
|
|
2125
|
-
|
|
2126
2122
|
#: imap_migration/checks.py:12
|
|
2127
2123
|
msgid ""
|
|
2128
2124
|
"Automatic domain/mailbox creation is disabled which means IMAP "
|
|
@@ -2449,13 +2445,13 @@ msgstr "帳號"
|
|
|
2449
2445
|
msgid "Personal account information"
|
|
2450
2446
|
msgstr "更新你的個人信息"
|
|
2451
2447
|
|
|
2452
|
-
#: pdfcredentials/api/v2/serializers.py:
|
|
2448
|
+
#: pdfcredentials/api/v2/serializers.py:86
|
|
2453
2449
|
#, fuzzy
|
|
2454
2450
|
#| msgid "Directory not found."
|
|
2455
2451
|
msgid "Directory is not writable"
|
|
2456
2452
|
msgstr "目錄不存在"
|
|
2457
2453
|
|
|
2458
|
-
#: pdfcredentials/api/v2/serializers.py:
|
|
2454
|
+
#: pdfcredentials/api/v2/serializers.py:114
|
|
2459
2455
|
#, fuzzy
|
|
2460
2456
|
#| msgid "No information available for this domain."
|
|
2461
2457
|
msgid "No document available for this user"
|
|
@@ -3257,15 +3253,31 @@ msgstr "簽名文字"
|
|
|
3257
3253
|
msgid "User defined email signature"
|
|
3258
3254
|
msgstr "使用者定義郵件簽名"
|
|
3259
3255
|
|
|
3256
|
+
#: webmail/exceptions.py:18
|
|
3257
|
+
#, fuzzy
|
|
3258
|
+
#| msgid "Server address"
|
|
3259
|
+
msgid "Server response"
|
|
3260
|
+
msgstr "伺服器位址"
|
|
3261
|
+
|
|
3260
3262
|
#: webmail/lib/attachments.py:112
|
|
3261
3263
|
#, fuzzy
|
|
3262
3264
|
msgid "Failed to remove attachment: "
|
|
3263
3265
|
msgstr "移除附件失敗:"
|
|
3264
3266
|
|
|
3267
|
+
#: webmail/lib/imapemail.py:272
|
|
3268
|
+
msgid "wrote:"
|
|
3269
|
+
msgstr ""
|
|
3270
|
+
|
|
3265
3271
|
#: webmail/lib/imapemail.py:306
|
|
3266
3272
|
msgid "Date"
|
|
3267
3273
|
msgstr "日期"
|
|
3268
3274
|
|
|
3275
|
+
#: webmail/lib/imapemail.py:322 webmail/lib/imapemail.py:325
|
|
3276
|
+
#, fuzzy
|
|
3277
|
+
#| msgid "sent messages"
|
|
3278
|
+
msgid "Original message"
|
|
3279
|
+
msgstr "已發訊息"
|
|
3280
|
+
|
|
3269
3281
|
#: webmail/lib/imaputils.py:221
|
|
3270
3282
|
msgid "Failed to retrieve hierarchy delimiter"
|
|
3271
3283
|
msgstr "無法檢查層次分隔"
|
|
@@ -18,7 +18,7 @@ class GlobalParametersAPITestCase(ModoAPITestCase):
|
|
|
18
18
|
resp = self.client.get(url)
|
|
19
19
|
self.assertEqual(resp.status_code, 200)
|
|
20
20
|
# core, admin, limits, pdf credentials, ...
|
|
21
|
-
self.assertEqual(len(resp.json()),
|
|
21
|
+
self.assertEqual(len(resp.json()), 13)
|
|
22
22
|
|
|
23
23
|
def test_get_structure(self):
|
|
24
24
|
url = reverse("v2:parameter-global-structure")
|
|
@@ -111,7 +111,7 @@ class UserParametersAPITestCase(ModoAPITestCase):
|
|
|
111
111
|
url = reverse("v2:parameter-user-applications")
|
|
112
112
|
resp = self.client.get(url)
|
|
113
113
|
self.assertEqual(resp.status_code, 200)
|
|
114
|
-
self.assertEqual(len(resp.json()),
|
|
114
|
+
self.assertEqual(len(resp.json()), 3)
|
|
115
115
|
|
|
116
116
|
def test_get_structure(self):
|
|
117
117
|
url = reverse("v2:parameter-user-structure")
|
|
@@ -93,6 +93,8 @@ class GlobalParametersViewSet(BaseParametersViewSet):
|
|
|
93
93
|
|
|
94
94
|
def get_permissions(self):
|
|
95
95
|
if self.action == "retrieve":
|
|
96
|
+
if self.kwargs.get("pk") == "amavis":
|
|
97
|
+
return [permissions.IsAuthenticated()]
|
|
96
98
|
return [permissions.IsAuthenticated(), IsPrivilegedUser()]
|
|
97
99
|
return [permissions.IsAuthenticated(), IsSuperUser()]
|
|
98
100
|
|
modoboa/policyd/tests.py
CHANGED
modoboa/urls_api_v2.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""External API urls."""
|
|
2
2
|
|
|
3
|
+
from django.conf import settings
|
|
3
4
|
from django.urls import include, path
|
|
4
5
|
|
|
5
6
|
from modoboa.core.extensions import exts_pool
|
|
@@ -25,4 +26,9 @@ urlpatterns = [
|
|
|
25
26
|
path("webmail/", include("modoboa.webmail.urls")),
|
|
26
27
|
]
|
|
27
28
|
|
|
29
|
+
if "modoboa.amavis" in settings.MODOBOA_APPS:
|
|
30
|
+
urlpatterns += [
|
|
31
|
+
path("amavis/", include("modoboa.amavis.urls")),
|
|
32
|
+
]
|
|
33
|
+
|
|
28
34
|
urlpatterns += exts_pool.get_urls(category="api")
|
modoboa/webmail/lib/imaputils.py
CHANGED
|
@@ -301,8 +301,8 @@ class IMAPconnector:
|
|
|
301
301
|
key = "SUBJECT"
|
|
302
302
|
else:
|
|
303
303
|
continue
|
|
304
|
-
criterions = or_criterion(criterions, f
|
|
305
|
-
self.criterions = [bytearray(criterions, "
|
|
304
|
+
criterions = or_criterion(criterions, f'({key} "{pattern}")')
|
|
305
|
+
self.criterions = [bytearray(criterions, "utf8")]
|
|
306
306
|
|
|
307
307
|
def messages_count(self, **kwargs) -> int:
|
|
308
308
|
"""An enhanced version of messages_count.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: modoboa
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.1
|
|
4
4
|
Summary: Mail hosting made simple
|
|
5
5
|
Author-email: Antoine Nguyen <tonio@ngyn.org>
|
|
6
6
|
License: ISC License
|
|
@@ -40,7 +40,7 @@ Classifier: Topic :: Internet :: WWW/HTTP
|
|
|
40
40
|
Requires-Python: >=3.10
|
|
41
41
|
Description-Content-Type: text/x-rst
|
|
42
42
|
License-File: LICENSE
|
|
43
|
-
Requires-Dist: django==5.2.
|
|
43
|
+
Requires-Dist: django==5.2.6
|
|
44
44
|
Requires-Dist: django-phonenumber-field[phonenumbers]==8.1.0
|
|
45
45
|
Requires-Dist: django-reversion==5.1.0
|
|
46
46
|
Requires-Dist: django-xforwardedfor-middleware==2.0
|
|
@@ -57,10 +57,10 @@ Requires-Dist: django-cors-headers
|
|
|
57
57
|
Requires-Dist: passlib~=1.7.4
|
|
58
58
|
Requires-Dist: bcrypt
|
|
59
59
|
Requires-Dist: asgiref
|
|
60
|
-
Requires-Dist: dnspython==2.
|
|
60
|
+
Requires-Dist: dnspython==2.8.0
|
|
61
61
|
Requires-Dist: feedparser==6.0.11
|
|
62
62
|
Requires-Dist: fido2==2.0.0
|
|
63
|
-
Requires-Dist: gevent==25.
|
|
63
|
+
Requires-Dist: gevent==25.8.2
|
|
64
64
|
Requires-Dist: progressbar33==2.4
|
|
65
65
|
Requires-Dist: python-dateutil
|
|
66
66
|
Requires-Dist: cryptography
|
|
@@ -85,6 +85,8 @@ Requires-Dist: sievelib>=1.4.1
|
|
|
85
85
|
Requires-Dist: drf-nested-routers
|
|
86
86
|
Requires-Dist: vobject
|
|
87
87
|
Requires-Dist: caldav==2.0.1
|
|
88
|
+
Requires-Dist: html2text
|
|
89
|
+
Requires-Dist: idna
|
|
88
90
|
Provides-Extra: dev
|
|
89
91
|
Requires-Dist: django-debug-toolbar; extra == "dev"
|
|
90
92
|
Requires-Dist: pre-commit; extra == "dev"
|