Skip to content

Commit 8a12a10

Browse files
authored
Merge pull request #521 from PROCOLLAB-github/feature/project-mospolytech-data
Feature/project mospolytech data
2 parents 2cf2708 + 99c392e commit 8a12a10

4 files changed

Lines changed: 212 additions & 9 deletions

File tree

projects/admin.py

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from django.contrib import admin
22

33
from projects.models import (
4-
DefaultProjectCover,
5-
Project,
64
Achievement,
75
Collaborator,
6+
DefaultProjectCover,
7+
Project,
88
ProjectLink,
99
ProjectNews,
1010
)
@@ -17,11 +17,79 @@ class ProjectAdmin(admin.ModelAdmin):
1717
"name",
1818
"draft",
1919
"is_company",
20+
"track",
21+
"direction",
22+
"specialty",
2023
)
2124
list_display_links = (
2225
"id",
2326
"name",
2427
)
28+
search_fields = (
29+
"name",
30+
"track",
31+
"specialty",
32+
)
33+
list_filter = (
34+
"draft",
35+
"is_company",
36+
"track",
37+
"direction",
38+
"specialty",
39+
)
40+
41+
fieldsets = (
42+
(
43+
"Основная информация",
44+
{
45+
"fields": (
46+
"name",
47+
"description",
48+
"leader",
49+
"industry",
50+
"region",
51+
"step",
52+
"draft",
53+
"is_company",
54+
)
55+
},
56+
),
57+
(
58+
"Для проектов ПД МосПолитеха",
59+
{
60+
"fields": (
61+
"track",
62+
"direction",
63+
"specialty",
64+
"actuality",
65+
"goal",
66+
"problem",
67+
)
68+
},
69+
),
70+
(
71+
"Медиа и обложка",
72+
{
73+
"fields": (
74+
"presentation_address",
75+
"image_address",
76+
"cover",
77+
"cover_image_address",
78+
)
79+
},
80+
),
81+
(
82+
"Служебные поля",
83+
{
84+
"fields": (
85+
"hidden_score",
86+
"datetime_created",
87+
"datetime_updated",
88+
)
89+
},
90+
),
91+
)
92+
readonly_fields = ("datetime_created", "datetime_updated")
2593

2694

2795
@admin.register(ProjectNews)
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Generated by Django 4.2.11 on 2025-07-03 08:53
2+
3+
import django.core.validators
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("projects", "0023_project_cover_image_address"),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name="project",
16+
name="actuality",
17+
field=models.TextField(
18+
blank=True,
19+
help_text="Почему проект важен (до 1000\u202fсимв.)",
20+
null=True,
21+
validators=[django.core.validators.MaxLengthValidator(1000)],
22+
verbose_name="Актуальность",
23+
),
24+
),
25+
migrations.AddField(
26+
model_name="project",
27+
name="direction",
28+
field=models.CharField(
29+
blank=True,
30+
help_text="Более общее направление деятельности проекта",
31+
max_length=256,
32+
null=True,
33+
verbose_name="Направление",
34+
),
35+
),
36+
migrations.AddField(
37+
model_name="project",
38+
name="goal",
39+
field=models.CharField(
40+
blank=True,
41+
help_text="Главная цель проекта (до 500\u202fсимв.)",
42+
max_length=500,
43+
null=True,
44+
verbose_name="Цель",
45+
),
46+
),
47+
migrations.AddField(
48+
model_name="project",
49+
name="problem",
50+
field=models.TextField(
51+
blank=True,
52+
help_text="Какую проблему решает проект (до 1000\u202fсимв.)",
53+
null=True,
54+
validators=[django.core.validators.MaxLengthValidator(1000)],
55+
verbose_name="Проблема",
56+
),
57+
),
58+
migrations.AddField(
59+
model_name="project",
60+
name="specialty",
61+
field=models.CharField(
62+
blank=True,
63+
help_text="Специализация проекта",
64+
max_length=256,
65+
null=True,
66+
verbose_name="Специальность",
67+
),
68+
),
69+
migrations.AddField(
70+
model_name="project",
71+
name="track",
72+
field=models.CharField(
73+
blank=True,
74+
help_text="Направление/курс, в рамках которого реализуется проект",
75+
max_length=256,
76+
null=True,
77+
verbose_name="Трек",
78+
),
79+
),
80+
]

projects/models.py

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
from django.contrib.auth import get_user_model
44
from django.contrib.contenttypes.fields import GenericRelation
5+
from django.core.validators import MaxLengthValidator
56
from django.db import models
67
from django.db.models import UniqueConstraint
78

89
from core.models import Like, View
910
from files.models import UserFile
1011
from industries.models import Industry
11-
1212
from projects.constants import VERBOSE_STEPS
1313
from projects.managers import AchievementManager, CollaboratorManager, ProjectManager
1414
from users.models import CustomUser
@@ -53,7 +53,11 @@ def get_random_file(cls):
5353
@classmethod
5454
def get_random_file_link(cls):
5555
# FIXME: this is not efficient, but for ~10 default covers it should be ok
56-
return cls.objects.order_by("?").first().image.link if cls.objects.order_by("?").first().image else None
56+
return (
57+
cls.objects.order_by("?").first().image.link
58+
if cls.objects.order_by("?").first().image
59+
else None
60+
)
5761

5862
class Meta:
5963
verbose_name = "Обложка проекта"
@@ -85,9 +89,54 @@ class Project(models.Model):
8589
name = models.CharField(max_length=256, null=True, blank=True)
8690
description = models.TextField(null=True, blank=True)
8791
region = models.CharField(max_length=256, null=True, blank=True)
88-
step = models.PositiveSmallIntegerField(choices=VERBOSE_STEPS, null=True, blank=True)
92+
step = models.PositiveSmallIntegerField(
93+
choices=VERBOSE_STEPS, null=True, blank=True
94+
)
8995
hidden_score = models.PositiveSmallIntegerField(default=100)
9096

97+
track = models.CharField(
98+
max_length=256,
99+
blank=True,
100+
null=True,
101+
verbose_name="Трек",
102+
help_text="Направление/курс, в рамках которого реализуется проект",
103+
)
104+
direction = models.CharField(
105+
max_length=256,
106+
blank=True,
107+
null=True,
108+
verbose_name="Направление",
109+
help_text="Более общее направление деятельности проекта",
110+
)
111+
specialty = models.CharField(
112+
max_length=256,
113+
blank=True,
114+
null=True,
115+
verbose_name="Специальность",
116+
help_text="Специализация проекта",
117+
)
118+
actuality = models.TextField(
119+
blank=True,
120+
null=True,
121+
validators=[MaxLengthValidator(1000)],
122+
verbose_name="Актуальность",
123+
help_text="Почему проект важен (до 1000 симв.)",
124+
)
125+
goal = models.CharField(
126+
max_length=500,
127+
blank=True,
128+
null=True,
129+
verbose_name="Цель",
130+
help_text="Главная цель проекта (до 500 симв.)",
131+
)
132+
problem = models.TextField(
133+
blank=True,
134+
null=True,
135+
validators=[MaxLengthValidator(1000)],
136+
verbose_name="Проблема",
137+
help_text="Какую проблему решает проект (до 1000 симв.)",
138+
)
139+
91140
industry = models.ForeignKey(
92141
Industry,
93142
on_delete=models.SET_NULL,

projects/serializers.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
from django.contrib.auth import get_user_model
2-
from rest_framework import serializers
32
from django.core.cache import cache
3+
from rest_framework import serializers
4+
45
from core.serializers import SkillToObjectSerializer
5-
from core.services import get_views_count, get_likes_count, is_fan
6+
from core.services import get_likes_count, get_views_count, is_fan
67
from core.utils import get_user_online_cache_key
78
from files.serializers import UserFileSerializer
89
from industries.models import Industry
9-
from projects.models import Project, Achievement, Collaborator, ProjectNews
10+
from projects.models import Achievement, Collaborator, Project, ProjectNews
1011
from projects.validators import validate_project
1112
from vacancy.serializers import ProjectVacancyListSerializer
1213

@@ -64,7 +65,6 @@ class Meta:
6465

6566

6667
class ProjectDetailSerializer(serializers.ModelSerializer):
67-
6868
achievements = AchievementListSerializer(many=True, read_only=True)
6969
cover = UserFileSerializer(required=False)
7070
collaborators = CollaboratorSerializer(
@@ -130,6 +130,12 @@ class Meta:
130130
"cover",
131131
"cover_image_address",
132132
"partner_programs_tags",
133+
"track",
134+
"direction",
135+
"specialty",
136+
"actuality",
137+
"goal",
138+
"problem",
133139
]
134140
read_only_fields = [
135141
"leader",

0 commit comments

Comments
 (0)