workers-control 0.2.0__tar.gz → 0.2.2__tar.gz

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 (600) hide show
  1. {workers_control-0.2.0/src/workers_control.egg-info → workers_control-0.2.2}/PKG-INFO +2 -2
  2. {workers_control-0.2.0 → workers_control-0.2.2}/pyproject.toml +2 -2
  3. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/email_notifications.py +7 -0
  4. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/change_user_email_address.py +3 -0
  5. workers_control-0.2.2/src/workers_control/core/interactors/change_user_name.py +73 -0
  6. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_basic_service.py +9 -3
  7. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/records.py +10 -0
  8. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/repositories.py +44 -0
  9. workers_control-0.2.2/src/workers_control/db/migrations/versions/68ac7ccf6086_create_table_emailoutbox.py +34 -0
  10. workers_control-0.2.2/src/workers_control/db/migrations/versions/c9f2e1a4b8d7_add_outbox_status_columns.py +43 -0
  11. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/models.py +15 -0
  12. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/repositories.py +195 -0
  13. workers_control-0.2.2/src/workers_control/email_sending_worker/interface.py +13 -0
  14. workers_control-0.2.0/src/workers_control/flask/mail_service/smtp_mail_service.py → workers_control-0.2.2/src/workers_control/email_sending_worker/smtp_service.py +25 -18
  15. workers_control-0.2.2/src/workers_control/email_sending_worker/worker.py +99 -0
  16. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/__init__.py +6 -1
  17. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/commands.py +28 -0
  18. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/options.py +2 -2
  19. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/production_defaults.py +4 -1
  20. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/dependency_injection.py +15 -0
  21. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/forms.py +24 -0
  22. workers_control-0.2.2/src/workers_control/flask/mail_sender/__init__.py +15 -0
  23. workers_control-0.2.2/src/workers_control/flask/mail_service/mail_storage_service.py +27 -0
  24. workers_control-0.2.2/src/workers_control/flask/routes/auth/routes.py +178 -0
  25. workers_control-0.2.2/src/workers_control/flask/routes/company/routes.py +223 -0
  26. workers_control-0.2.2/src/workers_control/flask/routes/member/routes.py +87 -0
  27. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/routes.py +12 -36
  28. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/unconfirmed_company.html +5 -2
  29. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/unconfirmed_member.html +5 -2
  30. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/account_details.html +6 -1
  31. workers_control-0.2.2/src/workers_control/flask/templates/user/change_user_name.html +39 -0
  32. workers_control-0.2.2/src/workers_control/flask/templates/user/name_change_confirmation.html +5 -0
  33. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/show_basic_service.html +1 -0
  34. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/text_renderer.py +6 -0
  35. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/de/LC_MESSAGES/messages.po +99 -45
  36. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/en/LC_MESSAGES/messages.po +89 -40
  37. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/es/LC_MESSAGES/messages.po +101 -47
  38. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/messages.pot +89 -39
  39. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/url_index.py +3 -0
  40. workers_control-0.2.2/src/workers_control/flask/views/change_user_name_view.py +42 -0
  41. workers_control-0.2.2/src/workers_control/flask/views/create_draft_from_plan_view.py +34 -0
  42. workers_control-0.2.2/src/workers_control/flask/views/delete_draft_view.py +35 -0
  43. workers_control-0.2.2/src/workers_control/flask/views/file_plan_with_accounting_view.py +37 -0
  44. workers_control-0.2.2/src/workers_control/flask/views/get_plan_details_company_view.py +25 -0
  45. workers_control-0.2.2/src/workers_control/flask/views/get_plan_details_member_view.py +32 -0
  46. workers_control-0.2.2/src/workers_control/flask/views/hide_plan_view.py +28 -0
  47. workers_control-0.2.2/src/workers_control/flask/views/log_in_accountant_view.py +42 -0
  48. workers_control-0.2.2/src/workers_control/flask/views/log_in_company_view.py +51 -0
  49. workers_control-0.2.2/src/workers_control/flask/views/log_in_member_view.py +48 -0
  50. workers_control-0.2.2/src/workers_control/flask/views/member_dashboard_view.py +31 -0
  51. workers_control-0.2.2/src/workers_control/flask/views/query_company_consumptions_view.py +32 -0
  52. workers_control-0.2.2/src/workers_control/flask/views/request_email_address_change_view.py +42 -0
  53. workers_control-0.2.2/src/workers_control/flask/views/resend_confirmation_view.py +40 -0
  54. workers_control-0.2.2/src/workers_control/flask/views/revoke_plan_filing_view.py +30 -0
  55. workers_control-0.2.2/src/workers_control/flask/views/show_member_account_details_view.py +32 -0
  56. workers_control-0.2.2/src/workers_control/flask/views/show_my_cooperations_view.py +52 -0
  57. workers_control-0.2.2/src/workers_control/flask/views/show_my_plans_view.py +31 -0
  58. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_sender.py +6 -0
  59. workers_control-0.2.2/src/workers_control/web/email/name_change_confirmation_presenter.py +26 -0
  60. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/__init__.py +8 -0
  61. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/text_renderer.py +2 -0
  62. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/url_index.py +2 -0
  63. workers_control-0.2.2/src/workers_control/web/www/controllers/change_user_name_controller.py +21 -0
  64. workers_control-0.2.2/src/workers_control/web/www/presenters/__init__.py +0 -0
  65. workers_control-0.2.2/src/workers_control/web/www/presenters/change_user_name_presenter.py +55 -0
  66. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_basic_service_presenter.py +2 -0
  67. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/user_account_details_presenter.py +2 -0
  68. {workers_control-0.2.0 → workers_control-0.2.2/src/workers_control.egg-info}/PKG-INFO +2 -2
  69. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/SOURCES.txt +32 -4
  70. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/requires.txt +1 -1
  71. workers_control-0.2.0/src/workers_control/flask/routes/auth/routes.py +0 -296
  72. workers_control-0.2.0/src/workers_control/flask/routes/company/routes.py +0 -390
  73. workers_control-0.2.0/src/workers_control/flask/routes/member/routes.py +0 -153
  74. workers_control-0.2.0/src/workers_control/flask/translations/de/LC_MESSAGES/messages.mo +0 -0
  75. workers_control-0.2.0/src/workers_control/flask/translations/en/LC_MESSAGES/messages.mo +0 -0
  76. workers_control-0.2.0/src/workers_control/flask/translations/es/LC_MESSAGES/messages.mo +0 -0
  77. {workers_control-0.2.0 → workers_control-0.2.2}/LICENSE +0 -0
  78. {workers_control-0.2.0 → workers_control-0.2.2}/MANIFEST.in +0 -0
  79. {workers_control-0.2.0 → workers_control-0.2.2}/README.rst +0 -0
  80. {workers_control-0.2.0 → workers_control-0.2.2}/build_support/__init__.py +0 -0
  81. {workers_control-0.2.0 → workers_control-0.2.2}/build_support/babel.cfg +0 -0
  82. {workers_control-0.2.0 → workers_control-0.2.2}/build_support/backend.py +0 -0
  83. {workers_control-0.2.0 → workers_control-0.2.2}/build_support/project.py +0 -0
  84. {workers_control-0.2.0 → workers_control-0.2.2}/build_support/translations.py +0 -0
  85. {workers_control-0.2.0 → workers_control-0.2.2}/setup.cfg +0 -0
  86. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/__init__.py +0 -0
  87. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/accountant_notifications.py +0 -0
  88. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/anonymization.py +0 -0
  89. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/control_thresholds.py +0 -0
  90. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/datetime_service.py +0 -0
  91. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/decimal.py +0 -0
  92. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/email.py +0 -0
  93. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/injector.py +0 -0
  94. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/__init__.py +0 -0
  95. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/accept_cooperation.py +0 -0
  96. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/accept_coordination_transfer.py +0 -0
  97. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/answer_company_work_invite.py +0 -0
  98. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/approve_plan.py +0 -0
  99. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/cancel_cooperation_solicitation.py +0 -0
  100. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/change_user_password.py +0 -0
  101. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/confirm_company.py +0 -0
  102. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/confirm_member.py +0 -0
  103. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_basic_service.py +0 -0
  104. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_cooperation.py +0 -0
  105. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_draft_from_plan.py +0 -0
  106. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_plan_draft.py +0 -0
  107. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/deactivate_basic_service.py +0 -0
  108. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/delete_draft.py +0 -0
  109. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/deny_cooperation.py +0 -0
  110. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/edit_draft.py +0 -0
  111. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/end_cooperation.py +0 -0
  112. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/file_plan_with_accounting.py +0 -0
  113. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_accountant_dashboard.py +0 -0
  114. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_company_dashboard.py +0 -0
  115. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_company_summary.py +0 -0
  116. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_coop_summary.py +0 -0
  117. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_coordination_transfer_request_details.py +0 -0
  118. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_draft_details.py +0 -0
  119. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_member_dashboard.py +0 -0
  120. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_plan_details.py +0 -0
  121. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_private_consumption_details.py +0 -0
  122. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_productive_consumption_details.py +0 -0
  123. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_statistics.py +0 -0
  124. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_user_account_details.py +0 -0
  125. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/hide_plan.py +0 -0
  126. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/invite_worker_to_company.py +0 -0
  127. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_active_plans_of_company.py +0 -0
  128. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_all_cooperations.py +0 -0
  129. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_available_languages.py +0 -0
  130. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_basic_services_of_worker.py +0 -0
  131. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_coordinations_of_company.py +0 -0
  132. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_coordinations_of_cooperation.py +0 -0
  133. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_my_cooperating_plans.py +0 -0
  134. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_pending_work_invites.py +0 -0
  135. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_plans_with_pending_review.py +0 -0
  136. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_registered_hours_worked.py +0 -0
  137. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_transfers.py +0 -0
  138. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_workers.py +0 -0
  139. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_accountant.py +0 -0
  140. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_company.py +0 -0
  141. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_member.py +0 -0
  142. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/preview_private_consumption.py +0 -0
  143. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_companies.py +0 -0
  144. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_company_consumptions.py +0 -0
  145. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_offers.py +0 -0
  146. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_private_consumptions.py +0 -0
  147. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_accountant.py +0 -0
  148. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_company.py +0 -0
  149. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_hours_worked.py +0 -0
  150. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_member.py +0 -0
  151. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_private_consumption.py +0 -0
  152. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_private_consumption_of_basic_service.py +0 -0
  153. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_productive_consumption.py +0 -0
  154. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_productive_consumption_of_basic_service.py +0 -0
  155. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/reject_plan.py +0 -0
  156. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/remove_worker_from_company.py +0 -0
  157. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_cooperation.py +0 -0
  158. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_coordination_transfer.py +0 -0
  159. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_email_address_change.py +0 -0
  160. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_user_password_reset.py +0 -0
  161. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/resend_confirmation_mail.py +0 -0
  162. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/resend_work_invite.py +0 -0
  163. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/review_registered_consumptions.py +0 -0
  164. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/revoke_plan_filing.py +0 -0
  165. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_private_consumption.py +0 -0
  166. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_private_consumption_of_basic_service.py +0 -0
  167. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_productive_consumption.py +0 -0
  168. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_productive_consumption_of_basic_service.py +0 -0
  169. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/send_accountant_registration_token.py +0 -0
  170. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_a_account_details.py +0 -0
  171. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_accounts.py +0 -0
  172. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_cooperations.py +0 -0
  173. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_work_invite_details.py +0 -0
  174. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_member_account_details.py +0 -0
  175. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_my_plans.py +0 -0
  176. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_p_account_details.py +0 -0
  177. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_payout_factor_details.py +0 -0
  178. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_prd_account_details.py +0 -0
  179. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_psf_account_details.py +0 -0
  180. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_r_account_details.py +0 -0
  181. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/password_hasher.py +0 -0
  182. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/__init__.py +0 -0
  183. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/account_details.py +0 -0
  184. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/compensation_transfers.py +0 -0
  185. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/payout_factor.py +0 -0
  186. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/plan_details.py +0 -0
  187. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/price_calculator.py +0 -0
  188. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/psf_balance.py +0 -0
  189. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/transfers.py +0 -0
  190. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/__init__.py +0 -0
  191. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/db.py +0 -0
  192. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/alembic.ini +0 -0
  193. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/env.py +0 -0
  194. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/script.py.mako +0 -0
  195. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/17911726c134_add_deactivated_on_to_basic_service.py +0 -0
  196. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/399a221ebea4_add_private_consumption_of_basic_.py +0 -0
  197. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/480a749375de_drop_transaction_table.py +0 -0
  198. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/4fd90069eb82_remove_social_accounting_account.py +0 -0
  199. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/686f2af1cbfe_add_basic_service_transfer_types.py +0 -0
  200. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/7a4d0412c2a7_add_productive_consumption_of_basic_.py +0 -0
  201. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/a3e7b2c1d4f5_use_native_uuid_column_types.py +0 -0
  202. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/b40539bf0293_add_basic_service_table.py +0 -0
  203. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/c5e8a9d0f1b2_add_taxes_to_basic_service_consumptions.py +0 -0
  204. {workers_control-0.2.0/src/workers_control/flask/config → workers_control-0.2.2/src/workers_control/email_sending_worker}/__init__.py +0 -0
  205. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/babel.py +0 -0
  206. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/class_based_view.py +0 -0
  207. {workers_control-0.2.0/src/workers_control/flask/routes → workers_control-0.2.2/src/workers_control/flask/config}/__init__.py +0 -0
  208. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/checks.py +0 -0
  209. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/loader.py +0 -0
  210. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/context_processors.py +0 -0
  211. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/control_thresholds.py +0 -0
  212. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/database.py +0 -0
  213. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/datetime.py +0 -0
  214. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/email_configuration.py +0 -0
  215. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/extensions.py +0 -0
  216. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/filters.py +0 -0
  217. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_colors.py +0 -0
  218. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_request.py +0 -0
  219. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_session.py +0 -0
  220. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/language_repository.py +0 -0
  221. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/logging_config.json +0 -0
  222. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/mail_service/__init__.py +0 -0
  223. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/mail_service/interface.py +0 -0
  224. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/notifications.py +0 -0
  225. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/password_hasher.py +0 -0
  226. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/payout_factor.py +0 -0
  227. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/plotter.py +0 -0
  228. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/profiling.py +0 -0
  229. {workers_control-0.2.0/src/workers_control/flask/routes/auth → workers_control-0.2.2/src/workers_control/flask/routes}/__init__.py +0 -0
  230. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/__init__.py +0 -0
  231. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/blueprint.py +0 -0
  232. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/routes.py +0 -0
  233. {workers_control-0.2.0/src/workers_control/web → workers_control-0.2.2/src/workers_control/flask/routes/auth}/__init__.py +0 -0
  234. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/company/__init__.py +0 -0
  235. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/company/blueprint.py +0 -0
  236. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/healthcheck/__init__.py +0 -0
  237. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/healthcheck/blueprint.py +0 -0
  238. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/member/__init__.py +0 -0
  239. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/member/blueprint.py +0 -0
  240. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/plots/__init__.py +0 -0
  241. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/plots/routes.py +0 -0
  242. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/__init__.py +0 -0
  243. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/blueprint.py +0 -0
  244. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/bulma.css +0 -0
  245. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/colors.css +0 -0
  246. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/favicon.ico +0 -0
  247. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.css +0 -0
  248. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.js +0 -0
  249. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.module.js +0 -0
  250. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/dashboard.html +0 -0
  251. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/notification-about-new-plan.html +0 -0
  252. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/plan_details.html +0 -0
  253. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/plans-to-review-list.html +0 -0
  254. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/accountant_invitation.html +0 -0
  255. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/activate.html +0 -0
  256. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/help.html +0 -0
  257. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_accountant.html +0 -0
  258. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_company.html +0 -0
  259. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_member.html +0 -0
  260. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/password_reset_confirmation_email.html +0 -0
  261. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/request_password_reset.html +0 -0
  262. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password.html +0 -0
  263. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password_email.html +0 -0
  264. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password_invalid.html +0 -0
  265. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_accountant.html +0 -0
  266. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_company.html +0 -0
  267. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_member.html +0 -0
  268. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/start.html +0 -0
  269. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/base.html +0 -0
  270. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/consumption_details.html +0 -0
  271. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/create_cooperation.html +0 -0
  272. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/create_draft.html +0 -0
  273. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/dashboard.html +0 -0
  274. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/draft_details.html +0 -0
  275. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/invite_worker_to_company.html +0 -0
  276. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/list_pending_work_invites.html +0 -0
  277. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/list_registered_hours_worked.html +0 -0
  278. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_consumptions.html +0 -0
  279. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_cooperations.html +0 -0
  280. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_plans.html +0 -0
  281. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/plan_details.html +0 -0
  282. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/register_hours_worked.html +0 -0
  283. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/register_productive_consumption.html +0 -0
  284. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/register_productive_consumption_of_basic_service.html +0 -0
  285. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/rejected_plan_notification.html +0 -0
  286. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/remove_worker_from_company.html +0 -0
  287. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/request_cooperation.html +0 -0
  288. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/request_coordination_transfer.html +0 -0
  289. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/review_registered_consumptions.html +0 -0
  290. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/show_coordination_transfer_request.html +0 -0
  291. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/at.html +0 -0
  292. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/basket-shopping.html +0 -0
  293. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/book.html +0 -0
  294. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/calendar.html +0 -0
  295. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/chart-line.html +0 -0
  296. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/chart-pie.html +0 -0
  297. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/check.html +0 -0
  298. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/copy.html +0 -0
  299. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/credit-card.html +0 -0
  300. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/edit.html +0 -0
  301. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/envelope.html +0 -0
  302. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/exchange-alt.html +0 -0
  303. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/exclamation-triangle.html +0 -0
  304. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/eye-slashed.html +0 -0
  305. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/eye.html +0 -0
  306. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/file-circle-plus.html +0 -0
  307. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/file.html +0 -0
  308. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/hands-helping.html +0 -0
  309. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/hourglass.html +0 -0
  310. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/industry.html +0 -0
  311. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/info-circle.html +0 -0
  312. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/key.html +0 -0
  313. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/list.html +0 -0
  314. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/oil-can.html +0 -0
  315. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/redo.html +0 -0
  316. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/square-arrow-up-right.html +0 -0
  317. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/times.html +0 -0
  318. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/trash.html +0 -0
  319. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/user.html +0 -0
  320. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/users.html +0 -0
  321. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/accountant_navigation.html +0 -0
  322. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/anonymous_navigation.html +0 -0
  323. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/company_navigation.html +0 -0
  324. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/company_summary.html +0 -0
  325. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/copy_toggle.html +0 -0
  326. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/draft_form.html +0 -0
  327. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/form_field_error.html +0 -0
  328. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/language_selection.html +0 -0
  329. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/member_navigation.html +0 -0
  330. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/navbar.html +0 -0
  331. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/pagination.html +0 -0
  332. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/plan_details.html +0 -0
  333. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/show_notifications.html +0 -0
  334. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/tooltips.html +0 -0
  335. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/transfers.html +0 -0
  336. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/basic_services.html +0 -0
  337. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/consumption_details.html +0 -0
  338. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/consumptions.html +0 -0
  339. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/create_basic_service.html +0 -0
  340. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/dashboard.html +0 -0
  341. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/my_account.html +0 -0
  342. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/notification-about-work-invitation.html +0 -0
  343. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/plan_details.html +0 -0
  344. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/register_private_consumption.html +0 -0
  345. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/register_private_consumption_of_basic_service.html +0 -0
  346. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/show_company_work_invite_details.html +0 -0
  347. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/account_psf.html +0 -0
  348. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_a.html +0 -0
  349. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_p.html +0 -0
  350. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_prd.html +0 -0
  351. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_r.html +0 -0
  352. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_accounts.html +0 -0
  353. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_summary.html +0 -0
  354. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/confirm_email_address_change.html +0 -0
  355. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/coop_summary.html +0 -0
  356. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/http_error.html +0 -0
  357. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_all_cooperations.html +0 -0
  358. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_coordinations_of_cooperation.html +0 -0
  359. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_transfers.html +0 -0
  360. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/query_companies.html +0 -0
  361. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/query_offers.html +0 -0
  362. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_address_change.html +0 -0
  363. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_change_notification.html +0 -0
  364. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_change_warning.html +0 -0
  365. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/show_payout_factor_details.html +0 -0
  366. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/statistics.html +0 -0
  367. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/token.py +0 -0
  368. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translator.py +0 -0
  369. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/types.py +0 -0
  370. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/__init__.py +0 -0
  371. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/accept_cooperation_request_view.py +0 -0
  372. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/accountant_invitation_email_view.py +0 -0
  373. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/cancel_cooperation_request_view.py +0 -0
  374. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/change_email_address_view.py +0 -0
  375. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/company_dashboard_view.py +0 -0
  376. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/company_work_invite_view.py +0 -0
  377. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/coop_summary_view.py +0 -0
  378. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_basic_service_view.py +0 -0
  379. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_cooperation_view.py +0 -0
  380. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_draft_view.py +0 -0
  381. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/deactivate_basic_service_view.py +0 -0
  382. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/deny_cooperation_view.py +0 -0
  383. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/draft_details_view.py +0 -0
  384. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/end_cooperation_view.py +0 -0
  385. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_private_consumption_details.py +0 -0
  386. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_productive_consumption_details.py +0 -0
  387. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_statistics_view.py +0 -0
  388. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/healthcheck_view.py +0 -0
  389. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/http_error_view.py +0 -0
  390. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/invite_worker_to_company.py +0 -0
  391. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_all_cooperations_view.py +0 -0
  392. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_basic_services_of_worker_view.py +0 -0
  393. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_coordinators_of_cooperation_view.py +0 -0
  394. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_pending_work_invites_view.py +0 -0
  395. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_registered_hours_worked_view.py +0 -0
  396. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_transfers.py +0 -0
  397. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_companies.py +0 -0
  398. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_offers.py +0 -0
  399. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_private_consumptions.py +0 -0
  400. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_hours_worked_view.py +0 -0
  401. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_private_consumption.py +0 -0
  402. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_private_consumption_of_basic_service_view.py +0 -0
  403. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_productive_consumption.py +0 -0
  404. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_productive_consumption_of_basic_service_view.py +0 -0
  405. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/remove_worker_from_company_view.py +0 -0
  406. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_cooperation_view.py +0 -0
  407. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_coordination_transfer_view.py +0 -0
  408. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_password_reset_view.py +0 -0
  409. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/reset_password_view.py +0 -0
  410. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/review_registered_consumptions_view.py +0 -0
  411. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_a_account_details_view.py +0 -0
  412. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_basic_service_view.py +0 -0
  413. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_company_accounts_view.py +0 -0
  414. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_coordination_transfer_request_view.py +0 -0
  415. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_p_account_details_view.py +0 -0
  416. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_payout_factor_details_view.py +0 -0
  417. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_prd_account_details_view.py +0 -0
  418. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_psf_account_details_view.py +0 -0
  419. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_r_account_details_view.py +0 -0
  420. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_accountant_view.py +0 -0
  421. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_company_view.py +0 -0
  422. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_member_view.py +0 -0
  423. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/wsgi.py +0 -0
  424. {workers_control-0.2.0/src/workers_control/web/formatters → workers_control-0.2.2/src/workers_control/web}/__init__.py +0 -0
  425. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/colors.py +0 -0
  426. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/__init__.py +0 -0
  427. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/accountant_invitation_presenter.py +0 -0
  428. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/company_notifier.py +0 -0
  429. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/cooperation_request_email_presenter.py +0 -0
  430. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_change_confirmation_presenter.py +0 -0
  431. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_change_warning_view.py +0 -0
  432. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/invite_worker_presenter.py +0 -0
  433. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/notify_about_worker_removal_from_company_presenter.py +0 -0
  434. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/notify_accountant_about_new_plan_presenter.py +0 -0
  435. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/registration_email_presenter.py +0 -0
  436. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/request_coordination_transfer_presenter.py +0 -0
  437. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/reset_password_email_presenter.py +0 -0
  438. {workers_control-0.2.0/src/workers_control/web/www → workers_control-0.2.2/src/workers_control/web/formatters}/__init__.py +0 -0
  439. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/formatters/datetime_formatter.py +0 -0
  440. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/formatters/plan_details_formatter.py +0 -0
  441. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/fields.py +0 -0
  442. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/formfield_parsers.py +0 -0
  443. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/json.py +0 -0
  444. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/language_service.py +0 -0
  445. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/malformed_input_data.py +0 -0
  446. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/notification.py +0 -0
  447. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/pagination.py +0 -0
  448. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/request.py +0 -0
  449. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/session.py +0 -0
  450. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/token.py +0 -0
  451. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/translator.py +0 -0
  452. {workers_control-0.2.0/src/workers_control/web/www/controllers → workers_control-0.2.2/src/workers_control/web/www}/__init__.py +0 -0
  453. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/authentication.py +0 -0
  454. {workers_control-0.2.0/src/workers_control/web/www/presenters → workers_control-0.2.2/src/workers_control/web/www/controllers}/__init__.py +0 -0
  455. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/accept_coordination_transfer_controller.py +0 -0
  456. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/answer_company_work_invite_controller.py +0 -0
  457. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/approve_plan_controller.py +0 -0
  458. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/change_user_email_address_controller.py +0 -0
  459. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/confirm_company_controller.py +0 -0
  460. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/confirm_member_controller.py +0 -0
  461. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_basic_service_controller.py +0 -0
  462. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_draft_controller.py +0 -0
  463. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_draft_from_plan_controller.py +0 -0
  464. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/deactivate_basic_service_controller.py +0 -0
  465. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/delete_draft_controller.py +0 -0
  466. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/draft_form_validator.py +0 -0
  467. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/edit_draft_controller.py +0 -0
  468. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/end_cooperation_controller.py +0 -0
  469. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/file_plan_with_accounting_controller.py +0 -0
  470. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/get_private_consumption_details_controller.py +0 -0
  471. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/get_productive_consumption_details_controller.py +0 -0
  472. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/invite_worker_to_company_controller.py +0 -0
  473. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_basic_services_of_worker_controller.py +0 -0
  474. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_pending_work_invites_controller.py +0 -0
  475. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_registered_hours_worked_controller.py +0 -0
  476. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_transfers_controller.py +0 -0
  477. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_workers_controller.py +0 -0
  478. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/log_in_accountant_controller.py +0 -0
  479. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_companies_controller.py +0 -0
  480. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_offers_controller.py +0 -0
  481. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_private_consumptions_controller.py +0 -0
  482. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_accountant_controller.py +0 -0
  483. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_company_controller.py +0 -0
  484. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_hours_worked_controller.py +0 -0
  485. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_member_controller.py +0 -0
  486. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_controller.py +0 -0
  487. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_form_validator.py +0 -0
  488. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_of_basic_service_controller.py +0 -0
  489. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_of_basic_service_form_validator.py +0 -0
  490. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_productive_consumption_controller.py +0 -0
  491. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_productive_consumption_of_basic_service_controller.py +0 -0
  492. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_productive_consumption_of_basic_service_form_validator.py +0 -0
  493. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/reject_plan_controller.py +0 -0
  494. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/remove_worker_from_company_controller.py +0 -0
  495. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_cooperation_controller.py +0 -0
  496. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_coordination_transfer_controller.py +0 -0
  497. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_email_address_change_controller.py +0 -0
  498. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_password_reset_controller.py +0 -0
  499. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/resend_work_invite_controller.py +0 -0
  500. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/reset_password_controller.py +0 -0
  501. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/review_registered_consumptions_controller.py +0 -0
  502. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/revoke_plan_filing_controller.py +0 -0
  503. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_private_consumption_controller.py +0 -0
  504. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_private_consumption_of_basic_service_controller.py +0 -0
  505. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_productive_consumption_controller.py +0 -0
  506. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_productive_consumption_of_basic_service_controller.py +0 -0
  507. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_a_account_details_controller.py +0 -0
  508. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_basic_service_controller.py +0 -0
  509. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_company_accounts_controller.py +0 -0
  510. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_company_work_invite_details_controller.py +0 -0
  511. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_p_account_details_controller.py +0 -0
  512. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_prd_account_details_controller.py +0 -0
  513. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_r_account_details_controller.py +0 -0
  514. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/user_account_details_controller.py +0 -0
  515. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/navbar.py +0 -0
  516. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/accept_cooperation_request_presenter.py +0 -0
  517. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/accept_coordination_transfer_presenter.py +0 -0
  518. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/answer_company_work_invite_presenter.py +0 -0
  519. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/approve_plan_presenter.py +0 -0
  520. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/cancel_cooperation_request_presenter.py +0 -0
  521. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/change_user_email_address_presenter.py +0 -0
  522. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/company_consumptions_presenter.py +0 -0
  523. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_basic_service_presenter.py +0 -0
  524. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_cooperation_presenter.py +0 -0
  525. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_draft_from_plan_presenter.py +0 -0
  526. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_draft_presenter.py +0 -0
  527. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/deactivate_basic_service_presenter.py +0 -0
  528. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/delete_draft_presenter.py +0 -0
  529. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/deny_cooperation_presenter.py +0 -0
  530. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/edit_draft_presenter.py +0 -0
  531. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/end_cooperation_presenter.py +0 -0
  532. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/file_plan_with_accounting_presenter.py +0 -0
  533. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_accountant_dashboard_presenter.py +0 -0
  534. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_company_dashboard_presenter.py +0 -0
  535. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_company_summary_presenter.py +0 -0
  536. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_coop_summary_presenter.py +0 -0
  537. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_coordination_transfer_request_details_presenter.py +0 -0
  538. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_draft_details_presenter.py +0 -0
  539. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_member_dashboard_presenter.py +0 -0
  540. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_accountant_presenter.py +0 -0
  541. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_company_presenter.py +0 -0
  542. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_member_presenter.py +0 -0
  543. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_statistics_presenter.py +0 -0
  544. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/hide_plan_presenter.py +0 -0
  545. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/invite_worker_to_company_presenter.py +0 -0
  546. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_all_cooperations_presenter.py +0 -0
  547. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_available_languages_presenter.py +0 -0
  548. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_basic_services_of_worker_presenter.py +0 -0
  549. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_coordinations_of_cooperation_presenter.py +0 -0
  550. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_pending_work_invites_presenter.py +0 -0
  551. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_plans_presenter.py +0 -0
  552. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_plans_with_pending_review_presenter.py +0 -0
  553. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_registered_hours_worked_presenter.py +0 -0
  554. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_transfers_presenter.py +0 -0
  555. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_workers_presenter.py +0 -0
  556. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_accountant_presenter.py +0 -0
  557. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_company_presenter.py +0 -0
  558. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_member_presenter.py +0 -0
  559. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/private_consumption_details_presenter.py +0 -0
  560. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/private_consumptions_presenter.py +0 -0
  561. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/productive_consumption_details_presenter.py +0 -0
  562. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/query_companies_presenter.py +0 -0
  563. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/query_offers_presenter.py +0 -0
  564. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_accountant_presenter.py +0 -0
  565. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_company_presenter.py +0 -0
  566. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_hours_worked_presenter.py +0 -0
  567. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_member_presenter.py +0 -0
  568. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_private_consumption_of_basic_service_presenter.py +0 -0
  569. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_private_consumption_presenter.py +0 -0
  570. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_productive_consumption_of_basic_service_presenter.py +0 -0
  571. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_productive_consumption_presenter.py +0 -0
  572. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/reject_plan_presenter.py +0 -0
  573. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/remove_worker_from_company_presenter.py +0 -0
  574. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_cooperation_presenter.py +0 -0
  575. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_coordination_transfer_presenter.py +0 -0
  576. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_email_address_change_presenter.py +0 -0
  577. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_password_reset_presenter.py +0 -0
  578. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/resend_work_invite_presenter.py +0 -0
  579. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/reset_password_presenter.py +0 -0
  580. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/review_registered_consumptions_presenter.py +0 -0
  581. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/revoke_plan_filing_presenter.py +0 -0
  582. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_private_consumption_of_basic_service_presenter.py +0 -0
  583. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_private_consumption_presenter.py +0 -0
  584. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_productive_consumption_of_basic_service_presenter.py +0 -0
  585. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_productive_consumption_presenter.py +0 -0
  586. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_a_account_details_presenter.py +0 -0
  587. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_company_accounts_presenter.py +0 -0
  588. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_company_work_invite_details_presenter.py +0 -0
  589. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_member_account_details_presenter.py +0 -0
  590. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_my_cooperations_presenter.py +0 -0
  591. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_my_plans_presenter.py +0 -0
  592. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_p_account_details_presenter.py +0 -0
  593. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_payout_factor_details_presenter.py +0 -0
  594. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_prd_account_details_presenter.py +0 -0
  595. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_psf_account_details_presenter.py +0 -0
  596. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_r_account_details_presenter.py +0 -0
  597. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/transfers.py +0 -0
  598. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/response.py +0 -0
  599. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/dependency_links.txt +0 -0
  600. {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workers-control
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: A flask app for labour time accounting.
5
5
  License-Expression: AGPL-3.0-or-later
6
6
  Project-URL: Source, https://github.com/ida-arbeitszeit/workers-control
@@ -20,7 +20,7 @@ Requires-Dist: flask-babel==4.0.0
20
20
  Requires-Dist: flask-talisman==1.1.0
21
21
  Requires-Dist: flask-login==0.6.3
22
22
  Requires-Dist: flask-wtf==1.2.2
23
- Requires-Dist: matplotlib<=3.10.8,>=3.10.5
23
+ Requires-Dist: matplotlib<=3.10.9,>=3.10.5
24
24
  Provides-Extra: profiling
25
25
  Requires-Dist: flask_profiler; extra == "profiling"
26
26
  Dynamic: license-file
@@ -5,7 +5,7 @@ backend-path = ["."]
5
5
 
6
6
  [project]
7
7
  name = "workers-control"
8
- version = "0.2.0"
8
+ version = "0.2.2"
9
9
  description = "A flask app for labour time accounting."
10
10
  license = "AGPL-3.0-or-later"
11
11
  requires-python = ">=3.12"
@@ -26,7 +26,7 @@ dependencies = [
26
26
  "flask-talisman==1.1.0",
27
27
  "flask-login==0.6.3",
28
28
  "flask-wtf==1.2.2",
29
- "matplotlib>=3.10.5, <=3.10.8" # different versions in stable/unstable nixpkgs
29
+ "matplotlib>=3.10.5, <=3.10.9" # different versions in stable/unstable nixpkgs
30
30
  ]
31
31
 
32
32
  [project.optional-dependencies]
@@ -57,6 +57,12 @@ class EmailChangeConfirmation:
57
57
  new_email_address: str
58
58
 
59
59
 
60
+ @dataclass
61
+ class NameChangeConfirmation:
62
+ email_address: str
63
+ new_name: str
64
+
65
+
60
66
  @dataclass
61
67
  class CooperationRequestEmail:
62
68
  coordinator_email_address: str
@@ -102,6 +108,7 @@ Message: TypeAlias = Union[
102
108
  EmailChangeWarning,
103
109
  EmailChangeConfirmation,
104
110
  MemberRegistration,
111
+ NameChangeConfirmation,
105
112
  RejectedPlanNotification,
106
113
  ResetPasswordConfirmation,
107
114
  ResetPasswordRequest,
@@ -31,6 +31,9 @@ class ChangeUserEmailAddressInteractor:
31
31
  account_credentials.update().change_email_address(
32
32
  request.new_email
33
33
  ).perform()
34
+ self.database.get_password_reset_requests().with_email_address(
35
+ old_email
36
+ ).delete()
34
37
  self.database.get_email_addresses().with_address(old_email).delete()
35
38
  self.database.get_email_addresses().with_address(
36
39
  request.new_email
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ import enum
4
+ from dataclasses import dataclass
5
+ from uuid import UUID
6
+
7
+ from workers_control.core.email_notifications import (
8
+ EmailSender,
9
+ NameChangeConfirmation,
10
+ )
11
+ from workers_control.core.password_hasher import PasswordHasher
12
+ from workers_control.core.repositories import DatabaseGateway
13
+
14
+ MAX_NAME_LENGTH = 150
15
+
16
+
17
+ @dataclass
18
+ class Request:
19
+ user_id: UUID
20
+ new_name: str
21
+ current_password: str
22
+
23
+
24
+ @dataclass
25
+ class Response:
26
+ class RejectionReason(Exception, enum.Enum):
27
+ invalid_name = enum.auto()
28
+ user_not_found = enum.auto()
29
+ incorrect_password = enum.auto()
30
+
31
+ rejection_reason: RejectionReason | None
32
+
33
+
34
+ @dataclass
35
+ class ChangeUserNameInteractor:
36
+ database: DatabaseGateway
37
+ email_sender: EmailSender
38
+ password_hasher: PasswordHasher
39
+
40
+ def change_user_name(self, request: Request) -> Response:
41
+ if not request.new_name or len(request.new_name) > MAX_NAME_LENGTH:
42
+ return Response(rejection_reason=Response.RejectionReason.invalid_name)
43
+
44
+ member_query = self.database.get_members().with_id(request.user_id)
45
+ company_query = self.database.get_companies().with_id(request.user_id)
46
+ accountant_query = self.database.get_accountants().with_id(request.user_id)
47
+ matching_query = member_query or company_query or accountant_query
48
+
49
+ record = matching_query.joined_with_email_address().first()
50
+ if not record:
51
+ return Response(rejection_reason=Response.RejectionReason.user_not_found)
52
+
53
+ _, email = record
54
+ credentials = (
55
+ self.database.get_account_credentials()
56
+ .with_email_address(email.address)
57
+ .first()
58
+ )
59
+ if not credentials or not self.password_hasher.is_password_matching_hash(
60
+ request.current_password, credentials.password_hash
61
+ ):
62
+ return Response(
63
+ rejection_reason=Response.RejectionReason.incorrect_password
64
+ )
65
+
66
+ matching_query.update().set_name(request.new_name).perform()
67
+ self.email_sender.send_email(
68
+ NameChangeConfirmation(
69
+ email_address=email.address,
70
+ new_name=request.new_name,
71
+ )
72
+ )
73
+ return Response(rejection_reason=None)
@@ -18,6 +18,7 @@ class ShowBasicServiceResponse:
18
18
  @dataclass
19
19
  class Details:
20
20
  provider_name: str
21
+ provider_email: str
21
22
  name: str
22
23
  description: str
23
24
  created_on: datetime
@@ -39,13 +40,18 @@ class ShowBasicServiceInteractor:
39
40
  )
40
41
  if basic_service is None:
41
42
  return ShowBasicServiceResponse(details=None)
42
- member = (
43
- self.database_gateway.get_members().with_id(basic_service.provider).first()
43
+ result = (
44
+ self.database_gateway.get_members()
45
+ .with_id(basic_service.provider)
46
+ .joined_with_email_address()
47
+ .first()
44
48
  )
45
- assert member
49
+ assert result
50
+ member, email = result
46
51
  return ShowBasicServiceResponse(
47
52
  details=ShowBasicServiceResponse.Details(
48
53
  provider_name=member.name,
54
+ provider_email=email.address,
49
55
  name=basic_service.name,
50
56
  description=basic_service.description,
51
57
  created_on=basic_service.created_on,
@@ -360,3 +360,13 @@ class RegisteredHoursWorked:
360
360
  transfer_of_work_certificates: UUID
361
361
  transfer_of_taxes: UUID
362
362
  registered_on: datetime
363
+
364
+
365
+ @dataclass
366
+ class Email:
367
+ id: UUID
368
+ created_at: datetime
369
+ recipient: str
370
+ sender: str
371
+ subject: str
372
+ html: str
@@ -244,6 +244,12 @@ class MemberResult(QueryResult[records.Member], Protocol):
244
244
  self,
245
245
  ) -> QueryResult[Tuple[records.Member, records.EmailAddress]]: ...
246
246
 
247
+ def update(self) -> MemberUpdate: ...
248
+
249
+
250
+ class MemberUpdate(DatabaseUpdate, Protocol):
251
+ def set_name(self, name: str) -> Self: ...
252
+
247
253
 
248
254
  class PrivateConsumptionResult(QueryResult[records.PrivateConsumption], Protocol):
249
255
  def ordered_by_creation_date(self, *, ascending: bool = ...) -> Self: ...
@@ -374,6 +380,12 @@ class CompanyResult(QueryResult[records.Company], Protocol):
374
380
  self,
375
381
  ) -> QueryResult[Tuple[records.Company, records.EmailAddress]]: ...
376
382
 
383
+ def update(self) -> CompanyUpdate: ...
384
+
385
+
386
+ class CompanyUpdate(DatabaseUpdate, Protocol):
387
+ def set_name(self, name: str) -> Self: ...
388
+
377
389
 
378
390
  class AccountantResult(QueryResult[records.Accountant], Protocol):
379
391
  def with_email_address(self, email: str) -> Self: ...
@@ -384,6 +396,12 @@ class AccountantResult(QueryResult[records.Accountant], Protocol):
384
396
  self,
385
397
  ) -> QueryResult[Tuple[records.Accountant, records.EmailAddress]]: ...
386
398
 
399
+ def update(self) -> AccountantUpdate: ...
400
+
401
+
402
+ class AccountantUpdate(DatabaseUpdate, Protocol):
403
+ def set_name(self, name: str) -> Self: ...
404
+
387
405
 
388
406
  class TransferResult(QueryResult[records.Transfer], Protocol):
389
407
  def where_account_is_debtor(self, *account: UUID) -> Self: ...
@@ -518,6 +536,8 @@ class PasswordResetRequestResult(QueryResult[records.PasswordResetRequest], Prot
518
536
 
519
537
  def with_creation_date_after(self, creation_threshold: datetime) -> Self: ...
520
538
 
539
+ def delete(self) -> None: ...
540
+
521
541
 
522
542
  class LanguageRepository(Protocol):
523
543
  def get_available_language_codes(self) -> Iterable[str]: ...
@@ -577,6 +597,24 @@ class BasicServiceUpdate(DatabaseUpdate, Protocol):
577
597
  def set_deactivated_on(self, deactivated_on: datetime) -> Self: ...
578
598
 
579
599
 
600
+ class EmailResult(QueryResult[records.Email], Protocol):
601
+ def with_id(self, id_: UUID) -> Self: ...
602
+
603
+ def that_have_not_been_sent(self) -> Self: ...
604
+
605
+ def ordered_by_creation_date(self, ascending: bool = ...) -> Self: ...
606
+
607
+ def update(self) -> EmailUpdate: ...
608
+
609
+
610
+ class EmailUpdate(DatabaseUpdate, Protocol):
611
+ def set_sent_at(self, sent_at: datetime) -> Self: ...
612
+
613
+ def set_last_error(self, message: str) -> Self: ...
614
+
615
+ def increment_retry_count(self) -> Self: ...
616
+
617
+
580
618
  class DatabaseGateway(Protocol):
581
619
  def create_private_consumption(
582
620
  self,
@@ -777,3 +815,9 @@ class DatabaseGateway(Protocol):
777
815
  ) -> records.BasicService: ...
778
816
 
779
817
  def get_basic_services(self) -> BasicServiceResult: ...
818
+
819
+ def create_email(
820
+ self, created_at: datetime, recipient: str, sender: str, subject: str, html: str
821
+ ) -> records.Email: ...
822
+
823
+ def get_emails(self) -> EmailResult: ...
@@ -0,0 +1,34 @@
1
+ """Create table EmailOutbox
2
+
3
+ Revision ID: 68ac7ccf6086
4
+ Revises: 17911726c134
5
+ Create Date: 2026-01-31 07:42:03.847387
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = '68ac7ccf6086'
16
+ down_revision: Union[str, None] = '17911726c134'
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ op.create_table('email_outbox',
23
+ sa.Column('id', sa.UUID(), nullable=False),
24
+ sa.Column('created_at', sa.DateTime(), nullable=False),
25
+ sa.Column('recipient', sa.String(length=1000), nullable=False),
26
+ sa.Column('sender', sa.String(length=1000), nullable=False),
27
+ sa.Column('subject', sa.String(length=1000), nullable=False),
28
+ sa.Column('html', sa.Text(), nullable=False),
29
+ sa.PrimaryKeyConstraint('id')
30
+ )
31
+
32
+
33
+ def downgrade() -> None:
34
+ op.drop_table('email_outbox')
@@ -0,0 +1,43 @@
1
+ """Add status columns to email_outbox
2
+
3
+ Revision ID: c9f2e1a4b8d7
4
+ Revises: 68ac7ccf6086
5
+ Create Date: 2026-05-09 16:55:00.000000
6
+ """
7
+ from typing import Sequence, Union
8
+
9
+ from alembic import op
10
+ import sqlalchemy as sa
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision: str = 'c9f2e1a4b8d7'
15
+ down_revision: Union[str, Sequence[str], None] = '68ac7ccf6086'
16
+ branch_labels: Union[str, Sequence[str], None] = None
17
+ depends_on: Union[str, Sequence[str], None] = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ op.add_column(
22
+ 'email_outbox',
23
+ sa.Column('sent_at', sa.DateTime(), nullable=True),
24
+ )
25
+ op.add_column(
26
+ 'email_outbox',
27
+ sa.Column(
28
+ 'retry_count',
29
+ sa.Integer(),
30
+ nullable=False,
31
+ server_default=sa.text('0'),
32
+ ),
33
+ )
34
+ op.add_column(
35
+ 'email_outbox',
36
+ sa.Column('last_error', sa.Text(), nullable=True),
37
+ )
38
+
39
+
40
+ def downgrade() -> None:
41
+ op.drop_column('email_outbox', 'last_error')
42
+ op.drop_column('email_outbox', 'retry_count')
43
+ op.drop_column('email_outbox', 'sent_at')
@@ -16,6 +16,7 @@ from sqlalchemy import (
16
16
  ForeignKey,
17
17
  String,
18
18
  Table,
19
+ Text,
19
20
  TypeDecorator,
20
21
  Uuid,
21
22
  event,
@@ -390,3 +391,17 @@ class BasicService(Base):
390
391
  provider: Mapped[UUID] = mapped_column(Uuid, ForeignKey("member.id"))
391
392
  created_on: Mapped[datetime] = mapped_column(TZDateTime)
392
393
  deactivated_on: Mapped[datetime | None] = mapped_column(TZDateTime)
394
+
395
+
396
+ class EmailOutbox(Base):
397
+ __tablename__ = "email_outbox"
398
+
399
+ id: Mapped[UUID] = mapped_column(Uuid, primary_key=True, default=uuid4)
400
+ created_at: Mapped[datetime] = mapped_column(TZDateTime)
401
+ recipient: Mapped[str] = mapped_column(String(1000))
402
+ sender: Mapped[str] = mapped_column(String(1000))
403
+ subject: Mapped[str] = mapped_column(String(1000))
404
+ html: Mapped[str] = mapped_column(Text)
405
+ sent_at: Mapped[datetime | None] = mapped_column(TZDateTime)
406
+ retry_count: Mapped[int] = mapped_column(default=0)
407
+ last_error: Mapped[str | None] = mapped_column(Text)
@@ -691,6 +691,36 @@ class MemberQueryResult(SqlQueryResult[records.Member]):
691
691
  .with_entities(models.Member, email),
692
692
  )
693
693
 
694
+ def update(self) -> MemberUpdate:
695
+ return MemberUpdate(db=self.db, query=self.query)
696
+
697
+
698
+ @dataclass
699
+ class MemberUpdate:
700
+ db: Database
701
+ query: Query
702
+ changes: Dict[str, Any] = field(default_factory=dict)
703
+
704
+ def set_name(self, name: str) -> Self:
705
+ return replace(self, changes=dict(self.changes, name=name))
706
+
707
+ def perform(self) -> int:
708
+ if not self.changes:
709
+ return 0
710
+ sql_statement = (
711
+ update(models.Member)
712
+ .where(
713
+ models.Member.id.in_(
714
+ self.query.with_entities(models.Member.id).scalar_subquery()
715
+ )
716
+ )
717
+ .values(**self.changes)
718
+ .execution_options(synchronize_session="fetch")
719
+ )
720
+ rowcount = cast(CursorResult, self.db.session.execute(sql_statement)).rowcount
721
+ self.db.session.flush()
722
+ return rowcount
723
+
694
724
 
695
725
  class CompanyQueryResult(SqlQueryResult[records.Company]):
696
726
  def with_id(self, id_: UUID) -> Self:
@@ -788,6 +818,36 @@ class CompanyQueryResult(SqlQueryResult[records.Company]):
788
818
  .with_entities(models.Company, email),
789
819
  )
790
820
 
821
+ def update(self) -> CompanyUpdate:
822
+ return CompanyUpdate(db=self.db, query=self.query)
823
+
824
+
825
+ @dataclass
826
+ class CompanyUpdate:
827
+ db: Database
828
+ query: Query
829
+ changes: Dict[str, Any] = field(default_factory=dict)
830
+
831
+ def set_name(self, name: str) -> Self:
832
+ return replace(self, changes=dict(self.changes, name=name))
833
+
834
+ def perform(self) -> int:
835
+ if not self.changes:
836
+ return 0
837
+ sql_statement = (
838
+ update(models.Company)
839
+ .where(
840
+ models.Company.id.in_(
841
+ self.query.with_entities(models.Company.id).scalar_subquery()
842
+ )
843
+ )
844
+ .values(**self.changes)
845
+ .execution_options(synchronize_session="fetch")
846
+ )
847
+ rowcount = cast(CursorResult, self.db.session.execute(sql_statement)).rowcount
848
+ self.db.session.flush()
849
+ return rowcount
850
+
791
851
 
792
852
  class AccountantResult(SqlQueryResult[records.Accountant]):
793
853
  def with_email_address(self, email: str) -> Self:
@@ -826,6 +886,36 @@ class AccountantResult(SqlQueryResult[records.Accountant]):
826
886
  mapper=mapper,
827
887
  )
828
888
 
889
+ def update(self) -> AccountantUpdate:
890
+ return AccountantUpdate(db=self.db, query=self.query)
891
+
892
+
893
+ @dataclass
894
+ class AccountantUpdate:
895
+ db: Database
896
+ query: Query
897
+ changes: Dict[str, Any] = field(default_factory=dict)
898
+
899
+ def set_name(self, name: str) -> Self:
900
+ return replace(self, changes=dict(self.changes, name=name))
901
+
902
+ def perform(self) -> int:
903
+ if not self.changes:
904
+ return 0
905
+ sql_statement = (
906
+ update(models.Accountant)
907
+ .where(
908
+ models.Accountant.id.in_(
909
+ self.query.with_entities(models.Accountant.id).scalar_subquery()
910
+ )
911
+ )
912
+ .values(**self.changes)
913
+ .execution_options(synchronize_session="fetch")
914
+ )
915
+ rowcount = cast(CursorResult, self.db.session.execute(sql_statement)).rowcount
916
+ self.db.session.flush()
917
+ return rowcount
918
+
829
919
 
830
920
  class TransferQueryResult(SqlQueryResult[records.Transfer]):
831
921
  def where_account_is_debtor(self, *account: UUID) -> Self:
@@ -2349,6 +2439,10 @@ class PasswordResetRequestResult(SqlQueryResult[records.PasswordResetRequest]):
2349
2439
  )
2350
2440
  )
2351
2441
 
2442
+ def delete(self) -> None:
2443
+ self.query.delete()
2444
+ self.db.session.flush()
2445
+
2352
2446
 
2353
2447
  class BasicServiceResult(SqlQueryResult[records.BasicService]):
2354
2448
  def with_id(self, id_: UUID) -> Self:
@@ -2455,6 +2549,74 @@ class BasicServiceUpdate:
2455
2549
  return cast(CursorResult, result).rowcount
2456
2550
 
2457
2551
 
2552
+ class EmailResult(SqlQueryResult[records.Email]):
2553
+ def with_id(self, id_: UUID) -> Self:
2554
+ return self._with_modified_query(
2555
+ lambda query: query.filter(models.EmailOutbox.id == id_)
2556
+ )
2557
+
2558
+ def that_have_not_been_sent(self) -> Self:
2559
+ return self._with_modified_query(
2560
+ lambda query: query.filter(models.EmailOutbox.sent_at.is_(None))
2561
+ )
2562
+
2563
+ def ordered_by_creation_date(self, ascending: bool = True) -> Self:
2564
+ ordering = (
2565
+ models.EmailOutbox.created_at.asc()
2566
+ if ascending
2567
+ else models.EmailOutbox.created_at.desc()
2568
+ )
2569
+ return self._with_modified_query(lambda query: query.order_by(ordering))
2570
+
2571
+ def update(self) -> EmailUpdate:
2572
+ return EmailUpdate(query=self.query, db=self.db)
2573
+
2574
+
2575
+ @dataclass
2576
+ class EmailUpdate:
2577
+ query: Query
2578
+ db: Database
2579
+ update_values: Dict[str, Any] = field(default_factory=dict)
2580
+
2581
+ def set_sent_at(self, sent_at: datetime) -> Self:
2582
+ return replace(
2583
+ self,
2584
+ update_values=dict(self.update_values, sent_at=sent_at),
2585
+ )
2586
+
2587
+ def set_last_error(self, message: str) -> Self:
2588
+ return replace(
2589
+ self,
2590
+ update_values=dict(self.update_values, last_error=message),
2591
+ )
2592
+
2593
+ def increment_retry_count(self) -> Self:
2594
+ return replace(
2595
+ self,
2596
+ update_values=dict(
2597
+ self.update_values,
2598
+ retry_count=models.EmailOutbox.retry_count + 1,
2599
+ ),
2600
+ )
2601
+
2602
+ def perform(self) -> int:
2603
+ if not self.update_values:
2604
+ return 0
2605
+ sql_statement = (
2606
+ update(models.EmailOutbox)
2607
+ .where(
2608
+ models.EmailOutbox.id.in_(
2609
+ self.query.with_entities(models.EmailOutbox.id).scalar_subquery()
2610
+ )
2611
+ )
2612
+ .values(**self.update_values)
2613
+ .execution_options(synchronize_session="fetch")
2614
+ )
2615
+ result = self.db.session.execute(sql_statement)
2616
+ self.db.session.flush()
2617
+ return cast(CursorResult, result).rowcount
2618
+
2619
+
2458
2620
  @dataclass
2459
2621
  class DatabaseGatewayImpl:
2460
2622
  db: Database
@@ -3234,3 +3396,36 @@ class DatabaseGatewayImpl:
3234
3396
  query=self.db.session.query(models.BasicService),
3235
3397
  mapper=self.basic_service_from_orm,
3236
3398
  )
3399
+
3400
+ def create_email(
3401
+ self, created_at: datetime, recipient: str, sender: str, subject: str, html: str
3402
+ ) -> records.Email:
3403
+ orm = models.EmailOutbox(
3404
+ id=uuid4(),
3405
+ created_at=created_at,
3406
+ recipient=recipient,
3407
+ sender=sender,
3408
+ subject=subject,
3409
+ html=html,
3410
+ )
3411
+ self.db.session.add(orm)
3412
+ self.db.session.flush()
3413
+ return self.email_from_orm(orm)
3414
+
3415
+ def get_emails(self) -> EmailResult:
3416
+ return EmailResult(
3417
+ db=self.db,
3418
+ query=self.db.session.query(models.EmailOutbox),
3419
+ mapper=self.email_from_orm,
3420
+ )
3421
+
3422
+ @classmethod
3423
+ def email_from_orm(cls, orm: models.EmailOutbox) -> records.Email:
3424
+ return records.Email(
3425
+ id=orm.id,
3426
+ created_at=orm.created_at,
3427
+ recipient=orm.recipient,
3428
+ sender=orm.sender,
3429
+ subject=orm.subject,
3430
+ html=orm.html,
3431
+ )
@@ -0,0 +1,13 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class EmailSenderPlugin(ABC):
5
+ @abstractmethod
6
+ def send_message(
7
+ self,
8
+ subject: str,
9
+ recipient: list[str],
10
+ html: str,
11
+ sender: str,
12
+ ) -> None:
13
+ pass
@@ -1,19 +1,30 @@
1
1
  import email.utils
2
2
  from contextlib import contextmanager
3
+ from dataclasses import dataclass
3
4
  from email.message import EmailMessage
4
5
  from smtplib import SMTP, SMTP_SSL
5
6
  from typing import Generator
6
7
 
7
- from flask import current_app
8
+ from workers_control.email_sending_worker.interface import EmailSenderPlugin
8
9
 
9
- from .interface import EmailPlugin
10
10
 
11
+ @dataclass
12
+ class SmtpMailServerConfig:
13
+ mail_server: str
14
+ mail_port: int
15
+ encryption_type: str
16
+ username: str | None = None
17
+ password: str | None = None
18
+
19
+
20
+ @dataclass
21
+ class SmtpMailService(EmailSenderPlugin):
22
+ config: SmtpMailServerConfig
11
23
 
12
- class SmtpMailService(EmailPlugin):
13
24
  def send_message(
14
25
  self,
15
26
  subject: str,
16
- recipients: list[str],
27
+ recipient: list[str],
17
28
  html: str,
18
29
  sender: str,
19
30
  ) -> None:
@@ -24,19 +35,15 @@ class SmtpMailService(EmailPlugin):
24
35
  message.set_content(html, subtype="html")
25
36
 
26
37
  with self.create_smtp_connection() as connection:
27
- for recipient in recipients:
28
- del message["Message-ID"]
29
- del message["To"]
30
- message["Message-ID"] = email.utils.make_msgid(domain="workers-control")
31
- message["To"] = recipient
32
- connection.send_message(message)
33
-
34
- @classmethod
38
+ message["Message-ID"] = email.utils.make_msgid(domain="workers-control")
39
+ message["To"] = recipient
40
+ connection.send_message(message)
41
+
35
42
  @contextmanager
36
- def create_smtp_connection(cls) -> Generator[SMTP | SMTP_SSL, None, None]:
37
- server = current_app.config.get("MAIL_SERVER", "localhost")
38
- port = current_app.config.get("MAIL_PORT", 587)
39
- encryption_type = current_app.config.get("MAIL_ENCRYPTION_TYPE", "tls")
43
+ def create_smtp_connection(self) -> Generator[SMTP | SMTP_SSL, None, None]:
44
+ server = self.config.mail_server
45
+ port = self.config.mail_port
46
+ encryption_type = self.config.encryption_type
40
47
  connection: SMTP | SMTP_SSL
41
48
 
42
49
  if encryption_type == "ssl":
@@ -46,8 +53,8 @@ class SmtpMailService(EmailPlugin):
46
53
  connection.starttls()
47
54
 
48
55
  connection.ehlo()
49
- username = current_app.config.get("MAIL_USERNAME", "")
50
- password = current_app.config.get("MAIL_PASSWORD", "")
56
+ username = self.config.username
57
+ password = self.config.password
51
58
  if username and password:
52
59
  connection.login(username, password)
53
60
  yield connection