Skip to content

Commit 16469a1

Browse files
committed
Добавлены даты окончания подачи и оценки проектов в модель программы
1 parent d4eac09 commit 16469a1

6 files changed

Lines changed: 77 additions & 1 deletion

File tree

partner_programs/admin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class Meta:
8484
(
8585
"datetime_started",
8686
"datetime_registration_ends",
87+
"datetime_project_submission_ends",
88+
"datetime_evaluation_ends",
8789
"datetime_finished",
8890
),
8991
(
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Generated by Django 4.2.11 on 2025-12-19 06:26
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("partner_programs", "0013_partnerprogram_max_project_rates"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="partnerprogram",
15+
name="datetime_evaluation_ends",
16+
field=models.DateTimeField(
17+
blank=True, null=True, verbose_name="Дата окончания оценки проектов"
18+
),
19+
),
20+
migrations.AddField(
21+
model_name="partnerprogram",
22+
name="datetime_project_submission_ends",
23+
field=models.DateTimeField(
24+
blank=True,
25+
help_text="Если не указано, используется дата окончания регистрации",
26+
null=True,
27+
verbose_name="Дата окончания подачи проектов",
28+
),
29+
),
30+
]

partner_programs/models.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.contrib.auth import get_user_model
22
from django.core.exceptions import ValidationError
33
from django.db import models
4+
from django.utils import timezone
45

56
from files.models import UserFile
67
from partner_programs.constants import get_default_data_schema
@@ -115,6 +116,17 @@ class PartnerProgram(models.Model):
115116
datetime_registration_ends = models.DateTimeField(
116117
verbose_name="Дата окончания регистрации",
117118
)
119+
datetime_project_submission_ends = models.DateTimeField(
120+
null=True,
121+
blank=True,
122+
verbose_name="Дата окончания подачи проектов",
123+
help_text="Если не указано, используется дата окончания регистрации",
124+
)
125+
datetime_evaluation_ends = models.DateTimeField(
126+
null=True,
127+
blank=True,
128+
verbose_name="Дата окончания оценки проектов",
129+
)
118130
datetime_started = models.DateTimeField(
119131
verbose_name="Дата начала",
120132
)
@@ -143,6 +155,14 @@ class Meta:
143155
def __str__(self):
144156
return f"PartnerProgram<{self.pk}> - {self.name}"
145157

158+
def get_project_submission_deadline(self):
159+
"""Возвращает дедлайн подачи проектов: отдельное поле или дата окончания регистрации."""
160+
return self.datetime_project_submission_ends or self.datetime_registration_ends
161+
162+
def is_project_submission_open(self) -> bool:
163+
deadline = self.get_project_submission_deadline()
164+
return deadline is None or deadline >= timezone.now()
165+
146166

147167
class PartnerProgramUserProfile(models.Model):
148168
"""

partner_programs/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class Meta:
4949
"short_description",
5050
"registration_link",
5151
"datetime_registration_ends",
52+
"datetime_project_submission_ends",
53+
"datetime_evaluation_ends",
5254
"datetime_started",
5355
"datetime_finished",
5456
"views_count",
@@ -116,6 +118,8 @@ class Meta:
116118
"registration_link",
117119
"views_count",
118120
"datetime_registration_ends",
121+
"datetime_project_submission_ends",
122+
"datetime_evaluation_ends",
119123
"is_user_manager",
120124
)
121125

@@ -137,6 +141,8 @@ class Meta:
137141
"presentation_address",
138142
"registration_link",
139143
"datetime_registration_ends",
144+
"datetime_project_submission_ends",
145+
"datetime_evaluation_ends",
140146
"is_user_manager",
141147
)
142148

projects/helpers.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,28 @@ def update_partner_program(
109109
clear_project_existing_from_profile(user, instance)
110110
else:
111111
partner_program = PartnerProgram.objects.get(pk=program_id)
112-
existing_program_id: int | None = clear_project_existing_from_profile(user, instance)
112+
existing_program_profile = (
113+
PartnerProgramUserProfile.objects.select_related("partner_program")
114+
.filter(user=user, project=instance)
115+
.first()
116+
)
117+
existing_program_id: int | None = (
118+
existing_program_profile.partner_program_id
119+
if existing_program_profile
120+
else None
121+
)
122+
123+
submission_deadline = partner_program.get_project_submission_deadline()
124+
if submission_deadline and submission_deadline < timezone.now():
125+
raise ValidationError({"error": "Срок подачи проектов в программу завершён."})
113126

114127
if (
115128
partner_program.datetime_finished < timezone.now()
116129
and (existing_program_id != program_id)
117130
):
118131
raise ValidationError({"error": "Cannot select a completed program."})
119132

133+
clear_project_existing_from_profile(user, instance)
120134
partner_program_profile = PartnerProgramUserProfile.objects.get(
121135
user=user,
122136
partner_program=partner_program,

projects/permissions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ def has_permission(self, request, view):
204204
except PartnerProgram.DoesNotExist:
205205
raise ValidationError({"partner_program_id": "Программа не найдена."})
206206

207+
submission_deadline = program.get_project_submission_deadline()
208+
if submission_deadline and submission_deadline < timezone.now():
209+
raise ValidationError({"partner_program_id": "Срок подачи проектов в программу завершён."})
210+
207211
if program.is_manager(request.user):
208212
return True
209213

0 commit comments

Comments
 (0)