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.
- {workers_control-0.2.0/src/workers_control.egg-info → workers_control-0.2.2}/PKG-INFO +2 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/pyproject.toml +2 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/email_notifications.py +7 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/change_user_email_address.py +3 -0
- workers_control-0.2.2/src/workers_control/core/interactors/change_user_name.py +73 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_basic_service.py +9 -3
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/records.py +10 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/repositories.py +44 -0
- workers_control-0.2.2/src/workers_control/db/migrations/versions/68ac7ccf6086_create_table_emailoutbox.py +34 -0
- workers_control-0.2.2/src/workers_control/db/migrations/versions/c9f2e1a4b8d7_add_outbox_status_columns.py +43 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/models.py +15 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/repositories.py +195 -0
- workers_control-0.2.2/src/workers_control/email_sending_worker/interface.py +13 -0
- 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
- workers_control-0.2.2/src/workers_control/email_sending_worker/worker.py +99 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/__init__.py +6 -1
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/commands.py +28 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/options.py +2 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/production_defaults.py +4 -1
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/dependency_injection.py +15 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/forms.py +24 -0
- workers_control-0.2.2/src/workers_control/flask/mail_sender/__init__.py +15 -0
- workers_control-0.2.2/src/workers_control/flask/mail_service/mail_storage_service.py +27 -0
- workers_control-0.2.2/src/workers_control/flask/routes/auth/routes.py +178 -0
- workers_control-0.2.2/src/workers_control/flask/routes/company/routes.py +223 -0
- workers_control-0.2.2/src/workers_control/flask/routes/member/routes.py +87 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/routes.py +12 -36
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/unconfirmed_company.html +5 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/unconfirmed_member.html +5 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/account_details.html +6 -1
- workers_control-0.2.2/src/workers_control/flask/templates/user/change_user_name.html +39 -0
- workers_control-0.2.2/src/workers_control/flask/templates/user/name_change_confirmation.html +5 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/show_basic_service.html +1 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/text_renderer.py +6 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/de/LC_MESSAGES/messages.po +99 -45
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/en/LC_MESSAGES/messages.po +89 -40
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/es/LC_MESSAGES/messages.po +101 -47
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translations/messages.pot +89 -39
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/url_index.py +3 -0
- workers_control-0.2.2/src/workers_control/flask/views/change_user_name_view.py +42 -0
- workers_control-0.2.2/src/workers_control/flask/views/create_draft_from_plan_view.py +34 -0
- workers_control-0.2.2/src/workers_control/flask/views/delete_draft_view.py +35 -0
- workers_control-0.2.2/src/workers_control/flask/views/file_plan_with_accounting_view.py +37 -0
- workers_control-0.2.2/src/workers_control/flask/views/get_plan_details_company_view.py +25 -0
- workers_control-0.2.2/src/workers_control/flask/views/get_plan_details_member_view.py +32 -0
- workers_control-0.2.2/src/workers_control/flask/views/hide_plan_view.py +28 -0
- workers_control-0.2.2/src/workers_control/flask/views/log_in_accountant_view.py +42 -0
- workers_control-0.2.2/src/workers_control/flask/views/log_in_company_view.py +51 -0
- workers_control-0.2.2/src/workers_control/flask/views/log_in_member_view.py +48 -0
- workers_control-0.2.2/src/workers_control/flask/views/member_dashboard_view.py +31 -0
- workers_control-0.2.2/src/workers_control/flask/views/query_company_consumptions_view.py +32 -0
- workers_control-0.2.2/src/workers_control/flask/views/request_email_address_change_view.py +42 -0
- workers_control-0.2.2/src/workers_control/flask/views/resend_confirmation_view.py +40 -0
- workers_control-0.2.2/src/workers_control/flask/views/revoke_plan_filing_view.py +30 -0
- workers_control-0.2.2/src/workers_control/flask/views/show_member_account_details_view.py +32 -0
- workers_control-0.2.2/src/workers_control/flask/views/show_my_cooperations_view.py +52 -0
- workers_control-0.2.2/src/workers_control/flask/views/show_my_plans_view.py +31 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_sender.py +6 -0
- workers_control-0.2.2/src/workers_control/web/email/name_change_confirmation_presenter.py +26 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/__init__.py +8 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/text_renderer.py +2 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/url_index.py +2 -0
- workers_control-0.2.2/src/workers_control/web/www/controllers/change_user_name_controller.py +21 -0
- workers_control-0.2.2/src/workers_control/web/www/presenters/__init__.py +0 -0
- workers_control-0.2.2/src/workers_control/web/www/presenters/change_user_name_presenter.py +55 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_basic_service_presenter.py +2 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/user_account_details_presenter.py +2 -0
- {workers_control-0.2.0 → workers_control-0.2.2/src/workers_control.egg-info}/PKG-INFO +2 -2
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/SOURCES.txt +32 -4
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/requires.txt +1 -1
- workers_control-0.2.0/src/workers_control/flask/routes/auth/routes.py +0 -296
- workers_control-0.2.0/src/workers_control/flask/routes/company/routes.py +0 -390
- workers_control-0.2.0/src/workers_control/flask/routes/member/routes.py +0 -153
- workers_control-0.2.0/src/workers_control/flask/translations/de/LC_MESSAGES/messages.mo +0 -0
- workers_control-0.2.0/src/workers_control/flask/translations/en/LC_MESSAGES/messages.mo +0 -0
- workers_control-0.2.0/src/workers_control/flask/translations/es/LC_MESSAGES/messages.mo +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/LICENSE +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/MANIFEST.in +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/README.rst +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/build_support/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/build_support/babel.cfg +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/build_support/backend.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/build_support/project.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/build_support/translations.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/setup.cfg +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/accountant_notifications.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/anonymization.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/control_thresholds.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/datetime_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/decimal.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/email.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/injector.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/accept_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/accept_coordination_transfer.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/answer_company_work_invite.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/approve_plan.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/cancel_cooperation_solicitation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/change_user_password.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/confirm_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/confirm_member.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_draft_from_plan.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/create_plan_draft.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/deactivate_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/delete_draft.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/deny_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/edit_draft.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/end_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/file_plan_with_accounting.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_accountant_dashboard.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_company_dashboard.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_company_summary.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_coop_summary.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_coordination_transfer_request_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_draft_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_member_dashboard.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_plan_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_private_consumption_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_productive_consumption_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_statistics.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/get_user_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/hide_plan.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/invite_worker_to_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_active_plans_of_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_all_cooperations.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_available_languages.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_basic_services_of_worker.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_coordinations_of_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_coordinations_of_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_my_cooperating_plans.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_pending_work_invites.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_plans_with_pending_review.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_registered_hours_worked.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_transfers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/list_workers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_accountant.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/log_in_member.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/preview_private_consumption.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_companies.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_company_consumptions.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_offers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/query_private_consumptions.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_accountant.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_hours_worked.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_member.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_private_consumption.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_private_consumption_of_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_productive_consumption.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/register_productive_consumption_of_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/reject_plan.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/remove_worker_from_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_cooperation.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_coordination_transfer.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_email_address_change.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/request_user_password_reset.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/resend_confirmation_mail.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/resend_work_invite.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/review_registered_consumptions.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/revoke_plan_filing.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_private_consumption.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_private_consumption_of_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_productive_consumption.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/select_productive_consumption_of_basic_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/send_accountant_registration_token.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_a_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_accounts.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_cooperations.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_company_work_invite_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_member_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_my_plans.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_p_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_payout_factor_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_prd_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_psf_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/interactors/show_r_account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/password_hasher.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/account_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/compensation_transfers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/payout_factor.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/plan_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/price_calculator.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/services/psf_balance.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/transfers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/db.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/alembic.ini +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/env.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/script.py.mako +0 -0
- {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
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/480a749375de_drop_transaction_table.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/4fd90069eb82_remove_social_accounting_account.py +0 -0
- {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
- {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
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/db/migrations/versions/b40539bf0293_add_basic_service_table.py +0 -0
- {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
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/babel.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/class_based_view.py +0 -0
- {workers_control-0.2.0/src/workers_control/flask/routes → workers_control-0.2.2/src/workers_control/flask/config}/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/checks.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/config/loader.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/context_processors.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/control_thresholds.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/database.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/datetime.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/email_configuration.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/extensions.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/filters.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_colors.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_request.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/flask_session.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/language_repository.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/logging_config.json +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/mail_service/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/mail_service/interface.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/notifications.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/password_hasher.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/payout_factor.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/plotter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/profiling.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/blueprint.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/accountant/routes.py +0 -0
- {workers_control-0.2.0/src/workers_control/web → workers_control-0.2.2/src/workers_control/flask/routes/auth}/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/company/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/company/blueprint.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/healthcheck/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/healthcheck/blueprint.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/member/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/member/blueprint.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/plots/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/plots/routes.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/routes/user/blueprint.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/bulma.css +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/colors.css +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/favicon.ico +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.css +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.js +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/static/main.module.js +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/dashboard.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/notification-about-new-plan.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/plan_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/accountant/plans-to-review-list.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/accountant_invitation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/activate.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/help.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_accountant.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_company.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/login_member.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/password_reset_confirmation_email.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/request_password_reset.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password_email.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/reset_password_invalid.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_accountant.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_company.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/signup_member.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/auth/start.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/base.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/consumption_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/create_cooperation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/create_draft.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/dashboard.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/draft_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/invite_worker_to_company.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/list_pending_work_invites.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/list_registered_hours_worked.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_consumptions.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_cooperations.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/my_plans.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/plan_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/register_hours_worked.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/register_productive_consumption.html +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/rejected_plan_notification.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/remove_worker_from_company.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/request_cooperation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/request_coordination_transfer.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/review_registered_consumptions.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/company/show_coordination_transfer_request.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/at.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/basket-shopping.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/book.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/calendar.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/chart-line.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/chart-pie.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/check.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/copy.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/credit-card.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/edit.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/envelope.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/exchange-alt.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/exclamation-triangle.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/eye-slashed.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/eye.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/file-circle-plus.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/file.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/hands-helping.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/hourglass.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/industry.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/info-circle.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/key.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/list.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/oil-can.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/redo.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/square-arrow-up-right.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/times.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/trash.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/user.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/icons/users.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/accountant_navigation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/anonymous_navigation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/company_navigation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/company_summary.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/copy_toggle.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/draft_form.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/form_field_error.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/language_selection.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/member_navigation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/navbar.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/pagination.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/plan_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/show_notifications.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/tooltips.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/macros/transfers.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/basic_services.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/consumption_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/consumptions.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/create_basic_service.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/dashboard.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/my_account.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/notification-about-work-invitation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/plan_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/register_private_consumption.html +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/member/show_company_work_invite_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/account_psf.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_a.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_p.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_prd.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_account_r.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_accounts.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/company_summary.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/confirm_email_address_change.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/coop_summary.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/http_error.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_all_cooperations.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_coordinations_of_cooperation.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/list_transfers.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/query_companies.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/query_offers.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_address_change.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_change_notification.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/request_email_change_warning.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/show_payout_factor_details.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/templates/user/statistics.html +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/token.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/translator.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/types.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/accept_cooperation_request_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/accountant_invitation_email_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/cancel_cooperation_request_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/change_email_address_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/company_dashboard_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/company_work_invite_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/coop_summary_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_basic_service_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_cooperation_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/create_draft_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/deactivate_basic_service_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/deny_cooperation_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/draft_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/end_cooperation_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_private_consumption_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_productive_consumption_details.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/get_statistics_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/healthcheck_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/http_error_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/invite_worker_to_company.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_all_cooperations_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_basic_services_of_worker_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_coordinators_of_cooperation_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_pending_work_invites_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_registered_hours_worked_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/list_transfers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_companies.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_offers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/query_private_consumptions.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_hours_worked_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_private_consumption.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/register_productive_consumption.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/remove_worker_from_company_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_cooperation_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_coordination_transfer_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/request_password_reset_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/reset_password_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/review_registered_consumptions_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_a_account_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_basic_service_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_company_accounts_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_coordination_transfer_request_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_p_account_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_payout_factor_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_prd_account_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_psf_account_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/show_r_account_details_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_accountant_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_company_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/views/signup_member_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/flask/wsgi.py +0 -0
- {workers_control-0.2.0/src/workers_control/web/formatters → workers_control-0.2.2/src/workers_control/web}/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/colors.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/accountant_invitation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/company_notifier.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/cooperation_request_email_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_change_confirmation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/email_change_warning_view.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/invite_worker_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/notify_accountant_about_new_plan_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/registration_email_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/request_coordination_transfer_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/email/reset_password_email_presenter.py +0 -0
- {workers_control-0.2.0/src/workers_control/web/www → workers_control-0.2.2/src/workers_control/web/formatters}/__init__.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/formatters/datetime_formatter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/formatters/plan_details_formatter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/fields.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/forms/formfield_parsers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/json.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/language_service.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/malformed_input_data.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/notification.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/pagination.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/request.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/session.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/token.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/translator.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/authentication.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/accept_coordination_transfer_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/answer_company_work_invite_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/approve_plan_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/change_user_email_address_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/confirm_company_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/confirm_member_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_basic_service_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_draft_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/create_draft_from_plan_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/deactivate_basic_service_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/delete_draft_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/draft_form_validator.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/edit_draft_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/end_cooperation_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/file_plan_with_accounting_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/get_private_consumption_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/get_productive_consumption_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/invite_worker_to_company_controller.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_pending_work_invites_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_registered_hours_worked_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_transfers_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/list_workers_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/log_in_accountant_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_companies_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_offers_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/query_private_consumptions_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_accountant_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_company_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_hours_worked_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_member_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_private_consumption_form_validator.py +0 -0
- {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
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/register_productive_consumption_controller.py +0 -0
- {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
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/reject_plan_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/remove_worker_from_company_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_cooperation_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_coordination_transfer_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_email_address_change_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/request_password_reset_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/resend_work_invite_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/reset_password_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/review_registered_consumptions_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/revoke_plan_filing_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_private_consumption_controller.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/select_productive_consumption_controller.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_a_account_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_basic_service_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_company_accounts_controller.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_p_account_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_prd_account_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/show_r_account_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/controllers/user_account_details_controller.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/navbar.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/accept_cooperation_request_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/accept_coordination_transfer_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/answer_company_work_invite_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/approve_plan_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/cancel_cooperation_request_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/change_user_email_address_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/company_consumptions_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_basic_service_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_cooperation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_draft_from_plan_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/create_draft_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/deactivate_basic_service_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/delete_draft_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/deny_cooperation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/edit_draft_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/end_cooperation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/file_plan_with_accounting_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_accountant_dashboard_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_company_dashboard_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_company_summary_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_coop_summary_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_draft_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_member_dashboard_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_accountant_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_company_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_plan_details_member_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/get_statistics_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/hide_plan_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/invite_worker_to_company_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_all_cooperations_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_available_languages_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_coordinations_of_cooperation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_pending_work_invites_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_plans_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_registered_hours_worked_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_transfers_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/list_workers_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_accountant_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_company_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/log_in_member_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/private_consumption_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/private_consumptions_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/productive_consumption_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/query_companies_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/query_offers_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_accountant_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_company_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_hours_worked_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_member_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_private_consumption_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/register_productive_consumption_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/reject_plan_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/remove_worker_from_company_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_cooperation_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_coordination_transfer_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_email_address_change_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/request_password_reset_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/resend_work_invite_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/reset_password_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/review_registered_consumptions_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/revoke_plan_filing_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_private_consumption_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/select_productive_consumption_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_a_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_company_accounts_presenter.py +0 -0
- {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
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_member_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_my_cooperations_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_my_plans_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_p_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_payout_factor_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_prd_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_psf_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/show_r_account_details_presenter.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/presenters/transfers.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/web/www/response.py +0 -0
- {workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
29
|
+
"matplotlib>=3.10.5, <=3.10.9" # different versions in stable/unstable nixpkgs
|
|
30
30
|
]
|
|
31
31
|
|
|
32
32
|
[project.optional-dependencies]
|
{workers_control-0.2.0 → workers_control-0.2.2}/src/workers_control/core/email_notifications.py
RENAMED
|
@@ -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
|
-
|
|
43
|
-
self.database_gateway.get_members()
|
|
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
|
|
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
|
+
)
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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(
|
|
37
|
-
server =
|
|
38
|
-
port =
|
|
39
|
-
encryption_type =
|
|
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 =
|
|
50
|
-
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
|