Skip to content

Commit bb803cf

Browse files
authored
Merge pull request #529 from PROCOLLAB-github/dev
Расширение моделей пользователя и проекта, интеграция данных МосПолитеха
2 parents 59301e6 + d8ee4ee commit bb803cf

25 files changed

Lines changed: 583 additions & 130 deletions

invites/admin.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,11 @@
55

66
@admin.register(Invite)
77
class InviteAdmin(admin.ModelAdmin):
8-
fields = ["project", "user", "motivational_letter", "role", "is_accepted"]
8+
fields = [
9+
"project",
10+
"user",
11+
"motivational_letter",
12+
"role",
13+
"specialization",
14+
"is_accepted",
15+
]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 4.2.11 on 2025-07-08 11:18
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("invites", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="invite",
15+
name="specialization",
16+
field=models.CharField(
17+
blank=True,
18+
default=None,
19+
max_length=100,
20+
null=True,
21+
verbose_name="Специализация",
22+
),
23+
),
24+
]

invites/models.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from django.db import models
2+
from django_stubs_ext.db.models import TypedModelMeta
23

34
from invites.managers import InviteManager
45
from projects.models import Project
56
from users.models import CustomUser
6-
from django_stubs_ext.db.models import TypedModelMeta
77

88

99
class Invite(models.Model):
@@ -27,6 +27,13 @@ class Invite(models.Model):
2727
max_length=4096, blank=True, null=True, default=None
2828
)
2929
role = models.CharField(max_length=128, blank=True, null=True)
30+
specialization = models.CharField(
31+
max_length=100,
32+
blank=True,
33+
null=True,
34+
default=None,
35+
verbose_name="Специализация",
36+
)
3037
is_accepted = models.BooleanField(blank=False, null=True, default=None)
3138

3239
datetime_created = models.DateTimeField(
@@ -39,7 +46,9 @@ class Invite(models.Model):
3946
objects = InviteManager()
4047

4148
def __str__(self) -> str:
42-
return f'Invite from project "{self.project.name}" to {self.user.get_full_name()}'
49+
return (
50+
f'Invite from project "{self.project.name}" to {self.user.get_full_name()}'
51+
)
4352

4453
class Meta(TypedModelMeta):
4554
verbose_name = "Приглашение"

invites/serializers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ class Meta:
1414
"user",
1515
"motivational_letter",
1616
"role",
17+
"specialization",
1718
"is_accepted",
1819
]
1920

2021

2122
class InviteDetailSerializer(serializers.ModelSerializer[Invite]):
2223
user = UserDetailSerializer(many=False, read_only=True)
2324
project = ProjectListSerializer(many=False, read_only=True)
25+
specialization = serializers.CharField(
26+
required=False, allow_null=True, allow_blank=True
27+
)
2428

2529
class Meta:
2630
model = Invite
@@ -30,6 +34,7 @@ class Meta:
3034
"user",
3135
"motivational_letter",
3236
"role",
37+
"specialization",
3338
"is_accepted",
3439
"datetime_created",
3540
"datetime_updated",

invites/views.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from invites.filters import InviteFilter
66
from invites.models import Invite
7-
from invites.serializers import InviteListSerializer, InviteDetailSerializer
7+
from invites.serializers import InviteDetailSerializer, InviteListSerializer
88
from projects.models import Collaborator
99

1010

@@ -49,7 +49,10 @@ def post(self, request, *args, **kwargs):
4949
return Response(status=status.HTTP_403_FORBIDDEN)
5050
# add user to project collaborators
5151
Collaborator.objects.create(
52-
user=invite.user, project=invite.project, role=invite.role
52+
user=invite.user,
53+
project=invite.project,
54+
role=invite.role,
55+
specialization=invite.specialization,
5356
)
5457
invite.is_accepted = True
5558
invite.save()

projects/admin.py

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

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

2691

2792
@admin.register(ProjectNews)
@@ -77,3 +142,8 @@ class DefaultProjectCoverAdmin(admin.ModelAdmin):
77142
"datetime_created",
78143
"datetime_updated",
79144
)
145+
146+
147+
@admin.register(DefaultProjectAvatar)
148+
class DefaultProjectAvatarAdmin(admin.ModelAdmin):
149+
list_display = ("id", "image", "datetime_created")
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+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Generated by Django 4.2.11 on 2025-07-04 13:36
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("projects", "0024_project_actuality_project_direction_project_goal_and_more"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="project",
15+
name="specialty",
16+
),
17+
]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Generated by Django 4.2.11 on 2025-07-08 11:18
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("projects", "0025_remove_project_specialty"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="collaborator",
15+
name="specialization",
16+
field=models.CharField(
17+
blank=True,
18+
default=None,
19+
help_text="Направления работы участника в рамках проекта",
20+
max_length=100,
21+
null=True,
22+
verbose_name="Специализация",
23+
),
24+
),
25+
]

0 commit comments

Comments
 (0)