class AnswerSerializer(serializers.ModelSerializer): created = DateTimeUTCField(read_only=True) creator = ProfileFKSerializer(read_only=True, source='creator.get_profile') updated = DateTimeUTCField(read_only=True) updated_by = ProfileFKSerializer(read_only=True, source='updated_by.get_profile') num_helpful_votes = serializers.Field(source='num_helpful_votes') num_unhelpful_votes = serializers.Field(source='num_unhelpful_votes') class Meta: model = Answer fields = ( 'id', 'question', 'content', 'created', 'creator', 'updated', 'updated_by', 'is_spam', 'num_helpful_votes', 'num_unhelpful_votes', ) def validate_creator(self, attrs, source): user = getattr(self.context.get('request'), 'user') if user and not user.is_anonymous() and attrs.get('creator') is None: attrs['creator'] = user return attrs
class QuestionSerializer(serializers.ModelSerializer): # Use slugs for product and topic instead of ids. product = serializers.SlugRelatedField(required=True, slug_field='slug') topic = TopicField(required=True) # Use usernames for creator and updated_by instead of ids. created = DateTimeUTCField(read_only=True) creator = ProfileFKSerializer(source='creator.get_profile', read_only=True) involved = serializers.SerializerMethodField('get_involved_users') is_solved = serializers.Field(source='is_solved') is_taken = serializers.Field(source='is_taken') metadata = QuestionMetaDataSerializer(source='metadata_set', required=False) num_votes = serializers.Field(source='num_votes') solution = serializers.PrimaryKeyRelatedField(read_only=True) taken_by = ProfileFKSerializer(source='taken_by.get_profile', read_only=True) updated = DateTimeUTCField(read_only=True) updated_by = ProfileFKSerializer(source='updated_by.get_profile', read_only=True) class Meta: model = Question fields = ( 'answers', 'content', 'created', 'creator', 'id', 'involved', 'is_archived', 'is_locked', 'is_solved', 'is_spam', 'is_taken', 'last_answer', 'locale', 'metadata', 'num_answers', 'num_votes_past_week', 'num_votes', 'product', 'solution', 'taken_until', 'taken_by', 'title', 'topic', 'updated_by', 'updated', ) def get_involved_users(self, obj): involved = set([obj.creator.get_profile()]) involved.update(a.creator.get_profile() for a in obj.answers.all()) return ProfileFKSerializer(involved, many=True).data def validate_creator(self, attrs, source): user = getattr(self.context.get('request'), 'user') if user and not user.is_anonymous() and attrs.get(source) is None: attrs['creator'] = user return attrs
def get_solved_by(self, obj): if obj.solution: return ProfileFKSerializer(obj.solution.creator.profile).data else: return None
def get_involved(self, obj): involved = set([obj.creator.profile]) involved.update(a.creator.profile for a in obj.answers.all()) return ProfileFKSerializer(involved, many=True).data
def get_updated_by(self, obj): updated_by = Profile.objects.get(user=obj.updated_by) if obj.updated_by else None return ProfileFKSerializer(updated_by).data if updated_by else None
def get_creator(self, obj): return ProfileFKSerializer(Profile.objects.get(user=obj.creator)).data
def get_updated_by(self, obj): if obj.updated_by: return ProfileFKSerializer(obj.updated_by.profile).data else: return None
def get_taken_by(self, obj): if obj.taken_by: return ProfileFKSerializer(obj.taken_by.profile).data else: return None
def get_creator(self, obj): return ProfileFKSerializer(obj.creator.profile).data
def get_taken_by(self, obj): taken_by = Profile.objects.get( user=obj.taken_by) if obj.taken_by else None return ProfileFKSerializer(taken_by).data if taken_by else None
def get_solved_by(self, obj): return ProfileFKSerializer( obj.solution.creator).data if obj.solution else None
def get_involved_users(self, obj): involved = set([Profile.objects.get(user=obj.creator)]) involved.update( Profile.objects.get(user=a.creator) for a in obj.answers.all()) return ProfileFKSerializer(involved, many=True).data