Skip to content

Commit d90c3b8

Browse files
authored
Merge pull request #563 from PROCOLLAB-github/release/minor_fixes
Расширена модель программы, в выдачу данных о проектах добавлено дополнительное поле
2 parents eb30bdb + f588677 commit d90c3b8

6 files changed

Lines changed: 84 additions & 3 deletions

File tree

partner_programs/admin.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import urllib.parse
33

44
import tablib
5+
from django import forms
56
from django.contrib import admin
67
from django.db.models import QuerySet
78
from django.http import HttpRequest, HttpResponse
@@ -37,7 +38,19 @@ class PartnerProgramFieldInline(admin.TabularInline):
3738

3839
@admin.register(PartnerProgram)
3940
class PartnerProgramAdmin(admin.ModelAdmin):
41+
class PartnerProgramAdminForm(forms.ModelForm):
42+
class Meta:
43+
model = PartnerProgram
44+
fields = "__all__"
45+
widgets = {
46+
"name": forms.TextInput(attrs={"size": 80}),
47+
"tag": forms.TextInput(attrs={"size": 80}),
48+
"description": forms.Textarea(attrs={"rows": 4, "cols": 82}),
49+
"city": forms.TextInput(attrs={"size": 80}),
50+
}
51+
4052
inlines = [PartnerProgramMaterialInline, PartnerProgramFieldInline]
53+
form = PartnerProgramAdminForm
4154
list_display = ("id", "name", "tag", "city", "datetime_created")
4255
list_display_links = (
4356
"id",
@@ -53,8 +66,39 @@ class PartnerProgramAdmin(admin.ModelAdmin):
5366
)
5467
list_filter = ("city",)
5568

56-
filter_horizontal = ("users", "managers")
69+
filter_horizontal = ("managers",)
5770
date_hierarchy = "datetime_started"
71+
readonly_fields = ("datetime_created", "datetime_updated")
72+
fieldsets = (
73+
(
74+
None,
75+
{
76+
"fields": (
77+
"name",
78+
"tag",
79+
"description",
80+
"city",
81+
"is_competitive",
82+
"projects_availability",
83+
"draft",
84+
(
85+
"datetime_started",
86+
"datetime_registration_ends",
87+
"datetime_finished",
88+
),
89+
(
90+
"image_address",
91+
"cover_image_address",
92+
"advertisement_image_address",
93+
),
94+
("presentation_address", "registration_link"),
95+
"data_schema",
96+
)
97+
},
98+
),
99+
("Менеджеры программы", {"fields": ("managers",)}),
100+
("Служебная информация", {"fields": ("datetime_created", "datetime_updated")}),
101+
)
58102

59103
def get_queryset(self, request: HttpRequest) -> QuerySet[PartnerProgram]:
60104
qs = super().get_queryset(request)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 4.2.24 on 2025-10-31 10:20
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('partner_programs', '0011_partnerprogram_is_competitive_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='partnerprogram',
15+
name='registration_link',
16+
field=models.URLField(blank=True, help_text='Адрес страницы регистрации (например, на Tilda)', null=True, verbose_name='Ссылка на регистрацию'),
17+
),
18+
]

partner_programs/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,12 @@ class PartnerProgram(models.Model):
7373
blank=True,
7474
verbose_name="Ссылка на презентацию",
7575
)
76+
registration_link = models.URLField(
77+
null=True,
78+
blank=True,
79+
verbose_name="Ссылка на регистрацию",
80+
help_text="Адрес страницы регистрации (например, на Tilda)",
81+
)
7682
data_schema = models.JSONField(
7783
verbose_name="Схема данных в формате JSON",
7884
help_text="Ключи - имена полей, значения - тип поля ввода",

partner_programs/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Meta:
4545
"name",
4646
"image_address",
4747
"short_description",
48+
"registration_link",
4849
"datetime_registration_ends",
4950
"datetime_started",
5051
"datetime_finished",
@@ -110,6 +111,7 @@ class Meta:
110111
"image_address",
111112
"cover_image_address",
112113
"presentation_address",
114+
"registration_link",
113115
"views_count",
114116
"datetime_registration_ends",
115117
"is_user_manager",
@@ -131,6 +133,7 @@ class Meta:
131133
"cover_image_address",
132134
"advertisement_image_address",
133135
"presentation_address",
136+
"registration_link",
134137
"datetime_registration_ends",
135138
"is_user_manager",
136139
)

projects/managers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def get_draft_projects_for_user(self):
1616

1717
class ProjectManager(Manager):
1818
def get_projects_for_list_view(self):
19-
return self.get_queryset().filter(draft=False)
19+
return self.get_queryset().filter(draft=False).prefetch_related("program_links")
2020

2121
def get_user_projects_for_list_view(self):
2222
return self.get_queryset().distinct()

projects/serializers.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ class Meta:
334334
class ProjectListSerializer(serializers.ModelSerializer):
335335
views_count = serializers.SerializerMethodField(method_name="count_views")
336336
short_description = serializers.SerializerMethodField()
337+
partner_program_id = serializers.SerializerMethodField()
337338

338339
@classmethod
339340
def count_views(cls, project):
@@ -343,6 +344,14 @@ def count_views(cls, project):
343344
def get_short_description(cls, project):
344345
return project.get_short_description()
345346

347+
@staticmethod
348+
def get_partner_program_id(project):
349+
links_cache = getattr(project, "_prefetched_objects_cache", {}).get(
350+
"program_links"
351+
)
352+
link = links_cache[0] if links_cache else project.program_links.first()
353+
return link.partner_program_id if link else None
354+
346355
class Meta:
347356
model = Project
348357
fields = [
@@ -354,9 +363,10 @@ class Meta:
354363
"industry",
355364
"views_count",
356365
"is_company",
366+
"partner_program_id",
357367
]
358368

359-
read_only_fields = ["leader", "views_count", "is_company"]
369+
read_only_fields = ["leader", "views_count", "is_company", "partner_program_id"]
360370

361371
def is_valid(self, *, raise_exception=False):
362372
return super().is_valid(raise_exception=raise_exception)

0 commit comments

Comments
 (0)