Skip to content

Commit c6aa85b

Browse files
authored
Merge pull request #427 from PROCOLLAB-github/dev
Dev
2 parents f099e42 + 2090529 commit c6aa85b

14 files changed

Lines changed: 147 additions & 30 deletions

File tree

feed/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class NewSimpleFeed(APIView):
1717
serializator_class = NewsFeedListSerializer
1818
pagination_class = FeedPagination
1919

20-
def get_filter_data(self) -> list[str]:
20+
def _get_filter_data(self) -> list[str]:
2121
filter_queries: str | None = self.request.query_params.get("type")
2222
filter_queries: str = filter_queries if filter_queries else "" # existence check
2323

@@ -27,7 +27,7 @@ def get_filter_data(self) -> list[str]:
2727
return news_types
2828

2929
def get_queryset(self) -> QuerySet[News]:
30-
filters = self.get_filter_data()
30+
filters = self._get_filter_data()
3131
queryset = (
3232
News.objects.select_related("content_type")
3333
.prefetch_related("content_object", "files")

news/admin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class NewsAdmin(admin.ModelAdmin):
1414
"content_type",
1515
"object_id",
1616
"text",
17+
"pin",
1718
"datetime_created",
1819
"datetime_updated",
1920
)
@@ -22,6 +23,7 @@ class NewsAdmin(admin.ModelAdmin):
2223
"content_type",
2324
"object_id",
2425
"text",
26+
"pin",
2527
"datetime_created",
2628
"datetime_updated",
2729
)

news/migrations/0009_news_pin.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.2.11 on 2024-08-07 10:56
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("news", "0008_alter_news_datetime_created"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="news",
15+
name="pin",
16+
field=models.BooleanField(
17+
blank=True,
18+
default=False,
19+
help_text="Закрепить новость (пока только для профиля программ)",
20+
verbose_name="Закрепить новость",
21+
),
22+
),
23+
]

news/mixins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def get_queryset_for_program(self) -> QuerySet[News]:
3333
except PartnerProgram.DoesNotExist:
3434
# TODO: raise http 404 here
3535
return News.objects.none()
36-
return News.objects.get_news(obj=program)
36+
return News.objects.get_news(obj=program).order_by("-pin", "-datetime_created")
3737

3838
def get_queryset_for_user(self) -> QuerySet[News]:
3939
"""Returns queryset of news for user"""

news/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ class News(models.Model):
3232
Like,
3333
related_query_name="project_news",
3434
)
35-
35+
pin = models.BooleanField(
36+
blank=True,
37+
default=False,
38+
verbose_name="Закрепить новость",
39+
help_text="Закрепить новость (пока только для профиля программ)",
40+
)
3641
datetime_created = models.DateTimeField(
3742
verbose_name="Дата создания", null=False, default=timezone.now
3843
)

news/serializers.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Meta:
5050
fields = [
5151
"id",
5252
"name",
53+
"pin",
5354
"image_address",
5455
"text",
5556
"datetime_created",
@@ -58,7 +59,7 @@ class Meta:
5859
"files",
5960
"is_user_liked",
6061
]
61-
62+
read_only_fields = ["pin"]
6263

6364

6465
class NewsFeedListSerializer(serializers.ModelSerializer):
@@ -123,8 +124,6 @@ class Meta:
123124
read_only_fields = ["views_count", "likes_count", "type_model"]
124125

125126

126-
127-
128127
class NewsDetailSerializer(serializers.ModelSerializer):
129128
views_count = serializers.SerializerMethodField()
130129
likes_count = serializers.SerializerMethodField()
@@ -155,6 +154,7 @@ class Meta:
155154
fields = [
156155
"id",
157156
"name",
157+
"pin",
158158
"image_address",
159159
"text",
160160
"datetime_created",
@@ -164,3 +164,4 @@ class Meta:
164164
"is_user_liked",
165165
"files",
166166
]
167+
read_only_fields = ["pin"]

projects/admin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class ProjectAdmin(admin.ModelAdmin):
1616
"id",
1717
"name",
1818
"draft",
19+
"is_company",
1920
)
2021
list_display_links = (
2122
"id",

projects/filters.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class ProjectFilter(filters.FilterSet):
1515
industry (int), step (int), region (str), name__contains (str),
1616
description__contains (str), collaborator__user__in (List[int]),
1717
datetime_created__gt (datetime.datetime), step (int), any_vacancies (bool),
18-
member_count__gt (int), member_count__lt (int), leader (int), partner_program (int)
18+
member_count__gt (int), member_count__lt (int), leader (int), partner_program (int),
19+
is_company (bool).
1920
2021
Examples:
2122
?industry=1&name__contains=clown
@@ -26,6 +27,7 @@ class ProjectFilter(filters.FilterSet):
2627
?step=1 equals to .filter(step=1)
2728
?any_vacancies=true equals to .filter(any_vacancies=True)
2829
?collaborator__count__gt=1 equals to .filter(collaborator__count__gt=1)
30+
?is_company=0/?is_company=false equals .filter(is_company=False)
2931
"""
3032

3133
@classmethod
@@ -84,6 +86,10 @@ def filter_by_partner_program(self, queryset, name, value):
8486
datetime_created__gt = filters.DateTimeFilter(
8587
field_name="datetime_created", lookup_expr="gt"
8688
)
89+
is_company = filters.BooleanFilter(
90+
field_name="is_company",
91+
label="is_company\n`1`/`true` is company\n`0`/`false` is not company"
92+
)
8793

8894
# filters by whether there are any vacancies in the project
8995
any_vacancies = filters.BooleanFilter(field_name="vacancies", method="vacancy_filter")
@@ -107,4 +113,5 @@ class Meta:
107113
"leader",
108114
"step",
109115
"partner_program",
116+
"is_company",
110117
)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 4.2.11 on 2024-08-23 12:11
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("projects", "0021_project_subscribers"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name="project",
15+
options={
16+
"ordering": ["-is_company", "-hidden_score", "-datetime_created"],
17+
"verbose_name": "Проект",
18+
"verbose_name_plural": "Проекты",
19+
},
20+
),
21+
migrations.AddField(
22+
model_name="project",
23+
name="is_company",
24+
field=models.BooleanField(default=False),
25+
),
26+
]

projects/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class Project(models.Model):
7070
image_address: A URLField image URL address.
7171
leader: A ForeignKey referring to the User model.
7272
draft: A boolean indicating if Project is a draft.
73+
is_company: A boolean indicating if Project is a company.
7374
cover: A ForeignKey referring to the UserFile model, which is the image cover of the project.
7475
datetime_created: A DateTimeField indicating date of creation.
7576
datetime_updated: A DateTimeField indicating date of update.
@@ -98,6 +99,7 @@ class Project(models.Model):
9899
)
99100

100101
draft = models.BooleanField(blank=False, default=True)
102+
is_company = models.BooleanField(null=False, default=False)
101103

102104
cover = models.ForeignKey(
103105
UserFile,
@@ -135,7 +137,7 @@ def __str__(self):
135137
return f"Project<{self.id}> - {self.name}"
136138

137139
class Meta:
138-
ordering = ["-hidden_score", "-datetime_created"]
140+
ordering = ["-is_company", "-hidden_score", "-datetime_created"]
139141
verbose_name = "Проект"
140142
verbose_name_plural = "Проекты"
141143

0 commit comments

Comments
 (0)