Skip to content

Instantly share code, notes, and snippets.

@asankulov
Created March 30, 2020 12:20
Show Gist options
  • Save asankulov/98cd8e5bdc571cb0c4100bb40946b401 to your computer and use it in GitHub Desktop.
Save asankulov/98cd8e5bdc571cb0c4100bb40946b401 to your computer and use it in GitHub Desktop.
django component class exampls
class Course(models.Model):
class Meta:
verbose_name = 'Course'
verbose_name_plural = 'Courses'
trailer = models.FileField(verbose_name='Trailer', upload_to='course_trailers/')
price = models.PositiveSmallIntegerField(verbose_name='Price')
author = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Author',
related_name='courses')
title = models.CharField(max_length=255, verbose_name='Title')
description = models.CharField(verbose_name='Description', max_length=2000)
@property
def produce_slug(self):
return '{}-{}'.format(self.title, self.pk)
@property
def author_info(self):
return self.author.__unicode__()
@property
def rate(self):
result = self.rates.aggregate(avg_rate=Avg('rate'))
return result['avg_rate']
@property
def rates_count(self):
return self.rates.distinct('user').count()
@property
def rates_in_percent_by_value(self):
total_rows_count = CourseRate.objects.filter(course=self).count()
return CourseRate.objects.filter(course=self).values('rate').annotate(
value=ExpressionWrapper(Count('rate') * 100 / total_rows_count,
output_field=models.FloatField())).values('rate', 'value')
class UserCreateSerializer(serializers.Serializer):
email = serializers.EmailField(required=True, trim_whitespace=True)
password = serializers.CharField(required=True, trim_whitespace=True, min_length=6)
name = serializers.CharField(required=True, trim_whitespace=True)
birth_date = serializers.DateField(required=False)
gender = serializers.ChoiceField(choices=CustomUser.GENDER_CHOICES, required=False)
phone_number = serializers.CharField(required=False)
avatar = serializers.ImageField(required=False)
def create(self, validated_data):
try:
firebase_user = firebase_auth.create_user(email=validated_data['email'],
password=validated_data['password'],
display_name=validated_data['name'],
email_verified=False)
user = CustomUser.objects.create_user(**validated_data, username=firebase_user.uid)
except (firebase_exceptions.InvalidArgumentError, IntegrityError):
raise rest_exceptions.ValidationError(detail='Email is already taken.')
except ValueError:
raise rest_exceptions.ValidationError(detail='The specified user properties are invalid.')
return user
class VerifyEmailAPIView(APIView):
def get_object(self, key):
return get_object_or_404(key=key,
queryset=EmailConfirmation.objects.all())
@swagger_auto_schema(request_body=VerificationKeySerializer)
def post(self, request):
serializer = VerificationKeySerializer(data=request.data)
serializer.is_valid(raise_exception=True)
email_confirmation = self.get_object(serializer.validated_data['key'])
try:
email_confirmation.confirm()
except KeyExpiredException:
return Response({'detail': _('Key expired.')}, status=status.HTTP_400_BAD_REQUEST)
return Response({'detail': _('Email verified.')}, status=status.HTTP_200_OK)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment