Skip to content

Commit 601a02a

Browse files
committed
Merge remote-tracking branch 'origin/main' into themes
* origin/main: Fix report file path issue and duplicate file issue, Fix file path issue for Project and SOW Form (#4580) Use xhtml2pdf inplace of reportlab for submission pdf export (#4577) Fix co-applicant permission for Partners, Reviewers, and Community Reviewers (#4583) Migrate django-fsm to django-viewflow (#4561) Delete application comments with the application (#4585)
2 parents 88b8fe6 + eb6f9a0 commit 601a02a

27 files changed

Lines changed: 2129 additions & 2370 deletions

hypha/apply/funds/files.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,24 @@ class PrivateStreamFieldFile(StreamFieldFile):
2222

2323
def get_entity_id(self):
2424
from hypha.apply.funds.models import ApplicationRevision
25-
from hypha.apply.projects.reports.models import ReportVersion
25+
from hypha.apply.projects.models.project import Project, ProjectSOW
26+
from hypha.apply.projects.reports.models import Report, ReportVersion
2627

2728
entity_id = self.instance.pk
2829

29-
if isinstance(self.instance, ApplicationRevision):
30+
if isinstance(self.instance, ApplicationRevision) or isinstance(
31+
self.instance, Project
32+
):
3033
entity_id = self.instance.submission.pk
34+
elif isinstance(self.instance, Report) or isinstance(self.instance, ProjectSOW):
35+
entity_id = self.instance.project.submission.pk
3136
elif isinstance(self.instance, ReportVersion):
3237
# Reports are project documents.
33-
entity_id = self.instance.report.project.pk
38+
entity_id = self.instance.report.project.submission.pk
3439
return entity_id
3540

3641
def generate_filename(self):
37-
from hypha.apply.projects.reports.models import ReportVersion
38-
3942
path_start = "submission"
40-
if isinstance(self.instance, ReportVersion):
41-
path_start = "project"
4243
return generate_private_file_path(
4344
self.get_entity_id(),
4445
self.field.id,
@@ -48,14 +49,10 @@ def generate_filename(self):
4849

4950
@property
5051
def url(self):
51-
from hypha.apply.projects.reports.models import ReportVersion
52-
5352
view_name = "apply:submissions:serve_private_media"
5453
kwargs = {
5554
"pk": self.get_entity_id(),
5655
"field_id": self.field.id,
5756
"file_name": self.basename,
5857
}
59-
if isinstance(self.instance, ReportVersion):
60-
view_name = "apply:projects:document"
6158
return reverse(viewname=view_name, kwargs=kwargs)

hypha/apply/funds/migrations/0033_use_django_fsm.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Generated by Django 2.0.2 on 2018-06-11 16:14
22

33
from django.db import migrations, models
4-
import django_fsm
54

65

76
class Migration(migrations.Migration):
@@ -13,8 +12,9 @@ class Migration(migrations.Migration):
1312
migrations.AlterField(
1413
model_name="applicationsubmission",
1514
name="status",
16-
field=django_fsm.FSMField(
17-
default="in_discussion", max_length=50, protected=True
15+
field=models.CharField(
16+
default="in_discussion",
17+
max_length=50,
1818
),
1919
),
2020
migrations.AlterField(
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Generated by Django 4.2.22 on 2025-06-10 13:09
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("funds", "0129_coapplicantinvite_project_permission"),
9+
]
10+
11+
operations = [
12+
migrations.AlterField(
13+
model_name="applicationsubmission",
14+
name="status",
15+
field=models.CharField(
16+
choices=[
17+
("accepted", "Accepted"),
18+
("almost", "Accepted but additional info required"),
19+
("com_accepted", "Accepted"),
20+
("com_almost", "Accepted but additional info required"),
21+
("com_community_review", "Community Review"),
22+
("com_determination", "Ready for Determination"),
23+
("com_external_review", "External Review"),
24+
("com_internal_review", "Internal Review"),
25+
("com_more_info", "More information required"),
26+
("com_open_call", "Open Call (public)"),
27+
("com_post_external_review_discussion", "Ready For Discussion"),
28+
("com_post_external_review_more_info", "More information required"),
29+
("com_post_review_discussion", "Ready For Discussion"),
30+
("com_post_review_more_info", "More information required"),
31+
("com_rejected", "Dismissed"),
32+
("concept_determination", "Ready for Preliminary Determination"),
33+
("concept_internal_review", "Internal Review"),
34+
("concept_more_info", "More information required"),
35+
("concept_rejected", "Dismissed"),
36+
("concept_review_discussion", "Ready For Discussion"),
37+
("concept_review_more_info", "More information required"),
38+
("determination", "Ready for Determination"),
39+
("draft", "Draft"),
40+
("draft_proposal", "Invited for Proposal"),
41+
("ext_accepted", "Accepted"),
42+
("ext_almost", "Accepted but additional info required"),
43+
("ext_determination", "Ready for Determination"),
44+
("ext_external_review", "External Review"),
45+
("ext_internal_review", "Internal Review"),
46+
("ext_more_info", "More information required"),
47+
("ext_post_external_review_discussion", "Ready For Discussion"),
48+
("ext_post_external_review_more_info", "More information required"),
49+
("ext_post_review_discussion", "Ready For Discussion"),
50+
("ext_post_review_more_info", "More information required"),
51+
("ext_rejected", "Dismissed"),
52+
("external_review", "External Review"),
53+
("in_discussion", "Need screening"),
54+
("internal_review", "Internal Review"),
55+
("invited_to_proposal", "Concept Accepted"),
56+
("more_info", "More information required"),
57+
("post_external_review_discussion", "Ready For Discussion"),
58+
("post_external_review_more_info", "More information required"),
59+
("post_proposal_review_discussion", "Ready For Discussion"),
60+
("post_proposal_review_more_info", "More information required"),
61+
("post_review_discussion", "Ready For Discussion"),
62+
("post_review_more_info", "More information required"),
63+
("proposal_accepted", "Accepted"),
64+
("proposal_almost", "Accepted but additional info required"),
65+
("proposal_determination", "Ready for Final Determination"),
66+
("proposal_discussion", "Proposal Received"),
67+
("proposal_internal_review", "Internal Review"),
68+
("proposal_more_info", "More information required"),
69+
("proposal_rejected", "Dismissed"),
70+
("rejected", "Dismissed"),
71+
("same_accepted", "Accepted"),
72+
("same_almost", "Accepted but additional info required"),
73+
("same_determination", "Ready for Determination"),
74+
("same_internal_review", "Review"),
75+
("same_more_info", "More information required"),
76+
("same_post_review_discussion", "Ready For Discussion"),
77+
("same_post_review_more_info", "More information required"),
78+
("same_rejected", "Dismissed"),
79+
],
80+
default="in_discussion",
81+
max_length=100,
82+
),
83+
),
84+
]

hypha/apply/funds/models/mixins.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,3 +385,20 @@ def get_answer_from_label(self, label):
385385
if answer and not answer == "N":
386386
return answer
387387
return None
388+
389+
def get_text_questions_answers_as_dict(self):
390+
data_dict = {}
391+
for field_id in self.question_text_field_ids:
392+
if field_id not in self.named_blocks:
393+
question_field = self.serialize(field_id)
394+
if isinstance(question_field["answer"], str):
395+
answer = question_field["answer"]
396+
else:
397+
answer = ",".join(question_field["answer"])
398+
if answer and not answer == "None":
399+
data_dict[question_field["question"]] = answer
400+
elif question_field["type"] == "checkbox":
401+
data_dict[question_field["question"]] = False
402+
else:
403+
data_dict[question_field["question"]] = "-"
404+
return data_dict

0 commit comments

Comments
 (0)