diff --git a/hypha/apply/activity/adapters/activity_feed.py b/hypha/apply/activity/adapters/activity_feed.py index 0c0a92817a..44e1c2ce25 100644 --- a/hypha/apply/activity/adapters/activity_feed.py +++ b/hypha/apply/activity/adapters/activity_feed.py @@ -50,6 +50,10 @@ class ActivityAdapter(AdapterBase): MESSAGES.CREATED_PROJECT: _( 'Created project with initial status of "{status}"' ), + MESSAGES.CREATED_SOW: _('Created SOW for project "{related.project}"'), + MESSAGES.EDITED_SOW: _('Edited SOW for project "{related.project}"'), + MESSAGES.CREATED_PF: _('Created project form for project "{related.project}"'), + MESSAGES.EDITED_PF: _('Edited project form for project "{related.project}"'), MESSAGES.PROJECT_TRANSITION: "handle_project_transition", MESSAGES.UPDATE_PROJECT_TITLE: _( "updated the project title from {old_title} to {source.title}" @@ -94,6 +98,10 @@ def extra_kwargs(self, message_type, source, sources, **kwargs): MESSAGES.DELETE_REVIEW_OPINION, MESSAGES.BATCH_REVIEWERS_UPDATED, MESSAGES.APPROVE_PROJECT, + MESSAGES.CREATED_SOW, + MESSAGES.EDITED_SOW, + MESSAGES.CREATED_PF, + MESSAGES.EDITED_PF, MESSAGES.REQUEST_PROJECT_CHANGE, MESSAGES.SEND_FOR_APPROVAL, MESSAGES.APPROVE_PAF, diff --git a/hypha/apply/activity/adapters/base.py b/hypha/apply/activity/adapters/base.py index 429428b643..161bf92984 100644 --- a/hypha/apply/activity/adapters/base.py +++ b/hypha/apply/activity/adapters/base.py @@ -21,6 +21,10 @@ MESSAGES.DELETE_REVIEW_OPINION: "review_opinion", MESSAGES.EDIT_REVIEW: "review", MESSAGES.CREATED_PROJECT: "submission", + MESSAGES.CREATED_SOW: "sow", + MESSAGES.EDITED_SOW: "sow", + MESSAGES.EDITED_PF: "pfp", + MESSAGES.CREATED_PF: "pfp", MESSAGES.PROJECT_TRANSITION: "old_stage", MESSAGES.APPROVE_PAF: "paf_approvals", # expect a list MESSAGES.UPDATE_PROJECT_LEAD: "old_lead", diff --git a/hypha/apply/activity/forms.py b/hypha/apply/activity/forms.py index e3359f75fe..3ccc43ea10 100644 --- a/hypha/apply/activity/forms.py +++ b/hypha/apply/activity/forms.py @@ -1,5 +1,6 @@ from django import forms from django.db import transaction +from django.forms.widgets import Textarea from django.utils.translation import gettext_lazy as _ from django_file_form.forms import FileFormMixin @@ -28,6 +29,10 @@ class Meta: "message", "visibility", "assign_to", + "related_content_type", + "related_object_id", + "source_content_type", + "source_object_id", ) labels = { "visibility": _("Visible to"), @@ -41,9 +46,13 @@ class Meta: widgets = { "visibility": forms.RadioSelect(), "message": PagedownWidget(), + "related_content_type": forms.HiddenInput(), + "related_object_id": forms.HiddenInput(), + "source_content_type": forms.HiddenInput(), + "source_object_id": forms.HiddenInput(), } - def __init__(self, *args, user=None, **kwargs): + def __init__(self, *args, user=None, mini=False, **kwargs): super().__init__(*args, **kwargs) self.visibility_choices = self._meta.model.visibility_choices_for(user) visibility = self.fields["visibility"] @@ -59,6 +68,11 @@ def __init__(self, *args, user=None, **kwargs): if not user.is_apply_staff: self.fields["assign_to"].widget = forms.HiddenInput() + if mini: + self.fields["message"].widget = Textarea( + attrs={"rows": 2, "placeholder": "Write a comment..."} + ) + @transaction.atomic def save(self, commit=True): instance = super().save(commit=True) diff --git a/hypha/apply/activity/migrations/0096_alter_event_type.py b/hypha/apply/activity/migrations/0096_alter_event_type.py new file mode 100644 index 0000000000..15db731f3e --- /dev/null +++ b/hypha/apply/activity/migrations/0096_alter_event_type.py @@ -0,0 +1,89 @@ +# Generated by Django 5.2.15 on 2026-07-21 15:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("activity", "0095_alter_event_type"), + ] + + operations = [ + 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"), + ("ANONYMIZE_SUBMISSION", "anonymized submission"), + ("DELETE_REVIEW", "deleted review"), + ("DELETE_REVIEW_OPINION", "deleted review opinion"), + ("CREATED_PROJECT", "created project"), + ("CREATED_SOW", "created a project SOW"), + ("EDITED_SOW", "edited a project SOW"), + ("CREATED_PF", "created a project form"), + ("EDITED_PF", "edited a project form"), + ("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"), + ("DELETE_REPORT", "deleted 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_ANONYMIZE_SUBMISSION", "batch anonymized 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"), + ("UPDATE_AUTHOR", "updated author"), + ], + max_length=50, + verbose_name="verb", + ), + ), + ] diff --git a/hypha/apply/activity/options.py b/hypha/apply/activity/options.py index 09e89ad2c2..160d284f0b 100644 --- a/hypha/apply/activity/options.py +++ b/hypha/apply/activity/options.py @@ -36,6 +36,10 @@ class MESSAGES(TextChoices): DELETE_REVIEW = "DELETE_REVIEW", _("deleted review") DELETE_REVIEW_OPINION = "DELETE_REVIEW_OPINION", _("deleted review opinion") CREATED_PROJECT = "CREATED_PROJECT", _("created project") + CREATED_SOW = "CREATED_SOW", _("created a project SOW") + EDITED_SOW = "EDITED_SOW", _("edited a project SOW") + CREATED_PF = "CREATED_PF", _("created a project form") + EDITED_PF = "EDITED_PF", _("edited a project form") UPDATE_PROJECT_LEAD = "UPDATE_PROJECT_LEAD", _("updated project lead") UPDATE_PROJECT_TITLE = "UPDATE_PROJECT_TITLE", _("updated project title") UPDATE_PROJECT_CONTRACT_NUMBER = ( diff --git a/hypha/apply/activity/templates/activity/partials/comment_form.html b/hypha/apply/activity/templates/activity/partials/comment_form.html new file mode 100644 index 0000000000..9d28bad50a --- /dev/null +++ b/hypha/apply/activity/templates/activity/partials/comment_form.html @@ -0,0 +1,37 @@ +{% comment %} +Renders the sidebar comments form. + +Params: + form – the CommentForm form +{% endcomment %} + +{% load i18n static heroicons %} + +
diff --git a/hypha/apply/activity/templates/activity/ui/activity-action-item.html b/hypha/apply/activity/templates/activity/ui/activity-action-item.html index 25643ec769..e72b179853 100644 --- a/hypha/apply/activity/templates/activity/ui/activity-action-item.html +++ b/hypha/apply/activity/templates/activity/ui/activity-action-item.html @@ -1,7 +1,16 @@ +{% comment %} +Renders a line item of activity including the message attached to the activity & an icon based on the message. + +Params: + activity – an Activity object to render into a timeline + no_timeline - bool of should the line item be styled as a piece of a larger timeline + mini - bool that will force including only essential elements of the action item +{% endcomment %} + {% load i18n activity_tags heroicons %} {% with activity|display_for:request.user as activity_text %} -