class ActivitySerializer(serializers.ModelSerializer):
    like_count = serializers.ReadOnlyField()
    url = serializers.SerializerMethodField()
    share_count = serializers.ReadOnlyField()
    company = CompanySerializer(read_only=True)
    dislike_count = serializers.ReadOnlyField()
    comments_count = serializers.ReadOnlyField()
    auth_user = AuthUserSerializerLogin(read_only=True)
    is_friends = serializers.SerializerMethodField()
    liked = serializers.SerializerMethodField('is_liked')
    author_settings = serializers.SerializerMethodField()
    shared = serializers.SerializerMethodField('is_shared')
    disLiked = serializers.SerializerMethodField('is_disliked')
    bookmarked = serializers.SerializerMethodField('is_bookmarked')
    original_activity = RecursiveActivitySerializer(read_only=True)
    activity_mention = ListActivityMentionSerializer(many=True, read_only=True)
    activity_attachment = ActivityAttachmentSerializers(many=True,
                                                        read_only=True)

    def is_shared(self, obj):
        return obj.activity_action.filter(
            has_share=True, auth_user=self.context['request'].user).exists()

    def is_liked(self, obj):
        return obj.activity_action.filter(
            has_like=True, auth_user=self.context['request'].user).exists()

    def is_disliked(self, obj):
        return obj.activity_action.filter(
            has_dislike=True, auth_user=self.context['request'].user).exists()

    def is_bookmarked(self, obj):
        return obj.activity_control.filter(
            is_saved=True, auth_user=self.context['request'].user).exists()

    def get_url(self, obj):
        return self.context['request'].build_absolute_uri(
            location="/") + obj.get_absolute_url()[1:]

    def get_is_friends(self, obj):
        try:
            return Friend.objects.are_friends(self.context['request'].user,
                                              obj.auth_user)
        except:
            return False

    def get_author_settings(self, obj):
        instance = ProfileSettings.objects.get(
            user_profile__auth_user=obj.auth_user)
        return UserProfileSettingsSerializer(instance=instance,
                                             context={
                                                 'request':
                                                 self.context['request']
                                             }).data

    class Meta:
        model = Activity
        fields = '__all__'
        read_only_fields = ('action', 'liked', 'disLiked', 'is_friends',
                            'author_settings')
    def upload_avatar(self, request, slug):
        company = get_object_or_404(Company,
                                    user_profile__auth_user=request.user,
                                    slug=slug)
        file = request.FILES['file']
        is_image(file)
        data = cloudinary.uploader.upload(request.FILES['file'],
                                          folder=settings.AVATAR,
                                          crop='limit',
                                          use_filename=True,
                                          eager=[{
                                              'width': 200,
                                              'height': 200,
                                              'crop': 'thumb',
                                              'gravity': 'face',
                                              'radius': 'max',
                                              'effect': 'sepia'
                                          }, {
                                              'width': 100,
                                              'height': 150,
                                              'crop': 'fit',
                                              'format': 'png'
                                          }])

        company.avatar = data['public_id']
        company.save()
        company_serializer = CompanySerializer(company,
                                               context={'request': request})
        return Response(data=company_serializer.data, status=HTTP_201_CREATED)
 def switch_to_company(self, request, slug):
     company = get_object_or_404(Company,
                                 user_profile__auth_user=request.user,
                                 slug=slug)
     company_serializer = CompanySerializer(company,
                                            context={
                                                'request': request
                                            }).data
     profile_session = ProfileSession(request, company)
     profile_session.switch_to_company()
     return Response(data=company_serializer, status=HTTP_200_OK)
 def get_profile_companies(self, request, slug):
     paginator = PageNumberPagination()
     paginator.page_size = 10
     list_company = get_list_or_404(Company,
                                    user_profile__auth_user=request.user,
                                    user_profile__slug=slug)
     result_page = paginator.paginate_queryset(list_company, request)
     company_serializer = CompanySerializer(result_page,
                                            many=True,
                                            context={'request': request})
     return paginator.get_paginated_response(company_serializer.data)
    def update_company(self, request, slug):
        company = get_object_or_404(Company,
                                    user_profile__auth_user=request.user,
                                    slug=slug)
        company_serializer = CompanySerializer(instance=company,
                                               data=request.data,
                                               partial=True,
                                               context={'request': request})
        company_serializer.is_valid(raise_exception=True)
        company_serializer.save()

        # create profile talent category
        categories = request.data.get('tags', list())
        if categories:
            company.tags.all().delete()

        bulk_tags = []
        for category in categories:
            tags = CompanyTags()
            tags.company = company_serializer.instance
            tags.category_id = category['category']['id']
            bulk_tags.append(tags)
        try:
            CompanyTags.objects.bulk_create(bulk_tags)
        except Exception as e:
            return Response(data=str(e), status=HTTP_500_INTERNAL_SERVER_ERROR)

        return Response(data=company_serializer.data, status=HTTP_200_OK)
    def get_my_own_company(self, request):
        following = Follow.objects.followers(request.user)
        companies = Company.objects.filter(
            user_profile__auth_user=request.user)
        if request.GET.get('name', None):
            companies.filter(name__contains=request.GET.get('name'))

        if request.GET.get('tags__in', None):
            companies.filter(id__in=[
                tags.company.pk for tags in CompanyTags.objects.filter(
                    id__in=[x for x in request.GET.get('tags__in').split(',')])
            ])
        paginator = PageNumberPagination()
        paginator.page_size = 10
        result_page = paginator.paginate_queryset(companies, request)
        company_serializer = CompanySerializer(result_page,
                                               many=True,
                                               context={'request': request})
        return paginator.get_paginated_response(company_serializer.data)
    def create_new_company(self, request, slug):
        profile = get_object_or_404(UsersProfile, auth_user=request.user)
        company_serializer = CompanySerializer(data=request.data,
                                               context={'request': request})
        company_serializer.is_valid(raise_exception=True)
        company_serializer.save(
            user_profile=profile,
            slug=slugify('%s %s' %
                         (request.data['name'], profile.auth_user.id),
                         allow_unicode=True))
        # create profile talent category
        categories = request.data.get('tags', list())
        bulk_tags = []
        for category in categories:
            tags = CompanyTags()
            tags.company = company_serializer.instance
            tags.category_id = category
            bulk_tags.append(tags)
        try:
            CompanyTags.objects.bulk_create(bulk_tags)
        except Exception as e:
            return Response(data=str(e), status=HTTP_500_INTERNAL_SERVER_ERROR)

        return Response(data=company_serializer.data, status=HTTP_201_CREATED)
 def get(self, request, slug):
     company = get_object_or_404(Company, slug=slug)
     serializer = CompanySerializer(company, context={'request': request})
     return Response(data=serializer.data, status=HTTP_200_OK)