modoboa 2.4.10__py3-none-any.whl → 2.5.0__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.
Files changed (331) hide show
  1. modoboa/admin/api/v1/serializers.py +1 -0
  2. modoboa/admin/api/v2/serializers.py +15 -1
  3. modoboa/admin/api/v2/tests.py +11 -1
  4. modoboa/admin/lib.py +1 -1
  5. modoboa/admin/models/mailbox.py +15 -13
  6. modoboa/admin/models/mxrecord.py +4 -0
  7. modoboa/admin/tests/test_import_.py +11 -11
  8. modoboa/amavis/__init__.py +3 -0
  9. modoboa/amavis/app_settings.py +276 -0
  10. modoboa/amavis/apps.py +18 -0
  11. modoboa/amavis/checks/__init__.py +2 -0
  12. modoboa/amavis/checks/settings_checks.py +59 -0
  13. modoboa/amavis/dbrouter.py +35 -0
  14. modoboa/amavis/factories.py +164 -0
  15. modoboa/amavis/handlers.py +146 -0
  16. modoboa/amavis/lib.py +381 -0
  17. modoboa/amavis/management/__init__.py +0 -0
  18. modoboa/amavis/management/commands/__init__.py +0 -0
  19. modoboa/amavis/management/commands/amnotify.py +99 -0
  20. modoboa/amavis/management/commands/qcleanup.py +84 -0
  21. modoboa/amavis/migrations/0001_initial.py +340 -0
  22. modoboa/amavis/migrations/__init__.py +0 -0
  23. modoboa/amavis/models.py +226 -0
  24. modoboa/amavis/serializers.py +139 -0
  25. modoboa/amavis/sql_connector.py +240 -0
  26. modoboa/amavis/sql_email.py +66 -0
  27. modoboa/amavis/tasks.py +33 -0
  28. modoboa/amavis/templates/amavis/notifications/pending_requests.html +16 -0
  29. modoboa/amavis/tests/__init__.py +0 -0
  30. modoboa/amavis/tests/sa-learn +3 -0
  31. modoboa/amavis/tests/sample_messages/quarantined-input.txt +80 -0
  32. modoboa/amavis/tests/sample_messages/quarantined-output-plain_nolinks.txt +17 -0
  33. modoboa/amavis/tests/spamc +3 -0
  34. modoboa/amavis/tests/test_checks.py +25 -0
  35. modoboa/amavis/tests/test_handlers.py +214 -0
  36. modoboa/amavis/tests/test_lib.py +90 -0
  37. modoboa/amavis/tests/test_management_commands.py +45 -0
  38. modoboa/amavis/tests/test_sql_email.py +67 -0
  39. modoboa/amavis/tests/test_utils.py +19 -0
  40. modoboa/amavis/tests/test_viewsets.py +319 -0
  41. modoboa/amavis/urls.py +11 -0
  42. modoboa/amavis/utils.py +105 -0
  43. modoboa/amavis/viewsets.py +265 -0
  44. modoboa/core/api/v1/serializers.py +7 -5
  45. modoboa/core/api/v2/serializers.py +13 -2
  46. modoboa/core/api/v2/tests.py +34 -4
  47. modoboa/core/api/v2/urls.py +10 -5
  48. modoboa/core/api/v2/views.py +23 -2
  49. modoboa/core/api/v2/viewsets.py +24 -3
  50. modoboa/core/app_settings.py +11 -0
  51. modoboa/core/fido2_auth.py +1 -2
  52. modoboa/core/handlers.py +6 -2
  53. modoboa/core/management/commands/add_allowed_hosts.py +33 -0
  54. modoboa/core/management/commands/cleanlogs.py +9 -0
  55. modoboa/core/management/commands/load_initial_data.py +10 -0
  56. modoboa/core/migrations/0025_rename_user_email_is_active_core_user_email_c0c03f_idx.py +23 -5
  57. modoboa/core/tests/test_core.py +29 -0
  58. modoboa/core/utils.py +6 -0
  59. modoboa/dnstools/api/v2/serializers.py +9 -11
  60. modoboa/frontend_dist/assets/AccountAliasForm-BuSy_1n9.js +1 -0
  61. modoboa/frontend_dist/assets/AccountEditView-qdJmLM_e.js +1 -0
  62. modoboa/frontend_dist/assets/AccountLayout-DrN7vHsX.js +1 -0
  63. modoboa/frontend_dist/assets/AccountPasswordSubForm-DZGt_Xgq.js +1 -0
  64. modoboa/frontend_dist/assets/AccountView-CO65y0vZ.js +1 -0
  65. modoboa/frontend_dist/assets/AddressBook-BZNUlhek.js +1 -0
  66. modoboa/frontend_dist/assets/AdminLayout-CTNhuwTw.js +1 -0
  67. modoboa/frontend_dist/assets/AlarmsView-9yKGbmkC.css +1 -0
  68. modoboa/frontend_dist/assets/AlarmsView-DN_JIw9g.js +1 -0
  69. modoboa/frontend_dist/assets/AliasEditView-DjpPUTp9.js +1 -0
  70. modoboa/frontend_dist/assets/{AliasRecipientForm-DVZXWaUX.js → AliasRecipientForm-B1Y8wFdP.js} +1 -1
  71. modoboa/frontend_dist/assets/AliasView-GOJ5lyQH.js +1 -0
  72. modoboa/frontend_dist/assets/AuditTrailView-fbXmq70e.js +1 -0
  73. modoboa/frontend_dist/assets/CalendarView-LlQQNEPL.js +1 -0
  74. modoboa/frontend_dist/assets/{ChoiceField-7eU7c_rI.js → ChoiceField-B3ReQHVe.js} +1 -1
  75. modoboa/frontend_dist/assets/ComposeEmailForm-Bs1fZXAL.js +1 -0
  76. modoboa/frontend_dist/assets/ComposeEmailView-s3LMl3pO.js +1 -0
  77. modoboa/frontend_dist/assets/ConfirmDialog-DY_kUHLG.js +1 -0
  78. modoboa/frontend_dist/assets/{ConnectedLayout-BaJZ3BeR.css → ConnectedLayout-Bxh21hcH.css} +1 -1
  79. modoboa/frontend_dist/assets/ConnectedLayout-UWjiYBNw.js +1 -0
  80. modoboa/frontend_dist/assets/CreationForm-ORg3fazt.js +1 -0
  81. modoboa/frontend_dist/assets/DashboardView-Dplk9itS.js +1 -0
  82. modoboa/frontend_dist/assets/{DashboardView-BLlMi6Qb.css → DashboardView-gwwVAPvt.css} +1 -1
  83. modoboa/frontend_dist/assets/DomainAdminList-DVn9x0rB.js +1 -0
  84. modoboa/frontend_dist/assets/DomainEditView-nAoL64D_.js +1 -0
  85. modoboa/frontend_dist/assets/{DomainTransportForm-DPnPGBOp.js → DomainTransportForm-CA-DNUxX.js} +1 -1
  86. modoboa/frontend_dist/assets/{DomainView-BDKoBFYr.css → DomainView-CCLYXPHx.css} +1 -1
  87. modoboa/frontend_dist/assets/DomainView-CdXPpwJG.js +5 -0
  88. modoboa/frontend_dist/assets/DomainsView-B_59gowf.js +1 -0
  89. modoboa/frontend_dist/assets/DomainsView-DZ-ss9bI.css +1 -0
  90. modoboa/frontend_dist/assets/EmailField-CwcwI5xW.js +1 -0
  91. modoboa/frontend_dist/assets/EmailView-BshxcfAK.js +1 -0
  92. modoboa/frontend_dist/assets/EmptyLayout-DFfhnhLi.js +1 -0
  93. modoboa/frontend_dist/assets/FiltersView-Cf20MSTK.js +1 -0
  94. modoboa/frontend_dist/assets/ForwardEmailView-CZG062os.js +1 -0
  95. modoboa/frontend_dist/assets/{HtmlEditor-uM4AtIGi.js → HtmlEditor-Bh4c689R.js} +1 -1
  96. modoboa/frontend_dist/assets/IdentitiesView-BXAuU1YX.js +1 -0
  97. modoboa/frontend_dist/assets/{IdentitiesView-jmuItyMZ.css → IdentitiesView-DPrrRMS5.css} +1 -1
  98. modoboa/frontend_dist/assets/InformationView-C9vvvQhJ.css +1 -0
  99. modoboa/frontend_dist/assets/InformationView-Cn5FZW7H.js +1 -0
  100. modoboa/frontend_dist/assets/{LoadingData-CVD2Aen8.js → LoadingData-CdVvm4FI.js} +1 -1
  101. modoboa/frontend_dist/assets/{LoginCallbackView-sWzBke1g.js → LoginCallbackView-B9hAH4MI.js} +1 -1
  102. modoboa/frontend_dist/assets/{LoginView-wmN73W0f.js → LoginView-tHIR4Adc.js} +1 -1
  103. modoboa/frontend_dist/assets/MailboxView-Bugu2vhg.js +1 -0
  104. modoboa/frontend_dist/assets/MenuItems-PXjiG-fs.js +1 -0
  105. modoboa/frontend_dist/assets/MessageView-Cy4STShm.js +1 -0
  106. modoboa/frontend_dist/assets/MessagesView-DdkuEgfX.js +1 -0
  107. modoboa/frontend_dist/assets/MigrationsView-CidSEjCF.js +1 -0
  108. modoboa/frontend_dist/assets/{ParametersForm-BCeQljir.js → ParametersForm-CAv4SH-E.js} +1 -1
  109. modoboa/frontend_dist/assets/ParametersView-CX7Ffemw.js +1 -0
  110. modoboa/frontend_dist/assets/ParametersView-CrbNcmV3.js +1 -0
  111. modoboa/frontend_dist/assets/ProviderEditView-CrltAQXl.js +1 -0
  112. modoboa/frontend_dist/assets/ProviderGeneralForm-BYAzVnXM.js +1 -0
  113. modoboa/frontend_dist/assets/ProvidersView-osjIY4Ex.js +1 -0
  114. modoboa/frontend_dist/assets/QuarantineLayout-B8EcU9vS.js +1 -0
  115. modoboa/frontend_dist/assets/QuarantineView-D4gOE4EQ.css +1 -0
  116. modoboa/frontend_dist/assets/QuarantineView-D8Qg0MXA.js +1 -0
  117. modoboa/frontend_dist/assets/ReplyEmailView-BABPqWhd.js +1 -0
  118. modoboa/frontend_dist/assets/ResourcesForm-OaqdRYVs.js +1 -0
  119. modoboa/frontend_dist/assets/SelfServiceLayout-d277YTGR.js +1 -0
  120. modoboa/frontend_dist/assets/SettingsView-9iNcDhkI.js +6 -0
  121. modoboa/frontend_dist/assets/StatisticsView-cHsPyGkL.js +1 -0
  122. modoboa/frontend_dist/assets/TimeSerieChart--V83dcJ9.js +1 -0
  123. modoboa/frontend_dist/assets/UserLayout-B3sBiTcZ.js +1 -0
  124. modoboa/frontend_dist/assets/VAlert-BuaaYN2h.js +1 -0
  125. modoboa/frontend_dist/assets/VApp-CKP-6zGP.js +1 -0
  126. modoboa/frontend_dist/assets/VAutocomplete-Dwv6_Rzq.js +1 -0
  127. modoboa/frontend_dist/assets/VAvatar-Cmga0vj6.js +1 -0
  128. modoboa/frontend_dist/assets/VBadge-BQrRJ9S0.css +1 -0
  129. modoboa/frontend_dist/assets/VBadge-CixeK87a.js +1 -0
  130. modoboa/frontend_dist/assets/VCard-CxH9DWoK.js +1 -0
  131. modoboa/frontend_dist/assets/VCheckbox-62GOpvvP.js +1 -0
  132. modoboa/frontend_dist/assets/{VCheckboxBtn-j7di4leN.js → VCheckboxBtn-DMoNtKT8.js} +1 -1
  133. modoboa/frontend_dist/assets/VChip-D_styETR.js +1 -0
  134. modoboa/frontend_dist/assets/VColorPicker-BHscBGQV.js +1 -0
  135. modoboa/frontend_dist/assets/VContainer-B46caNs1.js +1 -0
  136. modoboa/frontend_dist/assets/VDataTable-Bh8NbVSx.js +1 -0
  137. modoboa/frontend_dist/assets/VDataTableServer-BDR5hOmo.js +1 -0
  138. modoboa/frontend_dist/assets/VDataTableVirtual-BOQlNtIG.js +1 -0
  139. modoboa/frontend_dist/assets/{VDialog-CZqM2Ofu.js → VDialog-BcTg7w6P.js} +1 -1
  140. modoboa/frontend_dist/assets/VExpansionPanels-BmH5Jl2Z.js +1 -0
  141. modoboa/frontend_dist/assets/VFileInput-BC4yAygd.js +1 -0
  142. modoboa/frontend_dist/assets/VForm-D5iPGkde.js +1 -0
  143. modoboa/frontend_dist/assets/VInput-CcxkaOXT.css +1 -0
  144. modoboa/frontend_dist/assets/VInput-CoDJzvaW.js +1 -0
  145. modoboa/frontend_dist/assets/VMenu-gUG70-zD.js +1 -0
  146. modoboa/frontend_dist/assets/VPicker-BXuKT3zB.js +1 -0
  147. modoboa/frontend_dist/assets/VProgressCircular-BtOPiGCg.js +1 -0
  148. modoboa/frontend_dist/assets/VRadioGroup-DIFZKSn-.js +1 -0
  149. modoboa/frontend_dist/assets/{VRow-C_Ydf6yr.js → VRow-ozg66L7j.js} +1 -1
  150. modoboa/frontend_dist/assets/VSelect-C3RjAa45.js +1 -0
  151. modoboa/frontend_dist/assets/VSelectionControl-zyz-fJvC.js +1 -0
  152. modoboa/frontend_dist/assets/VSheet-BNx2X4Mk.js +1 -0
  153. modoboa/frontend_dist/assets/VSpacer-DinPiXs9.js +1 -0
  154. modoboa/frontend_dist/assets/VSwitch-DwxdeAEq.js +1 -0
  155. modoboa/frontend_dist/assets/VTable-DaLxa4FO.js +1 -0
  156. modoboa/frontend_dist/assets/VTabs-BP0Hgsgm.js +1 -0
  157. modoboa/frontend_dist/assets/VTextField-BzBVKKob.css +1 -0
  158. modoboa/frontend_dist/assets/VTextField-XoGTj1KG.js +1 -0
  159. modoboa/frontend_dist/assets/VTextarea-wBlRMIv_.js +1 -0
  160. modoboa/frontend_dist/assets/VToolbar-CFZfqeOr.js +1 -0
  161. modoboa/frontend_dist/assets/VWindowItem-BB7ETW3b.js +1 -0
  162. modoboa/frontend_dist/assets/WebmailLayout-_Hk1XhVq.js +1 -0
  163. modoboa/frontend_dist/assets/accounts-DUzbx6k8.js +1 -0
  164. modoboa/frontend_dist/assets/admin-DewTk2H8.js +1 -0
  165. modoboa/frontend_dist/assets/{aliases-c3n-dCV_.js → aliases-4sXmjwXp.js} +1 -1
  166. modoboa/frontend_dist/assets/amavis-CC0li7_T.js +1 -0
  167. modoboa/frontend_dist/assets/amavis-DK8SHE6o.js +1 -0
  168. modoboa/frontend_dist/assets/{contacts-Bqckz8sr.js → contacts-BjghrPqZ.js} +1 -1
  169. modoboa/frontend_dist/assets/{domains-nBMR-fRf.js → domains-BSawReeu.js} +1 -1
  170. modoboa/frontend_dist/assets/{domains.store-ChZgLcqP.js → domains.store-D-vWCEIK.js} +1 -1
  171. modoboa/frontend_dist/assets/{filter-D7NrAf6a.js → filter-C82FUCw_.js} +1 -1
  172. modoboa/frontend_dist/assets/forwardRefs-cvcnlhoK.js +1 -0
  173. modoboa/frontend_dist/assets/global.store-DbkcI5o2.js +1 -0
  174. modoboa/frontend_dist/assets/{importExport-Dn9vYw7T.js → importExport-DzoL4Mvc.js} +1 -1
  175. modoboa/frontend_dist/assets/index-BImkz5Jx.js +984 -0
  176. modoboa/frontend_dist/assets/index-DuzUMVLM.js +1 -0
  177. modoboa/frontend_dist/assets/layout-C5FyYCHK.js +1 -0
  178. modoboa/frontend_dist/assets/{layout.store-BxBoBlgf.js → layout.store-NXWtFIwL.js} +1 -1
  179. modoboa/frontend_dist/assets/logos-BswdveCV.js +1 -0
  180. modoboa/frontend_dist/assets/{logs-DrTzylW7.js → logs-6CbtfaZS.js} +1 -1
  181. modoboa/frontend_dist/assets/{parameters-Lgiqp7aw.js → parameters-aSQiR7kN.js} +1 -1
  182. modoboa/frontend_dist/assets/{parameters.store-C9k9DuTj.js → parameters.store-CzQqVatx.js} +1 -1
  183. modoboa/frontend_dist/assets/permissions-DNoefz-n.js +1 -0
  184. modoboa/frontend_dist/assets/{ssrBoot-BsxW6uW4.js → ssrBoot-CKUX4kcb.js} +1 -1
  185. modoboa/frontend_dist/assets/{tag-CFK9dzMJ.js → tag-B_yWNNJD.js} +1 -1
  186. modoboa/frontend_dist/assets/transports-BDNB9wR5.js +1 -0
  187. modoboa/frontend_dist/assets/{webmail-KrD8ZhNM.js → webmail-CdU6CD9b.js} +1 -1
  188. modoboa/frontend_dist/index.html +1 -1
  189. modoboa/lib/email_utils.py +2 -2
  190. modoboa/lib/permissions.py +7 -0
  191. modoboa/lib/redis.py +1 -5
  192. modoboa/lib/test_runners.py +29 -0
  193. modoboa/lib/tests/__init__.py +5 -1
  194. modoboa/locale/br/LC_MESSAGES/django.po +87 -75
  195. modoboa/locale/cs/LC_MESSAGES/django.po +82 -74
  196. modoboa/locale/cs_CZ/LC_MESSAGES/django.po +145 -121
  197. modoboa/locale/de/LC_MESSAGES/django.mo +0 -0
  198. modoboa/locale/de/LC_MESSAGES/django.po +339 -651
  199. modoboa/locale/de_DE/LC_MESSAGES/django.po +87 -75
  200. modoboa/locale/el_GR/LC_MESSAGES/django.po +160 -135
  201. modoboa/locale/en/LC_MESSAGES/django.po +82 -74
  202. modoboa/locale/es/LC_MESSAGES/django.po +158 -131
  203. modoboa/locale/es_MX/LC_MESSAGES/django.po +82 -74
  204. modoboa/locale/fi/LC_MESSAGES/django.po +87 -75
  205. modoboa/locale/fr/LC_MESSAGES/django.mo +0 -0
  206. modoboa/locale/fr/LC_MESSAGES/django.po +469 -201
  207. modoboa/locale/hu/LC_MESSAGES/django.po +82 -74
  208. modoboa/locale/it/LC_MESSAGES/django.mo +0 -0
  209. modoboa/locale/it/LC_MESSAGES/django.po +148 -122
  210. modoboa/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
  211. modoboa/locale/ja_JP/LC_MESSAGES/django.po +201 -334
  212. modoboa/locale/ka/LC_MESSAGES/django.po +82 -74
  213. modoboa/locale/nl_NL/LC_MESSAGES/django.po +160 -132
  214. modoboa/locale/no/LC_MESSAGES/django.po +82 -74
  215. modoboa/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  216. modoboa/locale/pl_PL/LC_MESSAGES/django.po +172 -149
  217. modoboa/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  218. modoboa/locale/pt_BR/LC_MESSAGES/django.po +172 -144
  219. modoboa/locale/pt_PT/LC_MESSAGES/django.po +135 -112
  220. modoboa/locale/ro_RO/LC_MESSAGES/django.po +87 -75
  221. modoboa/locale/ru/LC_MESSAGES/django.po +142 -118
  222. modoboa/locale/si/LC_MESSAGES/django.po +82 -74
  223. modoboa/locale/sk/LC_MESSAGES/django.po +82 -74
  224. modoboa/locale/sk_SK/LC_MESSAGES/django.po +84 -76
  225. modoboa/locale/sl_SI/LC_MESSAGES/django.po +90 -76
  226. modoboa/locale/sv/LC_MESSAGES/django.mo +0 -0
  227. modoboa/locale/sv/LC_MESSAGES/django.po +172 -139
  228. modoboa/locale/tr/LC_MESSAGES/django.po +87 -75
  229. modoboa/locale/tr_TR/LC_MESSAGES/django.po +84 -74
  230. modoboa/locale/uk/LC_MESSAGES/django.po +82 -74
  231. modoboa/locale/zh/LC_MESSAGES/django.po +82 -74
  232. modoboa/locale/zh_CN/LC_MESSAGES/django.po +82 -74
  233. modoboa/locale/zh_TW/LC_MESSAGES/django.po +87 -75
  234. modoboa/parameters/api/v2/tests.py +2 -2
  235. modoboa/parameters/api/v2/viewsets.py +2 -0
  236. modoboa/policyd/tests.py +2 -0
  237. modoboa/urls_api_v2.py +6 -0
  238. {modoboa-2.4.10.dist-info → modoboa-2.5.0.dist-info}/METADATA +6 -4
  239. {modoboa-2.4.10.dist-info → modoboa-2.5.0.dist-info}/RECORD +244 -193
  240. modoboa/frontend_dist/assets/AccountAliasForm-DVXatAhB.js +0 -1
  241. modoboa/frontend_dist/assets/AccountEditView-DmvQjxpx.js +0 -1
  242. modoboa/frontend_dist/assets/AccountLayout-OGtZvlHR.js +0 -1
  243. modoboa/frontend_dist/assets/AccountPasswordSubForm-g3IEGrgM.js +0 -1
  244. modoboa/frontend_dist/assets/AccountView-DsxYqr3k.js +0 -1
  245. modoboa/frontend_dist/assets/AddressBook-3RoKiKon.js +0 -1
  246. modoboa/frontend_dist/assets/AdminLayout-CWfn8zaQ.js +0 -1
  247. modoboa/frontend_dist/assets/AlarmsView-Bheey-gp.css +0 -1
  248. modoboa/frontend_dist/assets/AlarmsView-D3Mh8ntf.js +0 -1
  249. modoboa/frontend_dist/assets/AliasEditView-C15eUZ11.js +0 -1
  250. modoboa/frontend_dist/assets/AliasView-Cyvc5vMb.js +0 -1
  251. modoboa/frontend_dist/assets/AuditTrailView-LI2XuLLn.js +0 -1
  252. modoboa/frontend_dist/assets/CalendarView-BpOlPh3f.js +0 -1
  253. modoboa/frontend_dist/assets/ComposeEmailForm-CNfI7ept.js +0 -1
  254. modoboa/frontend_dist/assets/ComposeEmailView-B866Xsrc.js +0 -1
  255. modoboa/frontend_dist/assets/ConfirmDialog-BvqxQsD1.js +0 -1
  256. modoboa/frontend_dist/assets/ConnectedLayout-BQ3ug6Jh.js +0 -1
  257. modoboa/frontend_dist/assets/CreationForm-C9Kh05ax.js +0 -1
  258. modoboa/frontend_dist/assets/DashboardView-Cw-gIcuB.js +0 -1
  259. modoboa/frontend_dist/assets/DomainAdminList-CsWUNKVk.js +0 -1
  260. modoboa/frontend_dist/assets/DomainEditView-DocxeOeW.js +0 -1
  261. modoboa/frontend_dist/assets/DomainView-Djc_0PsF.js +0 -5
  262. modoboa/frontend_dist/assets/DomainsView-B-Lxru7P.js +0 -1
  263. modoboa/frontend_dist/assets/DomainsView-DasJ0NdZ.css +0 -1
  264. modoboa/frontend_dist/assets/EmailField-BEKxuYni.js +0 -1
  265. modoboa/frontend_dist/assets/EmailView-BsR1Wes5.js +0 -1
  266. modoboa/frontend_dist/assets/EmptyLayout-BzPFOeLU.js +0 -1
  267. modoboa/frontend_dist/assets/FiltersView-5rmpC5cC.js +0 -1
  268. modoboa/frontend_dist/assets/ForwardEmailView-D7MbetcT.js +0 -1
  269. modoboa/frontend_dist/assets/IdentitiesView-BqjD9Lue.js +0 -1
  270. modoboa/frontend_dist/assets/InformationView-CghcvPn2.js +0 -1
  271. modoboa/frontend_dist/assets/InformationView-U5Ww-Sx1.css +0 -1
  272. modoboa/frontend_dist/assets/MailboxView-T_p-_ZtJ.js +0 -1
  273. modoboa/frontend_dist/assets/MenuItems-kHCMzR5E.js +0 -1
  274. modoboa/frontend_dist/assets/MessagesView-Cerv3xsy.js +0 -1
  275. modoboa/frontend_dist/assets/MigrationsView-7kjqPyYU.js +0 -1
  276. modoboa/frontend_dist/assets/ParametersView-DspBxVMV.js +0 -1
  277. modoboa/frontend_dist/assets/ParametersView-Dy0H5ep1.js +0 -1
  278. modoboa/frontend_dist/assets/ProviderEditView-DDLMOylC.js +0 -1
  279. modoboa/frontend_dist/assets/ProviderGeneralForm-BwOSKNHK.js +0 -1
  280. modoboa/frontend_dist/assets/ProvidersView-C99UD0WB.js +0 -1
  281. modoboa/frontend_dist/assets/ReplyEmailView-DAPBHldd.js +0 -1
  282. modoboa/frontend_dist/assets/ResourcesForm-D87PHeH0.js +0 -1
  283. modoboa/frontend_dist/assets/SettingsView-OxDo9wNd.js +0 -6
  284. modoboa/frontend_dist/assets/StatisticsView-CM__Eqku.js +0 -1
  285. modoboa/frontend_dist/assets/TimeSerieChart-C6j0uYR_.js +0 -1
  286. modoboa/frontend_dist/assets/UserLayout-CckCGnPS.js +0 -1
  287. modoboa/frontend_dist/assets/VAlert-B7mzOJIO.js +0 -1
  288. modoboa/frontend_dist/assets/VApp-BKxnjOoi.js +0 -1
  289. modoboa/frontend_dist/assets/VAutocomplete-Cc4_tcl1.js +0 -1
  290. modoboa/frontend_dist/assets/VAvatar-BAgTUIvX.js +0 -1
  291. modoboa/frontend_dist/assets/VCard-DFWiFORP.js +0 -1
  292. modoboa/frontend_dist/assets/VCheckbox-CKsH_vq3.js +0 -1
  293. modoboa/frontend_dist/assets/VChip-nZ0uhY7t.js +0 -1
  294. modoboa/frontend_dist/assets/VColorPicker-Os2aeP6J.js +0 -1
  295. modoboa/frontend_dist/assets/VContainer-Btam4lk2.js +0 -1
  296. modoboa/frontend_dist/assets/VDataTable-D_0_xJTl.js +0 -1
  297. modoboa/frontend_dist/assets/VDataTableServer-BWTt4Mzi.js +0 -1
  298. modoboa/frontend_dist/assets/VDataTableVirtual-BwVmkt4u.js +0 -1
  299. modoboa/frontend_dist/assets/VExpansionPanels-B5D6GOa3.js +0 -1
  300. modoboa/frontend_dist/assets/VFileInput-Cv9DIPki.js +0 -1
  301. modoboa/frontend_dist/assets/VForm-CpoZf60D.js +0 -1
  302. modoboa/frontend_dist/assets/VMenu-B_dVqOmo.js +0 -1
  303. modoboa/frontend_dist/assets/VPicker-CXkIGEze.js +0 -1
  304. modoboa/frontend_dist/assets/VProgressCircular-CrEXxs7k.js +0 -1
  305. modoboa/frontend_dist/assets/VRadioGroup-D8ypjYOO.js +0 -1
  306. modoboa/frontend_dist/assets/VSelect-CS51PDEt.js +0 -1
  307. modoboa/frontend_dist/assets/VSelectionControl-DiOqtY38.js +0 -1
  308. modoboa/frontend_dist/assets/VSheet-5VVWtHvs.js +0 -1
  309. modoboa/frontend_dist/assets/VSpacer-C6PZ3X24.js +0 -1
  310. modoboa/frontend_dist/assets/VSwitch-Chg5o-Cp.js +0 -1
  311. modoboa/frontend_dist/assets/VTable-KsiZ3cBz.js +0 -1
  312. modoboa/frontend_dist/assets/VTabs-tNrJIYO0.js +0 -1
  313. modoboa/frontend_dist/assets/VTextField-C-J20yj_.css +0 -1
  314. modoboa/frontend_dist/assets/VTextField-CLwRV0Cb.js +0 -1
  315. modoboa/frontend_dist/assets/VTextarea-Di8jbl8m.js +0 -1
  316. modoboa/frontend_dist/assets/VToolbar-CGwhgdmI.js +0 -1
  317. modoboa/frontend_dist/assets/VWindowItem-wWSFAGI-.js +0 -1
  318. modoboa/frontend_dist/assets/WebmailLayout-DsYThBrz.js +0 -1
  319. modoboa/frontend_dist/assets/admin-CJVLMHh9.js +0 -1
  320. modoboa/frontend_dist/assets/forwardRefs-Cpc3YYl6.js +0 -1
  321. modoboa/frontend_dist/assets/global.store-DUP26-A5.js +0 -1
  322. modoboa/frontend_dist/assets/index-DV9Li2cg.js +0 -852
  323. modoboa/frontend_dist/assets/index-DzL89N4E.js +0 -1
  324. modoboa/frontend_dist/assets/layout-CHO37cA6.js +0 -1
  325. modoboa/frontend_dist/assets/permissions-mL5hLHcW.js +0 -1
  326. modoboa/frontend_dist/assets/transports-TO08iTXJ.js +0 -1
  327. {modoboa-2.4.10.data → modoboa-2.5.0.data}/scripts/modoboa-admin.py +0 -0
  328. {modoboa-2.4.10.dist-info → modoboa-2.5.0.dist-info}/WHEEL +0 -0
  329. {modoboa-2.4.10.dist-info → modoboa-2.5.0.dist-info}/entry_points.txt +0 -0
  330. {modoboa-2.4.10.dist-info → modoboa-2.5.0.dist-info}/licenses/LICENSE +0 -0
  331. {modoboa-2.4.10.dist-info → modoboa-2.5.0.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-07-27 10:50+0200\n"
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:88
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:98
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:116
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:162 admin/api/v1/serializers.py:357
51
- #: admin/api/v2/serializers.py:548 admin/models/alias.py:44
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:224 admin/api/v2/serializers.py:88
56
- #: admin/api/v2/serializers.py:470 core/api/v2/serializers.py:235
57
- #: core/api/v2/serializers.py:237 core/api/v2/serializers.py:246
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:236
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:330 admin/api/v2/serializers.py:530
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:348
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:390 admin/api/v2/serializers.py:582
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:402 admin/api/v2/serializers.py:599
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:492
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:508 admin/api/v2/viewsets.py:286
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:544
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:553
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:80
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:92
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:99
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:133
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:248 admin/api/v2/serializers.py:254
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:263
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:266 pdfcredentials/api/v2/serializers.py:79
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:277
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:290
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:303
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:565
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:587
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:751
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:162
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:340
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:308
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:172
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:179
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:87
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:425
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:175 core/app_settings.py:17
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:194 core/api/v2/serializers.py:201
995
- #: core/api/v2/serializers.py:208
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:213
992
+ #: core/api/v2/serializers.py:233
1000
993
  msgid "Invalid rounds number"
1001
994
  msgstr ""
1002
995
 
1003
- #: core/api/v2/serializers.py:413 core/forms.py:81
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:483 core/views/auth.py:194 core/views/auth.py:247
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:164
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:174
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:186 core/api/v2/viewsets.py:188
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:726
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:728
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:735
1574
+ #: core/app_settings.py:746
1574
1575
  msgid "Default top redirection"
1575
1576
  msgstr ""
1576
1577
 
1577
- #: core/app_settings.py:737
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/dovecot."
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, debian."
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:81
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:102
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()), 12)
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()), 2)
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
@@ -41,6 +41,8 @@ class PolicyDaemonTestCase(RedisTestCaseMixin, ParametersMixin, TransactionTestC
41
41
  A redis instance is required to run those tests.
42
42
  """
43
43
 
44
+ databases = "__all__"
45
+
44
46
  def setUp(self):
45
47
  super().setUp()
46
48
  call_command("load_initial_data")
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")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modoboa
3
- Version: 2.4.10
3
+ Version: 2.5.0
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.5
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.7.0
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.5.1
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"