Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ A clear and concise description of what you expected to happen.
- Staff
- Applicants
- Reviewers
- Partners
- Developers
- General public

Expand Down
1 change: 0 additions & 1 deletion .github/ISSUE_TEMPLATE/enhancement-request.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ Add any other context or screenshots about the feature request here.
- Staff
- Applicants
- Reviewers
- Partners
- Developers
- General public

Expand Down
1 change: 0 additions & 1 deletion .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ Add any other context or screenshots about the feature request here.
- Staff
- Applicants
- Reviewers
- Partners
- Developers
- General public

Expand Down
1 change: 0 additions & 1 deletion .github/ISSUE_TEMPLATE/scoping_review_form.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ Add any other context or screenshots about the feature request here.
- Staff
- Applicants
- Reviewers
- Partners
- Developers
- General public

Expand Down
3 changes: 0 additions & 3 deletions docs/references/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,5 @@
**Approver**
: an individual, usually member of staff, who can authorize a contract or payment request

**Partner**
: For OTF, in the application phase, "partner" could view the application but is unable to submit a review and could submit payment requests. This role can see, edit, and communicate about a specific application.

**Finance**
: role for staff with finance related functions. In Hypha they have dashboard to enable approval of invoices.
24 changes: 1 addition & 23 deletions docs/references/user-roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ For example, system administrators could adjust the administrative access or per
Hypha comes with the following user roles that has special permissions:

- [Staff](#staff)
- [Partner](#partner)
- [Reviewer](#reviewer)
- [Applicant](#applicant)
- [Additional roles](#additional-roles)
Expand All @@ -28,34 +27,13 @@ Staff can:
* Modify roles for other users
* Set up applications (this means creating Forms, Funds, and Rounds
* View applications/submissions
* Give other users (ie Reviewers, Partners) access to submissions
* Give other users (ie. Reviewers, Co-Applicants) access to submissions
* Review submissions
* Draft and send correspondence
* Write a comment to applicants and other users on the platform

Account created by **Staff** & assigned to either "Fund" or specific application(s)

## Partner

The **Partner** role could be access, edit, and communicate about a specific application they are assigned to. This role could be accessed when two or more people are working together on a single application; one applicant gets **Applicant** role, and additional applicants get this role. OTF use the partner role for fellowship host organizations, service providers, etc.

A **Partner can**:

* View, edit, and communicate about a specific application
* Used when two or more people are working together on an application; one applicant gets **Applicant** role, and additional applicants get this role

> ℹ️ _This role is created by Staff and associated with a specific application_

The **Partner** role could be access, edit, and communicate about a specific application they are assigned to. OTF use the partner role for fellowship host organizations, service providers, etc.

The Partner could only review applications that has been assigned to them. Applications assigned to the Partner are available on their dashboard.

![](../assets/partner_dashboard_assign_submission.png)

The Partner role could be associated or assigned to an application by clicking on Partner button in the **Actions to take** > Assign.

![](../assets/submission_how-to-assign-partner.png)

## Reviewer

The **Reviewer** role has their own dashboard and can submit reviews. OTF's Advisory Council Members are often assigned the 'Reviewer' role.
Expand Down
2 changes: 1 addition & 1 deletion docs/setup/administrators/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ Staff e-mail domain. Used for OAUTH2 whitelist default value and staff account c

----

Should staff identities be obscured from Applicants & Partners (ie. comments will be ORG_LONG_NAME rather than "John Doe").
Should staff identities be obscured from Applicants (ie. comments will be ORG_LONG_NAME rather than "John Doe").

HIDE_STAFF_IDENTITY = env.bool('HIDE_STAFF_IDENTITY', False)

Expand Down
2 changes: 1 addition & 1 deletion docs/user-guides/creating-a-user-account.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ The "Add User" form will request your email, name, and role within the platform.

![](../assets/manage_user-add-user.jpg)

Selecting a role with enable to administrative access within the platform. Commonly used roles within the platform are **Staff**, **Partner**, and **Reviewer**.
Selecting a role with enable to administrative access within the platform. Commonly used roles within the platform are **Staff** and **Reviewer**.

![](../assets/manage_user-update-group.jpg)

Expand Down
14 changes: 0 additions & 14 deletions hypha/apply/activity/adapters/activity_feed.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ class ActivityAdapter(AdapterBase):
MESSAGES.INVITED_TO_PROPOSAL: _("Invited to submit a proposal"),
MESSAGES.REVIEWERS_UPDATED: "reviewers_updated",
MESSAGES.BATCH_REVIEWERS_UPDATED: "batch_reviewers_updated",
MESSAGES.PARTNERS_UPDATED: "partners_updated",
MESSAGES.NEW_REVIEW: _("Submitted a review"),
MESSAGES.OPENED_SEALED: _("Opened the submission while still sealed"),
MESSAGES.SCREENING: "handle_screening_statuses",
Expand Down Expand Up @@ -89,7 +88,6 @@ def extra_kwargs(self, message_type, source, sources, **kwargs):
MESSAGES.REVIEW_OPINION,
MESSAGES.DELETE_REVIEW_OPINION,
MESSAGES.BATCH_REVIEWERS_UPDATED,
MESSAGES.PARTNERS_UPDATED,
MESSAGES.APPROVE_PROJECT,
MESSAGES.REQUEST_PROJECT_CHANGE,
MESSAGES.SEND_FOR_APPROVAL,
Expand Down Expand Up @@ -287,18 +285,6 @@ def handle_batch_transition(self, transitions, sources, **kwargs):
old_phase=old_phase, source=submission, **kwargs
)

def partners_updated(self, added, removed, **kwargs):
message = [_("Partners updated.")]
if added:
message.append(_("Added:"))
message.append(", ".join([str(user) for user in added]) + ".")

if removed:
message.append(_("Removed:"))
message.append(", ".join([str(user) for user in removed]) + ".")

return " ".join(message)

def handle_report_frequency(self, config, **kwargs):
new_schedule = config.get_frequency_display()
return _(
Expand Down
30 changes: 0 additions & 30 deletions hypha/apply/activity/adapters/emails.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from django.utils.translation import gettext as _

from hypha.apply.activity import tasks
from hypha.apply.activity.models import ALL, APPLICANT_PARTNERS, PARTNER
from hypha.apply.funds.models.co_applicants import (
CoApplicantProjectPermission,
CoApplicantRole,
Expand Down Expand Up @@ -65,8 +64,6 @@ class EmailAdapter(AdapterBase):
MESSAGES.READY_FOR_REVIEW: "handle_ready_for_review",
MESSAGES.REVIEWERS_UPDATED: "handle_ready_for_review",
MESSAGES.BATCH_REVIEWERS_UPDATED: "handle_batch_ready_for_review",
MESSAGES.PARTNERS_UPDATED: "partners_updated_applicant",
MESSAGES.PARTNERS_UPDATED_PARTNER: "partners_updated_partner",
MESSAGES.UPLOAD_CONTRACT: "messages/email/contract_uploaded.html",
MESSAGES.SUBMIT_CONTRACT_DOCUMENTS: "messages/email/submit_contract_documents.html",
MESSAGES.CREATED_PROJECT: "messages/email/project_created.html",
Expand Down Expand Up @@ -328,10 +325,6 @@ def recipients(self, message_type, source, user, **kwargs):
related = kwargs.get("related", None)
return [related.invited_user_email]

if message_type == MESSAGES.PARTNERS_UPDATED_PARTNER:
partners = kwargs["added"]
return [partner.email for partner in partners]

if message_type == MESSAGES.APPROVE_PAF:
from hypha.apply.projects.models.project import ProjectSettings

Expand Down Expand Up @@ -488,12 +481,6 @@ def recipients(self, message_type, source, user, **kwargs):
).values_list("user__email", flat=True)
recipients: List[str] = [source.user.email, *co_applicants]

if partners := list(source.partners.values_list("email", flat=True)):
if comment.visibility == PARTNER:
recipients = partners
elif comment.visibility in [APPLICANT_PARTNERS, ALL]:
recipients += partners

# Comment handling for Projects
elif isinstance(source, Project):
# co_applciants with Comment permission
Expand Down Expand Up @@ -557,23 +544,6 @@ def reviewers(self, source):
and not reviewer.is_apply_staff
]

def partners_updated_applicant(self, added, removed, **kwargs):
if added:
return self.render_message(
"messages/email/partners_update_applicant.html", added=added, **kwargs
)

def partners_updated_partner(self, added, removed, **kwargs):
if added:
recipient = kwargs["recipient"]
# Pass the user object to render_message rather than the email string
recipient_obj = User.objects.get(email__exact=recipient)
kwargs["recipient"] = recipient_obj

return self.render_message(
"messages/email/partners_update_partner.html", **kwargs
)

def render_message(self, template, **kwargs):
with language(settings.LANGUAGE_CODE):
text = render_to_string(template, kwargs, kwargs["request"])
Expand Down
3 changes: 0 additions & 3 deletions hypha/apply/activity/adapters/slack.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,6 @@ class SlackAdapter(AdapterBase):
),
MESSAGES.REVIEWERS_UPDATED: "reviewers_updated",
MESSAGES.BATCH_REVIEWERS_UPDATED: "handle_batch_reviewers",
MESSAGES.PARTNERS_UPDATED: _(
"{user} has updated the partners on <{link}|{source.title_text_display}>"
),
MESSAGES.TRANSITION: _(
"{user} has updated the status of <{link}|{source.title_text_display}>: {old_phase.display_name} → {source.phase.display_name}"
),
Expand Down
9 changes: 1 addition & 8 deletions hypha/apply/activity/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,8 @@ class Meta:
}

def __init__(self, *args, user=None, **kwargs):
# Get `submission_partner_list` kwarg and remove it before initializing parent.
submission_partner_list = None
if "submission_partner_list" in kwargs:
submission_partner_list = kwargs.pop("submission_partner_list")

super().__init__(*args, **kwargs)
self.visibility_choices = self._meta.model.visibility_choices_for(
user, submission_partner_list
)
self.visibility_choices = self._meta.model.visibility_choices_for(user)
visibility = self.fields["visibility"]
# Set default visibility to "Applicant" for staff and staff can view everything.
visibility.initial = self.visibility_choices[0]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ class Migration(migrations.Migration):
("INVITED_TO_PROPOSAL", "Invited To Proposal"),
("REVIEWERS_UPDATED", "Reviewers Updated"),
("BATCH_REVIEWERS_UPDATED", "Batch Reviewers Updated"),
("PARTNERS_UPDATED", "Partners Updated"),
("READY_FOR_REVIEW", "Ready For Review"),
("BATCH_READY_FOR_REVIEW", "Batch Ready For Review"),
("NEW_REVIEW", "New Review"),
Expand Down
20 changes: 20 additions & 0 deletions hypha/apply/activity/migrations/0089_remove_partner_perms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 5.2.12 on 2026-03-25 18:29

from django.db import migrations

from hypha.apply.activity.models import APPLICANT


def convert_partner_perms_to_applicant(apps, schema_editor):
Activity = apps.get_model("activity", "Activity")

# Encompasses both "partner" & "applicant partner" visibilities
Activity.objects.filter(visibility__contains="partner").update(visibility=APPLICANT)


class Migration(migrations.Migration):
dependencies = [
("activity", "0088_activity_deleted"),
]

operations = [migrations.RunPython(convert_partner_perms_to_applicant)]
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Generated by Django 5.2.12 on 2026-03-31 14:52

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("activity", "0089_remove_partner_perms"),
]

operations = [
migrations.AlterField(
model_name="activity",
name="visibility",
field=models.CharField(
choices=[
("applicant", "Applicants"),
("team", "Staff only"),
("reviewers", "Reviewers"),
("all", "All"),
],
default="applicant",
max_length=30,
),
),
migrations.AlterField(
model_name="event",
name="type",
field=models.CharField(
choices=[
("UPDATE_LEAD", "updated lead"),
("BATCH_UPDATE_LEAD", "batch updated lead"),
("EDIT_SUBMISSION", "edited submission"),
("APPLICANT_EDIT", "edited applicant"),
("NEW_SUBMISSION", "submitted new submission"),
("DRAFT_SUBMISSION", "submitted new draft submission"),
("SCREENING", "screened"),
("TRANSITION", "transitioned"),
("BATCH_TRANSITION", "batch transitioned"),
("DETERMINATION_OUTCOME", "sent determination outcome"),
("BATCH_DETERMINATION_OUTCOME", "sent batch determination outcome"),
("INVITED_TO_PROPOSAL", "invited to proposal"),
("REVIEWERS_UPDATED", "updated reviewers"),
("BATCH_REVIEWERS_UPDATED", "batch updated reviewers"),
("READY_FOR_REVIEW", "marked ready for review"),
("BATCH_READY_FOR_REVIEW", "marked batch ready for review"),
("NEW_REVIEW", "added new review"),
("COMMENT", "added comment"),
("PROPOSAL_SUBMITTED", "submitted proposal"),
("OPENED_SEALED", "opened sealed submission"),
("REVIEW_OPINION", "reviewed opinion"),
("DELETE_SUBMISSION", "deleted submission"),
("DELETE_REVIEW", "deleted review"),
("DELETE_REVIEW_OPINION", "deleted review opinion"),
("CREATED_PROJECT", "created project"),
("UPDATE_PROJECT_LEAD", "updated project lead"),
("UPDATE_PROJECT_TITLE", "updated project title"),
("EDIT_REVIEW", "edited review"),
("SEND_FOR_APPROVAL", "sent for approval"),
("APPROVE_PROJECT", "approved project"),
("ASSIGN_PAF_APPROVER", "assign project form approver"),
("APPROVE_PAF", "approved project form"),
("PROJECT_TRANSITION", "transitioned project"),
("REQUEST_PROJECT_CHANGE", "requested project change"),
("SUBMIT_CONTRACT_DOCUMENTS", "submitted contract documents"),
("UPLOAD_DOCUMENT", "uploaded document to project"),
("UPLOAD_CONTRACT", "uploaded contract to project"),
("APPROVE_CONTRACT", "approved contract"),
("CREATE_INVOICE", "created invoice for project"),
("UPDATE_INVOICE_STATUS", "updated invoice status"),
("APPROVE_INVOICE", "approve invoice"),
("DELETE_INVOICE", "deleted invoice"),
("SENT_TO_COMPLIANCE", "sent project to compliance"),
("UPDATE_INVOICE", "updated invoice"),
("SUBMIT_REPORT", "submitted report"),
("SKIPPED_REPORT", "skipped report"),
("REPORT_FREQUENCY_CHANGED", "changed report frequency"),
("DISABLED_REPORTING", "disabled reporting"),
("REPORT_NOTIFY", "notified report"),
("REVIEW_REMINDER", "reminder to review"),
("BATCH_DELETE_SUBMISSION", "batch deleted submissions"),
("BATCH_ARCHIVE_SUBMISSION", "batch archive submissions"),
("BATCH_INVOICE_STATUS_UPDATE", "batch update invoice status"),
("STAFF_ACCOUNT_CREATED", "created new account"),
("STAFF_ACCOUNT_EDITED", "edited account"),
("ARCHIVE_SUBMISSION", "archived submission"),
("UNARCHIVE_SUBMISSION", "unarchived submission"),
("REMOVE_TASK", "remove task"),
("INVITE_COAPPLICANT", "invite co-applicant"),
],
max_length=50,
verbose_name="verb",
),
),
]
Loading
Loading