from rest_framework import serializers from actstream.models import Action from courses.reports.serializers import UserStatsSerializer from courses.serializers import SimpleUserSerializer from django.contrib.auth.models import User from django.contrib.auth import get_user_model User = get_user_model() from courses.models import Course from courses.stats.models import AccessibleArea from courses.classroom.models import Classroom from courses.classroom.serializers import BasicClassroomSerializer from discussion.models import Comment, Topic, Forum from cards.models import Card from courses_learning_objects.models import LearningObject, Answer from datetime import datetime class UserActionsSerializer(serializers.Serializer): verb = serializers.CharField(required=True, max_length=100) action_object_id = serializers.IntegerField(required=False) action_object_type = serializers.CharField(required=False, max_length=100) target_id = serializers.IntegerField(required=False) target_type = serializers.CharField(required=False, max_length=100) class UserAccessSerializer(serializers.Serializer): area = serializers.CharField(required=True, max_length=100) target_id = serializers.IntegerField(required=False) target_type = serializers.CharField(required=False, max_length=100) class GenericRelatedField(serializers.Field): def to_representation(self, value): if isinstance(value, User): return SimpleUserSerializer(value).data if isinstance(value, Classroom): return BasicClassroomSerializer(value).data return str(value) class ActionSerializer(serializers.ModelSerializer): actor = GenericRelatedField(read_only=True) target = serializers.SerializerMethodField() action_object = GenericRelatedField(read_only=True) verb = GenericRelatedField(read_only=True) action_phrase = serializers.SerializerMethodField() complements = serializers.SerializerMethodField() timestamp = serializers.SerializerMethodField() class Meta: model = Action fields = ('actor', 'target', 'action_object', 'verb', 'action_phrase', 'timestamp', 'complements') def get_target(self, obj): if isinstance(obj.target, LearningObject): if obj.target.unit: return obj.target.unit.lesson.course.name if isinstance(obj.target, Forum): return obj.target.title if isinstance(obj.target, Classroom): return obj.target.name return obj.target def get_timestamp(self, obj): from django.utils import timezone tz_str = timezone.localtime(obj.timestamp) date, hour = tz_str.strftime('%d-%m-%Y %H:%M:%S').split() return '{} às {}'.format(date, hour) def get_accessible_area_name(self, name): accessible_areas = { 'Dashboard': 'a Página Inicial', 'Chat Main Page': 'os Chats', 'Profile Page': 'a Página de perfil', 'Notes': 'as Anotações', 'Classrooms': 'as Salas', 'Courses': 'a Lista de Espaços Formativos', 'Messages': 'os Avisos', 'Forums': 'os Fóruns', 'Cards List': 'a Lista de Conteúdos' } return accessible_areas.get(name, name) def get_object_type(self, obj): if isinstance(obj, Course): return ' no curso {}'.format(obj.name) if isinstance(obj, Classroom): return ' na sala {}'.format(obj.name) if isinstance(obj, Topic): return ' no tópico {}'.format(obj.title) if isinstance(obj, Forum): return ' no fórum {}'.format(obj.title) if isinstance(obj, AccessibleArea): return ' {}'.format(self.get_accessible_area_name(obj.name)) if isinstance(obj, LearningObject): if obj.unit: unit = obj.unit.title step = obj.unit.lesson.name course = obj.unit.lesson.course.name return ' a atividade {} na etapa {} do curso {}'.format(unit, step, course) if isinstance(obj, Card): title = obj.title return ' o conteúdo {}'.format(title) return '' def get_action_phrase(self, obj): verbs = { 'access': 'acessou', 'answered': 'respondeu', 'created': 'criou', 'reacted': 'reagiu a', 'created comment': 'comentou' } action_phrase = '' action_phrase += obj.actor.name.split()[0] action_phrase += (' {}'.format(verbs.get(obj.verb))) if obj.action_object: action_phrase += self.get_object_type(obj.action_object) if obj.target: action_phrase += self.get_object_type(obj.target) return action_phrase def get_complements(self, obj): if obj.target: if isinstance(obj.target, LearningObject) and obj.target.unit: unit = 'a atividade {}'.format(obj.target.unit.title) step = 'na etapa {}'.format(obj.target.unit.lesson.name) course = 'do curso {}'.format(obj.target.unit.lesson.course.name) compl = {'atividade': unit, 'etapa': step, 'curso': course} return compl return ''