Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions feed/mapping.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from partner_programs.serializers import PartnerProgramListSerializer
from projects.models import Project
from projects.serializers import ProjectListSerializer
from users.models import CustomUser
from users.serializers import UserFeedSerializer
from vacancy.models import Vacancy
from vacancy.serializers import VacancyDetailSerializer

CONTENT_OBJECT_MAPPING: dict[str, str | None] = {
Project.__name__.lower(): "project",
CustomUser.__name__.lower(): "news",
"partnerprogram": None,
Vacancy.__name__.lower(): "vacancy",
}

CONTENT_OBJECT_SERIALIZER_MAPPING: dict = {
Project.__name__.lower(): ProjectListSerializer,
CustomUser.__name__.lower(): UserFeedSerializer,
"partnerprogram": PartnerProgramListSerializer,
Vacancy.__name__.lower(): VacancyDetailSerializer,
}
8 changes: 4 additions & 4 deletions feed/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
Expand Down Expand Up @@ -33,13 +32,14 @@ def get_queryset(self):
.filter(content_type__model__in=filters)
.order_by("-datetime_created")
)
# временное удаление постов для проектов с текстом
return queryset.exclude(~Q(text=""), content_type__model="project")
return queryset

def get(self, *args, **kwargs):
paginator = self.pagination_class()
paginated_data = paginator.paginate_queryset(self.get_queryset(), self.request)
serializer = NewsFeedListSerializer(paginated_data, many=True)
serializer = NewsFeedListSerializer(
paginated_data, context={"user": self.request.user}, many=True
)

new_data = []
# временная подстройка данных под фронт
Expand Down
46 changes: 14 additions & 32 deletions news/serializers.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
from django.contrib.auth import get_user_model
from django.forms import model_to_dict
from rest_framework import serializers

from core.services import is_fan, get_likes_count, get_views_count
from feed.mapping import CONTENT_OBJECT_MAPPING, CONTENT_OBJECT_SERIALIZER_MAPPING
from files.serializers import UserFileSerializer
from news.mapping import NewsMapping
from news.models import News

from partner_programs.serializers import PartnerProgramListSerializer
from projects.models import Project
from projects.serializers import ProjectListSerializer
from users.models import CustomUser
from users.serializers import UserFeedSerializer
from vacancy.models import Vacancy
from vacancy.serializers import VacancyDetailSerializer

User = get_user_model()

Expand Down Expand Up @@ -78,33 +73,18 @@ class NewsFeedListSerializer(serializers.ModelSerializer):
content_object = serializers.SerializerMethodField()
type_model = serializers.SerializerMethodField()

def get_type_model(self, obj):
if obj.content_type.model == Project.__name__.lower():
return "project"
elif obj.content_type.model == CustomUser.__name__.lower():
def get_type_model(self, obj) -> str:
model_type = CONTENT_OBJECT_MAPPING[obj.content_type.model]
if obj.text != "" and model_type == "project":
return "news"
elif obj.content_type.model == "partnerprogram":
return None
elif obj.content_type.model == Vacancy.__name__.lower():
return "vacancy"

def get_content_object(self, obj):
if obj.content_type.model == Project.__name__.lower():
serialized_obj = ProjectListSerializer(instance=obj.content_object, data={})
serialized_obj.is_valid()
return serialized_obj.data
elif obj.content_type.model == CustomUser.__name__.lower():
serialized_obj = UserFeedSerializer(
instance=obj.content_object, data=model_to_dict(obj.content_object)
)
serialized_obj.is_valid()
return serialized_obj.data
elif obj.content_type.model == "partnerprogram":
serialized_obj = PartnerProgramListSerializer(obj.content_object)
return serialized_obj.data
elif obj.content_type.model == Vacancy.__name__.lower():
serialized_obj = VacancyDetailSerializer(obj.content_object)
return serialized_obj.data
return model_type

def get_content_object(self, obj) -> dict:
type_model = obj.content_type.model
if obj.text != "" and self.get_type_model(obj) == "project":
type_model = "news"
serializer = CONTENT_OBJECT_SERIALIZER_MAPPING[type_model](obj.content_object)
return serializer.data

def get_views_count(self, obj):
return get_views_count(obj)
Expand All @@ -115,6 +95,8 @@ def get_likes_count(self, obj):
def get_name(self, obj):
if obj.content_type.model == CustomUser.__name__.lower():
return f"{obj.content_object.first_name} {obj.content_object.last_name}"
elif obj.text != "" and obj.content_type.model == Project.__name__.lower():
return f"{obj.content_object.name}"

def get_image_address(self, obj):
return NewsMapping.get_image_address(obj.content_object)
Expand Down
99 changes: 92 additions & 7 deletions partner_programs/admin.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
import pandas as pd
import tablib
import re
from django.contrib import admin
from django.http import HttpResponse
from django.urls import path
from django.utils import timezone

from mailing.views import MailingTemplateRender
from partner_programs.models import PartnerProgram, PartnerProgramUserProfile
from project_rates.models import Criteria, ProjectScore
from projects.models import Project
from users.models import Expert


@admin.register(PartnerProgram)
class PartnerProgramAdmin(admin.ModelAdmin):
list_display = (
"id",
"name",
"tag",
"city",
"datetime_created",
)
list_display = ("id", "name", "tag", "city", "datetime_created")
list_display_links = (
"id",
"name",
Expand Down Expand Up @@ -48,6 +47,11 @@ def get_urls(self):
self.admin_site.admin_view(self.mailing),
name="partner_programs_mailing",
),
path(
"export-rates/<int:object_id>/",
self.admin_site.admin_view(self.get_export_rates_view),
name="partner_programs_export_rates",
),
]
return custom_urls + default_urls

Expand Down Expand Up @@ -126,6 +130,87 @@ def get_export_file(self, partner_program: PartnerProgram):
response.write(binary_data)
return response

def get_export_rates_view(self, request, object_id):
criterias = Criteria.objects.filter(partner_program__id=object_id).select_related(
"partner_program"
)
experts = Expert.objects.filter(programs=object_id).select_related("user")
scores = ProjectScore.objects.filter(criteria__in=criterias)
projects = Project.objects.filter(scores__in=scores)
return self.get_export_rates(criterias, experts, scores, projects)

def get_export_rates(self, criterias, experts, scores, projects):
col_names = list(
criterias.exclude(name="Комментарий").values_list("name", flat=True)
)

expert_names = [
expert.user.first_name + " " + expert.user.last_name for expert in experts
]

all_projects_data = []
for project in projects:
project_data = [[project.name, *col_names, "Комментарий"]]

for expert, expert_name in zip(experts, expert_names):
single_rate_data = [expert_name]

scores_of_expert = []
criterias_to_check = criterias.exclude(name="Комментарий")
for criteria in criterias_to_check:
checking_score = (
scores.filter(
criteria=criteria,
user__first_name=expert.user.first_name,
user__last_name=expert.user.last_name,
project__name=project.name,
)
.exclude(criteria__name="Комментарий")
.first()
)
if not checking_score:
scores_of_expert.append("")
else:
scores_of_expert.append(checking_score.value)

commentary = scores.filter(
user__first_name=expert.user.first_name,
user__last_name=expert.user.last_name,
criteria__name="Комментарий",
project__name=project.name,
).first()
commentary = [commentary.value] if commentary else [""]

scores_of_expert += commentary

single_rate_data += scores_of_expert

project_data.append(single_rate_data)
all_projects_data.append(project_data)

dataframed_projects_data = [
pd.DataFrame(project_data) for project_data in all_projects_data
]
with pd.ExcelWriter("output.xlsx") as writer:
for df, pr_data in zip(dataframed_projects_data, all_projects_data):
df.to_excel(writer, sheet_name=pr_data[0][0], index=False)

with open("output.xlsx", "rb") as f:
binary_data = f.read()

# Формирование HTTP-ответа
file_name = (
f'{criterias.first().partner_program.name}_оценки {timezone.now().strftime("%d-%m-%Y %H:%M:%S")}'
f".xlsx"
)
response = HttpResponse(
binary_data,
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
response["Content-Disposition"] = f'attachment; filename="{file_name}"'

return response


@admin.register(PartnerProgramUserProfile)
class PartnerProgramUserProfileAdmin(admin.ModelAdmin):
Expand Down
Loading