from django.contrib.auth import get_user_model from django.contrib.auth.models import User from rest_framework import serializers from django.utils import timezone from datetime import timedelta from courses.models import CourseStudent, Classroom from discussion.models import Comment, Topic, TopicLike, CommentLike User = get_user_model() class UserInDetailSerializer(serializers.ModelSerializer): class Meta: model = User fields = sorted(( 'name', 'cpf', 'email', 'institution', 'city', 'occupation', 'groups', 'courses', 'date_joined', 'last_login', 'topics_created', 'number_of_likes', 'comments_created', )) comments_created = serializers.SerializerMethodField() topics_created = serializers.SerializerMethodField() number_of_likes = serializers.SerializerMethodField() courses = serializers.SerializerMethodField() groups = serializers.SerializerMethodField() def get_comments_created(self, obj): return obj.comment_author.count() def get_courses(self, obj): needed_stuff = [ {'percent_progress': x.percent_progress(), 'course_finished': x.can_emmit_receipt(), 'course_name': x.course.name, # FIXME # 'has_certificate': x.certificate.document_type == 'certificate', 'has_certificate': False, 'class_name': x.get_current_class().name } for x in obj.coursestudent_set.all()] return needed_stuff def get_topics_created(self, obj): return obj.topic_author.count() def get_number_of_likes(self, obj): return obj.topiclike_set.count() + obj.commentlike_set.count() def get_groups(self, obj): return ', '.join([group.name for group in obj.groups.all()]) class UsersByClassSerializer(serializers.Serializer): class Meta: model = CourseStudent fields = sorted(( 'name', 'cpf', 'email', 'last_login', # 'percent_progress_by_lesson', 'percent_progress', 'course_finished', 'class_name', 'city', 'occupation', # 'institution', # 'has_certificate', 'groups', )) cpf = serializers.SerializerMethodField() email = serializers.SerializerMethodField() last_login = serializers.SerializerMethodField() # has_certificate = serializers.SerializerMethodField() percent_progress_by_lesson = serializers.SerializerMethodField() percent_progress = serializers.SerializerMethodField() course_finished = serializers.SerializerMethodField() class_name = serializers.SerializerMethodField() city = serializers.SerializerMethodField() occupation = serializers.SerializerMethodField() # institution = serializers.SerializerMethodField() groups = serializers.SerializerMethodField() def get_city(self, obj): return obj.user.city def get_occupation(self, obj): return obj.user.occupation def get_institution(self, obj): return obj.user.institution def get_cpf(self, obj): return obj.user.cpf def get_email(self, obj): return obj.user.email def get_last_login(self, obj): return obj.user.last_login # def get_has_certificate(self, obj): # return obj.certificate.document_type == 'certificate' def get_percent_progress_by_lesson(self, obj): return obj.percent_progress_by_lesson() def get_percent_progress(self, obj): return obj.percent_progress() def get_course_finished(self, obj): return obj.can_emmit_receipt() def get_class_name(self, obj): return obj.get_current_class().name def get_groups(self, obj): return ', '.join([group.name for group in obj.user.groups.all()]) class UserStatsSerializer(serializers.ModelSerializer): last_access = serializers.SerializerMethodField() accesses_count = serializers.SerializerMethodField() topics = serializers.SerializerMethodField() reactions = serializers.SerializerMethodField() comments = serializers.SerializerMethodField() class Meta: model = User fields = ('name', 'username', 'email', 'id', 'image', 'last_access', 'accesses_count', 'topics', 'reactions', 'comments') def get_last_access(self, obj): if obj.last_login: timestamp_str = obj.last_login.strftime('%d-%m-%Y %H:%M:%S') date, hour = timestamp_str.split() return date + ' às ' + hour return '' def get_accesses_count(self, obj): time_delta = timezone.now() - timedelta(days=7) return obj.actor_actions.filter(verb='access', timestamp__gte=time_delta).count() def get_topics(self, obj): return Topic.objects.filter(author=obj).count() def get_reactions(self, obj): return TopicLike.objects.filter(user=obj).count() + CommentLike.objects.filter(user=obj).count() def get_comments(self, obj): return Comment.objects.filter(author=obj).count()