Skip to content

Commit 8222ffe

Browse files
authored
Merge pull request #274 from PROCOLLAB-github/dev
Dev
2 parents d13fdbf + 9bb5f6c commit 8222ffe

26 files changed

+701
-22
lines changed

core/migrations/0011_auto_20240128_2214.py

Lines changed: 167 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 4.2.3 on 2024-01-28 19:33
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("core", "0011_auto_20240128_2214"),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name="specialization",
15+
options={
16+
"verbose_name": "Специализация",
17+
"verbose_name_plural": "Специализации",
18+
},
19+
),
20+
migrations.AlterModelOptions(
21+
name="specializationcategory",
22+
options={
23+
"verbose_name": "Категория специализации",
24+
"verbose_name_plural": "Категории специализаций",
25+
},
26+
),
27+
]

core/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,21 @@ class SkillToObject(models.Model):
155155
class SpecializationCategory(models.Model):
156156
name = models.TextField()
157157

158+
class Meta:
159+
verbose_name = "Категория специализации"
160+
verbose_name_plural = "Категории специализаций"
161+
158162

159163
class Specialization(models.Model):
160164
name = models.TextField()
161165
category = models.ForeignKey(
162166
SpecializationCategory, related_name="specializations", on_delete=models.CASCADE
163167
)
164168

169+
class Meta:
170+
verbose_name = "Специализация"
171+
verbose_name_plural = "Специализации"
172+
165173

166174
class SpecializationToObject(models.Model):
167175
specialization = models.ForeignKey(

feed/__init__.py

Whitespace-only changes.

feed/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class FeedConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "feed"

feed/constants.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import enum
2+
3+
from rest_framework import serializers
4+
5+
from news.serializers import NewsListSerializer
6+
from projects.serializers import ProjectListSerializer
7+
from vacancy.serializers import VacancyDetailSerializer
8+
9+
10+
class FeedItemType(enum.Enum):
11+
PROJECT = "project"
12+
NEWS = "news"
13+
VACANCY = "vacancy"
14+
15+
16+
FEED_SERIALIZER_MAPPING: dict[FeedItemType, serializers.Serializer] = {
17+
FeedItemType.PROJECT.value: ProjectListSerializer,
18+
FeedItemType.NEWS.value: NewsListSerializer,
19+
FeedItemType.VACANCY.value: VacancyDetailSerializer,
20+
}

feed/helpers.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import random
2+
import typing
3+
4+
from feed import constants
5+
from feed.serializers import FeedItemSerializer
6+
from news.models import News
7+
from projects.models import Project
8+
from vacancy.models import Vacancy
9+
10+
11+
def collect_feed() -> list:
12+
# да, это ужасно
13+
n_random_projects = get_n_random_projects(3)
14+
n_latest_created_projects = get_n_latest_created_projects(3)
15+
n_latest_created_news = get_n_latest_created_news(3)
16+
n_latest_created_vacancies = get_n_latest_created_vacancies(3)
17+
18+
feed = (
19+
to_feed_items(
20+
constants.FeedItemType.PROJECT.value,
21+
set(n_random_projects + n_latest_created_projects),
22+
)
23+
+ to_feed_items(constants.FeedItemType.NEWS.value, n_latest_created_news)
24+
+ to_feed_items(constants.FeedItemType.VACANCY.value, n_latest_created_vacancies)
25+
)
26+
27+
random.shuffle(feed)
28+
return feed
29+
30+
31+
def to_feed_items(type_: constants.FeedItemType, items: typing.Iterable) -> list[dict]:
32+
feed_items = []
33+
for item in items:
34+
serializer = to_feed_item(type_, item)
35+
serializer.is_valid()
36+
feed_items += [serializer.data]
37+
return feed_items
38+
39+
40+
def get_n_random_projects(num: int) -> list[Project]:
41+
tries = 3
42+
projects = set()
43+
44+
while len(projects) < num and tries > 0:
45+
project = Project.objects.filter(draft=False).order_by("?").first()
46+
47+
if project not in projects:
48+
projects.add(project)
49+
else:
50+
tries -= 1
51+
return list(projects)
52+
53+
54+
def get_n_latest_created_projects(num: int) -> list[Project]:
55+
return list(Project.objects.filter(draft=False).order_by("-datetime_created")[:num])
56+
57+
58+
def get_n_latest_created_news(num: int) -> list[Project]:
59+
return list(News.objects.order_by("-datetime_created")[:num])
60+
61+
62+
def get_n_latest_created_vacancies(num: int) -> list[Project]:
63+
return list(Vacancy.objects.order_by("-datetime_created")[:num])
64+
65+
66+
def to_feed_item(type_: constants.FeedItemType, data):
67+
serializer = constants.FEED_SERIALIZER_MAPPING[type_](data)
68+
69+
return FeedItemSerializer(data={"type": type_, "content": serializer.data})

feed/migrations/__init__.py

Whitespace-only changes.

feed/serializers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from rest_framework import serializers
2+
from feed import constants
3+
4+
5+
class FeedItemSerializer(serializers.Serializer):
6+
type = serializers.ChoiceField(choices=constants.FeedItemType, required=True)
7+
content = serializers.JSONField(required=True)

feed/urls.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django.urls import path
2+
3+
from feed.views import FeedList
4+
5+
app_name = "feed"
6+
7+
urlpatterns = [
8+
path("", FeedList.as_view()),
9+
]

0 commit comments

Comments
 (0)