Skip to content

Commit 76b71e7

Browse files
authored
Merge pull request #597 from PROCOLLAB-github/fix/project-submit-deadline
Сдача проекта блокируется после дедлайну, изменения учтены в can_submit
2 parents f0c58b2 + 663cf20 commit 76b71e7

3 files changed

Lines changed: 93 additions & 1 deletion

File tree

partner_programs/tests.py

Lines changed: 82 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.test import TestCase
33
from django.utils import timezone
4+
from rest_framework.test import APIRequestFactory, force_authenticate
45

56
from partner_programs.models import (
67
PartnerProgram,
@@ -10,6 +11,7 @@
1011
)
1112
from partner_programs.serializers import PartnerProgramFieldValueUpdateSerializer
1213
from partner_programs.services import publish_finished_program_projects
14+
from partner_programs.views import PartnerProgramProjectSubmitView
1315
from projects.models import Project
1416

1517

@@ -237,6 +239,86 @@ def test_publish_after_flag_enabled_post_finish(self):
237239
self.assertTrue(project.is_public)
238240

239241

242+
class PartnerProgramProjectSubmitViewTests(TestCase):
243+
def setUp(self):
244+
self.factory = APIRequestFactory()
245+
self.view = PartnerProgramProjectSubmitView.as_view()
246+
self.now = timezone.now()
247+
self.user = get_user_model().objects.create_user(
248+
email="leader@example.com",
249+
password="pass",
250+
first_name="Leader",
251+
last_name="User",
252+
birthday="1990-01-01",
253+
)
254+
255+
def create_program(self, **overrides):
256+
defaults = {
257+
"name": "Program",
258+
"tag": "program_tag",
259+
"description": "Program description",
260+
"city": "Moscow",
261+
"data_schema": {},
262+
"draft": False,
263+
"projects_availability": "all_users",
264+
"datetime_registration_ends": self.now + timezone.timedelta(days=10),
265+
"datetime_started": self.now - timezone.timedelta(days=1),
266+
"datetime_finished": self.now + timezone.timedelta(days=30),
267+
"is_competitive": True,
268+
}
269+
defaults.update(overrides)
270+
return PartnerProgram.objects.create(**defaults)
271+
272+
def create_project_link(self, program):
273+
project = Project.objects.create(
274+
leader=self.user,
275+
draft=False,
276+
is_public=False,
277+
name="Project",
278+
)
279+
return PartnerProgramProject.objects.create(
280+
partner_program=program,
281+
project=project,
282+
)
283+
284+
def test_submit_blocked_after_deadline(self):
285+
program = self.create_program(
286+
datetime_project_submission_ends=self.now - timezone.timedelta(days=1)
287+
)
288+
link = self.create_project_link(program)
289+
290+
request = self.factory.post(
291+
f"partner-program-projects/{link.pk}/submit/"
292+
)
293+
force_authenticate(request, user=self.user)
294+
response = self.view(request, pk=link.pk)
295+
296+
self.assertEqual(response.status_code, 400)
297+
self.assertEqual(
298+
response.data.get("detail"),
299+
"Срок подачи проектов в программу завершён.",
300+
)
301+
link.refresh_from_db()
302+
self.assertFalse(link.submitted)
303+
304+
def test_submit_allowed_before_deadline(self):
305+
program = self.create_program(
306+
datetime_project_submission_ends=self.now + timezone.timedelta(days=1)
307+
)
308+
link = self.create_project_link(program)
309+
310+
request = self.factory.post(
311+
f"partner-program-projects/{link.pk}/submit/"
312+
)
313+
force_authenticate(request, user=self.user)
314+
response = self.view(request, pk=link.pk)
315+
316+
self.assertEqual(response.status_code, 200)
317+
link.refresh_from_db()
318+
self.assertTrue(link.submitted)
319+
self.assertIsNotNone(link.datetime_submitted)
320+
321+
240322
class PartnerProgramFieldValueUpdateSerializerValidTests(TestCase):
241323
def setUp(self):
242324
now = timezone.now()

partner_programs/views.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,12 @@ def post(self, request, pk, *args, **kwargs):
514514
status=status.HTTP_400_BAD_REQUEST,
515515
)
516516

517+
if not program_project.partner_program.is_project_submission_open():
518+
return Response(
519+
{"detail": "Срок подачи проектов в программу завершён."},
520+
status=status.HTTP_400_BAD_REQUEST,
521+
)
522+
517523
program_project.submitted = True
518524
program_project.datetime_submitted = now()
519525
program_project.save()

projects/serializers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,11 @@ class Meta:
107107
]
108108

109109
def get_can_submit(self, obj):
110-
return obj.partner_program.is_competitive and not obj.submitted
110+
return (
111+
obj.partner_program.is_competitive
112+
and not obj.submitted
113+
and obj.partner_program.is_project_submission_open()
114+
)
111115

112116
def get_program_fields(self, obj):
113117
fields_qs = obj.partner_program.fields.all()

0 commit comments

Comments
 (0)