modoboa 2.4.11__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 (314) hide show
  1. modoboa/admin/api/v2/serializers.py +14 -0
  2. modoboa/amavis/__init__.py +3 -0
  3. modoboa/amavis/app_settings.py +276 -0
  4. modoboa/amavis/apps.py +18 -0
  5. modoboa/amavis/checks/__init__.py +2 -0
  6. modoboa/amavis/checks/settings_checks.py +59 -0
  7. modoboa/amavis/dbrouter.py +35 -0
  8. modoboa/amavis/factories.py +164 -0
  9. modoboa/amavis/handlers.py +146 -0
  10. modoboa/amavis/lib.py +381 -0
  11. modoboa/amavis/management/__init__.py +0 -0
  12. modoboa/amavis/management/commands/__init__.py +0 -0
  13. modoboa/amavis/management/commands/amnotify.py +99 -0
  14. modoboa/amavis/management/commands/qcleanup.py +84 -0
  15. modoboa/amavis/migrations/0001_initial.py +340 -0
  16. modoboa/amavis/migrations/__init__.py +0 -0
  17. modoboa/amavis/models.py +226 -0
  18. modoboa/amavis/serializers.py +139 -0
  19. modoboa/amavis/sql_connector.py +240 -0
  20. modoboa/amavis/sql_email.py +66 -0
  21. modoboa/amavis/tasks.py +33 -0
  22. modoboa/amavis/templates/amavis/notifications/pending_requests.html +16 -0
  23. modoboa/amavis/tests/__init__.py +0 -0
  24. modoboa/amavis/tests/sa-learn +3 -0
  25. modoboa/amavis/tests/sample_messages/quarantined-input.txt +80 -0
  26. modoboa/amavis/tests/sample_messages/quarantined-output-plain_nolinks.txt +17 -0
  27. modoboa/amavis/tests/spamc +3 -0
  28. modoboa/amavis/tests/test_checks.py +25 -0
  29. modoboa/amavis/tests/test_handlers.py +214 -0
  30. modoboa/amavis/tests/test_lib.py +90 -0
  31. modoboa/amavis/tests/test_management_commands.py +45 -0
  32. modoboa/amavis/tests/test_sql_email.py +67 -0
  33. modoboa/amavis/tests/test_utils.py +19 -0
  34. modoboa/amavis/tests/test_viewsets.py +319 -0
  35. modoboa/amavis/urls.py +11 -0
  36. modoboa/amavis/utils.py +105 -0
  37. modoboa/amavis/viewsets.py +265 -0
  38. modoboa/core/api/v1/serializers.py +7 -5
  39. modoboa/core/api/v2/serializers.py +4 -2
  40. modoboa/core/api/v2/tests.py +16 -4
  41. modoboa/core/api/v2/urls.py +5 -5
  42. modoboa/core/api/v2/views.py +3 -1
  43. modoboa/core/api/v2/viewsets.py +24 -3
  44. modoboa/core/handlers.py +6 -2
  45. modoboa/core/management/commands/add_allowed_hosts.py +33 -0
  46. modoboa/core/management/commands/load_initial_data.py +10 -0
  47. modoboa/core/migrations/0025_rename_user_email_is_active_core_user_email_c0c03f_idx.py +23 -5
  48. modoboa/core/tests/test_core.py +24 -0
  49. modoboa/core/utils.py +3 -0
  50. modoboa/frontend_dist/assets/AccountAliasForm-BuSy_1n9.js +1 -0
  51. modoboa/frontend_dist/assets/AccountEditView-qdJmLM_e.js +1 -0
  52. modoboa/frontend_dist/assets/AccountLayout-DrN7vHsX.js +1 -0
  53. modoboa/frontend_dist/assets/AccountPasswordSubForm-DZGt_Xgq.js +1 -0
  54. modoboa/frontend_dist/assets/AccountView-CO65y0vZ.js +1 -0
  55. modoboa/frontend_dist/assets/AddressBook-BZNUlhek.js +1 -0
  56. modoboa/frontend_dist/assets/AdminLayout-CTNhuwTw.js +1 -0
  57. modoboa/frontend_dist/assets/AlarmsView-9yKGbmkC.css +1 -0
  58. modoboa/frontend_dist/assets/AlarmsView-DN_JIw9g.js +1 -0
  59. modoboa/frontend_dist/assets/AliasEditView-DjpPUTp9.js +1 -0
  60. modoboa/frontend_dist/assets/{AliasRecipientForm-IOae6sjF.js → AliasRecipientForm-B1Y8wFdP.js} +1 -1
  61. modoboa/frontend_dist/assets/AliasView-GOJ5lyQH.js +1 -0
  62. modoboa/frontend_dist/assets/AuditTrailView-fbXmq70e.js +1 -0
  63. modoboa/frontend_dist/assets/CalendarView-LlQQNEPL.js +1 -0
  64. modoboa/frontend_dist/assets/{ChoiceField-DJ_c78Cm.js → ChoiceField-B3ReQHVe.js} +1 -1
  65. modoboa/frontend_dist/assets/ComposeEmailForm-Bs1fZXAL.js +1 -0
  66. modoboa/frontend_dist/assets/ComposeEmailView-s3LMl3pO.js +1 -0
  67. modoboa/frontend_dist/assets/ConfirmDialog-DY_kUHLG.js +1 -0
  68. modoboa/frontend_dist/assets/{ConnectedLayout-Dvwmicnc.css → ConnectedLayout-Bxh21hcH.css} +1 -1
  69. modoboa/frontend_dist/assets/ConnectedLayout-UWjiYBNw.js +1 -0
  70. modoboa/frontend_dist/assets/CreationForm-ORg3fazt.js +1 -0
  71. modoboa/frontend_dist/assets/DashboardView-Dplk9itS.js +1 -0
  72. modoboa/frontend_dist/assets/DomainAdminList-DVn9x0rB.js +1 -0
  73. modoboa/frontend_dist/assets/DomainEditView-nAoL64D_.js +1 -0
  74. modoboa/frontend_dist/assets/{DomainTransportForm-C2xo0Yd7.js → DomainTransportForm-CA-DNUxX.js} +1 -1
  75. modoboa/frontend_dist/assets/{DomainView-BDKoBFYr.css → DomainView-CCLYXPHx.css} +1 -1
  76. modoboa/frontend_dist/assets/DomainView-CdXPpwJG.js +5 -0
  77. modoboa/frontend_dist/assets/DomainsView-B_59gowf.js +1 -0
  78. modoboa/frontend_dist/assets/DomainsView-DZ-ss9bI.css +1 -0
  79. modoboa/frontend_dist/assets/EmailField-CwcwI5xW.js +1 -0
  80. modoboa/frontend_dist/assets/EmailView-BshxcfAK.js +1 -0
  81. modoboa/frontend_dist/assets/EmptyLayout-DFfhnhLi.js +1 -0
  82. modoboa/frontend_dist/assets/FiltersView-Cf20MSTK.js +1 -0
  83. modoboa/frontend_dist/assets/ForwardEmailView-CZG062os.js +1 -0
  84. modoboa/frontend_dist/assets/{HtmlEditor-CJ9umKeO.js → HtmlEditor-Bh4c689R.js} +1 -1
  85. modoboa/frontend_dist/assets/IdentitiesView-BXAuU1YX.js +1 -0
  86. modoboa/frontend_dist/assets/{IdentitiesView-0ziuQ5s-.css → IdentitiesView-DPrrRMS5.css} +1 -1
  87. modoboa/frontend_dist/assets/InformationView-C9vvvQhJ.css +1 -0
  88. modoboa/frontend_dist/assets/InformationView-Cn5FZW7H.js +1 -0
  89. modoboa/frontend_dist/assets/{LoadingData-CYwX3Jpn.js → LoadingData-CdVvm4FI.js} +1 -1
  90. modoboa/frontend_dist/assets/{LoginCallbackView-E01qkKn0.js → LoginCallbackView-B9hAH4MI.js} +1 -1
  91. modoboa/frontend_dist/assets/{LoginView-Cy4uFV9h.js → LoginView-tHIR4Adc.js} +1 -1
  92. modoboa/frontend_dist/assets/MailboxView-Bugu2vhg.js +1 -0
  93. modoboa/frontend_dist/assets/MenuItems-PXjiG-fs.js +1 -0
  94. modoboa/frontend_dist/assets/MessageView-Cy4STShm.js +1 -0
  95. modoboa/frontend_dist/assets/MessagesView-DdkuEgfX.js +1 -0
  96. modoboa/frontend_dist/assets/MigrationsView-CidSEjCF.js +1 -0
  97. modoboa/frontend_dist/assets/{ParametersForm-BZM0QSvg.js → ParametersForm-CAv4SH-E.js} +1 -1
  98. modoboa/frontend_dist/assets/ParametersView-CX7Ffemw.js +1 -0
  99. modoboa/frontend_dist/assets/ParametersView-CrbNcmV3.js +1 -0
  100. modoboa/frontend_dist/assets/ProviderEditView-CrltAQXl.js +1 -0
  101. modoboa/frontend_dist/assets/ProviderGeneralForm-BYAzVnXM.js +1 -0
  102. modoboa/frontend_dist/assets/ProvidersView-osjIY4Ex.js +1 -0
  103. modoboa/frontend_dist/assets/QuarantineLayout-B8EcU9vS.js +1 -0
  104. modoboa/frontend_dist/assets/QuarantineView-D4gOE4EQ.css +1 -0
  105. modoboa/frontend_dist/assets/QuarantineView-D8Qg0MXA.js +1 -0
  106. modoboa/frontend_dist/assets/ReplyEmailView-BABPqWhd.js +1 -0
  107. modoboa/frontend_dist/assets/ResourcesForm-OaqdRYVs.js +1 -0
  108. modoboa/frontend_dist/assets/SelfServiceLayout-d277YTGR.js +1 -0
  109. modoboa/frontend_dist/assets/{SettingsView-BxLJBFY0.js → SettingsView-9iNcDhkI.js} +2 -2
  110. modoboa/frontend_dist/assets/StatisticsView-cHsPyGkL.js +1 -0
  111. modoboa/frontend_dist/assets/TimeSerieChart--V83dcJ9.js +1 -0
  112. modoboa/frontend_dist/assets/UserLayout-B3sBiTcZ.js +1 -0
  113. modoboa/frontend_dist/assets/VAlert-BuaaYN2h.js +1 -0
  114. modoboa/frontend_dist/assets/VApp-CKP-6zGP.js +1 -0
  115. modoboa/frontend_dist/assets/VAutocomplete-Dwv6_Rzq.js +1 -0
  116. modoboa/frontend_dist/assets/VAvatar-Cmga0vj6.js +1 -0
  117. modoboa/frontend_dist/assets/VBadge-BQrRJ9S0.css +1 -0
  118. modoboa/frontend_dist/assets/VBadge-CixeK87a.js +1 -0
  119. modoboa/frontend_dist/assets/VCard-CxH9DWoK.js +1 -0
  120. modoboa/frontend_dist/assets/VCheckbox-62GOpvvP.js +1 -0
  121. modoboa/frontend_dist/assets/{VCheckboxBtn-Dt810gWf.js → VCheckboxBtn-DMoNtKT8.js} +1 -1
  122. modoboa/frontend_dist/assets/VChip-D_styETR.js +1 -0
  123. modoboa/frontend_dist/assets/VColorPicker-BHscBGQV.js +1 -0
  124. modoboa/frontend_dist/assets/{VContainer-DvTbsotR.js → VContainer-B46caNs1.js} +1 -1
  125. modoboa/frontend_dist/assets/VDataTable-Bh8NbVSx.js +1 -0
  126. modoboa/frontend_dist/assets/VDataTableServer-BDR5hOmo.js +1 -0
  127. modoboa/frontend_dist/assets/VDataTableVirtual-BOQlNtIG.js +1 -0
  128. modoboa/frontend_dist/assets/{VDialog-Bk6EWNhz.js → VDialog-BcTg7w6P.js} +1 -1
  129. modoboa/frontend_dist/assets/VExpansionPanels-BmH5Jl2Z.js +1 -0
  130. modoboa/frontend_dist/assets/VFileInput-BC4yAygd.js +1 -0
  131. modoboa/frontend_dist/assets/VForm-D5iPGkde.js +1 -0
  132. modoboa/frontend_dist/assets/VInput-CcxkaOXT.css +1 -0
  133. modoboa/frontend_dist/assets/VInput-CoDJzvaW.js +1 -0
  134. modoboa/frontend_dist/assets/VMenu-gUG70-zD.js +1 -0
  135. modoboa/frontend_dist/assets/VPicker-BXuKT3zB.js +1 -0
  136. modoboa/frontend_dist/assets/VProgressCircular-BtOPiGCg.js +1 -0
  137. modoboa/frontend_dist/assets/VRadioGroup-DIFZKSn-.js +1 -0
  138. modoboa/frontend_dist/assets/{VRow-BF35mT1S.js → VRow-ozg66L7j.js} +1 -1
  139. modoboa/frontend_dist/assets/VSelect-C3RjAa45.js +1 -0
  140. modoboa/frontend_dist/assets/VSelectionControl-zyz-fJvC.js +1 -0
  141. modoboa/frontend_dist/assets/VSheet-BNx2X4Mk.js +1 -0
  142. modoboa/frontend_dist/assets/VSpacer-DinPiXs9.js +1 -0
  143. modoboa/frontend_dist/assets/VSwitch-DwxdeAEq.js +1 -0
  144. modoboa/frontend_dist/assets/VTable-DaLxa4FO.js +1 -0
  145. modoboa/frontend_dist/assets/VTabs-BP0Hgsgm.js +1 -0
  146. modoboa/frontend_dist/assets/VTextField-BzBVKKob.css +1 -0
  147. modoboa/frontend_dist/assets/VTextField-XoGTj1KG.js +1 -0
  148. modoboa/frontend_dist/assets/VTextarea-wBlRMIv_.js +1 -0
  149. modoboa/frontend_dist/assets/VToolbar-CFZfqeOr.js +1 -0
  150. modoboa/frontend_dist/assets/VWindowItem-BB7ETW3b.js +1 -0
  151. modoboa/frontend_dist/assets/WebmailLayout-_Hk1XhVq.js +1 -0
  152. modoboa/frontend_dist/assets/accounts-DUzbx6k8.js +1 -0
  153. modoboa/frontend_dist/assets/{admin-o-HRGnmT.js → admin-DewTk2H8.js} +1 -1
  154. modoboa/frontend_dist/assets/{aliases-DDVeehyg.js → aliases-4sXmjwXp.js} +1 -1
  155. modoboa/frontend_dist/assets/amavis-CC0li7_T.js +1 -0
  156. modoboa/frontend_dist/assets/amavis-DK8SHE6o.js +1 -0
  157. modoboa/frontend_dist/assets/{contacts-C84DY-Q1.js → contacts-BjghrPqZ.js} +1 -1
  158. modoboa/frontend_dist/assets/{domains-Bgn4ixHL.js → domains-BSawReeu.js} +1 -1
  159. modoboa/frontend_dist/assets/{domains.store-DTE-V7Y1.js → domains.store-D-vWCEIK.js} +1 -1
  160. modoboa/frontend_dist/assets/{filter-CnffiQAW.js → filter-C82FUCw_.js} +1 -1
  161. modoboa/frontend_dist/assets/forwardRefs-cvcnlhoK.js +1 -0
  162. modoboa/frontend_dist/assets/global.store-DbkcI5o2.js +1 -0
  163. modoboa/frontend_dist/assets/{importExport-BlQYb0NO.js → importExport-DzoL4Mvc.js} +1 -1
  164. modoboa/frontend_dist/assets/index-BImkz5Jx.js +984 -0
  165. modoboa/frontend_dist/assets/layout-C5FyYCHK.js +1 -0
  166. modoboa/frontend_dist/assets/{layout.store-DkjrAoXt.js → layout.store-NXWtFIwL.js} +1 -1
  167. modoboa/frontend_dist/assets/{logos-q8SEyAa4.js → logos-BswdveCV.js} +1 -1
  168. modoboa/frontend_dist/assets/{logs-B7IJ7LBa.js → logs-6CbtfaZS.js} +1 -1
  169. modoboa/frontend_dist/assets/{parameters-A6iBEYQq.js → parameters-aSQiR7kN.js} +1 -1
  170. modoboa/frontend_dist/assets/{parameters.store-BiXS4_6w.js → parameters.store-CzQqVatx.js} +1 -1
  171. modoboa/frontend_dist/assets/permissions-DNoefz-n.js +1 -0
  172. modoboa/frontend_dist/assets/{ssrBoot-AzTdjPjk.js → ssrBoot-CKUX4kcb.js} +1 -1
  173. modoboa/frontend_dist/assets/{tag-BnSYRTcD.js → tag-B_yWNNJD.js} +1 -1
  174. modoboa/frontend_dist/assets/transports-BDNB9wR5.js +1 -0
  175. modoboa/frontend_dist/assets/{webmail-CSH_3l6R.js → webmail-CdU6CD9b.js} +1 -1
  176. modoboa/frontend_dist/index.html +1 -1
  177. modoboa/lib/email_utils.py +2 -2
  178. modoboa/lib/permissions.py +7 -0
  179. modoboa/lib/test_runners.py +29 -0
  180. modoboa/lib/tests/__init__.py +5 -1
  181. modoboa/locale/br/LC_MESSAGES/django.po +87 -75
  182. modoboa/locale/cs/LC_MESSAGES/django.po +82 -74
  183. modoboa/locale/cs_CZ/LC_MESSAGES/django.po +145 -121
  184. modoboa/locale/de/LC_MESSAGES/django.mo +0 -0
  185. modoboa/locale/de/LC_MESSAGES/django.po +339 -651
  186. modoboa/locale/de_DE/LC_MESSAGES/django.po +87 -75
  187. modoboa/locale/el_GR/LC_MESSAGES/django.po +160 -135
  188. modoboa/locale/en/LC_MESSAGES/django.po +82 -74
  189. modoboa/locale/es/LC_MESSAGES/django.po +158 -131
  190. modoboa/locale/es_MX/LC_MESSAGES/django.po +82 -74
  191. modoboa/locale/fi/LC_MESSAGES/django.po +87 -75
  192. modoboa/locale/fr/LC_MESSAGES/django.mo +0 -0
  193. modoboa/locale/fr/LC_MESSAGES/django.po +469 -201
  194. modoboa/locale/hu/LC_MESSAGES/django.po +82 -74
  195. modoboa/locale/it/LC_MESSAGES/django.mo +0 -0
  196. modoboa/locale/it/LC_MESSAGES/django.po +148 -122
  197. modoboa/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
  198. modoboa/locale/ja_JP/LC_MESSAGES/django.po +80 -72
  199. modoboa/locale/ka/LC_MESSAGES/django.po +82 -74
  200. modoboa/locale/nl_NL/LC_MESSAGES/django.po +160 -132
  201. modoboa/locale/no/LC_MESSAGES/django.po +82 -74
  202. modoboa/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
  203. modoboa/locale/pl_PL/LC_MESSAGES/django.po +172 -149
  204. modoboa/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  205. modoboa/locale/pt_BR/LC_MESSAGES/django.po +172 -144
  206. modoboa/locale/pt_PT/LC_MESSAGES/django.po +135 -112
  207. modoboa/locale/ro_RO/LC_MESSAGES/django.po +87 -75
  208. modoboa/locale/ru/LC_MESSAGES/django.po +142 -118
  209. modoboa/locale/si/LC_MESSAGES/django.po +82 -74
  210. modoboa/locale/sk/LC_MESSAGES/django.po +82 -74
  211. modoboa/locale/sk_SK/LC_MESSAGES/django.po +84 -76
  212. modoboa/locale/sl_SI/LC_MESSAGES/django.po +90 -76
  213. modoboa/locale/sv/LC_MESSAGES/django.mo +0 -0
  214. modoboa/locale/sv/LC_MESSAGES/django.po +172 -139
  215. modoboa/locale/tr/LC_MESSAGES/django.po +87 -75
  216. modoboa/locale/tr_TR/LC_MESSAGES/django.po +84 -74
  217. modoboa/locale/uk/LC_MESSAGES/django.po +82 -74
  218. modoboa/locale/zh/LC_MESSAGES/django.po +82 -74
  219. modoboa/locale/zh_CN/LC_MESSAGES/django.po +82 -74
  220. modoboa/locale/zh_TW/LC_MESSAGES/django.po +87 -75
  221. modoboa/parameters/api/v2/tests.py +2 -2
  222. modoboa/parameters/api/v2/viewsets.py +2 -0
  223. modoboa/policyd/tests.py +2 -0
  224. modoboa/urls_api_v2.py +6 -0
  225. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/METADATA +6 -4
  226. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/RECORD +231 -181
  227. modoboa/frontend_dist/assets/AccountAliasForm-BV6KvTu6.js +0 -1
  228. modoboa/frontend_dist/assets/AccountEditView-DDOFyfBD.js +0 -1
  229. modoboa/frontend_dist/assets/AccountLayout-rX51xgxT.js +0 -1
  230. modoboa/frontend_dist/assets/AccountPasswordSubForm-D9S6LaeH.js +0 -1
  231. modoboa/frontend_dist/assets/AccountView-cmvaZNq3.js +0 -1
  232. modoboa/frontend_dist/assets/AddressBook-DCJxL8SU.js +0 -1
  233. modoboa/frontend_dist/assets/AdminLayout-r0wfG2lO.js +0 -1
  234. modoboa/frontend_dist/assets/AlarmsView-Bheey-gp.css +0 -1
  235. modoboa/frontend_dist/assets/AlarmsView-C0bqC4PA.js +0 -1
  236. modoboa/frontend_dist/assets/AliasEditView-DVoWoCGY.js +0 -1
  237. modoboa/frontend_dist/assets/AliasView-DrONZXOh.js +0 -1
  238. modoboa/frontend_dist/assets/AuditTrailView-OTkoZaMU.js +0 -1
  239. modoboa/frontend_dist/assets/CalendarView-CqF4_Ui9.js +0 -1
  240. modoboa/frontend_dist/assets/ComposeEmailForm-DO5_GB3e.js +0 -1
  241. modoboa/frontend_dist/assets/ComposeEmailView-A91HCBsN.js +0 -1
  242. modoboa/frontend_dist/assets/ConfirmDialog-BBcgdAnO.js +0 -1
  243. modoboa/frontend_dist/assets/ConnectedLayout-1oRW-Rql.js +0 -1
  244. modoboa/frontend_dist/assets/CreationForm-71YJbjsA.js +0 -1
  245. modoboa/frontend_dist/assets/DashboardView-CdLpSfUl.js +0 -1
  246. modoboa/frontend_dist/assets/DomainAdminList-BjC4KsqI.js +0 -1
  247. modoboa/frontend_dist/assets/DomainEditView-CQjKwYxl.js +0 -1
  248. modoboa/frontend_dist/assets/DomainView-BhhuZI_N.js +0 -5
  249. modoboa/frontend_dist/assets/DomainsView-Cft4BP8Z.js +0 -1
  250. modoboa/frontend_dist/assets/DomainsView-DasJ0NdZ.css +0 -1
  251. modoboa/frontend_dist/assets/EmailField-C8umy0EU.js +0 -1
  252. modoboa/frontend_dist/assets/EmailView-ki7uEQPD.js +0 -1
  253. modoboa/frontend_dist/assets/EmptyLayout-DaA1XH9n.js +0 -1
  254. modoboa/frontend_dist/assets/FiltersView-FYFZxG4B.js +0 -1
  255. modoboa/frontend_dist/assets/ForwardEmailView-cUbnSYCF.js +0 -1
  256. modoboa/frontend_dist/assets/IdentitiesView-njNo8N5n.js +0 -1
  257. modoboa/frontend_dist/assets/InformationView-D1h38POt.js +0 -1
  258. modoboa/frontend_dist/assets/InformationView-U5Ww-Sx1.css +0 -1
  259. modoboa/frontend_dist/assets/MailboxView-IlrLWm_H.js +0 -1
  260. modoboa/frontend_dist/assets/MenuItems-BAtHWzAE.js +0 -1
  261. modoboa/frontend_dist/assets/MessagesView-OSpjixFq.js +0 -1
  262. modoboa/frontend_dist/assets/MigrationsView-DKNOsVzF.js +0 -1
  263. modoboa/frontend_dist/assets/ParametersView-C4bXASiq.js +0 -1
  264. modoboa/frontend_dist/assets/ParametersView-CYXgNmc1.js +0 -1
  265. modoboa/frontend_dist/assets/ProviderEditView-CyxCWTST.js +0 -1
  266. modoboa/frontend_dist/assets/ProviderGeneralForm-BYPjNHqB.js +0 -1
  267. modoboa/frontend_dist/assets/ProvidersView-CxrMkRyk.js +0 -1
  268. modoboa/frontend_dist/assets/ReplyEmailView-Dkw9-N26.js +0 -1
  269. modoboa/frontend_dist/assets/ResourcesForm-CuUvrOdY.js +0 -1
  270. modoboa/frontend_dist/assets/StatisticsView-BN7QsZMT.js +0 -1
  271. modoboa/frontend_dist/assets/TimeSerieChart-BMN8BeFZ.js +0 -1
  272. modoboa/frontend_dist/assets/UserLayout-B6-JQg4F.js +0 -1
  273. modoboa/frontend_dist/assets/VAlert-DIQTrRif.js +0 -1
  274. modoboa/frontend_dist/assets/VApp-CpkYA7js.js +0 -1
  275. modoboa/frontend_dist/assets/VAutocomplete-C4IpXyl8.js +0 -1
  276. modoboa/frontend_dist/assets/VAvatar-Lpb-Dion.js +0 -1
  277. modoboa/frontend_dist/assets/VCard-er_isjE_.js +0 -1
  278. modoboa/frontend_dist/assets/VCheckbox-D-u8JXP1.js +0 -1
  279. modoboa/frontend_dist/assets/VChip-B4iSpj8_.js +0 -1
  280. modoboa/frontend_dist/assets/VColorPicker-BAjGDsXv.js +0 -1
  281. modoboa/frontend_dist/assets/VDataTable-4JRjbtgF.js +0 -1
  282. modoboa/frontend_dist/assets/VDataTableServer-tIDT1m3-.js +0 -1
  283. modoboa/frontend_dist/assets/VDataTableVirtual-BlnO18u_.js +0 -1
  284. modoboa/frontend_dist/assets/VExpansionPanels-CwGtXDhr.js +0 -1
  285. modoboa/frontend_dist/assets/VFileInput-D1_7ZkO_.js +0 -1
  286. modoboa/frontend_dist/assets/VForm-DAkW4nfy.js +0 -1
  287. modoboa/frontend_dist/assets/VMenu-BPFJwj2f.js +0 -1
  288. modoboa/frontend_dist/assets/VPicker-CfT82M8N.js +0 -1
  289. modoboa/frontend_dist/assets/VProgressCircular-w75-3ogi.js +0 -1
  290. modoboa/frontend_dist/assets/VRadioGroup-0j6DNC_k.js +0 -1
  291. modoboa/frontend_dist/assets/VSelect-Cs4ARbAS.js +0 -1
  292. modoboa/frontend_dist/assets/VSelectionControl-Dg-XyRRS.js +0 -1
  293. modoboa/frontend_dist/assets/VSheet-Btq_Mu4s.js +0 -1
  294. modoboa/frontend_dist/assets/VSpacer-C7xukQmu.js +0 -1
  295. modoboa/frontend_dist/assets/VSwitch-Cs1NQrmk.js +0 -1
  296. modoboa/frontend_dist/assets/VTable-CNz2SGk4.js +0 -1
  297. modoboa/frontend_dist/assets/VTabs-B1fyVn4M.js +0 -1
  298. modoboa/frontend_dist/assets/VTextField-BdyvgvkG.js +0 -1
  299. modoboa/frontend_dist/assets/VTextField-C-J20yj_.css +0 -1
  300. modoboa/frontend_dist/assets/VTextarea-DnOMpe0Q.js +0 -1
  301. modoboa/frontend_dist/assets/VToolbar-BiCiBxBJ.js +0 -1
  302. modoboa/frontend_dist/assets/VWindowItem-ChWm_kz3.js +0 -1
  303. modoboa/frontend_dist/assets/WebmailLayout-o4uEkp9e.js +0 -1
  304. modoboa/frontend_dist/assets/forwardRefs-Dvjn_Xq4.js +0 -1
  305. modoboa/frontend_dist/assets/global.store-BaiD63EN.js +0 -1
  306. modoboa/frontend_dist/assets/index-I1VDlN4g.js +0 -984
  307. modoboa/frontend_dist/assets/layout-D8ZJPiJ_.js +0 -1
  308. modoboa/frontend_dist/assets/permissions-CITHLHVg.js +0 -1
  309. modoboa/frontend_dist/assets/transports-Dz7c6kIy.js +0 -1
  310. {modoboa-2.4.11.data → modoboa-2.5.0.data}/scripts/modoboa-admin.py +0 -0
  311. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/WHEEL +0 -0
  312. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/entry_points.txt +0 -0
  313. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/licenses/LICENSE +0 -0
  314. {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python
2
+
3
+
4
+ import time
5
+
6
+ from django.core.management.base import BaseCommand
7
+ from django.db.models import Count
8
+
9
+ from modoboa.parameters import tools as param_tools
10
+ from ...models import Maddr, Msgrcpt, Msgs
11
+
12
+
13
+ class Command(BaseCommand):
14
+ args = ""
15
+ help = "Amavis quarantine cleanup" # NOQA:A003
16
+
17
+ def add_arguments(self, parser):
18
+ """Add extra arguments to command line."""
19
+ parser.add_argument(
20
+ "--debug", action="store_true", default=False, help="Activate debug output"
21
+ )
22
+ parser.add_argument(
23
+ "--verbose",
24
+ action="store_true",
25
+ default=False,
26
+ help="Display informational messages",
27
+ )
28
+
29
+ def __vprint(self, msg):
30
+ if not self.verbose:
31
+ return
32
+ print(msg)
33
+
34
+ def handle(self, *args, **options):
35
+ if options["debug"]:
36
+ import logging
37
+
38
+ log = logging.getLogger("django.db.backends")
39
+ log.setLevel(logging.DEBUG)
40
+ log.addHandler(logging.StreamHandler())
41
+ self.verbose = options["verbose"]
42
+
43
+ conf = dict(param_tools.get_global_parameters("amavis"))
44
+
45
+ flags = ["D"]
46
+ if conf["released_msgs_cleanup"]:
47
+ flags += ["R"]
48
+
49
+ self.__vprint("Deleting marked messages...")
50
+ ids = Msgrcpt.objects.filter(rs__in=flags).values("mail_id").distinct()
51
+ for msg in Msgs.objects.filter(mail_id__in=ids):
52
+ if not msg.msgrcpt_set.exclude(rs__in=flags).count():
53
+ msg.delete()
54
+
55
+ self.__vprint(
56
+ "Deleting messages older than {} days...".format(conf["max_messages_age"])
57
+ )
58
+ limit = int(time.time()) - (conf["max_messages_age"] * 24 * 3600)
59
+ while True:
60
+ qset = Msgs.objects.filter(
61
+ pk__in=list(
62
+ Msgs.objects.filter(time_num__lt=limit).values_list(
63
+ "pk", flat=True
64
+ )[:5000]
65
+ )
66
+ )
67
+ if not qset.exists():
68
+ break
69
+ qset.delete()
70
+
71
+ self.__vprint("Deleting unreferenced e-mail addresses...")
72
+ while True:
73
+ res = (
74
+ Maddr.objects.annotate(
75
+ msgs_count=Count("msgs"), msgrcpt_count=Count("msgrcpt")
76
+ )
77
+ .filter(msgs_count=0, msgrcpt_count=0)
78
+ .values_list("id", flat=True)[:100000]
79
+ )
80
+ if not res.exists():
81
+ break
82
+ Maddr.objects.filter(id__in=list(res)).delete()
83
+
84
+ self.__vprint("Done.")
@@ -0,0 +1,340 @@
1
+ from django.db import models, migrations
2
+
3
+
4
+ class Migration(migrations.Migration):
5
+
6
+ dependencies = []
7
+
8
+ operations = [
9
+ migrations.CreateModel(
10
+ name="Maddr",
11
+ fields=[
12
+ ("partition_tag", models.IntegerField(default=0)),
13
+ ("id", models.BigIntegerField(serialize=False, primary_key=True)),
14
+ ("email", models.CharField(unique=True, max_length=255)),
15
+ ("domain", models.CharField(max_length=765)),
16
+ ],
17
+ options={
18
+ "db_table": "maddr",
19
+ "managed": False,
20
+ },
21
+ bases=(models.Model,),
22
+ ),
23
+ migrations.CreateModel(
24
+ name="Mailaddr",
25
+ fields=[
26
+ ("id", models.IntegerField(serialize=False, primary_key=True)),
27
+ ("priority", models.IntegerField()),
28
+ ("email", models.CharField(unique=True, max_length=255)),
29
+ ],
30
+ options={
31
+ "db_table": "mailaddr",
32
+ "managed": False,
33
+ },
34
+ bases=(models.Model,),
35
+ ),
36
+ migrations.CreateModel(
37
+ name="Msgs",
38
+ fields=[
39
+ ("partition_tag", models.IntegerField(default=0)),
40
+ (
41
+ "mail_id",
42
+ models.CharField(max_length=12, serialize=False, primary_key=True),
43
+ ),
44
+ ("secret_id", models.CharField(max_length=12, blank=True)),
45
+ ("am_id", models.CharField(max_length=60)),
46
+ ("time_num", models.IntegerField()),
47
+ ("time_iso", models.CharField(max_length=48)),
48
+ ("policy", models.CharField(max_length=765, blank=True)),
49
+ ("client_addr", models.CharField(max_length=765, blank=True)),
50
+ ("size", models.IntegerField()),
51
+ ("originating", models.CharField(max_length=3)),
52
+ ("content", models.CharField(max_length=1, blank=True)),
53
+ ("quar_type", models.CharField(max_length=1, blank=True)),
54
+ ("quar_loc", models.CharField(max_length=255, blank=True)),
55
+ ("dsn_sent", models.CharField(max_length=3, blank=True)),
56
+ ("spam_level", models.FloatField(null=True, blank=True)),
57
+ ("message_id", models.CharField(max_length=765, blank=True)),
58
+ ("from_addr", models.CharField(max_length=765, blank=True)),
59
+ ("subject", models.CharField(max_length=765, blank=True)),
60
+ ("host", models.CharField(max_length=765)),
61
+ ],
62
+ options={
63
+ "db_table": "msgs",
64
+ "managed": False,
65
+ },
66
+ bases=(models.Model,),
67
+ ),
68
+ migrations.CreateModel(
69
+ name="Msgrcpt",
70
+ fields=[
71
+ ("partition_tag", models.IntegerField(default=0)),
72
+ (
73
+ "mail",
74
+ models.ForeignKey(
75
+ primary_key=True,
76
+ serialize=False,
77
+ to="amavis.Msgs",
78
+ on_delete=models.CASCADE,
79
+ ),
80
+ ),
81
+ ("rseqnum", models.IntegerField(default=0)),
82
+ ("is_local", models.CharField(max_length=3)),
83
+ ("content", models.CharField(max_length=3)),
84
+ ("ds", models.CharField(max_length=3)),
85
+ ("rs", models.CharField(max_length=3)),
86
+ ("bl", models.CharField(max_length=3, blank=True)),
87
+ ("wl", models.CharField(max_length=3, blank=True)),
88
+ ("bspam_level", models.FloatField(null=True, blank=True)),
89
+ ("smtp_resp", models.CharField(max_length=765, blank=True)),
90
+ ],
91
+ options={
92
+ "db_table": "msgrcpt",
93
+ "managed": False,
94
+ },
95
+ bases=(models.Model,),
96
+ ),
97
+ migrations.CreateModel(
98
+ name="Policy",
99
+ fields=[
100
+ (
101
+ "id",
102
+ models.AutoField(
103
+ verbose_name="ID",
104
+ serialize=False,
105
+ auto_created=True,
106
+ primary_key=True,
107
+ ),
108
+ ),
109
+ ("policy_name", models.CharField(max_length=32, blank=True)),
110
+ ("virus_lover", models.CharField(max_length=3, null=True, blank=True)),
111
+ ("spam_lover", models.CharField(max_length=3, null=True, blank=True)),
112
+ (
113
+ "unchecked_lover",
114
+ models.CharField(max_length=3, null=True, blank=True),
115
+ ),
116
+ (
117
+ "banned_files_lover",
118
+ models.CharField(max_length=3, null=True, blank=True),
119
+ ),
120
+ (
121
+ "bad_header_lover",
122
+ models.CharField(max_length=3, null=True, blank=True),
123
+ ),
124
+ (
125
+ "bypass_virus_checks",
126
+ models.CharField(
127
+ default=b"",
128
+ choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
129
+ max_length=3,
130
+ help_text="Bypass virus checks or not. Choose 'default' to use global settings.",
131
+ null=True,
132
+ verbose_name="Virus filter",
133
+ ),
134
+ ),
135
+ (
136
+ "bypass_spam_checks",
137
+ models.CharField(
138
+ default=b"",
139
+ choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
140
+ max_length=3,
141
+ help_text="Bypass spam checks or not. Choose 'default' to use global settings.",
142
+ null=True,
143
+ verbose_name="Spam filter",
144
+ ),
145
+ ),
146
+ (
147
+ "bypass_banned_checks",
148
+ models.CharField(
149
+ default=b"",
150
+ choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
151
+ max_length=3,
152
+ help_text="Bypass banned checks or not. Choose 'default' to use global settings.",
153
+ null=True,
154
+ verbose_name="Banned filter",
155
+ ),
156
+ ),
157
+ (
158
+ "bypass_header_checks",
159
+ models.CharField(max_length=3, null=True, blank=True),
160
+ ),
161
+ (
162
+ "virus_quarantine_to",
163
+ models.CharField(max_length=192, null=True, blank=True),
164
+ ),
165
+ (
166
+ "spam_quarantine_to",
167
+ models.CharField(max_length=192, null=True, blank=True),
168
+ ),
169
+ (
170
+ "banned_quarantine_to",
171
+ models.CharField(max_length=192, null=True, blank=True),
172
+ ),
173
+ (
174
+ "unchecked_quarantine_to",
175
+ models.CharField(max_length=192, null=True, blank=True),
176
+ ),
177
+ (
178
+ "bad_header_quarantine_to",
179
+ models.CharField(max_length=192, null=True, blank=True),
180
+ ),
181
+ (
182
+ "clean_quarantine_to",
183
+ models.CharField(max_length=192, null=True, blank=True),
184
+ ),
185
+ (
186
+ "archive_quarantine_to",
187
+ models.CharField(max_length=192, null=True, blank=True),
188
+ ),
189
+ ("spam_tag_level", models.FloatField(null=True, blank=True)),
190
+ ("spam_tag2_level", models.FloatField(null=True, blank=True)),
191
+ ("spam_tag3_level", models.FloatField(null=True, blank=True)),
192
+ ("spam_kill_level", models.FloatField(null=True, blank=True)),
193
+ ("spam_dsn_cutoff_level", models.FloatField(null=True, blank=True)),
194
+ (
195
+ "spam_quarantine_cutoff_level",
196
+ models.FloatField(null=True, blank=True),
197
+ ),
198
+ (
199
+ "addr_extension_virus",
200
+ models.CharField(max_length=192, null=True, blank=True),
201
+ ),
202
+ (
203
+ "addr_extension_spam",
204
+ models.CharField(max_length=192, null=True, blank=True),
205
+ ),
206
+ (
207
+ "addr_extension_banned",
208
+ models.CharField(max_length=192, null=True, blank=True),
209
+ ),
210
+ (
211
+ "addr_extension_bad_header",
212
+ models.CharField(max_length=192, null=True, blank=True),
213
+ ),
214
+ (
215
+ "warnvirusrecip",
216
+ models.CharField(max_length=3, null=True, blank=True),
217
+ ),
218
+ (
219
+ "warnbannedrecip",
220
+ models.CharField(max_length=3, null=True, blank=True),
221
+ ),
222
+ (
223
+ "warnbadhrecip",
224
+ models.CharField(max_length=3, null=True, blank=True),
225
+ ),
226
+ (
227
+ "newvirus_admin",
228
+ models.CharField(max_length=192, null=True, blank=True),
229
+ ),
230
+ (
231
+ "virus_admin",
232
+ models.CharField(max_length=192, null=True, blank=True),
233
+ ),
234
+ (
235
+ "banned_admin",
236
+ models.CharField(max_length=192, null=True, blank=True),
237
+ ),
238
+ (
239
+ "bad_header_admin",
240
+ models.CharField(max_length=192, null=True, blank=True),
241
+ ),
242
+ ("spam_admin", models.CharField(max_length=192, null=True, blank=True)),
243
+ (
244
+ "spam_subject_tag",
245
+ models.CharField(max_length=192, null=True, blank=True),
246
+ ),
247
+ (
248
+ "spam_subject_tag2",
249
+ models.CharField(
250
+ default=None,
251
+ max_length=192,
252
+ blank=True,
253
+ help_text="Modify spam subject using the specified text. Choose 'default' to use global settings.",
254
+ null=True,
255
+ verbose_name="Spam marker",
256
+ ),
257
+ ),
258
+ (
259
+ "spam_subject_tag3",
260
+ models.CharField(max_length=192, null=True, blank=True),
261
+ ),
262
+ ("message_size_limit", models.IntegerField(null=True, blank=True)),
263
+ (
264
+ "banned_rulenames",
265
+ models.CharField(max_length=192, null=True, blank=True),
266
+ ),
267
+ (
268
+ "disclaimer_options",
269
+ models.CharField(max_length=192, null=True, blank=True),
270
+ ),
271
+ (
272
+ "forward_method",
273
+ models.CharField(max_length=192, null=True, blank=True),
274
+ ),
275
+ (
276
+ "sa_userconf",
277
+ models.CharField(max_length=192, null=True, blank=True),
278
+ ),
279
+ (
280
+ "sa_username",
281
+ models.CharField(max_length=192, null=True, blank=True),
282
+ ),
283
+ ],
284
+ options={
285
+ "db_table": "policy",
286
+ "managed": False,
287
+ },
288
+ bases=(models.Model,),
289
+ ),
290
+ migrations.CreateModel(
291
+ name="Quarantine",
292
+ fields=[
293
+ ("partition_tag", models.IntegerField(default=0)),
294
+ (
295
+ "mail",
296
+ models.ForeignKey(
297
+ primary_key=True,
298
+ serialize=False,
299
+ to="amavis.Msgs",
300
+ on_delete=models.CASCADE,
301
+ ),
302
+ ),
303
+ ("chunk_ind", models.IntegerField()),
304
+ ("mail_text", models.TextField()),
305
+ ],
306
+ options={
307
+ "ordering": ["-mail__time_num"],
308
+ "db_table": "quarantine",
309
+ "managed": False,
310
+ },
311
+ bases=(models.Model,),
312
+ ),
313
+ migrations.CreateModel(
314
+ name="Users",
315
+ fields=[
316
+ ("id", models.AutoField(serialize=False, primary_key=True)),
317
+ ("priority", models.IntegerField()),
318
+ ("email", models.CharField(unique=True, max_length=255)),
319
+ ("fullname", models.CharField(max_length=765, blank=True)),
320
+ ],
321
+ options={
322
+ "db_table": "users",
323
+ "managed": False,
324
+ },
325
+ bases=(models.Model,),
326
+ ),
327
+ migrations.CreateModel(
328
+ name="Wblist",
329
+ fields=[
330
+ ("rid", models.IntegerField(serialize=False, primary_key=True)),
331
+ ("sid", models.IntegerField(primary_key=True)),
332
+ ("wb", models.CharField(max_length=30)),
333
+ ],
334
+ options={
335
+ "db_table": "wblist",
336
+ "managed": False,
337
+ },
338
+ bases=(models.Model,),
339
+ ),
340
+ ]
File without changes
@@ -0,0 +1,226 @@
1
+ # This is an auto-generated Django model module.
2
+ # You'll have to do the following manually to clean this up:
3
+ # * Rearrange models' order
4
+ # * Make sure each model has one field with primary_key=True
5
+ # Feel free to rename the models, but don't rename db_table values
6
+ # or field names.
7
+ #
8
+ # Also note: You'll have to insert the output of
9
+ # 'django-admin.py sqlcustom [appname]'into your database.
10
+ #
11
+ # Original Amavis version : 2.6.2
12
+
13
+ from datetime import datetime
14
+
15
+ from django.db import models
16
+ from django.utils.translation import gettext_lazy
17
+
18
+
19
+ class Maddr(models.Model):
20
+ partition_tag = models.IntegerField(default=0)
21
+ id = models.BigIntegerField(primary_key=True) # NOQA:A003
22
+ email = models.CharField(max_length=255)
23
+ domain = models.CharField(max_length=255)
24
+
25
+ class Meta:
26
+ db_table = "maddr"
27
+ unique_together = [("partition_tag", "email")]
28
+ managed = False
29
+
30
+
31
+ class Mailaddr(models.Model):
32
+ id = models.IntegerField(primary_key=True) # NOQA:A003
33
+ priority = models.IntegerField()
34
+ email = models.CharField(unique=True, max_length=255)
35
+
36
+ class Meta:
37
+ db_table = "mailaddr"
38
+ managed = False
39
+
40
+
41
+ class Msgs(models.Model):
42
+ partition_tag = models.IntegerField(default=0)
43
+ mail_id = models.BinaryField(max_length=16, primary_key=True)
44
+ secret_id = models.BinaryField()
45
+ am_id = models.CharField(max_length=60)
46
+ time_num = models.IntegerField()
47
+ time_iso = models.CharField(max_length=48)
48
+ sid = models.ForeignKey(Maddr, db_column="sid", on_delete=models.CASCADE)
49
+ policy = models.CharField(max_length=765, blank=True)
50
+ client_addr = models.CharField(max_length=765, blank=True)
51
+ size = models.IntegerField()
52
+ originating = models.CharField(max_length=3)
53
+ content = models.CharField(max_length=1, blank=True)
54
+ quar_type = models.CharField(max_length=1, blank=True)
55
+ quar_loc = models.CharField(max_length=255, blank=True)
56
+ dsn_sent = models.CharField(max_length=3, blank=True)
57
+ spam_level = models.FloatField(null=True, blank=True)
58
+ message_id = models.CharField(max_length=765, blank=True)
59
+ from_addr = models.CharField(max_length=765, blank=True)
60
+ subject = models.CharField(max_length=765, blank=True)
61
+ host = models.CharField(max_length=765)
62
+
63
+ class Meta:
64
+ db_table = "msgs"
65
+ managed = False
66
+ unique_together = ("partition_tag", "mail_id")
67
+
68
+ @property
69
+ def time_datetime(self) -> datetime:
70
+ return datetime.fromtimestamp(self.time_num)
71
+
72
+
73
+ class Msgrcpt(models.Model):
74
+ partition_tag = models.IntegerField(default=0)
75
+ mail = models.ForeignKey(Msgs, primary_key=True, on_delete=models.CASCADE)
76
+ rid = models.ForeignKey(Maddr, db_column="rid", on_delete=models.CASCADE)
77
+ rseqnum = models.IntegerField(default=0)
78
+ is_local = models.CharField(max_length=3)
79
+ content = models.CharField(max_length=3)
80
+ ds = models.CharField(max_length=3)
81
+ rs = models.CharField(max_length=3)
82
+ bl = models.CharField(max_length=3, blank=True)
83
+ wl = models.CharField(max_length=3, blank=True)
84
+ bspam_level = models.FloatField(null=True, blank=True)
85
+ smtp_resp = models.CharField(max_length=765, blank=True)
86
+
87
+ class Meta:
88
+ db_table = "msgrcpt"
89
+ managed = False
90
+ unique_together = ("partition_tag", "mail", "rseqnum")
91
+
92
+
93
+ class Policy(models.Model):
94
+ policy_name = models.CharField(max_length=32, blank=True)
95
+ virus_lover = models.CharField(max_length=3, blank=True, null=True)
96
+ spam_lover = models.CharField(max_length=3, blank=True, null=True)
97
+ unchecked_lover = models.CharField(max_length=3, blank=True, null=True)
98
+ banned_files_lover = models.CharField(max_length=3, blank=True, null=True)
99
+ bad_header_lover = models.CharField(max_length=3, blank=True, null=True)
100
+ bypass_virus_checks = models.CharField(
101
+ gettext_lazy("Virus filter"),
102
+ default="",
103
+ null=True,
104
+ choices=(
105
+ ("N", gettext_lazy("yes")),
106
+ ("Y", gettext_lazy("no")),
107
+ ("", gettext_lazy("default")),
108
+ ),
109
+ max_length=3,
110
+ help_text=gettext_lazy(
111
+ "Bypass virus checks or not. Choose 'default' to use global " "settings."
112
+ ),
113
+ )
114
+ bypass_spam_checks = models.CharField(
115
+ gettext_lazy("Spam filter"),
116
+ default="",
117
+ null=True,
118
+ choices=(
119
+ ("N", gettext_lazy("yes")),
120
+ ("Y", gettext_lazy("no")),
121
+ ("", gettext_lazy("default")),
122
+ ),
123
+ max_length=3,
124
+ help_text=gettext_lazy(
125
+ "Bypass spam checks or not. Choose 'default' to use global " "settings."
126
+ ),
127
+ )
128
+ bypass_banned_checks = models.CharField(
129
+ gettext_lazy("Banned filter"),
130
+ default="",
131
+ null=True,
132
+ choices=(
133
+ ("N", gettext_lazy("yes")),
134
+ ("Y", gettext_lazy("no")),
135
+ ("", gettext_lazy("default")),
136
+ ),
137
+ max_length=3,
138
+ help_text=gettext_lazy(
139
+ "Bypass banned checks or not. Choose 'default' to use global " "settings."
140
+ ),
141
+ )
142
+ bypass_header_checks = models.CharField(max_length=3, blank=True, null=True)
143
+ virus_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
144
+ spam_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
145
+ banned_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
146
+ unchecked_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
147
+ bad_header_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
148
+ clean_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
149
+ archive_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
150
+ spam_tag_level = models.FloatField(null=True, blank=True)
151
+ spam_tag2_level = models.FloatField(null=True, blank=True)
152
+ spam_tag3_level = models.FloatField(null=True, blank=True)
153
+ spam_kill_level = models.FloatField(null=True, blank=True)
154
+ spam_dsn_cutoff_level = models.FloatField(null=True, blank=True)
155
+ spam_quarantine_cutoff_level = models.FloatField(null=True, blank=True)
156
+ addr_extension_virus = models.CharField(max_length=192, blank=True, null=True)
157
+ addr_extension_spam = models.CharField(max_length=192, blank=True, null=True)
158
+ addr_extension_banned = models.CharField(max_length=192, blank=True, null=True)
159
+ addr_extension_bad_header = models.CharField(max_length=192, blank=True, null=True)
160
+ warnvirusrecip = models.CharField(max_length=3, blank=True, null=True)
161
+ warnbannedrecip = models.CharField(max_length=3, blank=True, null=True)
162
+ warnbadhrecip = models.CharField(max_length=3, blank=True, null=True)
163
+ newvirus_admin = models.CharField(max_length=192, blank=True, null=True)
164
+ virus_admin = models.CharField(max_length=192, blank=True, null=True)
165
+ banned_admin = models.CharField(max_length=192, blank=True, null=True)
166
+ bad_header_admin = models.CharField(max_length=192, blank=True, null=True)
167
+ spam_admin = models.CharField(max_length=192, blank=True, null=True)
168
+ spam_subject_tag = models.CharField(max_length=192, blank=True, null=True)
169
+ spam_subject_tag2 = models.CharField(
170
+ gettext_lazy("Spam marker"),
171
+ default=None,
172
+ max_length=192,
173
+ blank=True,
174
+ null=True,
175
+ help_text=gettext_lazy(
176
+ "Modify spam subject using the specified text. "
177
+ "Choose 'default' to use global settings."
178
+ ),
179
+ )
180
+ spam_subject_tag3 = models.CharField(max_length=192, blank=True, null=True)
181
+ message_size_limit = models.IntegerField(null=True, blank=True)
182
+ banned_rulenames = models.CharField(max_length=192, blank=True, null=True)
183
+ disclaimer_options = models.CharField(max_length=192, blank=True, null=True)
184
+ forward_method = models.CharField(max_length=192, blank=True, null=True)
185
+ sa_userconf = models.CharField(max_length=192, blank=True, null=True)
186
+ sa_username = models.CharField(max_length=192, blank=True, null=True)
187
+
188
+ class Meta:
189
+ db_table = "policy"
190
+ managed = False
191
+
192
+
193
+ class Quarantine(models.Model):
194
+ partition_tag = models.IntegerField(default=0)
195
+ mail = models.ForeignKey(Msgs, primary_key=True, on_delete=models.CASCADE)
196
+ chunk_ind = models.IntegerField()
197
+ mail_text = models.BinaryField()
198
+
199
+ class Meta:
200
+ db_table = "quarantine"
201
+ managed = False
202
+ ordering = ["-mail__time_num"]
203
+ unique_together = ("partition_tag", "mail", "chunk_ind")
204
+
205
+
206
+ class Users(models.Model):
207
+ id = models.AutoField(primary_key=True) # NOQA:A003
208
+ priority = models.IntegerField()
209
+ policy = models.ForeignKey(Policy, on_delete=models.CASCADE)
210
+ email = models.CharField(unique=True, max_length=255)
211
+ fullname = models.CharField(max_length=765, blank=True)
212
+
213
+ class Meta:
214
+ db_table = "users"
215
+ managed = False
216
+
217
+
218
+ class Wblist(models.Model):
219
+ rid = models.IntegerField(primary_key=True)
220
+ sid = models.IntegerField()
221
+ wb = models.CharField(max_length=30)
222
+
223
+ class Meta:
224
+ db_table = "wblist"
225
+ managed = False
226
+ unique_together = [("rid", "sid")]