├── .editorconfig ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── discussion-request.md │ ├── enhancement-request.md │ ├── feature_request.md │ └── scoping_review_form.md ├── PULL_REQUEST_TEMPLATE.md ├── release-drafter.yml └── workflows │ ├── codeql-analysis.yml │ ├── deploy-docs.yml │ ├── hypha-ci.yml │ └── release-drafter.yml ├── .gitignore ├── .nvmrc ├── .pre-commit-config.yaml ├── .python-version ├── .stylelintrc.yaml ├── .test_durations ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── Procfile ├── README.md ├── SECURITY.md ├── app.json ├── biome.json ├── conftest.py ├── docker ├── Dockerfile ├── Dockerfile.dockerignore ├── compose.yaml ├── entrypoint.sh └── prod │ ├── Dockerfile │ ├── Dockerfile.dockerignore │ ├── README.md │ └── entrypoint.sh ├── docs ├── assets │ ├── extra.css │ ├── how-to-login-nav.png │ ├── how-to-login-w-pass-btn.png │ ├── how-to-login-w-pass-prompt.png │ ├── how-to-login-wo-pw-page.png │ ├── hypha-logo.png │ ├── manage_user-add-user.jpg │ ├── manage_user-apply-filter.jpg │ ├── manage_user-nav.jpg │ ├── manage_user-update-group.jpg │ ├── partner_dashboard_assign_submission.png │ ├── setup_form-1.png │ ├── setup_form-2.png │ ├── setup_form-3.png │ ├── setup_form-4.png │ ├── setup_round-enter-lead-name.jpeg │ ├── setup_round-publish-options.png │ ├── setup_round-select-reviewers.png │ ├── setup_round-select-round-from-nav.jpg │ ├── setup_round-select-round-from-nav.png │ ├── staff_applicant_dashboard.png │ ├── submission_how-to-assign-partner.png │ ├── workflow1.png │ ├── workflow2.png │ ├── workflow3.png │ ├── workflow4.1.png │ └── workflow4.2.png ├── getting-started │ ├── .pages │ ├── LICENSE.md │ ├── SECURITY.md │ ├── architecture.md │ ├── contributing │ │ ├── .pages │ │ ├── code-contributions.md │ │ ├── code-of-conduct.md │ │ ├── contribute-to-documentation.md │ │ ├── developer-tips.md │ │ ├── localization-and-translation.md │ │ └── submitting-changes.md │ └── deployment.md ├── index.md ├── references │ ├── accessibility.md │ ├── glossary.md │ ├── notifications.md │ ├── plugins.md │ ├── project-reports.md │ ├── security.md │ ├── security2fa.md │ ├── template-hooks.md │ ├── user-roles.md │ ├── wagtail-admin.md │ └── workflows.md ├── scripts │ ├── doc_macros.py │ └── gen_ref_pages.py ├── setup │ ├── administrators │ │ ├── configuration.md │ │ ├── cookie-consent.md │ │ ├── cron-jobs.md │ │ ├── machine-translations.md │ │ ├── overriding-templates.md │ │ ├── setup-error-performance-monitoring.md │ │ └── setup-notifications.md │ └── deployment │ │ ├── development │ │ ├── docker.md │ │ └── stand-alone.md │ │ ├── index.md │ │ └── production │ │ ├── docker.md │ │ ├── heroku.md │ │ └── stand-alone.md └── user-guides │ ├── applications │ ├── creating-submission-application.md │ └── submission-search.md │ ├── creating-a-user-account.md │ └── login.md ├── dslr.toml ├── hypha ├── .gitignore ├── __init__.py ├── addressfield │ ├── __init__.py │ ├── fields.py │ ├── models.py │ ├── static │ │ ├── address_form.js │ │ ├── addressfield.min.json │ │ └── jquery.addressfield.min.js │ ├── templates │ │ └── addressfield │ │ │ └── widgets │ │ │ └── nested_with_label.html │ ├── tests.py │ └── widgets.py ├── apply │ ├── __init__.py │ ├── activity │ │ ├── __init__.py │ │ ├── adapters │ │ │ ├── __init__.py │ │ │ ├── activity_feed.py │ │ │ ├── base.py │ │ │ ├── emails.py │ │ │ ├── slack.py │ │ │ └── utils.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── filters.py │ │ ├── forms.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ └── send_staff_email_digest.py │ │ ├── messaging.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_activity_type.py │ │ │ ├── 0003_activity_visibility.py │ │ │ ├── 0004_update_on_delete_django2.py │ │ │ ├── 0005_event.py │ │ │ ├── 0006_message.py │ │ │ ├── 0007_message_status.py │ │ │ ├── 0008_message_external_id.py │ │ │ ├── 0009_add_private_option.py │ │ │ ├── 0011_add_new_event_type.py │ │ │ ├── 0012_add_generic_relation_to_activity.py │ │ │ ├── 0013_add_new_event_type_screening.py │ │ │ ├── 0014_add_batch_reviewer_message.py │ │ │ ├── 0015_add_batch_transition.py │ │ │ ├── 0016_add_batch_ready.py │ │ │ ├── 0017_add_review_opinion.py │ │ │ ├── 0018_add_batch_determine.py │ │ │ ├── 0019_partner_field_event.py │ │ │ ├── 0020_add_delete_event.py │ │ │ ├── 0021_add_review_delete_event.py │ │ │ ├── 0022_add_versioning_to_comments.py │ │ │ ├── 0023_notify_partners.py │ │ │ ├── 0024_add_review_edit_event.py │ │ │ ├── 0025_add_batch_lead_event.py │ │ │ ├── 0026_add_created_project_event.py │ │ │ ├── 0026_update_visibility_options.py │ │ │ ├── 0027_add_update_project_lead.py │ │ │ ├── 0027_update_visibility_options_2.py │ │ │ ├── 0028_add_new_generic_relation.py │ │ │ ├── 0028_migrate_messages_with_visibility.py │ │ │ ├── 0029_migrate_old_submission_relation.py │ │ │ ├── 0030_remove_old_relation.py │ │ │ ├── 0031_add_generic_fk_to_event.py │ │ │ ├── 0032_migrate_submission_to_generic_event.py │ │ │ ├── 0033_remove_old_submission_fk_event.py │ │ │ ├── 0034_add_send_for_approval.py │ │ │ ├── 0035_add_approve_project.py │ │ │ ├── 0036_add_reject_project.py │ │ │ ├── 0037_add_upload_document.py │ │ │ ├── 0038_auto_20190808_1142.py │ │ │ ├── 0039_add_remove_document.py │ │ │ ├── 0040_merge_activity_update_and_generic_relations.py │ │ │ ├── 0041_add_upload_contract.py │ │ │ ├── 0042_add_approve_contract.py │ │ │ ├── 0043_add_request_payment.py │ │ │ ├── 0044_add_update_payment_request_status.py │ │ │ ├── 0045_add_delete_payment_request.py │ │ │ ├── 0046_add_sent_to_compliance.py │ │ │ ├── 0047_add_update_payment_request.py │ │ │ ├── 0048_add_project_transition.py │ │ │ ├── 0049_auto_20191112_1227.py │ │ │ ├── 0050_add_submit_report.py │ │ │ ├── 0051_add_report_skipping_activity.py │ │ │ ├── 0052_report_frequency_change.py │ │ │ ├── 0053_nullable_by_report_notify.py │ │ │ ├── 0054_add_create_reminder_delete_reminder_and_review_reminder.py │ │ │ ├── 0055_add_batch_delete_submission.py │ │ │ ├── 0056_add_updated_vendor.py │ │ │ ├── 0057_add_invoices.py │ │ │ ├── 0058_add_project_invoicing.py │ │ │ ├── 0059_rename_team_staff.py │ │ │ ├── 0060_contracting_name_update.py │ │ │ ├── 0061_payment_requests_cleanup.py │ │ │ ├── 0062_remove_payment_requests_activities.py │ │ │ ├── 0063_alter_event_type.py │ │ │ ├── 0064_alter_event_type.py │ │ │ ├── 0065_auto_20221006_1115.py │ │ │ ├── 0066_alter_event_type.py │ │ │ ├── 0067_add_draft_submission.py │ │ │ ├── 0068_add_archive_unarchive.py │ │ │ ├── 0069_alter_event_type_add_disable_reporting.py │ │ │ ├── 0070_alter_event_type.py │ │ │ ├── 0071_alter_event_type.py │ │ │ ├── 0072_alter_event_type.py │ │ │ ├── 0073_add_approve_invoice.py │ │ │ ├── 0074_alter_event_type.py │ │ │ ├── 0075_alter_activity_visibility.py │ │ │ ├── 0076_alter_event_type.py │ │ │ ├── 0077_remove_deleted_submission_actions.py │ │ │ ├── 0078_activityattachment.py │ │ │ ├── 0079_alter_activity_visibility.py │ │ │ ├── 0080_alter_event_type.py │ │ │ ├── 0081_alter_event_type.py │ │ │ ├── 0082_change_staff_pii_visibility.py │ │ │ ├── 0083_alter_event_type.py │ │ │ ├── 0084_alter_event_type.py │ │ │ ├── 0085_rename_paf.py │ │ │ ├── 0086_remove_django_messages_adapter.py │ │ │ ├── 0087_alter_event_type.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── options.py │ │ ├── services.py │ │ ├── signals.py │ │ ├── tasks.py │ │ ├── templates │ │ │ ├── activity │ │ │ │ ├── include │ │ │ │ │ ├── action_list.html │ │ │ │ │ └── activity_list.html │ │ │ │ ├── notifications.html │ │ │ │ ├── partial_comment_message.html │ │ │ │ └── ui │ │ │ │ │ ├── activity-action-item.html │ │ │ │ │ ├── activity-comment-item.html │ │ │ │ │ └── edit_comment_form.html │ │ │ └── messages │ │ │ │ ├── email │ │ │ │ ├── activity_summary.md │ │ │ │ ├── applicant_base.html │ │ │ │ ├── assign_paf_approvers.html │ │ │ │ ├── base.html │ │ │ │ ├── batch_ready_to_review.html │ │ │ │ ├── comment.html │ │ │ │ ├── contract_uploaded.html │ │ │ │ ├── determination.html │ │ │ │ ├── invite_co_applicant.html │ │ │ │ ├── invited_to_proposal.html │ │ │ │ ├── invoice_approved.html │ │ │ │ ├── invoice_created.html │ │ │ │ ├── invoice_status_updated_applicant.html │ │ │ │ ├── invoice_status_updated_staff.html │ │ │ │ ├── invoice_updated.html │ │ │ │ ├── paf_for_approval.html │ │ │ │ ├── partners_update_applicant.html │ │ │ │ ├── partners_update_partner.html │ │ │ │ ├── project_created.html │ │ │ │ ├── project_final_approval.html │ │ │ │ ├── project_request_change.html │ │ │ │ ├── ready_for_contracting.html │ │ │ │ ├── ready_for_invoicing.html │ │ │ │ ├── ready_to_review.html │ │ │ │ ├── report_frequency.html │ │ │ │ ├── report_notify.html │ │ │ │ ├── report_skipped.html │ │ │ │ ├── report_submitted.html │ │ │ │ ├── sent_to_compliance.html │ │ │ │ ├── submission_confirmation.html │ │ │ │ ├── submission_edit.html │ │ │ │ ├── submit_contract_documents.html │ │ │ │ └── transition.html │ │ │ │ └── slack_message.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── activity_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories.py │ │ │ ├── test_comments.py │ │ │ ├── test_messaging.py │ │ │ ├── test_models.py │ │ │ └── test_tasks.py │ │ ├── urls.py │ │ └── views.py │ ├── categories │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── admin_helpers.py │ │ ├── admin_views.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_metacategory.py │ │ │ ├── 0003_rename_meta_categories_to_meta_terms.py │ │ │ ├── 0004_rename_meta_categories_to_meta_terms.py │ │ │ ├── 0005_alter_is_archived_field_on_terms.py │ │ │ ├── 0006_use_category_options_as_submission_filter.py │ │ │ ├── 0007_rename_meta_terms_to_tags.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates │ │ │ └── categories │ │ │ │ └── admin │ │ │ │ └── includes │ │ │ │ └── meta_term_list_header.html │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories.py │ │ │ └── test_blocks.py │ │ └── views.py │ ├── dashboard │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── services.py │ │ ├── templates │ │ │ └── dashboard │ │ │ │ ├── applicant_dashboard.html │ │ │ │ ├── community_dashboard.html │ │ │ │ ├── contracting_dashboard.html │ │ │ │ ├── finance_dashboard.html │ │ │ │ ├── includes │ │ │ │ ├── my-tasks.html │ │ │ │ ├── project_status_bar.html │ │ │ │ ├── projects_in_contracting.html │ │ │ │ └── submissions-waiting-for-review.html │ │ │ │ ├── partials │ │ │ │ ├── applicant_projects.html │ │ │ │ └── applicant_submissions.html │ │ │ │ ├── partner_dashboard.html │ │ │ │ ├── reviewer_dashboard.html │ │ │ │ └── staff_dashboard.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── dashboard_statusbar_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ └── test_views.py │ │ ├── urls.py │ │ ├── views.py │ │ ├── views_partials.py │ │ └── wagtail_hooks.py │ ├── determinations │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── admin_views.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── forms.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_add_fields.py │ │ │ ├── 0003_message_template_settings.py │ │ │ ├── 0004_change_labels.py │ │ │ ├── 0005_determination_drupal_id.py │ │ │ ├── 0006_allow_multiple_determinations.py │ │ │ ├── 0007_add_determinationformsettings.py │ │ │ ├── 0008_rename_more_info.py │ │ │ ├── 0009_add_send_notice_field.py │ │ │ ├── 0010_add_determination_stream_field_forms.py │ │ │ ├── 0011_auto_20220111_1314.py │ │ │ ├── 0012_auto_20220509_1136.py │ │ │ ├── 0013_auto_20220722_0844.py │ │ │ ├── 0014_alter_determination_formfield_send_notice.py │ │ │ ├── 0015_alter_determinationformsettings_options.py │ │ │ ├── 0016_rename_section_text_field.py │ │ │ ├── 0017_remove_drupal_id_field.py │ │ │ ├── 0018_help_text_rich_text.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── options.py │ │ ├── permissions.py │ │ ├── templates │ │ │ └── determinations │ │ │ │ ├── base_determination_form.html │ │ │ │ ├── batch_determination_form.html │ │ │ │ ├── determination_detail.html │ │ │ │ ├── determination_form.html │ │ │ │ └── includes │ │ │ │ ├── applicant_determination_block.html │ │ │ │ ├── determination_block.html │ │ │ │ └── determination_button.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── determination_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories.py │ │ │ ├── test_admin_views.py │ │ │ └── test_views.py │ │ ├── urls.py │ │ ├── utils.py │ │ └── views.py │ ├── flags │ │ ├── __init__.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates │ │ │ └── flags │ │ │ │ └── flags.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── flag_tags.py │ │ ├── urls.py │ │ └── views.py │ ├── funds │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── admin_forms.py │ │ ├── admin_helpers.py │ │ ├── admin_views.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── differ.py │ │ ├── edit_handlers.py │ │ ├── files.py │ │ ├── forms.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ ├── drafts_cleanup.py │ │ │ │ ├── export_manager_cleanup.py │ │ │ │ ├── export_submissions_csv.py │ │ │ │ ├── sanitize_database.py │ │ │ │ └── send_reminders.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_fundpage_workflow.py │ │ │ ├── 0003_applicationform_category_fundpageform_option.py │ │ │ ├── 0004_categoryblock_add_required_option.py │ │ │ ├── 0005_applicationsubmission.py │ │ │ ├── 0006_update_block_definitions.py │ │ │ ├── 0007_round.py │ │ │ ├── 0008_add_date_to_round.py │ │ │ ├── 0009_update_date_fields.py │ │ │ ├── 0010_update_for_rich_text_block.py │ │ │ ├── 0011_update_encoder_add_round_to_submission.py │ │ │ ├── 0012_create_lab_models.py │ │ │ ├── 0013_allow_nullable_round_on_submission.py │ │ │ ├── 0014_add_meta_names.py │ │ │ ├── 0015_link_user_to_application.py │ │ │ ├── 0016_roundform.py │ │ │ ├── 0017_round_workflow.py │ │ │ ├── 0018_add_addressfield.py │ │ │ ├── 0019_protect_submission.py │ │ │ ├── 0020_add_workflow_and_status_to_submission.py │ │ │ ├── 0021_rename_workflow_field.py │ │ │ ├── 0022_applicationsubmission_form_fields.py │ │ │ ├── 0023_round_lead.py │ │ │ ├── 0024_applicationsubmission_search_data.py │ │ │ ├── 0025_update_with_file_blocks.py │ │ │ ├── 0026_add_leads_to_submission_and_lab.py │ │ │ ├── 0027_applicationsubmission_drupal_id.py │ │ │ ├── 0028_update_on_delete_django2.py │ │ │ ├── 0029_applicationsubmission_next.py │ │ │ ├── 0030_add_reviewers.py │ │ │ ├── 0031_labtype_reviewers.py │ │ │ ├── 0032_make_reviewers_optional_in_all_instances.py │ │ │ ├── 0033_use_django_fsm.py │ │ │ ├── 0034_create_revisions_model.py │ │ │ ├── 0035_author_timestamp_revision.py │ │ │ ├── 0036_fundreviewform_labreviewform.py │ │ │ ├── 0037_refactor_funds_models.py │ │ │ ├── 0038_recreate_objects_that_exist.py │ │ │ ├── 0039_add_rfps_and_sealed_rounds.py │ │ │ ├── 0040_add_duration_stream_to_streamfield_definition.py │ │ │ ├── 0041_roundbasereviewform.py │ │ │ ├── 0042_update_json_encoder.py │ │ │ ├── 0043_auto_20180926_0948.py │ │ │ ├── 0044_add_named_blocks.py │ │ │ ├── 0045_new_workflow.py │ │ │ ├── 0046_rename_fields.py │ │ │ ├── 0047_add_markdown.py │ │ │ ├── 0048_add_field_slack_channel.py │ │ │ ├── 0049_screening_status.py │ │ │ ├── 0050_roundsandlabs.py │ │ │ ├── 0051_applicationsubmission_partners.py │ │ │ ├── 0052_reviewerrole.py │ │ │ ├── 0053_assigned_reviewers_pre.py │ │ │ ├── 0054_move_reviewer_data.py │ │ │ ├── 0055_remove_applicationsubmission_reviewers.py │ │ │ ├── 0056_reviewers_rename.py │ │ │ ├── 0057_start_date_blank_null_roundbase.py │ │ │ ├── 0058_add_group_toggle.py │ │ │ ├── 0059_add_community_review_workflow.py │ │ │ ├── 0060_add_duration_type_in_duration_block.py │ │ │ ├── 0061_prepare_assigned_reviewers_for_data_migration.py │ │ │ ├── 0062_data_migrate_type_for_assigned_reviewers.py │ │ │ ├── 0063_make_reviewer_type_required.py │ │ │ ├── 0064_group_toggle_end_block.py │ │ │ ├── 0065_applicationsubmission_meta_categories.py │ │ │ ├── 0066_add_stage_to_selected_forms.py │ │ │ ├── 0067_data_migration_for_one_form_per_stage.py │ │ │ ├── 0068_add_help_link_field.py │ │ │ ├── 0068_link_funds_and_labs_to_paf.py │ │ │ ├── 0069_merge_20190905_0403.py │ │ │ ├── 0070_rename_meta_categories_to_meta_terms.py │ │ │ ├── 0071_update_field_reviewer.py │ │ │ ├── 0072_add_guide_link_field.py │ │ │ ├── 0073_reminder.py │ │ │ ├── 0074_add_word_limit_to_text_blocks.py │ │ │ ├── 0075_auto_20200629_1707.py │ │ │ ├── 0076_multi_input_char_block.py │ │ │ ├── 0077_add_determination_stream_field_forms.py │ │ │ ├── 0078_add_heading_block_to_form_fields_block.py │ │ │ ├── 0079_add_reviewer_settings_for_submission_access.py │ │ │ ├── 0080_add_yes_and_default_fields_to_screening_status.py │ │ │ ├── 0081_add_screening_statuses_field.py │ │ │ ├── 0082_migrate_screening_status_to_screening_statuses.py │ │ │ ├── 0083_remove_screening_status_field.py │ │ │ ├── 0084_add_all_except_dismissed_outcome_reviewersettings.py │ │ │ ├── 0085_add_days_to_duration_block.py │ │ │ ├── 0086_applicationsubmission_summary.py │ │ │ ├── 0087_applicationsettings.py │ │ │ ├── 0088_auto_20210423_1257.py │ │ │ ├── 0089_remove_project_approval_form_refrences.py │ │ │ ├── 0090_auto_20220111_1314.py │ │ │ ├── 0091_category_block_label.py │ │ │ ├── 0092_auto_20220308_0827.py │ │ │ ├── 0093_set_duration_false.py │ │ │ ├── 0094_auto_20220406_0800.py │ │ │ ├── 0095_only_external_review_option.py │ │ │ ├── 0096_only_active_users.py │ │ │ ├── 0097_applicationbaseexternalreviewform_labbaseexternalreviewform_roundbaseexternalreviewform.py │ │ │ ├── 0098_alter_applicationsubmission_submit_time.py │ │ │ ├── 0099_auto_20220629_1339.py │ │ │ ├── 0100_alter_applicationbase_labbase_approval_form.py │ │ │ ├── 0101_auto_20220722_0844.py │ │ │ ├── 0102_add_projectapprovalform_to_fundbase_labbase.py │ │ │ ├── 0103_alter_screeningstatus.py │ │ │ ├── 0104_show_deadline.py │ │ │ ├── 0105_applicationbase_activity_digest_recipient_emails.py │ │ │ ├── 0106_applicationsubmission_is_archive.py │ │ │ ├── 0107_add_additional_fields_to_funds_labs.py │ │ │ ├── 0108_applicationbaseprojectsowform_labbaseprojectsowform.py │ │ │ ├── 0109_rename_section_text_field.py │ │ │ ├── 0110_auto_20230418_0644.py │ │ │ ├── 0111_applicationsubmission_search_document_and_more.py │ │ │ ├── 0112_add_organization_name.py │ │ │ ├── 0113_alter_assignedreviewers_reviewer.py │ │ │ ├── 0114_alter_assignedreviewers_reviewer.py │ │ │ ├── 0115_list_on_front_page.py │ │ │ ├── 0117_applicationrevision_is_draft.py │ │ │ ├── 0118_labbaseprojectreportform_and_more.py │ │ │ ├── 0119_rename_applicationbaseprojectapprovalform_applicationbaseprojectform_and_more.py │ │ │ ├── 0120_applicationsubmission_public_id_and_more.py │ │ │ ├── 0121_alter_applicationbase_workflow_name_and_more.py │ │ │ ├── 0122_remove_drupal_id_field.py │ │ │ ├── 0123_help_text_rich_text.py │ │ │ ├── 0124_submissionexportmanager.py │ │ │ ├── 0125_coapplicantinvite_coapplicant.py │ │ │ ├── 0126_add_max_length.py │ │ │ ├── 0127_coapplicant_project_permission.py │ │ │ ├── 0128_alter_coapplicant_role_alter_coapplicantinvite_role.py │ │ │ ├── 0129_coapplicantinvite_project_permission.py │ │ │ └── __init__.py │ │ ├── models │ │ │ ├── __init__.py │ │ │ ├── application_revisions.py │ │ │ ├── applications.py │ │ │ ├── assigned_reviewers.py │ │ │ ├── co_applicants.py │ │ │ ├── forms.py │ │ │ ├── mixins.py │ │ │ ├── reminders.py │ │ │ ├── reviewer_role.py │ │ │ ├── screening.py │ │ │ ├── submissions.py │ │ │ └── utils.py │ │ ├── permissions.py │ │ ├── reviewers │ │ │ ├── __init__.py │ │ │ └── services.py │ │ ├── services.py │ │ ├── tables.py │ │ ├── tasks.py │ │ ├── templates │ │ │ ├── funds │ │ │ │ ├── admin │ │ │ │ │ ├── parent_chooser.html │ │ │ │ │ └── widgets │ │ │ │ │ │ └── read_only.html │ │ │ │ ├── application_base.html │ │ │ │ ├── application_preview.html │ │ │ │ ├── applicationrevision_list.html │ │ │ │ ├── applicationsubmission_admin_detail.html │ │ │ │ ├── applicationsubmission_community_detail.html │ │ │ │ ├── applicationsubmission_confirm_delete.html │ │ │ │ ├── applicationsubmission_detail.html │ │ │ │ ├── applicationsubmission_form.html │ │ │ │ ├── applicationsubmission_reviewer_detail.html │ │ │ │ ├── coapplicant_invite_landing_page.html │ │ │ │ ├── comments.html │ │ │ │ ├── includes │ │ │ │ │ ├── admin_primary_actions.html │ │ │ │ │ ├── application_header.html │ │ │ │ │ ├── co-applicant-block.html │ │ │ │ │ ├── delegated_form_base.html │ │ │ │ │ ├── generic_primary_actions.html │ │ │ │ │ ├── modal_archive_submission_confirm.html │ │ │ │ │ ├── modal_unarchive_submission_confirm.html │ │ │ │ │ ├── no_round_block_dashboard.html │ │ │ │ │ ├── reminders_block.html │ │ │ │ │ ├── rendered_answers.html │ │ │ │ │ ├── review_sidebar.html │ │ │ │ │ ├── review_sidebar_item.html │ │ │ │ │ ├── round-block-listing.html │ │ │ │ │ ├── round-block.html │ │ │ │ │ ├── screening_status_block-button.html │ │ │ │ │ ├── screening_status_block.html │ │ │ │ │ ├── status-block.html │ │ │ │ │ ├── status_bar.html │ │ │ │ │ ├── status_bar_item.html │ │ │ │ │ ├── submission-list-row.html │ │ │ │ │ ├── submission-table-row.html │ │ │ │ │ ├── table_filter_and_search.html │ │ │ │ │ ├── translate_application_form.html │ │ │ │ │ └── update_reviewer_form.html │ │ │ │ ├── lab_type.html │ │ │ │ ├── modals │ │ │ │ │ ├── create_project_form.html │ │ │ │ │ ├── create_reminder_form.html │ │ │ │ │ ├── edit_co_applicant_form.html │ │ │ │ │ ├── invite_co_applicant_form.html │ │ │ │ │ ├── progress_form.html │ │ │ │ │ ├── update_lead_form.html │ │ │ │ │ ├── update_meta_terms_form.html │ │ │ │ │ └── update_partner_form.html │ │ │ │ ├── reminder_confirm_delete.html │ │ │ │ ├── reviewer_leaderboard.html │ │ │ │ ├── reviewer_leaderboard_detail.html │ │ │ │ ├── revisions_compare.html │ │ │ │ ├── round.html │ │ │ │ ├── rounds.html │ │ │ │ ├── staff_assignments.html │ │ │ │ ├── submission-success.html │ │ │ │ ├── submission_sealed.html │ │ │ │ ├── submissions_result.html │ │ │ │ ├── tables │ │ │ │ │ ├── column_reviews.html │ │ │ │ │ └── table.html │ │ │ │ └── widgets │ │ │ │ │ └── icon_select2.html │ │ │ └── submissions │ │ │ │ ├── all.html │ │ │ │ ├── partials │ │ │ │ ├── applicationsubmission.html │ │ │ │ ├── export-submission-button.html │ │ │ │ ├── meta-terms-card.html │ │ │ │ ├── submission-lead.html │ │ │ │ ├── submission-reviews-list-multi.html │ │ │ │ ├── submission-title.html │ │ │ │ └── submissions-inline.html │ │ │ │ └── submenu │ │ │ │ ├── bulk-update-lead.html │ │ │ │ ├── bulk-update-reviewers.html │ │ │ │ ├── category.html │ │ │ │ ├── change-status.html │ │ │ │ ├── funds.html │ │ │ │ ├── leads.html │ │ │ │ ├── meta-terms.html │ │ │ │ ├── reviewers.html │ │ │ │ └── rounds.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ ├── archive_tags.py │ │ │ ├── markdown_tags.py │ │ │ ├── primaryactions_tags.py │ │ │ ├── statusbar_tags.py │ │ │ ├── submission_tags.py │ │ │ ├── table_tags.py │ │ │ ├── translate_tags.py │ │ │ └── workflow_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories │ │ │ │ ├── __init__.py │ │ │ │ ├── blocks.py │ │ │ │ └── models.py │ │ │ ├── models │ │ │ │ ├── __init__.py │ │ │ │ └── test_roundsandlabs.py │ │ │ ├── test_admin_form.py │ │ │ ├── test_admin_views.py │ │ │ ├── test_forms.py │ │ │ ├── test_models.py │ │ │ ├── test_tags.py │ │ │ ├── test_tasks.py │ │ │ ├── test_utils.py │ │ │ ├── test_views.py │ │ │ └── views │ │ │ │ ├── __init__.py │ │ │ │ ├── test_rounds.py │ │ │ │ └── test_submission_delete.py │ │ ├── urls.py │ │ ├── utils.py │ │ ├── views │ │ │ ├── __init__.py │ │ │ ├── all.py │ │ │ ├── co_applicants.py │ │ │ ├── comments.py │ │ │ ├── partials.py │ │ │ ├── reminders.py │ │ │ ├── results.py │ │ │ ├── reviewer_leaderboard.py │ │ │ ├── revisions.py │ │ │ ├── staff_assignments.py │ │ │ ├── submission_delete.py │ │ │ ├── submission_detail.py │ │ │ ├── submission_edit.py │ │ │ └── translate.py │ │ ├── wagtail_hooks.py │ │ ├── widgets.py │ │ └── workflows │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── definitions │ │ │ ├── __init__.py │ │ │ ├── double_stage.py │ │ │ ├── single_stage.py │ │ │ ├── single_stage_community.py │ │ │ ├── single_stage_external.py │ │ │ └── single_stage_same.py │ │ │ ├── models │ │ │ ├── __init__.py │ │ │ ├── phase.py │ │ │ ├── stage.py │ │ │ └── workflow.py │ │ │ ├── permissions.py │ │ │ ├── registry.py │ │ │ └── utils.py │ ├── middleware.py │ ├── projects │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── admin_forms.py │ │ ├── admin_views.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── constants.py │ │ ├── context_processors.py │ │ ├── files.py │ │ ├── filters.py │ │ ├── forms │ │ │ ├── __init__.py │ │ │ ├── payment.py │ │ │ ├── project.py │ │ │ └── utils.py │ │ ├── middleware.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_add_submission_fields_to_project.py │ │ │ ├── 0003_add_project_lead.py │ │ │ ├── 0004_project_rename_name_to_title.py │ │ │ ├── 0005_add_user_to_project.py │ │ │ ├── 0006_add_project_paf_fields.py │ │ │ ├── 0007_fix_proposed_end_date_verbose_name.py │ │ │ ├── 0008_add_value_validator.py │ │ │ ├── 0009_add_approval.py │ │ │ ├── 0009_documentcategory.py │ │ │ ├── 0010_add_related_names_to_approval_fks.py │ │ │ ├── 0011_add_packet_file.py │ │ │ ├── 0012_adjust_storage_class.py │ │ │ ├── 0013_add_contract.py │ │ │ ├── 0014_add_payment_related_models.py │ │ │ ├── 0015_add_payment_request_changes_requested.py │ │ │ ├── 0016_add_project_settings.py │ │ │ ├── 0017_add_sent_to_compliance_at.py │ │ │ ├── 0018_projectapprovalform.py │ │ │ ├── 0019_add_form_to_projects.py │ │ │ ├── 0020_rename_value_to_requested_value.py │ │ │ ├── 0021_add_paid_value.py │ │ │ ├── 0022_update_field_definitions_for_forms.py │ │ │ ├── 0023_ensure_contracts_uses_private_storage.py │ │ │ ├── 0024_allow_no_comments_on_pr.py │ │ │ ├── 0025_add_report_models.py │ │ │ ├── 0026_data_contract_approved_date.py │ │ │ ├── 0027_report_current.py │ │ │ ├── 0028_report_draft.py │ │ │ ├── 0029_report_submitted.py │ │ │ ├── 0030_report_skipped.py │ │ │ ├── 0031_add_public_private_content.py │ │ │ ├── 0032_report_notified.py │ │ │ ├── 0033_add_word_limit_to_text_blocks.py │ │ │ ├── 0034_multi_input_char_block.py │ │ │ ├── 0035_add_heading_block_to_form_fields_block.py │ │ │ ├── 0036_add_vendor.py │ │ │ ├── 0037_add_project_invoicing.py │ │ │ ├── 0038_project_translateble.py │ │ │ ├── 0039_add_deliverables.py │ │ │ ├── 0040_remove_deliverable_invoice_quantity.py │ │ │ ├── 0041_payment_requests_cleanup.py │ │ │ ├── 0042_delete_project_approval_form.py │ │ │ ├── 0043_remove_project_approval_form.py │ │ │ ├── 0044_add_resubmitted_status.py │ │ │ ├── 0045_use_fsm_field_for_status.py │ │ │ ├── 0046_add_required_checks_field.py │ │ │ ├── 0047_alter_project_form_data.py │ │ │ ├── 0048_alter_project_value.py │ │ │ ├── 0049_add_fields_for_finance_integrations.py │ │ │ ├── 0050_add_new_invoice_status.py │ │ │ ├── 0051_remove_unnecessary_fields_from_invoice.py │ │ │ ├── 0052_alter_project_form_fields.py │ │ │ ├── 0053_projectapprovalform.py │ │ │ ├── 0054_alter_project_form_fields.py │ │ │ ├── 0055_alter_project_status_add_pafreviewersrole.py │ │ │ ├── 0056_packetfile_created_at.py │ │ │ ├── 0057_alter_report_config.py │ │ │ ├── 0058_project_ready_for_final_approval.py │ │ │ ├── 0059_set_ready_for_final_approval.py │ │ │ ├── 0060_auto_20230116_0712.py │ │ │ ├── 0061_remove_checks.py │ │ │ ├── 0062_auto_20230228_1218.py │ │ │ ├── 0063_projectsettings_paf_approval_sequential.py │ │ │ ├── 0064_alter_pafapprovals_options.py │ │ │ ├── 0065_remove_project_ready_for_final_approval.py │ │ │ ├── 0066_projectsowform.py │ │ │ ├── 0067_projectsow.py │ │ │ ├── 0068_rename_section_text_field.py │ │ │ ├── 0069_contractpacketfile_contractdocumentcategory.py │ │ │ ├── 0070_auto_20230327_1109.py │ │ │ ├── 0071_add_customformfields_to_paf_and_sow.py │ │ │ ├── 0072_pafapprovals_approved_at.py │ │ │ ├── 0073_alter_project_status.py │ │ │ ├── 0074_update_projects_status_committed_to_draft.py │ │ │ ├── 0075_alter_pafapprovals_user.py │ │ │ ├── 0076_alter_projectdocument_and_contractdocument_category.py │ │ │ ├── 0077_alter_invoice_status.py │ │ │ ├── 0078_update_project_statuses.py │ │ │ ├── 0079_alter_invoice_add_fields.py │ │ │ ├── 0080_alter_invoice_status.py │ │ │ ├── 0081_alter_project_value.py │ │ │ ├── 0082_projectreportform_and_more.py │ │ │ ├── 0083_rename_projectapprovalform_projectform_and_more.py │ │ │ ├── 0084_contract_signed_and_approved.py │ │ │ ├── 0085_alter_projectsettings_paf_approval_sequential.py │ │ │ ├── 0086_invoice_invoice_date_invoice_paid_date.py │ │ │ ├── 0087_alter_pafreviewersrole_user_roles.py │ │ │ ├── 0088_remove_duediligencedocument_vendor_and_more.py │ │ │ ├── 0089_projectreminderfrequency.py │ │ │ ├── 0090_contractdocumentcategory_document_access_view.py │ │ │ ├── 0091_report_form_data_report_form_fields.py │ │ │ ├── 0092_migrate_reportversion_streamform_to_report_streamform.py │ │ │ ├── 0093_remove_reportversion_form_fields.py │ │ │ ├── 0094_remove_project_user_has_updated_pf_details.py │ │ │ ├── 0095_alter_reportconfig_disable_reporting.py │ │ │ ├── 0096_remove_invoicedeliverable_deliverable_and_more.py │ │ │ ├── 0097_help_text_rich_text.py │ │ │ ├── 0098_move_project_comments_to_application.py │ │ │ ├── 0099_remove_reportconfig_project_and_more.py │ │ │ ├── 0100_alter_project_proposed_end_and_more.py │ │ │ ├── 0101_alter_invoice_message_for_pm.py │ │ │ └── __init__.py │ │ ├── models │ │ │ ├── __init__.py │ │ │ ├── payment.py │ │ │ └── project.py │ │ ├── permissions.py │ │ ├── reports │ │ │ ├── __init__.py │ │ │ ├── apps.py │ │ │ ├── filters.py │ │ │ ├── forms.py │ │ │ ├── management │ │ │ │ ├── __init__.py │ │ │ │ └── commands │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── notify_report_due.py │ │ │ ├── migrations │ │ │ │ ├── 0001_initial.py │ │ │ │ └── __init__.py │ │ │ ├── models.py │ │ │ ├── permissions.py │ │ │ ├── tables.py │ │ │ ├── templates │ │ │ │ └── reports │ │ │ │ │ ├── includes │ │ │ │ │ ├── report_line.html │ │ │ │ │ └── reports.html │ │ │ │ │ ├── modals │ │ │ │ │ └── report_frequency_config.html │ │ │ │ │ ├── report_detail.html │ │ │ │ │ ├── report_form.html │ │ │ │ │ ├── report_list.html │ │ │ │ │ └── reporting.html │ │ │ ├── tests │ │ │ │ ├── __init__.py │ │ │ │ ├── factories.py │ │ │ │ ├── test_commands.py │ │ │ │ ├── test_models.py │ │ │ │ ├── test_pages.py │ │ │ │ ├── test_views.py │ │ │ │ └── utils.py │ │ │ ├── urls.py │ │ │ └── views.py │ │ ├── service_utils.py │ │ ├── signals.py │ │ ├── tables.py │ │ ├── templates │ │ │ └── application_projects │ │ │ │ ├── filters │ │ │ │ └── widgets │ │ │ │ │ └── date_range_input_widget.html │ │ │ │ ├── includes │ │ │ │ ├── contracting_documents.html │ │ │ │ ├── invoices.html │ │ │ │ ├── project_documents.html │ │ │ │ └── project_header.html │ │ │ │ ├── invoice_confirm_delete.html │ │ │ │ ├── invoice_detail.html │ │ │ │ ├── invoice_form.html │ │ │ │ ├── invoice_list.html │ │ │ │ ├── modals │ │ │ │ ├── approve_contract.html │ │ │ │ ├── assign_pafapprovers.html │ │ │ │ ├── batch_invoice_status_update.html │ │ │ │ ├── contracting_documents_upload.html │ │ │ │ ├── invoice_status_update.html │ │ │ │ ├── lead_update.html │ │ │ │ ├── pafstatus_update.html │ │ │ │ ├── project_dates_update.html │ │ │ │ ├── project_status_update.html │ │ │ │ ├── project_title_update.html │ │ │ │ ├── send_for_approval.html │ │ │ │ ├── submit_contracting_documents.html │ │ │ │ ├── supporting_documents_upload.html │ │ │ │ ├── update_pafapprovers.html │ │ │ │ └── upload_contract.html │ │ │ │ ├── paf_export.html │ │ │ │ ├── partials │ │ │ │ ├── contracting_category_documents.html │ │ │ │ ├── invoice_detail_actions.html │ │ │ │ ├── invoice_status.html │ │ │ │ ├── invoice_status_table.html │ │ │ │ ├── project_information.html │ │ │ │ ├── project_lead.html │ │ │ │ ├── project_title.html │ │ │ │ └── supporting_documents.html │ │ │ │ ├── pdf_invoice_approved_page.html │ │ │ │ ├── project_admin_detail.html │ │ │ │ ├── project_approval_detail.html │ │ │ │ ├── project_approval_form.html │ │ │ │ ├── project_detail.html │ │ │ │ ├── project_form.html │ │ │ │ ├── project_list.html │ │ │ │ ├── project_sow_detail.html │ │ │ │ ├── project_sow_form.html │ │ │ │ ├── sow_export.html │ │ │ │ └── tables │ │ │ │ └── table.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ ├── approval_tools.py │ │ │ ├── contract_tools.py │ │ │ ├── invoice_tools.py │ │ │ └── project_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories.py │ │ │ ├── test_files.py │ │ │ ├── test_forms.py │ │ │ ├── test_middleware.py │ │ │ ├── test_models.py │ │ │ ├── test_settings.py │ │ │ ├── test_templatetags.py │ │ │ └── test_views.py │ │ ├── urls.py │ │ ├── utils.py │ │ ├── views │ │ │ ├── __init__.py │ │ │ ├── payment.py │ │ │ ├── project.py │ │ │ └── project_partials.py │ │ └── wagtail_hooks.py │ ├── review │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── admin_helpers.py │ │ ├── admin_views.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── fields.py │ │ ├── forms.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ └── export_reviews_csv.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_add_common_fields.py │ │ │ ├── 0003_review_json_field.py │ │ │ ├── 0004_review_is_draft.py │ │ │ ├── 0005_streamform.py │ │ │ ├── 0006_remove_review_review.py │ │ │ ├── 0007_review_revision.py │ │ │ ├── 0008_update_fields_for_tweaks.py │ │ │ ├── 0009_auto_20180823_0918.py │ │ │ ├── 0010_review_drupal_id.py │ │ │ ├── 0011_add_date_fields.py │ │ │ ├── 0012_auto_20180926_0948.py │ │ │ ├── 0013_rename_fields.py │ │ │ ├── 0014_add_markdown.py │ │ │ ├── 0015_review_opinion.py │ │ │ ├── 0016_review_visibility.py │ │ │ ├── 0017_add_temp_author_field.py │ │ │ ├── 0018_migrate_author_data.py │ │ │ ├── 0019_replace_existing_author_field.py │ │ │ ├── 0020_review_score_calc_update.py │ │ │ ├── 0021_add_help_link_field.py │ │ │ ├── 0022_add_word_limit_to_text_blocks.py │ │ │ ├── 0023_add_score_without_text_block.py │ │ │ ├── 0024_auto_20220111_1314.py │ │ │ ├── 0025_auto_20220722_0844.py │ │ │ ├── 0026_remove_drupal_id_field.py │ │ │ ├── 0027_help_text_rich_text.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── options.py │ │ ├── templates │ │ │ └── review │ │ │ │ ├── includes │ │ │ │ ├── review_button.html │ │ │ │ └── review_opinions_list.html │ │ │ │ ├── render_scored_answer_field.html │ │ │ │ ├── review_confirm_delete.html │ │ │ │ ├── review_detail.html │ │ │ │ ├── review_edit_form.html │ │ │ │ ├── review_form.html │ │ │ │ ├── review_list.html │ │ │ │ └── reviewopinion_confirm_delete.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── review_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories │ │ │ │ ├── __init__.py │ │ │ │ ├── blocks.py │ │ │ │ └── models.py │ │ │ ├── test_admin.py │ │ │ ├── test_admin_views.py │ │ │ ├── test_models.py │ │ │ └── test_views.py │ │ ├── urls.py │ │ ├── views.py │ │ └── wagtail_hooks.py │ ├── search │ │ ├── __init__.py │ │ ├── filters.py │ │ ├── query_parser.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ ├── test_filters.py │ │ │ └── test_query_parser.py │ ├── stream_forms │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── fields.py │ │ ├── files.py │ │ ├── forms.py │ │ ├── migrations │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── templates │ │ │ └── stream_forms │ │ │ │ ├── heading_field.html │ │ │ │ ├── includes │ │ │ │ └── file_field.html │ │ │ │ ├── render_field.html │ │ │ │ ├── render_file_field.html │ │ │ │ ├── render_list_field.html │ │ │ │ ├── render_markdown_field.html │ │ │ │ ├── render_multi_file_field.html │ │ │ │ └── render_unsafe_field.html │ │ ├── testing │ │ │ ├── __init__.py │ │ │ └── factories.py │ │ ├── tests.py │ │ └── views.py │ ├── templates │ │ └── forms │ │ │ └── includes │ │ │ ├── field.html │ │ │ ├── form_errors.html │ │ │ └── multi_input_field.html │ ├── todo │ │ ├── __init__.py │ │ ├── apps.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_alter_task_code.py │ │ │ ├── 0003_alter_task_code.py │ │ │ ├── 0004_alter_task_code.py │ │ │ ├── 0005_alter_task_code.py │ │ │ ├── 0006_alter_task_code.py │ │ │ ├── 0007_alter_task_code.py │ │ │ ├── 0008_alter_task_code.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── options.py │ │ ├── services.py │ │ ├── templates │ │ │ └── todo │ │ │ │ ├── todolist_dropdown.html │ │ │ │ └── todolist_item.html │ │ ├── tests.py │ │ ├── urls.py │ │ ├── utils.py │ │ └── views.py │ ├── translate │ │ ├── __init__.py │ │ ├── fields.py │ │ ├── forms.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ ├── install_languages.py │ │ │ │ └── uninstall_languages.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── test_translate.py │ │ │ └── test_utils.py │ │ ├── translate.py │ │ └── utils.py │ ├── users │ │ ├── __init__.py │ │ ├── admin_views.py │ │ ├── backends.py │ │ ├── decorators.py │ │ ├── forms.py │ │ ├── identicon.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ └── accounts_cleanup.py │ │ ├── middleware.py │ │ ├── migrations │ │ │ ├── 0001_initial.py │ │ │ ├── 0002_initial_data.py │ │ │ ├── 0003_make_email_username.py │ │ │ ├── 0004_drop_first_last_names.py │ │ │ ├── 0005_user_drupal_id.py │ │ │ ├── 0006_update_the_ordering_of_users.py │ │ │ ├── 0007_user_slack.py │ │ │ ├── 0008_add_staff_permissions.py │ │ │ ├── 0009_add_partner_group.py │ │ │ ├── 0010_add_community_reviewer_group.py │ │ │ ├── 0011_add_applicant_group.py │ │ │ ├── 0012_set_applicant_group.py │ │ │ ├── 0013_add_approver_group.py │ │ │ ├── 0014_usersettings.py │ │ │ ├── 0015_login_extra_text.py │ │ │ ├── 0016_add_finance_group.py │ │ │ ├── 0017_rename_staff_admin.py │ │ │ ├── 0018_add_contracting_group.py │ │ │ ├── 0019_rename_usersettings_authsettings.py │ │ │ ├── 0020_auto_20230625_1825.py │ │ │ ├── 0021_groupdesc.py │ │ │ ├── 0021_pendingsignup.py │ │ │ ├── 0022_confirmaccesstoken.py │ │ │ ├── 0023_merge_0021_groupdesc_0022_confirmaccesstoken.py │ │ │ ├── 0024_update_is_staff.py │ │ │ ├── 0025_remove_authsettings_register_extra_text.py │ │ │ ├── 0026_delete_groupdesc.py │ │ │ ├── 0027_remove_drupal_id_field.py │ │ │ └── __init__.py │ │ ├── models.py │ │ ├── roles.py │ │ ├── services.py │ │ ├── templates │ │ │ ├── elevate │ │ │ │ └── elevate.html │ │ │ ├── two_factor │ │ │ │ ├── _base.html │ │ │ │ ├── _wizard_actions.html │ │ │ │ ├── admin │ │ │ │ │ └── disable.html │ │ │ │ ├── core │ │ │ │ │ ├── backup_tokens.html │ │ │ │ │ ├── backup_tokens_password.html │ │ │ │ │ ├── setup.html │ │ │ │ │ ├── setup_complete.html │ │ │ │ │ └── two_factor_required.html │ │ │ │ └── profile │ │ │ │ │ └── disable.html │ │ │ ├── users │ │ │ │ ├── account.html │ │ │ │ ├── activation │ │ │ │ │ ├── email.txt │ │ │ │ │ ├── email_subject.txt │ │ │ │ │ └── invalid.html │ │ │ │ ├── become.html │ │ │ │ ├── change_password.html │ │ │ │ ├── email_change │ │ │ │ │ ├── confirm_email.txt │ │ │ │ │ ├── done.html │ │ │ │ │ ├── invalid_link.html │ │ │ │ │ └── update_info_email.html │ │ │ │ ├── emails │ │ │ │ │ ├── confirm_access.md │ │ │ │ │ ├── passwordless_login_email.md │ │ │ │ │ ├── passwordless_login_no_account_found.md │ │ │ │ │ ├── passwordless_new_account_login.md │ │ │ │ │ ├── set_password.txt │ │ │ │ │ └── set_password_subject.txt │ │ │ │ ├── login.html │ │ │ │ ├── oauth.html │ │ │ │ ├── partials │ │ │ │ │ ├── confirmation_code_sent.html │ │ │ │ │ └── passwordless_login_signup_sent.html │ │ │ │ ├── password_reset │ │ │ │ │ ├── complete.html │ │ │ │ │ ├── confirm.html │ │ │ │ │ ├── done.html │ │ │ │ │ ├── email.txt │ │ │ │ │ └── form.html │ │ │ │ ├── passwordless_login_signup.html │ │ │ │ └── register-success.html │ │ │ └── wagtailusers │ │ │ │ ├── groups │ │ │ │ └── index.html │ │ │ │ └── users │ │ │ │ ├── create.html │ │ │ │ ├── edit.html │ │ │ │ ├── index.html │ │ │ │ ├── list.html │ │ │ │ └── results.html │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── users_tags.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── factories.py │ │ │ ├── test_forms.py │ │ │ ├── test_middleware.py │ │ │ ├── test_oauth_access.py │ │ │ ├── test_tokens.py │ │ │ ├── test_utils.py │ │ │ └── test_views.py │ │ ├── tokens.py │ │ ├── urls.py │ │ ├── utils.py │ │ ├── views.py │ │ └── wagtail_hooks.py │ └── utils │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── apps.py │ │ ├── blocks.py │ │ ├── fields.py │ │ ├── image.py │ │ ├── media │ │ └── fonts │ │ │ ├── Montserrat-Bold.ttf │ │ │ ├── Montserrat-BoldItalic.ttf │ │ │ ├── Montserrat-Italic.ttf │ │ │ ├── Montserrat-Regular.ttf │ │ │ ├── NotoSans-Bold.ttf │ │ │ ├── NotoSans-BoldItalic.ttf │ │ │ ├── NotoSans-Italic.ttf │ │ │ └── NotoSans-Regular.ttf │ │ ├── migrations │ │ ├── 0001_add_pdf_page_size_setting.py │ │ ├── 0002_remove_pdfpagesettings_site.py │ │ ├── 0003_alter_pdfpagesettings_download_page_size.py │ │ └── __init__.py │ │ ├── models.py │ │ ├── options.py │ │ ├── pdfs.py │ │ ├── storage.py │ │ ├── templatetags │ │ ├── __init__.py │ │ └── apply_tags.py │ │ ├── testing │ │ ├── __init__.py │ │ ├── factories.py │ │ └── tests.py │ │ ├── tests │ │ └── test_views.py │ │ └── views.py ├── celery.py ├── cookieconsent │ ├── __init__.py │ ├── apps.py │ ├── context_processors.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_remove_cookieconsentsettings_site_and_more.py │ │ ├── 0003_alter_cookieconsentsettings_options_and_more.py │ │ └── __init__.py │ ├── models.py │ ├── static │ │ └── js │ │ │ └── cookieconsent.js │ ├── templates │ │ └── includes │ │ │ └── banner.html │ └── templatetags │ │ ├── __init__.py │ │ └── cookieconsent_tags.py ├── core │ ├── __init__.py │ ├── apps.py │ ├── components.py │ ├── context_processors.py │ ├── mail.py │ ├── management │ │ ├── __init__.py │ │ └── commands │ │ │ ├── __init__.py │ │ │ ├── initialize.py │ │ │ └── wagtailsiteupdate.py │ ├── middleware │ │ ├── __init__.py │ │ ├── htmx.py │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── test_htmx_auth_redirect.py │ ├── migrations │ │ ├── 0001_wagtail_4_reference_index_dependency.py │ │ ├── 0002_auto_20240215_remove_mailhimp.py │ │ ├── 0003_initial.py │ │ ├── 0004_move_system_settings_data.py │ │ ├── 0005_alter_systemsettings_footer_content.py │ │ ├── 0006_systemsettings_home_strapline_and_more.py │ │ ├── 0007_copy_homepage_title_strapline.py │ │ ├── 0008_systemsettings_home_no_applications_msg_and_more.py │ │ └── __init__.py │ ├── models │ │ ├── __init__.py │ │ └── system_settings.py │ ├── navigation.py │ ├── templatehook.py │ ├── templates │ │ ├── components │ │ │ ├── admin_bar.html │ │ │ ├── dropdown-menu.html │ │ │ ├── modal-title.html │ │ │ └── scroll-to-top.html │ │ └── core │ │ │ ├── navigation │ │ │ └── primarynav-apply.html │ │ │ └── wagtail │ │ │ └── panels │ │ │ └── inline_panel_readonly.html │ ├── templatetags │ │ ├── __init__.py │ │ ├── hooks_tags.py │ │ ├── querystrings.py │ │ ├── tests │ │ │ └── test_query_params.py │ │ └── util_tags.py │ ├── tests │ │ └── test_utils.py │ ├── utils.py │ ├── wagtail │ │ ├── __init__.py │ │ └── admin │ │ │ ├── __init__.py │ │ │ ├── options.py │ │ │ ├── panels.py │ │ │ └── registry.py │ ├── wagtail_hooks.py │ └── widgets.py ├── home │ ├── __init__.py │ ├── apps.py │ ├── factories.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_add_apply_homepage.py │ │ └── __init__.py │ ├── models.py │ ├── templates │ │ └── home │ │ │ ├── home.html │ │ │ └── includes │ │ │ └── fund-list-item.html │ ├── views.py │ └── wagtail_hooks.py ├── images │ ├── __init__.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_customimage_file_hash.py │ │ ├── 0003_customimage_drupal_id.py │ │ ├── 0004_alter_customimage_file_hash.py │ │ ├── 0005_auto_20230214_0658.py │ │ ├── 0006_alter_rendition_file.py │ │ ├── 0007_remove_drupal_id_field.py │ │ └── __init__.py │ └── models.py ├── locale │ ├── cs │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── django.pot │ ├── en │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── es │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ └── django.po │ └── zh_Hans │ │ └── LC_MESSAGES │ │ └── django.po ├── settings │ ├── .gitignore │ ├── __init__.py │ ├── base.py │ ├── dev.py │ ├── django.py │ ├── example.py │ ├── local.py.example │ ├── production.py │ └── test.py ├── static_src │ ├── images │ │ ├── .gitkeep │ │ ├── editor-buttons.png │ │ ├── favicons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── browserconfig.xml │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ ├── mstile-150x150.png │ │ │ ├── safari-pinned-tab.svg │ │ │ └── site.webmanifest │ │ ├── logo-small.png │ │ ├── logo.png │ │ └── quote-outline.svg │ ├── javascript │ │ ├── all-submissions-table.js │ │ ├── application-form.js │ │ ├── batch-actions.js │ │ ├── behaviours │ │ │ ├── collapse.js │ │ │ └── review-score.js │ │ ├── determination-template.js │ │ ├── esm │ │ │ ├── choices.js-10-2-0.js │ │ │ ├── github-filter-input-element-0-1-1.js │ │ │ └── github-relative-time-element-4-3-0.js │ │ ├── file-uploads.js │ │ ├── form-group-toggle.js │ │ ├── multi-input-fields.js │ │ ├── past-reports-pagination.js │ │ ├── report-calculator.js │ │ ├── review-form-actions.js │ │ ├── submission-form-copy.js │ │ ├── submission-text-cleanup.js │ │ ├── tinymce-word-count.js │ │ ├── tooltips │ │ │ ├── popper.min.js │ │ │ └── tippy.min.js │ │ ├── translate-application.js │ │ └── vendor │ │ │ ├── alpine-focus.min.js │ │ │ ├── alpine.min.js │ │ │ ├── clipboard.min.js │ │ │ ├── daterangepicker.min.js │ │ │ ├── htmx-ext-multi-swap.min.js │ │ │ ├── htmx.min.js │ │ │ ├── jquery.min.js │ │ │ ├── moment.min.js │ │ │ └── nprogress-2.0.0.min.js │ ├── sass │ │ ├── abstracts │ │ │ ├── _functions.scss │ │ │ ├── _mixins.scss │ │ │ └── _variables.scss │ │ ├── base │ │ │ ├── _base.scss │ │ │ └── _typography.scss │ │ ├── components │ │ │ ├── _actions-bar.scss │ │ │ ├── _admin-bar.scss │ │ │ ├── _all-reviews-table.scss │ │ │ ├── _all-submissions-table.scss │ │ │ ├── _button.scss │ │ │ ├── _card.scss │ │ │ ├── _cookieconsent.scss │ │ │ ├── _dashboard-table.scss │ │ │ ├── _data-block.scss │ │ │ ├── _docs-block.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _editor.scss │ │ │ ├── _feed.scss │ │ │ ├── _form.scss │ │ │ ├── _heading.scss │ │ │ ├── _hypha-grid.scss │ │ │ ├── _invoice-block.scss │ │ │ ├── _list-reveal.scss │ │ │ ├── _list.scss │ │ │ ├── _modal.scss │ │ │ ├── _nav.scss │ │ │ ├── _nprogress.scss │ │ │ ├── _pagination.scss │ │ │ ├── _projects-table.scss │ │ │ ├── _responsive-table.scss │ │ │ ├── _reviews-list.scss │ │ │ ├── _reviews-sidebar.scss │ │ │ ├── _reviews-summary.scss │ │ │ ├── _revisions.scss │ │ │ ├── _rich-text.scss │ │ │ ├── _round-block.scss │ │ │ ├── _sidebar.scss │ │ │ ├── _stat-block.scss │ │ │ ├── _status-bar.scss │ │ │ ├── _status-block.scss │ │ │ ├── _submission-meta.scss │ │ │ ├── _table.scss │ │ │ ├── _tabs.scss │ │ │ ├── _traffic-light.scss │ │ │ ├── _two-factor.scss │ │ │ └── _wrapper.scss │ │ ├── custom │ │ │ └── _custom.scss │ │ ├── layout │ │ │ └── _header.scss │ │ ├── main.scss │ │ ├── print.scss │ │ ├── wagtail_global_admin.css │ │ ├── wagtail_groups_list.scss │ │ └── wagtail_users_list.scss │ └── tailwind │ │ ├── base │ │ ├── core.css │ │ ├── forms.css │ │ └── variables.css │ │ ├── components │ │ ├── choices.css │ │ ├── daterangepicker.css │ │ └── django-file-field.css │ │ └── main.css ├── storage_backends.py ├── templates │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── base-apply.html │ ├── base-pdf.html │ ├── base.html │ ├── django │ │ └── forms │ │ │ └── widgets │ │ │ ├── date.html │ │ │ ├── datetime.html │ │ │ ├── input_option.html │ │ │ ├── multiple_input.html │ │ │ ├── number.html │ │ │ └── select.html │ ├── includes │ │ ├── _modal-placeholder.html │ │ ├── _partial-main.html │ │ ├── _toast-placeholder.html │ │ ├── body_end.html │ │ ├── dialog_form_base.html │ │ ├── head_end.html │ │ ├── header-logo.html │ │ ├── hijack-bar.html │ │ ├── language-switcher.html │ │ ├── menu-notifications.html │ │ ├── org_login_button.html │ │ ├── pagination.html │ │ ├── password_login_button.html │ │ ├── passwordless_login_button.html │ │ └── user_menu.html │ ├── password_required.html │ └── wagtailadmin │ │ └── widgets │ │ ├── date_input.html │ │ └── datetime_input.html ├── templates_custom │ └── .gitkeep ├── urls.py └── wsgi.py ├── manage.py ├── mkdocs.yml ├── package-lock.json ├── package.json ├── public ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── logo.png ├── mstile-150x150.png ├── robots.txt ├── safari-pinned-tab.svg ├── sandbox_db.dump └── site.webmanifest ├── pyproject.toml ├── requirements.txt ├── requirements ├── dev.txt ├── docs.txt ├── prod.txt ├── translate-cpu.txt └── translate.txt └── uv.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs. 2 | # See: http://editorconfig.org 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 4 9 | indent_style = space 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | 13 | [*.{yml,yaml,js,json,css,scss}] 14 | indent_size = 2 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false 18 | 19 | [Makefile] 20 | indent_style = tab 21 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | #github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | #patreon: # Replace with a single Patreon username 5 | open_collective: hypha 6 | #ko_fi: # Replace with a single Ko-fi username 7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: hypha 10 | issuehunt: OpenTechFund/hypha 11 | #otechie: # Replace with a single Otechie username 12 | #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/discussion-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Discussion request 3 | about: Suggest a topic for to discuss. This is often for something big we don't know 4 | yet what specific features to create. 5 | title: '' 6 | labels: 7 | - 'Type: Discussion' 8 | - 'discussion' 9 | assignees: '' 10 | 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | # branches to consider in the event; optional, defaults to all 6 | branches: 7 | - main 8 | # pull_request event is required only for autolabeler 9 | pull_request: 10 | # Only following types are handled by the action, but one can default to all as well 11 | types: [opened, reopened, synchronize] 12 | 13 | workflow_dispatch: 14 | 15 | jobs: 16 | update_release_draft: 17 | runs-on: ubuntu-latest 18 | steps: 19 | # Drafts your next Release notes as Pull Requests are merged into "main" 20 | - uses: release-drafter/release-drafter@v6 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v24.1.0 2 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.12.9 2 | -------------------------------------------------------------------------------- /.stylelintrc.yaml: -------------------------------------------------------------------------------- 1 | extends: 2 | - stylelint-config-standard-scss 3 | rules: 4 | declaration-block-no-redundant-longhand-properties: null 5 | declaration-empty-line-before: null 6 | no-descending-specificity: null 7 | selector-class-pattern: 8 | - "^[a-z0-9\\-]+$" 9 | - message: Selector should be written in lowercase with hyphens (selector-class-pattern) 10 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["njpwerner.autodocstring"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python: Django", 9 | "type": "python", 10 | "request": "launch", 11 | "program": "${workspaceFolder}/manage.py", 12 | "args": ["runserver", "0.0.0.0:9001"], 13 | "django": true 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "makefile.extensionOutputFolder": "./.vscode", 3 | "cSpell.words": [ 4 | "Anymail", 5 | "cookieconsent", 6 | "coreutils", 7 | "modelcluster", 8 | "pagedown", 9 | "pytestmark", 10 | "ratelimit", 11 | "SIGNUP", 12 | "svgwrite", 13 | "WAGTAILADMIN", 14 | "wagtailcore" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Hypha 2 | 3 | First off, thanks for taking the time to contribute! Hypha is improved by a small community of developers, designers and users. We welcome your contributions. 4 | 5 | There are [many ways to contribute](https://docs.hypha.app/getting-started/contributing/code-contributions/) to Hypha - code, design, documentation and translation. 6 | 7 | Before you start working however, please [read our guide which covers all the ways you can contribute](https://docs.hypha.app/getting-started/contributing/code-contributions/). 8 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | release: python manage.py migrate --noinput && python manage.py clear_cache --cache=default && python manage.py sync_roles 2 | web: gunicorn hypha.wsgi:application --log-file - 3 | worker: celery --app=hypha.celery worker --autoscale=6,2 --events 4 | -------------------------------------------------------------------------------- /conftest.py: -------------------------------------------------------------------------------- 1 | # This file is used to setup the django environment for pytest 2 | import pytest 3 | from django.core.management import call_command 4 | 5 | 6 | @pytest.fixture(scope="session") 7 | def django_db_setup(django_db_setup, django_db_blocker): 8 | """Create initial groups before running tests.""" 9 | with django_db_blocker.unblock(): 10 | call_command("sync_roles") 11 | -------------------------------------------------------------------------------- /docker/Dockerfile.dockerignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .git 3 | .github 4 | .ruff_cache 5 | .venv 6 | .vscode 7 | docs_build 8 | hypha/static_compiled 9 | media 10 | node_modules 11 | -------------------------------------------------------------------------------- /docker/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | # Run needed python commands. 5 | python manage.py createcachetable 6 | python manage.py migrate --noinput 7 | python manage.py clear_cache --cache=default 8 | python manage.py sync_roles 9 | python manage.py wagtailsiteupdate hypha.test 9001 10 | 11 | # Start dev server. 12 | npm run watch & 13 | python manage.py runserver_plus 0.0.0.0:9001 14 | 15 | exec "$@" 16 | -------------------------------------------------------------------------------- /docker/prod/Dockerfile.dockerignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .git 3 | .github 4 | .ruff_cache 5 | .venv 6 | .vscode 7 | docs 8 | docs_build 9 | hypha/static_compiled 10 | media 11 | node_modules 12 | -------------------------------------------------------------------------------- /docker/prod/README.md: -------------------------------------------------------------------------------- 1 | # Docker for production 2 | 3 | This is not a complete solution, but a starting point. A Dockerfile that build the Hypha app with all dependencies are provided. 4 | 5 | Anyone using this will need to add a Postgres container and a Nginx (or equivalent) container. 6 | 7 | 8 | Please play around with it and suggest improvements at . 9 | 10 | -------------------------------------------------------------------------------- /docker/prod/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Run needed python commands. 4 | python manage.py createcachetable 5 | python manage.py migrate --noinput 6 | python manage.py clear_cache --cache=default 7 | python manage.py sync_roles 8 | 9 | # Start gunicorn server. 10 | gunicorn hypha.wsgi:application --env DJANGO_SETTINGS_MODULE=hypha.settings.production --threads 3 --reload --bind 0.0.0.0:9001 11 | 12 | exec "$@" 13 | -------------------------------------------------------------------------------- /docs/assets/extra.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --md-primary-fg-color: #1269a1; 3 | } 4 | 5 | [dir="ltr"] .md-header__title { 6 | margin-left: 0.2rem; 7 | } 8 | -------------------------------------------------------------------------------- /docs/assets/how-to-login-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/how-to-login-nav.png -------------------------------------------------------------------------------- /docs/assets/how-to-login-w-pass-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/how-to-login-w-pass-btn.png -------------------------------------------------------------------------------- /docs/assets/how-to-login-w-pass-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/how-to-login-w-pass-prompt.png -------------------------------------------------------------------------------- /docs/assets/how-to-login-wo-pw-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/how-to-login-wo-pw-page.png -------------------------------------------------------------------------------- /docs/assets/hypha-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/hypha-logo.png -------------------------------------------------------------------------------- /docs/assets/manage_user-add-user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/manage_user-add-user.jpg -------------------------------------------------------------------------------- /docs/assets/manage_user-apply-filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/manage_user-apply-filter.jpg -------------------------------------------------------------------------------- /docs/assets/manage_user-nav.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/manage_user-nav.jpg -------------------------------------------------------------------------------- /docs/assets/manage_user-update-group.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/manage_user-update-group.jpg -------------------------------------------------------------------------------- /docs/assets/partner_dashboard_assign_submission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/partner_dashboard_assign_submission.png -------------------------------------------------------------------------------- /docs/assets/setup_form-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_form-1.png -------------------------------------------------------------------------------- /docs/assets/setup_form-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_form-2.png -------------------------------------------------------------------------------- /docs/assets/setup_form-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_form-3.png -------------------------------------------------------------------------------- /docs/assets/setup_form-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_form-4.png -------------------------------------------------------------------------------- /docs/assets/setup_round-enter-lead-name.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_round-enter-lead-name.jpeg -------------------------------------------------------------------------------- /docs/assets/setup_round-publish-options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_round-publish-options.png -------------------------------------------------------------------------------- /docs/assets/setup_round-select-reviewers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_round-select-reviewers.png -------------------------------------------------------------------------------- /docs/assets/setup_round-select-round-from-nav.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_round-select-round-from-nav.jpg -------------------------------------------------------------------------------- /docs/assets/setup_round-select-round-from-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/setup_round-select-round-from-nav.png -------------------------------------------------------------------------------- /docs/assets/staff_applicant_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/staff_applicant_dashboard.png -------------------------------------------------------------------------------- /docs/assets/submission_how-to-assign-partner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/submission_how-to-assign-partner.png -------------------------------------------------------------------------------- /docs/assets/workflow1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/workflow1.png -------------------------------------------------------------------------------- /docs/assets/workflow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/workflow2.png -------------------------------------------------------------------------------- /docs/assets/workflow3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/workflow3.png -------------------------------------------------------------------------------- /docs/assets/workflow4.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/workflow4.1.png -------------------------------------------------------------------------------- /docs/assets/workflow4.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/docs/assets/workflow4.2.png -------------------------------------------------------------------------------- /docs/getting-started/.pages: -------------------------------------------------------------------------------- 1 | nav: 2 | - ... 3 | - SECURITY.md 4 | - LICENSE.md 5 | -------------------------------------------------------------------------------- /docs/getting-started/LICENSE.md: -------------------------------------------------------------------------------- 1 | ../../LICENSE -------------------------------------------------------------------------------- /docs/getting-started/SECURITY.md: -------------------------------------------------------------------------------- 1 | ../../SECURITY.md -------------------------------------------------------------------------------- /docs/getting-started/contributing/.pages: -------------------------------------------------------------------------------- 1 | nav: 2 | - ... 3 | - CODE OF CONDUCT: code-of-conduct.md 4 | -------------------------------------------------------------------------------- /docs/getting-started/contributing/code-of-conduct.md: -------------------------------------------------------------------------------- 1 | ../../../CODE_OF_CONDUCT.md -------------------------------------------------------------------------------- /docs/getting-started/deployment.md: -------------------------------------------------------------------------------- 1 | ## Deploying Hypha 2 | 3 | Navigating to the setup guide [production](../setup/deployment/production/stand-alone.md) or [development](../setup/deployment/development/stand-alone.md) -------------------------------------------------------------------------------- /docs/references/plugins.md: -------------------------------------------------------------------------------- 1 | Hypha implements DJP: Django Plugins. A plugin system for Django. 2 | 3 | See https://djp.readthedocs.io/ for more information. 4 | 5 | ## Some tips 6 | 7 | You can set the `DJP_PLUGINS_DIR` environment variable to point to a directory which contains *.py files implementing plugins. Good for development and when you do not want to publish the plugin on PyPI. 8 | 9 | Since DJP allow a plugin to override any setting you can tell Hypha to look for templates in a directory inside your plugin. This allows the plugin to override any template in Hypha. 10 | -------------------------------------------------------------------------------- /docs/setup/administrators/overriding-templates.md: -------------------------------------------------------------------------------- 1 | ## Templates 2 | 3 | You can override any Hypha template by adding a copy inside the `templates_custom` directory. 4 | 5 | As an example lets override the `hypha/apply/dashboard/templates/dashboard/applicant_dashboard.html` template. 6 | 7 | Place a copy of the template in `hypha/templates_custom/dashboard/applicant_dashboard.html`. Make any needed changes to the template and it will be used instead of the original template. 8 | -------------------------------------------------------------------------------- /docs/setup/deployment/index.md: -------------------------------------------------------------------------------- 1 | # Deployment 2 | 3 | !!! info 4 | The domain settings between the development & production deployment tutorial differ: **Production** assumes Hypha will be running on a subdomain (ie. `apply.server.domain`). **Development** assumes Hypha will be running locally using `hypha.test`. 5 | 6 | These settings can be configured, just ensure they are consistent throughout. -------------------------------------------------------------------------------- /docs/setup/deployment/production/docker.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | 3 | We do not have a production ready Docker setup for Hypha. If you are using Hypha with docker in production and would like help, please reach out to us. 4 | -------------------------------------------------------------------------------- /dslr.toml: -------------------------------------------------------------------------------- 1 | url = 'postgres:///hypha' 2 | -------------------------------------------------------------------------------- /hypha/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hypha/__init__.py: -------------------------------------------------------------------------------- 1 | from .celery import app as celery_app 2 | 3 | __all__ = ("celery_app",) 4 | -------------------------------------------------------------------------------- /hypha/addressfield/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/addressfield/__init__.py -------------------------------------------------------------------------------- /hypha/addressfield/models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/addressfield/models.py -------------------------------------------------------------------------------- /hypha/addressfield/templates/addressfield/widgets/nested_with_label.html: -------------------------------------------------------------------------------- 1 |
{% spaceless %} 2 | {% for widget in widget.subwidgets %} 3 | {% if not widget.subwidgets %} 4 |
5 | 6 | {% endif %} 7 | 8 | {% include widget.template_name %} 9 | 10 | {% if not widget.subwidgets %} 11 |
12 | {% endif %} 13 | {% endfor %} 14 | {% endspaceless %}
15 | -------------------------------------------------------------------------------- /hypha/apply/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/adapters/__init__.py: -------------------------------------------------------------------------------- 1 | from .activity_feed import ActivityAdapter 2 | from .base import AdapterBase 3 | from .emails import EmailAdapter 4 | from .slack import SlackAdapter 5 | 6 | __all__ = [ 7 | "AdapterBase", 8 | "ActivityAdapter", 9 | "EmailAdapter", 10 | "SlackAdapter", 11 | ] 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ActivityConfig(AppConfig): 5 | name = "hypha.apply.activity" 6 | 7 | def ready(self): 8 | from . import signals # NOQA 9 | -------------------------------------------------------------------------------- /hypha/apply/activity/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0004_update_on_delete_django2.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-03-13 12:12 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("activity", "0003_activity_visibility"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name="activity", 16 | name="user", 17 | field=models.ForeignKey( 18 | on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0007_message_status.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-07-30 14:09 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0006_message"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="message", 14 | name="status", 15 | field=models.TextField(default=""), 16 | preserve_default=False, 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0008_message_external_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-08-01 09:01 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0007_message_status"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="message", 14 | name="external_id", 15 | field=models.CharField(blank=True, max_length=75, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0030_remove_old_relation.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-07-10 17:33 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0029_migrate_old_submission_relation"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="activity", 14 | name="submission", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0033_remove_old_submission_fk_event.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-07-10 22:40 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0032_migrate_submission_to_generic_event"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="event", 14 | name="submission", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0040_merge_activity_update_and_generic_relations.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-13 18:04 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0028_migrate_messages_with_visibility"), 9 | ("activity", "0039_add_remove_document"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0049_auto_20191112_1227.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-11-12 12:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("activity", "0048_add_project_transition"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="activity", 14 | name="source_object_id", 15 | field=models.PositiveIntegerField(blank=True, db_index=True, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/0062_remove_payment_requests_activities.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-11-02 10:48 2 | 3 | from django.db import migrations 4 | 5 | 6 | def remove_payment_request_activities(apps, schema_editor): 7 | Activity = apps.get_model("activity", "Activity") 8 | Activity.objects.filter(related_content_type__model="paymentrequest").delete() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | dependencies = [ 13 | ("activity", "0061_payment_requests_cleanup"), 14 | ] 15 | 16 | operations = [ 17 | migrations.RunPython(remove_payment_request_activities), 18 | ] 19 | -------------------------------------------------------------------------------- /hypha/apply/activity/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/signals.py: -------------------------------------------------------------------------------- 1 | from anymail.signals import tracking 2 | from django.dispatch import receiver 3 | 4 | from .models import Message 5 | 6 | 7 | @receiver(tracking) 8 | def handle_event(sender, event, esp_name, **kwargs): 9 | status = "Webhook received: {} [{}]".format(event.event_type, event.timestamp) 10 | if event.description: 11 | status += " " + event.description 12 | Message.objects.get(external_id=event.message_id).update_status(status) 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/activity/include/action_list.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | {% for action in actions %} 4 | {% include "activity/ui/activity-action-item.html" with activity=action %} 5 | {% empty %} 6 | {% trans "There are no actions." %} 7 | {% endfor %} 8 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/assign_paf_approvers.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% trans "Project documents are ready to be assigned for approval." %} 8 | 9 | {% trans "Title" %}: {{ source.title_text_display }} 10 | {% trans "Link" %}: {{ request.scheme }}://{{ request.get_host }}{% url 'apply:projects:approval' pk=source.submission.pk %} 11 | 12 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 13 | {% endblock %}{# fmt:on #} 14 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/base.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% block salutation %}{% blocktrans %}Dear {{ user }},{% endblocktrans %}{% endblock %} 3 | 4 | {% block content %}{% endblock %} 5 | 6 | {% block more_info %}{% endblock %} 7 | 8 | {# fmt:off #}{% blocktrans %}Kind Regards, 9 | The {{ org_short_name }} Team{% endblocktrans %} 10 | 11 | -- 12 | {{ org_long_name }} 13 | {% if ORG_URL %}{{ ORG_URL }}{% endif %} 14 | {% block post_signature_content %}{% endblock %}{# fmt:on #} 15 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/batch_ready_to_review.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% trans "Dear Reviewer," %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% trans "New applications have been added to your review list." %} 8 | {% for submission in sources %} 9 | {% trans "Title" %}: {{ submission.title_text_display }} 10 | {% trans "Link" %}: {{ request.scheme }}://{{ request.get_host }}{{ submission.get_absolute_url }} 11 | {% endfor %} 12 | 13 | {% endblock %}{# fmt:on #} 14 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/determination.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | {% load nh3_tags i18n %} 3 | 4 | {% block content %}{# fmt:off #} 5 | {% trans "Your application has been reviewed and the outcome is" %}: {{ determination.clean_outcome }} 6 | 7 | {{ determination.message|nh3|striptags }} 8 | 9 | {% trans "Read the full determination here" %}: {{ request.scheme }}://{{ request.get_host }}{{ determination.get_absolute_url }} 10 | {% endblock %}{# fmt:on #} 11 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/invoice_approved.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display %}An invoice on project "{{title}}" is waiting for your approval.{% endblocktrans %} 7 | 8 | {% trans "View the invoice here" %}: {{ request.scheme }}://{{ request.get_host }}{{ invoice.get_absolute_url }} 9 | 10 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 11 | {% endblock %}{# fmt:on #} 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/invoice_created.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display %}A new invoice has been submitted for project "{{title}}".{% endblocktrans %} 7 | 8 | {% trans "View the invoice here" %}: {{ request.scheme }}://{{ request.get_host }}{{ related.get_absolute_url }} 9 | 10 | {% endblock %}{# fmt:on #} 11 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/invoice_updated.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n invoice_tools %} 4 | {% block content %}{# fmt:off #} 5 | 6 | {% blocktrans with title=source.title_text_display %}An {{ ORG_SHORT_NAME }} staff member has updated an invoice on your project "{{ title }}".{% endblocktrans %} 7 | 8 | {% trans "View the invoice here:" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 9 | {% endblock %}{# fmt:on #} 10 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/paf_for_approval.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% blocktrans with title=source.title_text_display %}The {{ title }} project is awaiting your review.{% endblocktrans %} 8 | 9 | {% trans "View the project here" %}: {{ request.scheme }}://{{ request.get_host }}{% url 'apply:projects:approval' pk=source.submission.pk %} 10 | 11 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 12 | {% endblock %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/partners_update_applicant.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | {% block content %}{# fmt:off #} 5 | {% trans "New partner(s) has been added to your submission." %} 6 | {% for partner in added %} 7 | * {{ partner }} 8 | {% endfor %} 9 | {% trans "Title" %}: {{ source.title_text_display }} 10 | {% trans "Link" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 11 | {% endblock %}{# fmt:on #} 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/partners_update_partner.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% trans "Dear" %} {{ recipient }},{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% trans "You have been added as a partner the following submission." %} 8 | 9 | {% trans "Title" %}: {{ source.title_text_display }} 10 | {% trans "Link" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 11 | {% endblock %}{# fmt:on #} 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/project_created.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n activity_tags %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display %}A project, "{{ title }}" has been created for your submission to the {{ ORG_LONG_NAME }}.{% endblocktrans %} 7 | {% get_project_creation_message source as message %} 8 | {% if message %} 9 | 10 | {{ message }} 11 | 12 | {% endif %} 13 | 14 | {% endblock %}{# fmt:on #} 15 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/project_final_approval.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% blocktrans with title=source.title_text_display %}The project "{{title}}" is awaiting final approval.{% blocktrans %} 8 | 9 | {% trans "Approve the project here" %}: {{ request.scheme }}://{{ request.get_host }}{% url 'apply:projects:approval' pk=source.submission.pk %} 10 | 11 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 12 | {% endblock %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/ready_for_contracting.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% blocktrans with title=source.title_text_display%}The project "{{ title }}" is waiting for contract.{% endblocktrans %} 8 | 9 | {% trans "View the project here" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 10 | 11 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 12 | {% endblock %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/ready_for_invoicing.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display %}The contract for your project "{{ title }}" has approved. Now, your project is ready for invoicing.{% endblocktrans %} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/ready_to_review.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% trans "Dear Reviewer," %}{% endblock %} 5 | {% block content %}{# fmt:off #} 6 | {% trans "This application is awaiting your review." %} 7 | 8 | {% trans "Title" %}: {{ source.title_text_display }} 9 | {% if related.title %}{% trans "Reminder Title" %}: {{ related.title }}{% endif %} 10 | {% if related.description %}{% trans "Reminder Description" %}: {{ related.description }}{% endif %} 11 | {% trans "Link" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 12 | {% endblock %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/report_frequency.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display %}An {{ ORG_SHORT_NAME }} staff member has changed the reporting frequency of your project "{{ title }}".{% endblocktrans %} 7 | 8 | {% trans "The new schedule is" %}: {{ config.get_frequency_display }} 9 | 10 | {% trans "The next report is due" %}: {{ config.current_due_report.end_date }} 11 | {% endblock %}{# fmt:on #} 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/report_notify.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title end_date=report.end_date %}A report is due for your project "{{ title }}" on {{ end_date }}.{% endblocktrans %} 7 | 8 | {% endblock %}{# fmt:on #} 9 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/report_skipped.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans %}An {{ ORG_SHORT_NAME }} staff member has marked a report as {% endblocktrans %}{% if report.skipped %}{% trans "no longer required" %}{% else %}{% trans "required" %}{% endif %}{% blocktrans with title=source.title_text_display start_date=report.start_date end_date=report.end_date %} for "{{ title }}" for period {{ start_date }} to {{ end_date }}.{% endblocktrans %} 7 | 8 | {% if not report.skipped %} 9 | {% trans "This report was previously not required. Please ensure you now complete the report." %} 10 | {% endif %} 11 | {% endblock %}{# fmt:on #} 12 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/report_submitted.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with title=source.title_text_display start_date=report.start_date end_date=report.end_date %}An {{ ORG_SHORT_NAME }} staff member has submitted a report for your project "{{ title }}" for period {{ start_date }} to {{ end_date }}.{% endblocktrans %} 7 | 8 | {% trans "You can review the report here" %}: {{ request.scheme }}://{{ request.get_host }}{{ report.get_absolute_url }} 9 | {% endblock %}{# fmt:on #} 10 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/sent_to_compliance.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | {% block salutation %}{% endblock %} 5 | 6 | {% block content %}{# fmt:off #} 7 | {% blocktrans with title=source.title_text_display %}The project "{{ title }}" is awaiting your review.{% endblocktrans %} 8 | 9 | {% trans "View the project here" %}: {{ request.scheme }}://{{ request.get_host }}{% url 'apply:projects:approval' pk=source.submission.pk %} 10 | 11 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 12 | {% endblock %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/submission_edit.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% trans "Your submission has been edited by a member of staff." %} 7 | {% endblock %}{# fmt:on #} 8 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/submit_contract_documents.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block salutation %}{% endblock %} 6 | 7 | {% block content %}{# fmt:off #} 8 | {% blocktrans with title=source.title_text_display %}The contract for project "{{ title }}" is awaiting your review.{% endblocktrans %} 9 | 10 | {% trans "View the project here" %}: {{ request.scheme }}://{{ request.get_host }}{{ source.get_absolute_url }} 11 | 12 | {% blocktrans with lead=source.lead email=source.lead.email %}Please contact {{ lead }} - {{ email }} if you have any questions.{% endblocktrans %} 13 | {% endblock %}{# fmt:on #} 14 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/email/transition.html: -------------------------------------------------------------------------------- 1 | {% extends "messages/email/applicant_base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block content %}{# fmt:off #} 6 | {% blocktrans with old_status=old_phase.public_name new_status=source.phase.public_name %}Your application is now in "{{ new_status }}" status (progressed from "{{ old_status }}").{% endblocktrans %} 7 | 8 | {% trans "Please submit any questions related to your application here" %}: {{ request.scheme }}://{{ request.get_host }}{% url 'funds:submissions:comments' pk=source.pk %} 9 | {% endblock %}{# fmt:on #} 10 | -------------------------------------------------------------------------------- /hypha/apply/activity/templates/messages/slack_message.html: -------------------------------------------------------------------------------- 1 | {% extends django_slack %} 2 | 3 | 4 | {% block text %} 5 | {{ message|safe }} 6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /hypha/apply/activity/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/activity/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/activity/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import include, path 2 | 3 | from .views import AttachmentView, NotificationsView, edit_comment, partial_comments 4 | 5 | app_name = "activity" 6 | 7 | 8 | urlpatterns = [ 9 | path("anymail/", include("anymail.urls")), 10 | path("notifications/", NotificationsView.as_view(), name="notifications"), 11 | path("comments//", partial_comments, name="partial-comments"), 12 | path("/edit-comment/", edit_comment, name="edit-comment"), 13 | path( 14 | "activities/attachment//download/", 15 | AttachmentView.as_view(), 16 | name="attachment", 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /hypha/apply/categories/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/categories/__init__.py -------------------------------------------------------------------------------- /hypha/apply/categories/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CategoriesConfig(AppConfig): 5 | name = "hypha.apply.categories" 6 | -------------------------------------------------------------------------------- /hypha/apply/categories/migrations/0004_rename_meta_categories_to_meta_terms.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-07-30 07:53 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("categories", "0003_rename_meta_categories_to_meta_terms"), 9 | ("funds", "0070_rename_meta_categories_to_meta_terms"), 10 | ] 11 | 12 | operations = [ 13 | migrations.DeleteModel( 14 | name="MetaCategory", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/categories/migrations/0005_alter_is_archived_field_on_terms.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-09-27 17:22 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("categories", "0004_rename_meta_categories_to_meta_terms"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="metaterm", 14 | name="is_archived", 15 | field=models.BooleanField( 16 | default=False, 17 | help_text="Archived terms can be viewed but not set on content.", 18 | verbose_name="Archived", 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /hypha/apply/categories/migrations/0006_use_category_options_as_submission_filter.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.16 on 2021-02-05 10:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("categories", "0005_alter_is_archived_field_on_terms"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="category", 14 | name="filter_on_dashboard", 15 | field=models.BooleanField( 16 | default=False, help_text="Make available to filter on dashboard" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/categories/migrations/0007_rename_meta_terms_to_tags.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.18 on 2025-01-31 07:38 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("categories", "0006_use_category_options_as_submission_filter"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterModelOptions( 13 | name="metaterm", 14 | options={"verbose_name": "Tag", "verbose_name_plural": "Tags"}, 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/categories/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/categories/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/categories/templates/categories/admin/includes/meta_term_list_header.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% if is_root %} 3 | {{ name }} 4 | {% else %} 5 | 6 | 7 | 8 | {% if is_archived %} 9 | {{ name }} ({% trans "archived" %}) 10 | {% else %} 11 | {{ name }} 12 | {% endif %} 13 | 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /hypha/apply/categories/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/categories/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/categories/tests/factories.py: -------------------------------------------------------------------------------- 1 | import factory 2 | 3 | from ..models import Category, Option 4 | 5 | 6 | class CategoryFactory(factory.django.DjangoModelFactory): 7 | class Meta: 8 | model = Category 9 | 10 | name = factory.Faker("word") 11 | help_text = factory.Faker("sentence") 12 | 13 | 14 | class OptionFactory(factory.django.DjangoModelFactory): 15 | class Meta: 16 | model = Option 17 | 18 | value = factory.Faker("word") 19 | category = factory.SubFactory(CategoryFactory) 20 | -------------------------------------------------------------------------------- /hypha/apply/categories/views.py: -------------------------------------------------------------------------------- 1 | # from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /hypha/apply/dashboard/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/dashboard/__init__.py -------------------------------------------------------------------------------- /hypha/apply/dashboard/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DashboardConfig(AppConfig): 5 | name = "hypha.apply.dashboard" 6 | -------------------------------------------------------------------------------- /hypha/apply/dashboard/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/dashboard/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/dashboard/models.py: -------------------------------------------------------------------------------- 1 | # from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /hypha/apply/dashboard/templates/dashboard/includes/my-tasks.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
4 | {% if my_tasks.data %} 5 |

{% trans "My tasks" %}

6 | 7 |
8 | {% for task in my_tasks.data %} 9 | {% include "todo/todolist_item.html" %} 10 | {% endfor %} 11 |
12 | {% endif %} 13 |
14 | -------------------------------------------------------------------------------- /hypha/apply/dashboard/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/dashboard/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/dashboard/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/dashboard/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/dashboard/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import DashboardView 4 | from .views_partials import applicant_projects, applicant_submissions 5 | 6 | app_name = "dashboard" 7 | 8 | urlpatterns = [ 9 | path("", DashboardView.as_view(), name="dashboard"), 10 | path("applicant/submissions/", applicant_submissions, name="applicant_submissions"), 11 | path("applicant/projects/", applicant_projects, name="applicant_projects"), 12 | ] 13 | -------------------------------------------------------------------------------- /hypha/apply/dashboard/wagtail_hooks.py: -------------------------------------------------------------------------------- 1 | from django.urls import reverse 2 | from django.utils.translation import gettext as _ 3 | from wagtail import hooks 4 | from wagtail.admin.menu import MenuItem 5 | 6 | 7 | @hooks.register("register_admin_menu_item") 8 | def register_dashboard_menu_item(): 9 | return MenuItem( 10 | _("Goto Dashboard"), 11 | reverse("dashboard:dashboard"), 12 | classname="icon icon-arrow-left", 13 | order=100000, 14 | ) 15 | -------------------------------------------------------------------------------- /hypha/apply/determinations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/determinations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/determinations/admin_views.py: -------------------------------------------------------------------------------- 1 | from wagtail_modeladmin.views import CreateView, EditView 2 | 3 | from hypha.apply.utils.blocks import show_admin_form_error_messages 4 | 5 | 6 | class CreateDeterminationFormView(CreateView): 7 | def form_invalid(self, form): 8 | show_admin_form_error_messages(self.request, form) 9 | return self.render_to_response(self.get_context_data(form=form)) 10 | 11 | 12 | class EditDeterminationFormView(EditView): 13 | def form_invalid(self, form): 14 | show_admin_form_error_messages(self.request, form) 15 | return self.render_to_response(self.get_context_data(form=form)) 16 | -------------------------------------------------------------------------------- /hypha/apply/determinations/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DeterminationsConfig(AppConfig): 5 | name = "hypha.apply.determinations" 6 | -------------------------------------------------------------------------------- /hypha/apply/determinations/migrations/0005_determination_drupal_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-08-29 17:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("determinations", "0004_change_labels"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="determination", 14 | name="drupal_id", 15 | field=models.IntegerField(blank=True, editable=False, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/determinations/migrations/0009_add_send_notice_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.10 on 2020-02-13 13:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("determinations", "0008_rename_more_info"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="determination", 14 | name="send_notice", 15 | field=models.BooleanField( 16 | default=True, verbose_name="Send message to applicant" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/determinations/migrations/0015_alter_determinationformsettings_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-11-10 17:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("determinations", "0014_alter_determination_formfield_send_notice"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterModelOptions( 13 | name="determinationformsettings", 14 | options={"verbose_name": "determination form settings"}, 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/determinations/migrations/0017_remove_drupal_id_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2025-01-14 08:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("determinations", "0016_rename_section_text_field"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="determination", 14 | name="drupal_id", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/determinations/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/determinations/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/determinations/options.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext_lazy as _ 2 | 3 | from hypha.apply.funds.workflows import DETERMINATION_OUTCOMES 4 | 5 | REJECTED = 0 6 | NEEDS_MORE_INFO = 1 7 | ACCEPTED = 2 8 | 9 | DETERMINATION_CHOICES = ( 10 | (REJECTED, _("Dismissed")), 11 | (NEEDS_MORE_INFO, _("More information requested")), 12 | (ACCEPTED, _("Approved")), 13 | ) 14 | 15 | DETERMINATION_TO_OUTCOME = { 16 | "rejected": REJECTED, 17 | "accepted": ACCEPTED, 18 | "more_info": NEEDS_MORE_INFO, 19 | } 20 | 21 | TRANSITION_DETERMINATION = { 22 | name: DETERMINATION_TO_OUTCOME[type] 23 | for name, type in DETERMINATION_OUTCOMES.items() 24 | } 25 | -------------------------------------------------------------------------------- /hypha/apply/determinations/permissions.py: -------------------------------------------------------------------------------- 1 | from hypha.apply.funds.workflows import DETERMINATION_OUTCOMES 2 | 3 | from .utils import determination_actions, transition_from_outcome 4 | 5 | 6 | def can_edit_determination(user, determination, submission): 7 | if submission.is_archive: 8 | return False 9 | outcome = transition_from_outcome(determination.outcome, submission) 10 | valid_outcomes = determination_actions(user, submission) 11 | return outcome in valid_outcomes 12 | 13 | 14 | def can_create_determination(user, submission): 15 | if submission.is_archive: 16 | return False 17 | actions = determination_actions(user, submission) 18 | return any(action in DETERMINATION_OUTCOMES for action in actions) 19 | -------------------------------------------------------------------------------- /hypha/apply/determinations/templates/determinations/determination_form.html: -------------------------------------------------------------------------------- 1 | {% extends "determinations/base_determination_form.html" %} 2 | {% load i18n %} 3 | 4 | {% adminbar %} 5 | {% slot header %} 6 | {% if object %}{% trans "Edit determination" %} {% if object.is_draft %}{% trans "draft" %}{% endif %}{% else %}{% trans "Create Determination" %}{% endif %} 7 | {% endslot %} 8 | {% slot sub_heading %}{% trans "For" %} {{ submission.title_text_display }}{% endslot %} 9 | {% endadminbar %} 10 | -------------------------------------------------------------------------------- /hypha/apply/determinations/templates/determinations/includes/determination_button.html: -------------------------------------------------------------------------------- 1 | {% load i18n determination_tags workflow_tags %} 2 | {% if request.user|show_determination_button:submission %} 3 | 7 | {% if submission.determinations.last.is_draft %} 8 | {% if draft_text %} 9 | {{ draft_text }} 10 | {% else %} 11 | {% trans "Update draft" %} 12 | {% endif %} 13 | {% else %} 14 | {% trans "Add determination" %} 15 | {% endif %} 16 | 17 | {% endif %} 18 | -------------------------------------------------------------------------------- /hypha/apply/determinations/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/determinations/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/determinations/templatetags/determination_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.db.models import ObjectDoesNotExist 3 | 4 | from ..permissions import can_create_determination, can_edit_determination 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.filter 10 | def show_determination_button(user, submission): 11 | try: 12 | return can_edit_determination( 13 | user, submission.determinations.active(), submission 14 | ) 15 | except ObjectDoesNotExist: 16 | return can_create_determination(user, submission) 17 | -------------------------------------------------------------------------------- /hypha/apply/determinations/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/determinations/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/flags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/flags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/flags/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/flags/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/flags/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/flags/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/flags/templatetags/flag_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | @register.filter 7 | def flagged_by(submission, user): 8 | return submission.flagged_by(user) 9 | 10 | 11 | @register.filter 12 | def flagged_staff(submission): 13 | return submission.flagged_staff 14 | -------------------------------------------------------------------------------- /hypha/apply/flags/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import FlagSubmissionCreateView 4 | 5 | app_name = "flags" 6 | 7 | urlpatterns = [ 8 | path( 9 | "//flag/", 10 | FlagSubmissionCreateView.as_view(), 11 | name="create_submission_flag", 12 | ), 13 | ] 14 | -------------------------------------------------------------------------------- /hypha/apply/funds/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApplyConfig(AppConfig): 5 | name = "hypha.apply.funds" 6 | -------------------------------------------------------------------------------- /hypha/apply/funds/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0002_fundpage_workflow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.7 on 2017-12-22 10:12 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("funds", "0001_initial"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="fundtype", 16 | name="workflow", 17 | field=models.CharField( 18 | choices=[("single", "Single Stage"), ("double", "Two Stage")], 19 | default="single", 20 | max_length=100, 21 | ), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0014_add_meta_names.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2018-01-25 13:08 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("funds", "0013_allow_nullable_round_on_submission"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterModelOptions( 15 | name="fundtype", 16 | options={"verbose_name": "Fund"}, 17 | ), 18 | migrations.AlterModelOptions( 19 | name="labtype", 20 | options={"verbose_name": "Lab"}, 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0017_round_workflow.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2018-02-08 07:58 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("funds", "0016_roundform"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="round", 16 | name="workflow", 17 | field=models.CharField( 18 | choices=[("single", "Single Stage"), ("double", "Two Stage")], 19 | default="single", 20 | max_length=100, 21 | ), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0024_applicationsubmission_search_data.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2018-02-16 16:29 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("funds", "0023_round_lead"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="applicationsubmission", 16 | name="search_data", 17 | field=models.TextField(default=""), 18 | preserve_default=False, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0027_applicationsubmission_drupal_id.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2018-03-08 11:02 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("funds", "0026_add_leads_to_submission_and_lab"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="applicationsubmission", 16 | name="drupal_id", 17 | field=models.IntegerField(blank=True, editable=False, null=True), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0050_roundsandlabs.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2019-01-16 16:20 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("wagtailcore", "0040_page_draft_title"), 9 | ("funds", "0049_screening_status"), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name="RoundsAndLabs", 15 | fields=[], 16 | options={ 17 | "proxy": True, 18 | "indexes": [], 19 | }, 20 | bases=("wagtailcore.page",), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0055_remove_applicationsubmission_reviewers.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.10 on 2019-02-07 16:17 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0054_move_reviewer_data"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="applicationsubmission", 14 | name="reviewers", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0056_reviewers_rename.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.10 on 2019-02-07 16:17 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0055_remove_applicationsubmission_reviewers"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RenameField( 13 | model_name="applicationsubmission", 14 | old_name="reviewers_new", 15 | new_name="reviewers", 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0057_start_date_blank_null_roundbase.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2019-03-07 13:53 2 | 3 | import datetime 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("funds", "0056_reviewers_rename"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="roundbase", 15 | name="start_date", 16 | field=models.DateField(blank=True, default=datetime.date.today, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0063_make_reviewer_type_required.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2019-02-24 20:50 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("funds", "0062_data_migrate_type_for_assigned_reviewers"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="assignedreviewers", 15 | name="type", 16 | field=models.ForeignKey( 17 | on_delete=django.db.models.deletion.PROTECT, to="auth.Group" 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0065_applicationsubmission_meta_categories.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-05-21 06:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("categories", "0002_metacategory"), 9 | ("funds", "0064_group_toggle_end_block"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="applicationsubmission", 15 | name="meta_categories", 16 | field=models.ManyToManyField( 17 | blank=True, related_name="submissions", to="categories.MetaCategory" 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0069_merge_20190905_0403.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-09-05 03:03 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0068_link_funds_and_labs_to_paf"), 9 | ("funds", "0068_add_help_link_field"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0075_auto_20200629_1707.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.13 on 2020-06-29 17:07 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0074_add_word_limit_to_text_blocks"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="applicationbase", 14 | name="slack_channel", 15 | field=models.CharField( 16 | blank=True, 17 | help_text="The slack #channel for notifications. If left empty, notifications will go to the default channel.", 18 | max_length=128, 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0081_add_screening_statuses_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.16 on 2020-11-09 05:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0080_add_yes_and_default_fields_to_screening_status"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="applicationsubmission", 14 | name="screening_statuses", 15 | field=models.ManyToManyField( 16 | blank=True, related_name="submissions", to="funds.ScreeningStatus" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0083_remove_screening_status_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.16 on 2020-11-09 05:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0082_migrate_screening_status_to_screening_statuses"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="applicationsubmission", 14 | name="screening_status", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0086_applicationsubmission_summary.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.18 on 2021-02-12 11:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0085_add_days_to_duration_block"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="applicationsubmission", 14 | name="summary", 15 | field=models.TextField(blank=True, default="", null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0088_auto_20210423_1257.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.19 on 2021-04-23 12:57 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0087_applicationsettings"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="reminder", 14 | name="description", 15 | field=models.TextField(blank=True), 16 | ), 17 | migrations.AddField( 18 | model_name="reminder", 19 | name="title", 20 | field=models.CharField(default="", max_length=60), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0089_remove_project_approval_form_refrences.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-11-22 07:37 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0088_auto_20210423_1257"), 9 | ] 10 | 11 | run_before = [ 12 | ("application_projects", "0043_remove_project_approval_form"), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name="applicationbase", 18 | name="approval_form", 19 | ), 20 | migrations.RemoveField( 21 | model_name="labbase", 22 | name="approval_form", 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0098_alter_applicationsubmission_submit_time.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.13 on 2022-05-24 13:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ( 9 | "funds", 10 | "0097_applicationbaseexternalreviewform_labbaseexternalreviewform_roundbaseexternalreviewform", 11 | ), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="applicationsubmission", 17 | name="submit_time", 18 | field=models.DateTimeField(verbose_name="submit time"), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0104_show_deadline.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-11-21 08:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0103_alter_screeningstatus"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="applicationbase", 14 | name="show_deadline", 15 | field=models.BooleanField( 16 | default=True, help_text="Should the deadline date be visible for users." 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0106_applicationsubmission_is_archive.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-11-26 11:54 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0105_applicationbase_activity_digest_recipient_emails"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="applicationsubmission", 14 | name="is_archive", 15 | field=models.BooleanField(default=False), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0117_applicationrevision_is_draft.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.10 on 2024-03-12 16:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0115_list_on_front_page"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="applicationrevision", 14 | name="is_draft", 15 | field=models.BooleanField(default=False), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0122_remove_drupal_id_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2025-01-14 08:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0121_alter_applicationbase_workflow_name_and_more"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="applicationsubmission", 14 | name="drupal_id", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0127_coapplicant_project_permission.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.20 on 2025-05-24 06:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0126_add_max_length"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="coapplicant", 14 | name="project_permission", 15 | field=models.JSONField(blank=True, default=list, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/0129_coapplicantinvite_project_permission.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.21 on 2025-06-05 07:58 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("funds", "0128_alter_coapplicant_role_alter_coapplicantinvite_role"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="coapplicantinvite", 14 | name="project_permission", 15 | field=models.JSONField(blank=True, default=list, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/reviewers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/reviewers/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/reviewers/services.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from django.db.models import Q 3 | from django.db.models.query import QuerySet 4 | 5 | from hypha.apply.users.roles import STAFF_GROUP_NAME 6 | 7 | User = get_user_model() 8 | 9 | 10 | def get_all_reviewers(*args, **kwargs) -> QuerySet: 11 | """All assigned reviewers, staff or admin.""" 12 | q_obj = ( 13 | Q(submissions_reviewer__isnull=False) 14 | | Q(groups__name=STAFF_GROUP_NAME) 15 | | Q(is_superuser=True) 16 | ) 17 | return User.objects.filter(q_obj).distinct() 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/admin/widgets/read_only.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
4 | {{ widget.value }} 5 |
6 | 7 | {% if widget.edit_link %} 8 | 13 | {% endif %} 14 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/includes/no_round_block_dashboard.html: -------------------------------------------------------------------------------- 1 | {% extends 'funds/includes/round-block-listing.html' %} 2 | {% load i18n %} 3 | 4 | {% block empty_round %} 5 |

6 | {% blocktrans with type=type|lower %}You have no {{ type }} rounds or labs assigned to you.{% endblocktrans %} 7 |

8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/includes/status-block.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 |
3 |
4 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/includes/status_bar_item.html: -------------------------------------------------------------------------------- 1 |
7 |
{{ label }}
8 |
9 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/lab_type.html: -------------------------------------------------------------------------------- 1 | {% extends "funds/application_base.html" %} 2 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/create_project_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Create project" %}{% endmodal_title %} 3 | 4 |
5 |

{% trans "Are you sure you want create a project from this submission? This cannot be undone." %}

6 |
7 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 8 |
9 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/create_reminder_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Create reminder" %}{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/progress_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n primaryactions_tags %} 2 | {% show_progress_button request.user object as show_progress_form %} 3 | 4 | {% if show_progress_form %} 5 | {% modal_title %}{% trans "Update Status" %}{% endmodal_title %} 6 | 7 |
8 |
9 |
10 |
{% trans "Current status" %}
11 |
{{ object.phase }}
12 |
13 |
14 | 15 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 16 |
17 | {% endif %} 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/update_lead_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Update Lead" %}{% endmodal_title %} 3 | 4 |
5 |
6 |
{% trans "Current Lead" %}
7 |
{{ object.lead }} <{{object.lead.email}}>
8 |
9 | 10 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 11 |
12 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/update_meta_terms_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}Update tags{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/modals/update_partner_form.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}Update partners{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/reviewer_leaderboard_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load i18n static %} 3 | {% load render_table from django_tables2 %} 4 | 5 | {% block title %}{% trans "Reviews" %}{% endblock %} 6 | 7 | {% block content %} 8 | 9 | {% adminbar %} 10 | {% slot header %}{% blocktrans %}Reviews by {{ object }}{% endblocktrans %}{% endslot %} 11 | {% slot sub_heading %}{% trans "Track and explore the reviews" %}{% endslot %} 12 | {% endadminbar %} 13 | 14 |
15 | {% block table %} 16 | {% render_table table %} 17 | {% endblock %} 18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/round.html: -------------------------------------------------------------------------------- 1 | {% extends "funds/application_base.html" %} 2 | 3 | {% block page_title %}{{ page.get_parent.title }}{% endblock %} 4 | 5 | {% block title %}{{ page.get_parent.title }}{% endblock %} 6 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/rounds.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load i18n static %} 3 | {% load render_table from django_tables2 %} 4 | 5 | {% block title %}{% trans "Rounds" %}{% endblock %} 6 | 7 | {% block content %} 8 | {% adminbar %} 9 | {% slot header %}{% trans "Rounds" %}{% endslot %} 10 | {% slot sub_heading %}{% trans "Explore current and past rounds" %}{% endslot %} 11 | {% endadminbar %} 12 | 13 |
14 | {% include "funds/includes/table_filter_and_search.html" with search_term=search_term %} 15 | {% render_table table %} 16 |
17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/staff_assignments.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load i18n static %} 3 | {% load render_table from django_tables2 %} 4 | 5 | {% block title %}{% trans "Staff assignments" %}{% endblock %} 6 | 7 | {% block content %} 8 | 9 | {% adminbar %} 10 | {% slot header %}{% trans "Staff assignments" %}{% endslot %} 11 | {% slot sub_heading %} 12 | {% trans "Track and explore the staff assignments" %} 13 | {% endslot %} 14 | {% endadminbar %} 15 | 16 |
17 | {% block table %} 18 | {% render_table table %} 19 | {% endblock %} 20 |
21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/funds/widgets/icon_select2.html: -------------------------------------------------------------------------------- 1 | {% load wagtailimages_tags %} 2 | {% if widget.attrs.icon %}
{% image widget.attrs.icon max-20x20 %}
{% endif %} 3 | {% include 'django/forms/widgets/select.html' %} 4 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/submissions/partials/applicationsubmission.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 |

{% trans "Proposal Information" %}

3 |
4 | {{ submission.output_named_blocks_answers }} 5 |
6 |
7 | {{ submission.output_answers }} 8 |
9 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/submissions/partials/submission-lead.html: -------------------------------------------------------------------------------- 1 | {% load i18n heroicons %} 2 | {% if request.user.is_apply_staff %} 3 | 8 | {% trans "Lead" %}: {{ submission.lead }} 9 | {% heroicon_micro "pencil-square" class="inline ms-1" aria_hidden=true %} 10 | 11 | {% elif request.user.is_org_faculty or not HIDE_STAFF_IDENTITY %} 12 | {% trans "Lead" %}: {{ submission.lead }} 13 | {% endif %} 14 | -------------------------------------------------------------------------------- /hypha/apply/funds/templates/submissions/partials/submission-title.html: -------------------------------------------------------------------------------- 1 |

{{ object.title }} #{{ object.application_id }}

2 | -------------------------------------------------------------------------------- /hypha/apply/funds/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/templatetags/markdown_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from hypha.core.utils import markdown_to_html 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.filter 9 | def markdown(value): 10 | return markdown_to_html(value) 11 | -------------------------------------------------------------------------------- /hypha/apply/funds/templatetags/translate_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.conf import settings 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter 8 | def can_translate_submission(user) -> bool: 9 | """Verify that system settings & user role allows for submission translations. 10 | 11 | Args: 12 | user: the user to check the role of. 13 | 14 | Returns: 15 | bool: true if submission can be translated, false if not. 16 | 17 | """ 18 | return bool(settings.APPLICATION_TRANSLATIONS_ENABLED and user.is_org_faculty) 19 | -------------------------------------------------------------------------------- /hypha/apply/funds/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/tests/factories/__init__.py: -------------------------------------------------------------------------------- 1 | from . import blocks, models 2 | from .blocks import * # noqa 3 | from .models import * # noqa 4 | 5 | __all__ = [] 6 | 7 | __all__.extend(blocks.__all__) 8 | __all__.extend(models.__all__) 9 | -------------------------------------------------------------------------------- /hypha/apply/funds/tests/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/tests/models/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/tests/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/tests/views/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/workflows/definitions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/workflows/definitions/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/workflows/models/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/funds/workflows/models/__init__.py -------------------------------------------------------------------------------- /hypha/apply/funds/workflows/models/stage.py: -------------------------------------------------------------------------------- 1 | class Stage: 2 | __slots__ = ("name", "has_external_review") 3 | 4 | def __init__(self, name: str, has_external_review: bool = False) -> None: 5 | self.name = name 6 | self.has_external_review = has_external_review 7 | 8 | def __str__(self) -> str: 9 | return self.name 10 | 11 | def __repr__(self) -> str: 12 | return f"" 13 | 14 | 15 | # Stage instances 16 | Request = Stage("Request") 17 | RequestSame = Stage("RequestSame", True) 18 | RequestExt = Stage("RequestExt", True) 19 | RequestCom = Stage("RequestCom", True) 20 | Concept = Stage("Concept") 21 | Proposal = Stage("Proposal", True) 22 | -------------------------------------------------------------------------------- /hypha/apply/projects/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ProjectsConfig(AppConfig): 5 | name = "hypha.apply.projects" 6 | label = "application_projects" 7 | 8 | def ready(self): 9 | import hypha.apply.projects.signals # noqa: F401 10 | -------------------------------------------------------------------------------- /hypha/apply/projects/blocks.py: -------------------------------------------------------------------------------- 1 | from hypha.apply.stream_forms.blocks import FormFieldsBlock 2 | from hypha.apply.utils.blocks import CustomFormFieldsBlock 3 | 4 | 5 | class ProjectFormCustomFormFieldsBlock(CustomFormFieldsBlock, FormFieldsBlock): 6 | """A block that can be used for customizable Project-related forms: PAF, SOW, and Report.""" 7 | 8 | pass 9 | -------------------------------------------------------------------------------- /hypha/apply/projects/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | def projects_enabled(request): 5 | return {"PROJECTS_ENABLED": settings.PROJECTS_ENABLED} 6 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0004_project_rename_name_to_title.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-07-11 03:20 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0003_add_project_lead"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RenameField( 13 | model_name="project", 14 | old_name="name", 15 | new_name="title", 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0007_fix_proposed_end_date_verbose_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-07 08:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0006_add_project_paf_fields"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="project", 14 | name="proposed_end", 15 | field=models.DateTimeField(null=True, verbose_name="Proposed End Date"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0017_add_sent_to_compliance_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-20 13:13 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0016_add_project_settings"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="project", 14 | name="sent_to_compliance_at", 15 | field=models.DateTimeField(null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0020_rename_value_to_requested_value.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-26 11:54 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0019_add_form_to_projects"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RenameField( 13 | model_name="paymentrequest", 14 | old_name="value", 15 | new_name="requested_value", 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0024_allow_no_comments_on_pr.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-09-05 08:49 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0023_ensure_contracts_uses_private_storage"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="paymentrequest", 14 | name="comment", 15 | field=models.TextField(blank=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0026_data_contract_approved_date.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-10-29 03:54 2 | 3 | from django.db import migrations 4 | from django.db.models import F 5 | 6 | 7 | def copy_submitted_date(apps, schema_editor): 8 | Contract = apps.get_model("application_projects", "Contract") 9 | Contract.objects.all().update(approved_at=F("created_at")) 10 | 11 | 12 | class Migration(migrations.Migration): 13 | dependencies = [ 14 | ("application_projects", "0025_add_report_models"), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(copy_submitted_date), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0029_report_submitted.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-10-31 09:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0028_report_draft"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="report", 14 | name="submitted", 15 | field=models.DateTimeField(null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0030_report_skipped.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-10-31 14:01 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0029_report_submitted"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="report", 14 | name="skipped", 15 | field=models.BooleanField(default=False), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0032_report_notified.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.1.11 on 2019-11-05 15:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0031_add_public_private_content"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="report", 14 | name="notified", 15 | field=models.DateTimeField(null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0038_project_translateble.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-09-08 09:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0037_add_project_invoicing"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="invoice", 14 | name="message_for_pm", 15 | field=models.TextField(blank=True, verbose_name="Message"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0040_remove_deliverable_invoice_quantity.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-09-30 12:40 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0039_add_deliverables"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="deliverable", 14 | name="invoice_quantity", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0042_delete_project_approval_form.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-11-22 07:11 2 | 3 | from django.db import migrations 4 | 5 | 6 | def migrate_label_and_relations(apps, schema_editor): 7 | ProjectApprovalForm = apps.get_model("application_projects", "ProjectApprovalForm") 8 | ProjectApprovalForm.objects.all().delete() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | dependencies = [ 13 | ("application_projects", "0041_payment_requests_cleanup"), 14 | ] 15 | 16 | operations = [ 17 | migrations.RunPython(migrate_label_and_relations, migrations.RunPython.noop) 18 | ] 19 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0043_remove_project_approval_form.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-11-22 07:40 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0042_delete_project_approval_form"), 9 | ] 10 | 11 | operations = [ 12 | migrations.DeleteModel( 13 | name="ProjectApprovalForm", 14 | ), 15 | ] 16 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0047_alter_project_form_data.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.12 on 2022-02-21 12:36 2 | 3 | from django.db import migrations, models 4 | import hypha.apply.stream_forms.files 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("application_projects", "0046_add_required_checks_field"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="project", 15 | name="form_data", 16 | field=models.JSONField( 17 | default=dict, 18 | encoder=hypha.apply.stream_forms.files.StreamFieldDataEncoder, 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0048_alter_project_value.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.12 on 2022-03-14 13:11 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0047_alter_project_form_data"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="project", 14 | name="value", 15 | field=models.PositiveIntegerField(default=0), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0051_remove_unnecessary_fields_from_invoice.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.12 on 2022-04-12 05:32 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0050_add_new_invoice_status"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="invoice", 14 | name="amount", 15 | ), 16 | migrations.RemoveField( 17 | model_name="invoice", 18 | name="date_from", 19 | ), 20 | migrations.RemoveField( 21 | model_name="invoice", 22 | name="date_to", 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0056_packetfile_created_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-10-13 10:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0055_alter_project_status_add_pafreviewersrole"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="packetfile", 14 | name="created_at", 15 | field=models.DateField(auto_now_add=True, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0058_project_ready_for_final_approval.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-01-10 07:05 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0057_alter_report_config"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="project", 14 | name="ready_for_final_approval", 15 | field=models.BooleanField(blank=True, default=False), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0061_remove_checks.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.17 on 2023-02-14 14:43 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0060_auto_20230116_0712"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="invoice", 14 | name="valid_checks", 15 | ), 16 | migrations.RemoveField( 17 | model_name="invoice", 18 | name="valid_checks_link", 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0063_projectsettings_paf_approval_sequential.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-01 07:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0062_auto_20230228_1218"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="projectsettings", 14 | name="paf_approval_sequential", 15 | field=models.BooleanField( 16 | default=True, help_text="Uncheck it to approve PAF parallelly" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0064_alter_pafapprovals_options.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-02 04:48 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0063_projectsettings_paf_approval_sequential"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterModelOptions( 13 | name="pafapprovals", 14 | options={"ordering": ["paf_reviewer_role__sort_order"]}, 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0065_remove_project_ready_for_final_approval.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-06 04:20 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0064_alter_pafapprovals_options"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="project", 14 | name="ready_for_final_approval", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0072_pafapprovals_approved_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-04-11 05:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0071_add_customformfields_to_paf_and_sow"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="pafapprovals", 14 | name="approved_at", 15 | field=models.DateTimeField(blank=True, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0074_update_projects_status_committed_to_draft.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.17 on 2023-02-16 12:42 2 | 3 | from django.db import migrations 4 | 5 | 6 | def update_committed_project_status_to_draft(apps, schema_editor): 7 | Project = apps.get_model("application_projects", "Project") 8 | 9 | for project in Project.objects.filter(status="committed"): 10 | project.status = "draft" 11 | project.save(update_fields={"status"}) 12 | 13 | 14 | class Migration(migrations.Migration): 15 | dependencies = [ 16 | ("application_projects", "0073_alter_project_status"), 17 | ] 18 | 19 | operations = [migrations.RunPython(update_committed_project_status_to_draft)] 20 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0084_contract_signed_and_approved.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.11 on 2024-05-23 03:28 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ( 9 | "application_projects", 10 | "0083_rename_projectapprovalform_projectform_and_more", 11 | ), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="contract", 17 | name="signed_and_approved", 18 | field=models.BooleanField( 19 | default=False, verbose_name="Signed and approved" 20 | ), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0085_alter_projectsettings_paf_approval_sequential.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.11 on 2024-06-26 11:57 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0084_contract_signed_and_approved"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="projectsettings", 14 | name="paf_approval_sequential", 15 | field=models.BooleanField( 16 | default=True, help_text="Uncheck it to approve project parallelly" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0093_remove_reportversion_form_fields.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.16 on 2024-11-19 12:40 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ( 9 | "application_projects", 10 | "0092_migrate_reportversion_streamform_to_report_streamform", 11 | ), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="reportversion", 17 | name="form_fields", 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0094_remove_project_user_has_updated_pf_details.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.16 on 2024-12-06 16:39 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0093_remove_reportversion_form_fields"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="project", 14 | name="user_has_updated_details", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0095_alter_reportconfig_disable_reporting.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.16 on 2024-12-10 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0094_remove_project_user_has_updated_pf_details"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="reportconfig", 14 | name="disable_reporting", 15 | field=models.BooleanField(default=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/0101_alter_invoice_message_for_pm.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.21 on 2025-05-12 19:58 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("application_projects", "0100_alter_project_proposed_end_and_more"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="invoice", 14 | name="message_for_pm", 15 | field=models.TextField( 16 | blank=True, 17 | help_text="This will be displayed as a comment in the conversations tab", 18 | verbose_name="Comment", 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /hypha/apply/projects/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/reports/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ReportsConfig(AppConfig): 5 | name = "hypha.apply.projects.reports" 6 | label = "project_reports" 7 | -------------------------------------------------------------------------------- /hypha/apply/projects/reports/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/reports/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/reports/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/reports/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/reports/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/reports/tests/utils.py: -------------------------------------------------------------------------------- 1 | # A boilerplate stream form for Project Report tests 2 | FORM_FIELDS = [ 3 | { 4 | "id": "012a4f29-0882-4b1c-b567-aede1b601d4a", 5 | "type": "number", 6 | "value": { 7 | "required": True, 8 | "help_text": "", 9 | "field_label": "How many folks did you reach?", 10 | "default_value": "", 11 | }, 12 | } 13 | ] 14 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/filters/widgets/date_range_input_widget.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% for widget in widget.subwidgets %} 3 | {% include widget.template_name %} 4 | {% if forloop.last %} 5 | {% trans "to" %}: 6 | {% endif %} 7 | {% endfor %} 8 | 9 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/approve_contract.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Approve Contract" %}{% endmodal_title %} 3 | 4 |
5 |

6 | {% trans "Are you sure you want to accept and approve the contract for commencing the project?" %} 7 | {% trans "This cannot be undone." %} 8 |

9 | {% url 'apply:projects:contract_approve' pk=object.submission.id as url %} 10 | {% include 'includes/dialog_form_base.html' with form=form value=value url=url %} 11 |
12 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/assign_pafapprovers.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% if pafapprover_exists %} 3 | {% modal_title %}{% trans "Assign Approver" %}{% endmodal_title %} 4 | {% else %} 5 | {% modal_title %}{% trans "Change Approver" %}{% endmodal_title %} 6 | {% endif %} 7 | 8 |
9 |

{% trans "Selected approver will be notified. On unselecting, every listed member here will be notified." %}

10 | 11 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 12 |
13 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/contracting_documents_upload.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Upload contracting documents" %}{% endmodal_title %} 3 | 4 |
5 |
6 |
7 |
{% trans "Category" %}
8 |
{{ category }}
9 |
10 |
11 | 12 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 13 |
14 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/lead_update.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Update Lead" %}{% endmodal_title %} 3 | 4 |
5 |
6 |
7 |
{% trans "Current Lead" %}
8 |
{{ object.lead }} <{{object.lead.email}}>
9 |
10 |
11 | 12 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 13 |
14 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/pafstatus_update.html: -------------------------------------------------------------------------------- 1 | {% load i18n project_tags %} 2 | {% modal_title %}{% trans "Update Project Form Status" %}{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/project_dates_update.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Update project dates" %}{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/project_status_update.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Update Project Status" %}{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/project_title_update.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Update title" %}{% endmodal_title %} 3 | 4 |
5 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 6 |
7 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/submit_contracting_documents.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Submit contracting documents" %}{% endmodal_title %} 3 | 4 |
5 |

6 | {% trans "Are you sure you want to submit contracting documents?" %} 7 | {% trans "Make sure you have uploaded correct contract and all required contracting documents." %} 8 |

9 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 10 |
11 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/modals/supporting_documents_upload.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% modal_title %}{% trans "Upload Supporting Documents" %}{% endmodal_title %} 3 | 4 |
5 |
6 |
7 |
{% trans "Category" %}
8 |
{{ category }}
9 |
10 |
11 | 12 | {% include 'includes/dialog_form_base.html' with form=form value=value %} 13 |
14 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/partials/project_lead.html: -------------------------------------------------------------------------------- 1 | {% load i18n heroicons %} 2 | 3 | {% if request.user.is_apply_staff %} 4 | 9 | {% trans "Project lead" %}: {{ object.lead }} 10 | {% heroicon_micro "pencil-square" class="inline ms-1" aria_hidden=true %} 11 | 12 | {% else %} 13 | {% trans "Project lead" %}: {{ object.lead }} 14 | {% endif %} 15 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/partials/project_title.html: -------------------------------------------------------------------------------- 1 | {% load heroicons i18n %} 2 | 3 | {{ object.title }} 4 | #{{ object.submission.application_id }} 5 | 6 | {% if request.user.is_apply_staff %} 7 | 12 | {% heroicon_solid "pencil-square" class="inline mt-2 ms-1" aria_hidden=true %} 13 | {% trans "edit title" %} 14 | 15 | {% endif %} 16 | -------------------------------------------------------------------------------- /hypha/apply/projects/templates/application_projects/sow_export.html: -------------------------------------------------------------------------------- 1 | {% extends "base-pdf.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

{{ org_name }} {% trans "Scope of Work" %}

6 |

{% trans "Project title" %}: {{ title }}

7 |

{% trans "Project ID" %}: {{ id }}

8 | 9 |
10 | 11 | 12 | {% for field_name, field_value in sow_data.items %} 13 |

{{ field_name }}

14 |

{{ field_value|safe|default:"-" }}

15 | {% endfor %} 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /hypha/apply/projects/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/projects/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/projects/wagtail_hooks.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from wagtail.contrib.settings.registry import register_setting 3 | from wagtail_modeladmin.options import modeladmin_register 4 | 5 | from .admin import ProjectAdminGroup 6 | from .models import ProjectSettings 7 | 8 | if settings.PROJECTS_ENABLED: 9 | modeladmin_register(ProjectAdminGroup) 10 | register_setting(model=ProjectSettings) 11 | -------------------------------------------------------------------------------- /hypha/apply/review/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/admin_views.py: -------------------------------------------------------------------------------- 1 | from wagtail_modeladmin.views import CreateView, EditView 2 | 3 | from hypha.apply.utils.blocks import show_admin_form_error_messages 4 | 5 | 6 | class CreateReviewFormView(CreateView): 7 | def form_invalid(self, form): 8 | show_admin_form_error_messages(self.request, form) 9 | return self.render_to_response(self.get_context_data(form=form)) 10 | 11 | 12 | class EditReviewFormView(EditView): 13 | def form_invalid(self, form): 14 | show_admin_form_error_messages(self.request, form) 15 | return self.render_to_response(self.get_context_data(form=form)) 16 | -------------------------------------------------------------------------------- /hypha/apply/review/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ReviewConfig(AppConfig): 5 | name = "hypha.apply.review" 6 | -------------------------------------------------------------------------------- /hypha/apply/review/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/migrations/0004_review_is_draft.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-03-21 16:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("review", "0003_review_json_field"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="review", 14 | name="is_draft", 15 | field=models.BooleanField(default=False, verbose_name="Draft"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/review/migrations/0006_remove_review_review.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-07-20 11:20 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("review", "0005_streamform"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="review", 14 | name="review", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/review/migrations/0010_review_drupal_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-08-29 14:07 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("review", "0009_auto_20180823_0918"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="review", 14 | name="drupal_id", 15 | field=models.IntegerField(blank=True, editable=False, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/review/migrations/0024_auto_20220111_1314.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.1 on 2022-01-11 13:14 2 | 3 | import django.core.serializers.json 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("review", "0023_add_score_without_text_block"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="review", 15 | name="form_data", 16 | field=models.JSONField( 17 | default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /hypha/apply/review/migrations/0026_remove_drupal_id_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2025-01-14 08:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("review", "0025_auto_20220722_0844"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="review", 14 | name="drupal_id", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/review/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/templates/review/includes/review_button.html: -------------------------------------------------------------------------------- 1 | {% load i18n review_tags workflow_tags %} 2 | {% if request.user|has_review_perm:submission %} 3 | {% if request.user|has_draft:submission or request.user|can_review:submission %} 4 | 5 | {% if request.user|has_draft:submission %} 6 | {{ draft_text|default:"Update draft" }} 7 | {% elif request.user|can_review:submission %} 8 | {% trans "Add a review" %} 9 | {% endif %} 10 | 11 | {% endif %} 12 | {% endif %} 13 | -------------------------------------------------------------------------------- /hypha/apply/review/templates/review/includes/review_opinions_list.html: -------------------------------------------------------------------------------- 1 | {% load wagtailimages_tags %} 2 | 3 | {% if opinions %} 4 |
    5 | {% for opinion in opinions %} 6 |
  • 7 | {{ opinion.author }} 8 | {% if opinion.get_author_assignment %}{% image opinion.get_author_assignment.icon max-12x12 %}{% endif %} 9 | {{ opinion.get_opinion_display }}s 10 |
  • 11 | {% endfor %} 12 |
13 | {% endif %} -------------------------------------------------------------------------------- /hypha/apply/review/templates/review/render_scored_answer_field.html: -------------------------------------------------------------------------------- 1 | {% load nh3_tags %} 2 | {% block data_display %} 3 |
4 |
{{ value.field_label }}
5 |
{{ score }}
6 |
{{ comment|nh3 }}
7 |
8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /hypha/apply/review/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/review/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/review/tests/factories/__init__.py: -------------------------------------------------------------------------------- 1 | from . import blocks, models 2 | from .blocks import * # noqa 3 | from .models import * # noqa 4 | 5 | __all__ = [] 6 | 7 | __all__.extend(blocks.__all__) 8 | __all__.extend(models.__all__) 9 | -------------------------------------------------------------------------------- /hypha/apply/review/tests/test_admin.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | from hypha.apply.review.models import ReviewForm 4 | 5 | from .factories import ReviewFormFactory 6 | 7 | 8 | class TestReviewFormAdminForm(TestCase): 9 | def test_can_create_review_form(self): 10 | review_form = ReviewFormFactory() 11 | self.assertEqual(ReviewForm.objects.last(), review_form) 12 | -------------------------------------------------------------------------------- /hypha/apply/review/wagtail_hooks.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Permission 2 | from wagtail import hooks 3 | 4 | 5 | @hooks.register("register_permissions") 6 | def register_permissions(): 7 | return Permission.objects.filter( 8 | content_type__app_label="review", 9 | codename__in=["add_review", "change_review", "delete_review"], 10 | ) 11 | -------------------------------------------------------------------------------- /hypha/apply/search/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/search/__init__.py -------------------------------------------------------------------------------- /hypha/apply/search/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/search/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/stream_forms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/stream_forms/__init__.py -------------------------------------------------------------------------------- /hypha/apply/stream_forms/admin.py: -------------------------------------------------------------------------------- 1 | # from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class StreamFormsConfig(AppConfig): 5 | name = "hypha.apply.stream_forms" 6 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/stream_forms/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/heading_field.html: -------------------------------------------------------------------------------- 1 | {% load heroicons %} 2 |
3 | <{{ self.size }} tabindex="-1" class="p-2 mb-2 text-white bg-light-blue"> 4 | 5 | {{ value.heading_text }} 6 | 14 | 15 |
16 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_field.html: -------------------------------------------------------------------------------- 1 | {% if include_question %} 2 |
3 |

{{ value.field_label }}

4 | {% endif %} 5 | 6 |
7 | {% block data_display %}

{{ data }}

{% endblock %} 8 |
9 | 10 | {% if include_question %} 11 |
12 | {% endif %} 13 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_file_field.html: -------------------------------------------------------------------------------- 1 | {% extends "stream_forms/render_field.html" %} 2 | {% block data_display %} 3 | {% if data.name %} 4 |
5 | {% include "stream_forms/includes/file_field.html" with file=data %} 6 |
7 | {% else %} 8 | {{ block.super }} 9 | {% endif %} 10 | {% endblock %} 11 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_list_field.html: -------------------------------------------------------------------------------- 1 | {% extends "stream_forms/render_field.html" %} 2 | {% block data_display %} 3 | {% if data %} 4 | {% for value in data %} 5 | {% if forloop.first %}
    {% endif %} 6 |
  • {{ value }}
  • 7 | {% if forloop.last %}
{% endif %} 8 | {% endfor %} 9 | {% else %} 10 | {{ block.super }} 11 | {% endif %} 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_markdown_field.html: -------------------------------------------------------------------------------- 1 | {% extends "stream_forms/render_field.html" %} 2 | {% load nh3_tags markdown_tags %} 3 | {% block data_display %} 4 | {% if data %} 5 | {{ data|markdown|nh3 }} 6 | {% else %} 7 | {{ block.super }} 8 | {% endif %} 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_multi_file_field.html: -------------------------------------------------------------------------------- 1 | {% extends "stream_forms/render_field.html" %} 2 | {% block data_display %} 3 |
4 | {% for file in data %} 5 | {% if file.name %} 6 | {% include "stream_forms/includes/file_field.html" with file=file %} 7 | {% else %} 8 | {{ file }} 9 | {% endif %} 10 | {% endfor %} 11 |
12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/templates/stream_forms/render_unsafe_field.html: -------------------------------------------------------------------------------- 1 | {% extends "stream_forms/render_field.html" %} 2 | {% load nh3_tags %} 3 | {% block data_display %} 4 | {% if data %} 5 | {% if value.format == 'url' %} 6 | {{ data|nh3 }} 7 | {% elif value.format == 'email' %} 8 | {{ data|nh3 }} 9 | {% else %} 10 |

{{ data|nh3 }}

11 | {% endif %} 12 | {% else %} 13 | {{ block.super }} 14 | {% endif %} 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/testing/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/stream_forms/testing/__init__.py -------------------------------------------------------------------------------- /hypha/apply/stream_forms/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from faker import Faker 3 | 4 | from .blocks import FormFieldBlock, FormFieldsBlock 5 | 6 | fake = Faker() 7 | 8 | 9 | class TestBlocks(TestCase): 10 | def test_blocks_decode_none(self): 11 | for block in FormFieldsBlock().child_blocks.values(): 12 | if isinstance(block, FormFieldBlock): 13 | with self.subTest(block=block): 14 | value = block.decode(None) 15 | self.assertIsNone(value) 16 | -------------------------------------------------------------------------------- /hypha/apply/stream_forms/views.py: -------------------------------------------------------------------------------- 1 | # from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /hypha/apply/todo/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/todo/__init__.py -------------------------------------------------------------------------------- /hypha/apply/todo/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class TodoConfig(AppConfig): 5 | name = "hypha.apply.todo" 6 | -------------------------------------------------------------------------------- /hypha/apply/todo/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/todo/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/todo/templates/todo/todolist_dropdown.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 11 | -------------------------------------------------------------------------------- /hypha/apply/todo/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from .views import TaskRemovalView, TodoListView 4 | 5 | app_name = "hypha.apply.todo" 6 | 7 | 8 | urlpatterns = [ 9 | path("todo/list/", TodoListView.as_view(), name="list"), 10 | path("todo//delete/", TaskRemovalView.as_view(), name="delete"), 11 | ] 12 | -------------------------------------------------------------------------------- /hypha/apply/translate/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/translate/__init__.py -------------------------------------------------------------------------------- /hypha/apply/translate/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/translate/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/translate/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/translate/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/translate/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/translate/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/management/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0005_user_drupal_id.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.8 on 2018-02-28 15:21 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("users", "0004_drop_first_last_names"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="user", 16 | name="drupal_id", 17 | field=models.IntegerField(blank=True, editable=False, null=True), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0006_update_the_ordering_of_users.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-03-20 11:08 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0005_user_drupal_id"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterModelOptions( 13 | name="user", 14 | options={"ordering": ("full_name", "email")}, 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0007_user_slack.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-07-18 16:51 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0006_update_the_ordering_of_users"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="user", 14 | name="slack", 15 | field=models.CharField( 16 | blank=True, 17 | help_text='This is the name we should "@mention" when sending notifications', 18 | max_length=50, 19 | verbose_name="Slack name", 20 | ), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0008_add_staff_permissions.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2019-01-10 09:28 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0007_user_slack"), 9 | ] 10 | 11 | operations = [] 12 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0009_add_partner_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2018-12-19 13:21 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("users", "0008_add_staff_permissions"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0010_add_community_reviewer_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2018-12-19 13:21 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("users", "0009_add_partner_group"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0011_add_applicant_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2018-12-19 13:21 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("users", "0010_add_community_reviewer_group"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0012_set_applicant_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2018-12-19 13:21 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("users", "0011_add_applicant_group"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0013_add_approver_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-05 13:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0012_set_applicant_group"), 9 | ] 10 | 11 | operations = [] 12 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0016_add_finance_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-05 13:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0015_login_extra_text"), 9 | ] 10 | 11 | operations = [] 12 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0017_rename_staff_admin.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.9 on 2018-12-19 13:21 2 | from __future__ import unicode_literals 3 | 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("users", "0016_add_finance_group"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0018_add_contracting_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-08-05 13:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0017_rename_staff_admin"), 9 | ] 10 | 11 | operations = [] 12 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0019_rename_usersettings_authsettings.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.19 on 2023-06-25 14:01 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("wagtailcore", "0083_workflowcontenttype"), 9 | ("users", "0018_add_contracting_group"), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameModel( 14 | old_name="UserSettings", 15 | new_name="AuthSettings", 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0023_merge_0021_groupdesc_0022_confirmaccesstoken.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.13 on 2023-11-27 14:46 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0021_groupdesc"), 9 | ("users", "0022_confirmaccesstoken"), 10 | ] 11 | 12 | operations = [] 13 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0025_remove_authsettings_register_extra_text.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.11 on 2024-05-14 12:51 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0024_update_is_staff"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="authsettings", 14 | name="register_extra_text", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0026_delete_groupdesc.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.16 on 2024-09-27 05:00 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0025_remove_authsettings_register_extra_text"), 9 | ] 10 | 11 | operations = [ 12 | migrations.DeleteModel( 13 | name="GroupDesc", 14 | ), 15 | ] 16 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/0027_remove_drupal_id_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2025-01-14 08:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("users", "0026_delete_groupdesc"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="user", 14 | name="drupal_id", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/users/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/templates/users/activation/email_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% autoescape off %} 2 | {% blocktranslate %}Account details for {{ username }} at {{ org_long_name }}{% endblocktranslate %} 3 | {% endautoescape %} 4 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/users/email_change/update_info_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n wagtailadmin_tags %}{% base_url_setting as base_url %}{% firstof name username as user %} 2 | {% blocktrans %}Dear {{ user }},{% endblocktrans %} 3 | 4 | {% blocktrans %}There has been an attempt to change email of your account on the {{ org_long_name }} web site. If this action wasn't made by you, please contact support at {{ org_email }} {% endblocktrans %} 5 | 6 | 7 | {# fmt:off #}{% blocktrans %}Kind Regards, 8 | The {{ org_short_name }} Team{% endblocktrans %} 9 | 10 | -- 11 | {{ org_long_name }} 12 | {% if site %}{{ site.root_url }}{% else %}{{ base_url }}{% endif %}{# fmt:on #} 13 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/users/emails/passwordless_login_no_account_found.md: -------------------------------------------------------------------------------- 1 | {% load i18n wagtailadmin_tags %}{% base_url_setting as base_url %} 2 | 3 | {% blocktrans %}Dear,{% endblocktrans %} 4 | 5 | {% blocktrans %}It looks like you are trying to login on {{ org_long_name }} web site, but we could not find any account with the email provided.{% endblocktrans %} 6 | 7 | {% if org_email %} 8 | {% blocktrans %}If you have any questions, please contact us at {{ org_email }}.{% endblocktrans %} 9 | {% endif %} 10 | 11 | {% blocktrans %}Kind Regards, 12 | The {{ org_short_name }} Team{% endblocktrans %} 13 | 14 | -- 15 | {{ org_long_name }} 16 | {% if site %}{{ site.root_url }}{% else %}{{ base_url }}{% endif %} 17 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/users/emails/set_password_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% autoescape off %} 2 | {% blocktranslate %}Set password for {{ username }} at {{ org_long_name }}{% endblocktranslate %} 3 | {% endautoescape %} 4 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/users/password_reset/complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Reset password" %}{% endblock %} 4 | 5 | {% block content %} 6 | 7 | {% adminbar %} 8 | {% slot header %}{% trans "Password change successful" %}{% endslot %} 9 | {% endadminbar %} 10 | 11 |
12 |

13 | {% trans "Log in" %} 14 |

15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/wagtailusers/groups/index.html: -------------------------------------------------------------------------------- 1 | {% extends "wagtailadmin/generic/index.html" %} 2 | {% load i18n static %} 3 | 4 | {% block extra_css %} 5 | 6 | {{ block.super }} 7 | {{ media.css }} 8 | {% endblock %} 9 | -------------------------------------------------------------------------------- /hypha/apply/users/templates/wagtailusers/users/index.html: -------------------------------------------------------------------------------- 1 | {% extends "wagtailusers/users/index.html" %} 2 | {% load i18n static wagtailadmin_tags %} 3 | 4 | {% block extra_css %} 5 | 6 | {% endblock %} 7 | 8 | {% block listing %} 9 |
10 |
11 | {% include "wagtailusers/users/results.html" %} 12 |
13 | {% trans "Select all users in listing" as select_all_text %} 14 | {% include 'wagtailadmin/bulk_actions/footer.html' with select_all_obj_text=select_all_text app_label=app_label model_name=model_name objects=page_obj %} 15 |
16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /hypha/apply/users/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/users/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/users/tests/__init__.py -------------------------------------------------------------------------------- /hypha/apply/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/__init__.py -------------------------------------------------------------------------------- /hypha/apply/utils/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UtilsConfig(AppConfig): 5 | name = "hypha.apply.utils" 6 | label = "apply_utils" 7 | -------------------------------------------------------------------------------- /hypha/apply/utils/fields.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | from .options import RICH_TEXT_WIDGET 4 | 5 | 6 | class RichTextField(forms.CharField): 7 | widget = RICH_TEXT_WIDGET 8 | 9 | def __init__(self, *args, required=False, **kwargs): 10 | kwargs.update(required=required) 11 | super().__init__(*args, **kwargs) 12 | -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/Montserrat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/Montserrat-Bold.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/Montserrat-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/Montserrat-BoldItalic.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/Montserrat-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/Montserrat-Italic.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/NotoSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/NotoSans-Bold.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/NotoSans-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/NotoSans-BoldItalic.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/NotoSans-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/NotoSans-Italic.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/media/fonts/NotoSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/media/fonts/NotoSans-Regular.ttf -------------------------------------------------------------------------------- /hypha/apply/utils/migrations/0002_remove_pdfpagesettings_site.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2024-12-05 08:43 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("apply_utils", "0001_add_pdf_page_size_setting"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="pdfpagesettings", 14 | name="site", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/apply/utils/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/apply/utils/options.py: -------------------------------------------------------------------------------- 1 | from tinymce.widgets import TinyMCE 2 | 3 | MCE_ATTRIBUTES = { 4 | "elementpath": False, 5 | "branding": False, 6 | "contextmenu": False, 7 | "entity_encoding": "raw", 8 | "plugins": "link table lists wordcount", 9 | "toolbar": "undo redo | blocks | bold italic | bullist numlist | table | link", 10 | "relative_urls": False, 11 | "browser_spellcheck": True, 12 | "default_link_target": "_blank", 13 | "invalid_elements": "iframe,object,embed", 14 | } 15 | MCE_ATTRIBUTES_SHORT = {**MCE_ATTRIBUTES, **{"height": 180}} 16 | 17 | RICH_TEXT_WIDGET = TinyMCE(mce_attrs=MCE_ATTRIBUTES) 18 | RICH_TEXT_WIDGET_SHORT = TinyMCE(mce_attrs=MCE_ATTRIBUTES_SHORT) 19 | -------------------------------------------------------------------------------- /hypha/apply/utils/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/apply/utils/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/apply/utils/testing/__init__.py: -------------------------------------------------------------------------------- 1 | from .tests import BaseViewTestCase, make_request # NOQA 2 | -------------------------------------------------------------------------------- /hypha/apply/utils/testing/factories.py: -------------------------------------------------------------------------------- 1 | from hypha.apply.stream_forms.testing.factories import FormFieldBlockFactory 2 | from hypha.apply.utils.blocks import RichTextFieldBlock 3 | 4 | 5 | class RichTextFieldBlockFactory(FormFieldBlockFactory): 6 | class Meta: 7 | model = RichTextFieldBlock 8 | -------------------------------------------------------------------------------- /hypha/celery.py: -------------------------------------------------------------------------------- 1 | import django 2 | from celery import Celery 3 | from django.conf import settings 4 | 5 | app = Celery("hypha") 6 | 7 | # Requires env var `DJANGO_SETTINGS_MODULE` to be set before running 8 | 9 | django.setup() 10 | 11 | app.config_from_object(settings, namespace="CELERY") 12 | app.autodiscover_tasks(["django_slack", "hypha.apply.activity"]) 13 | -------------------------------------------------------------------------------- /hypha/cookieconsent/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/cookieconsent/__init__.py -------------------------------------------------------------------------------- /hypha/cookieconsent/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CookieconsentConfig(AppConfig): 5 | name = "hypha.cookieconsent" 6 | -------------------------------------------------------------------------------- /hypha/cookieconsent/context_processors.py: -------------------------------------------------------------------------------- 1 | def cookies_accepted(request): 2 | cookieconsent = False 3 | if request.COOKIES.get("cookieconsent", "decline") == "accept": 4 | cookieconsent = True 5 | 6 | return {"COOKIES_ACCEPTED": cookieconsent} 7 | -------------------------------------------------------------------------------- /hypha/cookieconsent/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/cookieconsent/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/cookieconsent/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/cookieconsent/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/cookieconsent/templatetags/cookieconsent_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from ..models import CookieConsentSettings 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.inclusion_tag("includes/banner.html", takes_context=True) 9 | def cookie_banner(context): 10 | request = context["request"] 11 | settings = CookieConsentSettings.load(request_or_site=request) 12 | show_banner = settings.cookieconsent_active and not request.COOKIES.get( 13 | "cookieconsent" 14 | ) 15 | 16 | return {"show_banner": show_banner, "settings": settings} 17 | -------------------------------------------------------------------------------- /hypha/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/__init__.py -------------------------------------------------------------------------------- /hypha/core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django_web_components import component 3 | 4 | 5 | class CoreAppConfig(AppConfig): 6 | name = "hypha.core" 7 | 8 | def ready(self): 9 | from . import components # noqa 10 | 11 | component.register("adminbar", component=components.AdminBar) 12 | component.register("dropdown_menu", component=components.DropdownMenu) 13 | -------------------------------------------------------------------------------- /hypha/core/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/management/__init__.py -------------------------------------------------------------------------------- /hypha/core/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/management/commands/__init__.py -------------------------------------------------------------------------------- /hypha/core/middleware/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/middleware/__init__.py -------------------------------------------------------------------------------- /hypha/core/middleware/tests/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hypha/core/migrations/0001_wagtail_4_reference_index_dependency.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-12-12 08:37 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | """This migration is added to ensure all the migrations from wagtail is 8 | picked up and ran during the testing. 9 | 10 | The migrations from wagtail are picked up while running the "python manage.py migrate" 11 | but it somehow fails while the database schema is generated while running the django tests. 12 | """ 13 | 14 | dependencies = [ 15 | ("wagtailcore", "0078_referenceindex"), 16 | ] 17 | 18 | operations = [] 19 | -------------------------------------------------------------------------------- /hypha/core/migrations/0002_auto_20240215_remove_mailhimp.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.9 on 2024-02-15 08:49 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("core", "0001_wagtail_4_reference_index_dependency"), 9 | ] 10 | 11 | # Remove the mailchimp settings table, and add a reverse migration to do nothing 12 | operations = [ 13 | migrations.RunSQL("DROP TABLE IF EXISTS mailchimp_newslettersettings;"), 14 | ] 15 | -------------------------------------------------------------------------------- /hypha/core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/core/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .system_settings import SystemSettings 2 | 3 | __all__ = ["SystemSettings"] 4 | -------------------------------------------------------------------------------- /hypha/core/templates/components/admin_bar.html: -------------------------------------------------------------------------------- 1 | {% load components i18n %} 2 | 3 |
4 |
5 |
6 | {% render_slot slots.back_link %} 7 |

{% render_slot slots.header %}

8 | {% if slots.sub_heading %}

{% render_slot slots.sub_heading %}

{% endif %} 9 |
10 | {% if slots.buttons %}
{% render_slot slots.buttons %}
{% endif %} 11 | {% render_slot slots.inner_block %} 12 |
13 |
14 | -------------------------------------------------------------------------------- /hypha/core/templates/components/modal-title.html: -------------------------------------------------------------------------------- 1 | {% load components heroicons %} 2 | 3 |
4 |

5 | {% render_slot slots.inner_block %} 6 |

7 | 8 |
9 | 18 |
19 |
20 | -------------------------------------------------------------------------------- /hypha/core/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/templatetags/__init__.py -------------------------------------------------------------------------------- /hypha/core/utils.py: -------------------------------------------------------------------------------- 1 | import mistune 2 | 3 | 4 | def markdown_to_html(text: str) -> str: 5 | """Converts markdown text to html. 6 | 7 | - No escape of HTML tags 8 | - With strikethrough plugin 9 | - With table plugin 10 | - With footnote plugin 11 | 12 | Args: 13 | text: markdown text 14 | 15 | Returns: 16 | Formatted markdown in HTML format 17 | """ 18 | md = mistune.create_markdown( 19 | escape=False, 20 | hard_wrap=True, 21 | renderer="html", 22 | plugins=["strikethrough", "footnotes", "table", "url"], 23 | ) 24 | 25 | return md(text) 26 | -------------------------------------------------------------------------------- /hypha/core/wagtail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/core/wagtail/__init__.py -------------------------------------------------------------------------------- /hypha/core/wagtail/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from .options import SettingModelAdmin 2 | from .registry import register_public_site_setting 3 | 4 | __all__ = ["SettingModelAdmin", "register_public_site_setting"] 5 | -------------------------------------------------------------------------------- /hypha/core/wagtail/admin/panels.py: -------------------------------------------------------------------------------- 1 | from wagtail.admin.panels import InlinePanel 2 | 3 | 4 | class ReadOnlyInlinePanel(InlinePanel): 5 | """ 6 | Behaves same as InlinePanel, but removes UI for adding new item and 7 | deleting an existing item in the formset. 8 | """ 9 | 10 | class BoundPanel(InlinePanel.BoundPanel): 11 | template_name = "core/wagtail/panels/inline_panel_readonly.html" 12 | -------------------------------------------------------------------------------- /hypha/core/wagtail_hooks.py: -------------------------------------------------------------------------------- 1 | from django.templatetags.static import static 2 | from django.utils.html import format_html 3 | from wagtail import hooks 4 | 5 | 6 | @hooks.register("insert_global_admin_css") 7 | def global_admin_css(): 8 | return format_html( 9 | '', static("css/wagtail_global_admin.css") 10 | ) 11 | -------------------------------------------------------------------------------- /hypha/core/widgets.py: -------------------------------------------------------------------------------- 1 | from django.forms.widgets import Media 2 | from pagedown.widgets import PagedownWidget as PagedownWidgetBase 3 | 4 | 5 | class PagedownWidget(PagedownWidgetBase): 6 | """ 7 | Custom PagedownWidget to remove demo.css included in the default widget. 8 | """ 9 | 10 | @property 11 | def media(self): 12 | return Media(css={"all": ("pagedown.css",)}, js=PagedownWidgetBase.Media.js) 13 | -------------------------------------------------------------------------------- /hypha/home/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/home/__init__.py -------------------------------------------------------------------------------- /hypha/home/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class HomeConfig(AppConfig): 5 | name = "hypha.home" 6 | label = "apply_home" 7 | -------------------------------------------------------------------------------- /hypha/home/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/home/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/home/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from wagtail.models import Page 3 | 4 | 5 | class ApplyHomePage(Page): 6 | # Only allow creating HomePages at the root level 7 | parent_page_types = ["wagtailcore.Page"] 8 | subpage_types = ["funds.FundType", "funds.LabType", "funds.RequestForPartners"] 9 | 10 | strapline = models.CharField(blank=True, max_length=255) 11 | -------------------------------------------------------------------------------- /hypha/home/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | from hypha.apply.funds.models import ApplicationBase, LabBase 4 | 5 | 6 | def home(request): 7 | """Home page view. 8 | 9 | Displays the list of active rounds and labs to both logged in and logged out users. 10 | """ 11 | ctx = {} 12 | rounds = ApplicationBase.objects.order_by_end_date().specific() 13 | labs = LabBase.objects.public().live().specific() 14 | all_funds = list(rounds) + list(labs) 15 | 16 | # Only pass rounds/labs that are open & visible for the front page 17 | ctx["funds"] = [ 18 | fund for fund in all_funds if fund.open_round and fund.list_on_front_page 19 | ] 20 | return render(request, "home/home.html", ctx) 21 | -------------------------------------------------------------------------------- /hypha/images/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/images/__init__.py -------------------------------------------------------------------------------- /hypha/images/migrations/0002_customimage_file_hash.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.8 on 2018-08-21 08:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("images", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="customimage", 14 | name="file_hash", 15 | field=models.CharField(blank=True, editable=False, max_length=40), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/images/migrations/0003_customimage_drupal_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.2 on 2018-08-29 12:04 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("images", "0002_customimage_file_hash"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="customimage", 14 | name="drupal_id", 15 | field=models.IntegerField(blank=True, editable=False, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /hypha/images/migrations/0004_alter_customimage_file_hash.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.14 on 2022-07-22 08:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("images", "0003_customimage_drupal_id"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="customimage", 14 | name="file_hash", 15 | field=models.CharField( 16 | blank=True, db_index=True, editable=False, max_length=40 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /hypha/images/migrations/0007_remove_drupal_id_field.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.17 on 2025-01-14 08:41 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("images", "0006_alter_rendition_file"), 9 | ] 10 | 11 | operations = [ 12 | migrations.RemoveField( 13 | model_name="customimage", 14 | name="drupal_id", 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /hypha/images/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/images/migrations/__init__.py -------------------------------------------------------------------------------- /hypha/settings/.gitignore: -------------------------------------------------------------------------------- 1 | /local.py 2 | -------------------------------------------------------------------------------- /hypha/settings/__init__.py: -------------------------------------------------------------------------------- 1 | # If you want to avoid weird side effects, do not import dev settings here. 2 | # For example, if your dev settings do something like 3 | # 4 | # INSTALLED_APPS += [ 5 | # 'debug_toolbar', 6 | # ] 7 | # 8 | # You will have `debug_toolbar` enabled even if you run 9 | # your application in production settings because `INSTALLED_APPS` will be changed during import 10 | # 11 | # It's better to explicitly specify settings file 12 | # by setting the `DJANGO_SETTINGS_MODULE` environment variable 13 | # or passing the --settings argument into your manage commands, when possible. 14 | -------------------------------------------------------------------------------- /hypha/static_src/images/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/.gitkeep -------------------------------------------------------------------------------- /hypha/static_src/images/editor-buttons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/editor-buttons.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/android-chrome-192x192.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/android-chrome-512x512.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/favicon.ico -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/favicons/mstile-150x150.png -------------------------------------------------------------------------------- /hypha/static_src/images/favicons/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Hypha", 3 | "short_name": "Hypha", 4 | "icons": [ 5 | { 6 | "src": "/static/images/favicons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/static/images/favicons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /hypha/static_src/images/logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/logo-small.png -------------------------------------------------------------------------------- /hypha/static_src/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/static_src/images/logo.png -------------------------------------------------------------------------------- /hypha/static_src/images/quote-outline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /hypha/static_src/javascript/translate-application.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | htmx.on("translatedSubmission", (event) => { 3 | if (event.detail?.appTitle) { 4 | document.getElementById("app-title").textContent = event.detail.appTitle; 5 | } 6 | 7 | if (event.detail?.docTitle) { 8 | document.title = event.detail.docTitle; 9 | } 10 | }); 11 | })(); 12 | -------------------------------------------------------------------------------- /hypha/static_src/sass/components/_dropdown.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/variables"; 2 | 3 | .dropdown { 4 | position: relative; 5 | display: inline-block; 6 | 7 | &__content { 8 | position: absolute; 9 | background-color: variables.$color--light-grey; 10 | min-width: 160px; 11 | box-shadow: 1px 8px 16px 1px variables.$color--mid-dark-grey; 12 | z-index: 1; 13 | 14 | /* Links inside the dropdown */ 15 | a { 16 | color: variables.$color--black; 17 | padding: 12px 16px; 18 | text-decoration: none; 19 | display: block; 20 | 21 | /* Change color of dropdown links on hover */ 22 | &:hover { 23 | background-color: variables.$color--mid-grey; 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /hypha/static_src/sass/components/_responsive-table.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/mixins"; 2 | 3 | .responsive-table { 4 | @include mixins.table-ordering-styles; 5 | 6 | thead { 7 | display: none; 8 | 9 | @include mixins.media-query(lg) { 10 | display: table-header-group; 11 | } 12 | 13 | th { 14 | padding: 25px 10px; 15 | } 16 | } 17 | 18 | tbody { 19 | td { 20 | &.title { 21 | padding-block-start: 15px; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /hypha/static_src/sass/components/_reviews-summary.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/mixins"; 2 | @use "../abstracts/variables"; 3 | 4 | .reviews-summary { 5 | display: none; 6 | background-color: transparent; 7 | 8 | @include mixins.media-query(lg) { 9 | display: table; 10 | } 11 | 12 | &__tr { 13 | vertical-align: top; 14 | border-block-end: 0; 15 | } 16 | 17 | &__td { 18 | padding: 10px; 19 | vertical-align: middle; 20 | text-align: center; 21 | } 22 | 23 | &__td-width { 24 | width: max-content; 25 | } 26 | } 27 | 28 | .counts-separator { 29 | color: variables.$color--mid-grey; 30 | } 31 | -------------------------------------------------------------------------------- /hypha/static_src/sass/components/_revisions.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/variables"; 2 | 3 | .diff { 4 | &__deleted { 5 | background-color: variables.$color--light-pink; 6 | 7 | a { 8 | background-color: inherit; 9 | } 10 | } 11 | 12 | &__added { 13 | background-color: variables.$color--light-green; 14 | 15 | a { 16 | background-color: inherit; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /hypha/static_src/sass/components/_traffic-light.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/variables"; 2 | 3 | .traffic-light { 4 | display: block; 5 | width: 1em; 6 | height: 1em; 7 | aspect-ratio: 1/1; 8 | 9 | &--no, 10 | &--red { 11 | background-color: variables.$color--tomato; 12 | clip-path: polygon(100% 0, 0 0, 50% 100%); 13 | } 14 | 15 | &--maybe, 16 | &--amber { 17 | background-color: variables.$color--mustard; 18 | border-radius: 50%; 19 | } 20 | 21 | &--yes, 22 | &--green { 23 | background-color: variables.$color--green; 24 | clip-path: polygon(50% 0, 0 100%, 100% 100%); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /hypha/static_src/sass/custom/_custom.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable no-empty-source 2 | -------------------------------------------------------------------------------- /hypha/static_src/sass/layout/_header.scss: -------------------------------------------------------------------------------- 1 | @use "../abstracts/mixins"; 2 | @use "../abstracts/variables"; 3 | 4 | .header { 5 | padding-inline: variables.$gutters; 6 | 7 | @include mixins.media-query(xl) { 8 | padding-inline: 0; 9 | } 10 | 11 | &__logo { 12 | max-width: none; 13 | 14 | &--mobile { 15 | width: 60px; 16 | 17 | @include mixins.media-query(lg) { 18 | display: none; 19 | } 20 | } 21 | 22 | &--desktop { 23 | display: none; 24 | 25 | @include mixins.media-query(lg) { 26 | display: block; 27 | width: 215px; 28 | } 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /hypha/static_src/sass/wagtail_global_admin.css: -------------------------------------------------------------------------------- 1 | .sidebar form[role="search"], 2 | .sidebar-page-explorer-item { 3 | display: none; 4 | } 5 | -------------------------------------------------------------------------------- /hypha/static_src/sass/wagtail_groups_list.scss: -------------------------------------------------------------------------------- 1 | .group-help-text { 2 | font-size: smaller; 3 | padding-inline-start: 10px; 4 | } 5 | 6 | // Stylings used for the Wagtail admin "roles" tab when creating/editing a user 7 | .form { 8 | &__label { 9 | p { 10 | margin: 0; 11 | } 12 | 13 | .group-help-text { 14 | color: var(--w-color-grey-400); 15 | } 16 | } 17 | } 18 | 19 | // Stylings used for the Wagtail admin groups view 20 | .title-wrapper { 21 | a { 22 | .group-help-text { 23 | font-weight: normal; 24 | display: inline; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /hypha/static_src/tailwind/base/core.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: var(--color-fg-default); 3 | background-color: var(--color-bg-default); 4 | } 5 | -------------------------------------------------------------------------------- /hypha/static_src/tailwind/base/forms.css: -------------------------------------------------------------------------------- 1 | [type="text"], 2 | [type="email"], 3 | [type="url"], 4 | [type="password"], 5 | [type="number"], 6 | [type="date"], 7 | [type="datetime-local"], 8 | [type="month"], 9 | [type="search"], 10 | [type="tel"], 11 | [type="time"], 12 | [type="week"], 13 | [multiple], 14 | textarea, 15 | select { 16 | @apply border-gray-300 focus:ring-dark-blue disabled:opacity-75 disabled:cursor-not-allowed; 17 | } 18 | 19 | [type="checkbox"], 20 | [type="radio"] { 21 | @apply w-5 h-5 border-dark-blue text-dark-blue focus:ring-dark-blue; 22 | } 23 | -------------------------------------------------------------------------------- /hypha/static_src/tailwind/components/django-file-field.css: -------------------------------------------------------------------------------- 1 | .dff-uploader .dff-files { 2 | @apply m-0! shadow-inner outline-dashed! rounded-xs; 3 | } 4 | 5 | .dff-uploader .dff-files .dff-filesize { 6 | @apply text-fg-muted text-sm; 7 | } 8 | 9 | .dff-uploader .dff-files.dff-dropping { 10 | @apply ring-2! ring-offset-4; 11 | } 12 | 13 | .dff-uploader .dff-files .dff-delete { 14 | @apply text-red-500! font-medium before:content-['•'] before:mr-2; 15 | } 16 | -------------------------------------------------------------------------------- /hypha/templates/403.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load wagtailcore_tags wagtailsettings_tags %} 3 | 4 | {% block title %}{{ settings.core.SystemSettings.title_403 }}{% endblock %} 5 | 6 | {% block body_class %}template-403{% endblock %} 7 | 8 | {% block content %} 9 |
10 |

{{ settings.core.SystemSettings.title_403 }}

11 |
{{ settings.core.SystemSettings.body_403|richtext }}
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /hypha/templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base-apply.html" %} 2 | {% load wagtailcore_tags wagtailsettings_tags %} 3 | 4 | {% block title %}{{ settings.core.SystemSettings.title_404 }}{% endblock %} 5 | 6 | {% block body_class %}template-404{% endblock %} 7 | 8 | {% block content %} 9 |
10 |

{{ settings.core.SystemSettings.title_404 }}

11 |
{{ settings.core.SystemSettings.body_404|richtext }}
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /hypha/templates/django/forms/widgets/date.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hypha/templates/django/forms/widgets/datetime.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hypha/templates/django/forms/widgets/input_option.html: -------------------------------------------------------------------------------- 1 | {% include "django/forms/widgets/input.html" %} 2 | {% if widget.wrap_label %} 3 | 4 | {% endif %} 5 | -------------------------------------------------------------------------------- /hypha/templates/django/forms/widgets/multiple_input.html: -------------------------------------------------------------------------------- 1 | {% with id=widget.attrs.id %} 2 |
    6 | {% for group, options, index in widget.optgroups %} 7 | {% if group %} 8 |
  • {{ group }} 9 | {% endif %} 10 | {% for option in options %} 11 |
  • {% include option.template_name with widget=option %}
  • 12 | {% endfor %} 13 | {% if group %} 14 |
15 | 16 | {% endif %} 17 | {% endfor %} 18 | {% endwith %} 19 | -------------------------------------------------------------------------------- /hypha/templates/django/forms/widgets/select.html: -------------------------------------------------------------------------------- 1 |
2 | 15 |
16 | -------------------------------------------------------------------------------- /hypha/templates/includes/_partial-main.html: -------------------------------------------------------------------------------- 1 |
2 | {% block content_wrapper %} 3 | {% block content %}{% endblock %} 4 | {% endblock %} 5 |
6 | -------------------------------------------------------------------------------- /hypha/templates/includes/body_end.html: -------------------------------------------------------------------------------- 1 | {% comment %} Override in templates_custom to add custom content here. {% endcomment %} 2 | -------------------------------------------------------------------------------- /hypha/templates/includes/head_end.html: -------------------------------------------------------------------------------- 1 | {% comment %} Override in templates_custom to add custom content here. {% endcomment %} 2 | -------------------------------------------------------------------------------- /hypha/templates/includes/org_login_button.html: -------------------------------------------------------------------------------- 1 | {% load i18n heroicons %} 2 | 9 | -------------------------------------------------------------------------------- /hypha/templates/includes/password_login_button.html: -------------------------------------------------------------------------------- 1 | {% load i18n heroicons %} 2 | 9 | -------------------------------------------------------------------------------- /hypha/templates/includes/passwordless_login_button.html: -------------------------------------------------------------------------------- 1 | {% load i18n heroicons %} 2 | 9 | -------------------------------------------------------------------------------- /hypha/templates/wagtailadmin/widgets/date_input.html: -------------------------------------------------------------------------------- 1 | {% include "django/forms/widgets/input.html" %} 2 | -------------------------------------------------------------------------------- /hypha/templates/wagtailadmin/widgets/datetime_input.html: -------------------------------------------------------------------------------- 1 | {% include "django/forms/widgets/input.html" %} -------------------------------------------------------------------------------- /hypha/templates_custom/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/hypha/templates_custom/.gitkeep -------------------------------------------------------------------------------- /hypha/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for hypha project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hypha.settings.production") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hypha.settings.production") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/favicon.ico -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/logo.png -------------------------------------------------------------------------------- /public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/mstile-150x150.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-Agent: * 2 | 3 | Disallow: /search/ 4 | 5 | Allow: / 6 | -------------------------------------------------------------------------------- /public/sandbox_db.dump: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HyphaApp/hypha/56b31c9fdb0f550e4f6abae08fe394ef847dd695/public/sandbox_db.dump -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Required for the heroku buildpack 2 | -r requirements/prod.txt 3 | -------------------------------------------------------------------------------- /requirements/translate-cpu.txt: -------------------------------------------------------------------------------- 1 | # Requirements for machine translations, manually managed. 2 | 3 | # Only install the CPU version of torch when available (linux) 4 | --extra-index-url https://download.pytorch.org/whl/cpu 5 | torch==2.6.0+cpu 6 | argostranslate==1.9.6 7 | --------------------------------------------------------------------------------