~ 10 Python / Django courses, preparing people for their first job.
class Course(models.Model):
start_date = models.DateField()
end_date = models.DateField()
...
@property
def has_started(self):
now = get_now()
return self.start_date <= now.date()
@property
def has_finished(self):
now = get_now()
return self.end_date <= now.date()
class Course(models.Model):
start_date = models.DateField()
end_date = models.DateField()
...
def save(self, *args, **kwargs):
self.full_clean()
return super().save(*args, **kwargs)
def clean(self):
if self.start_date > self.end_date:
raise ValidationError("...")
class Course(models.Model):
...
def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)
weeks = self.duration_in_weeks
start_date = self.start_date
start_date = start_date - timedelta(days=start_date.weekday())
week_instances = []
for i in range(1, weeks + 1):
current = Week(course=self, ....)
start_date = current.end_date + timedelta(days=1)
week_instances.append(current)
Week.objects.bulk_create(week_instances)
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
from rest_framework import viewsets
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class SnippetViewSet(viewsets.ModelViewSet):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class CourseCreateApi(APIView):
def post(self, request):
serializer = CourseSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
course = Course.objects.create(**serializer.validated_data)
weeks = course.duration_in_weeks
start_date = course.start_date
start_date = start_date - timedelta(days=start_date.weekday())
week_instances = []
for i in range(1, weeks + 1):
current = Week(course=course, ....)
start_date = current.end_date + timedelta(days=1)
week_instances.append(current)
Week.objects.bulk_create(week_instances)
CourseDescription.objects.create(course=course, verbose=description)
return Response(status=status.HTTP_201_CREATED)
def create_user(
*,
email: str,
name: str
) -> User:
user = User(email=email)
user.full_clean()
user.save()
create_profile(user=user, name=name)
send_confirmation_email(user=user)
return user
@transaction.atomic
def create_course(
*,
name: str,
start_date: datetime,
end_date: datetime,
description: str
) -> Course:
course = Course.objects.create(
name=name,
start_date=start_date,
end_date=end_date
)
weeks = course.duration_in_weeks
start_date = course.start_date - timedelta(days=start_date.weekday())
week_instances = []
for i in range(1, weeks + 1):
current = Week(
course=course,
number=i,
start_date=start_date,
end_date=start_date + timedelta(days=6)
)
start_date = current.end_date + timedelta(days=1)
week_instances.append(current)
Week.objects.bulk_create(week_instances)
CourseDescription.objects.create(course=course, verbose=description)
return course
def get_users(*, fetched_by: User) -> Iterable[User]:
user_ids = get_visible_users_for(user=fetched_by)
query = Q(id__in=user_ids)
return User.objects.filter(query)
class Lecture(models.Model):
...
@property
def not_present_students(self):
present_ids = self.present_students.values_list('id', flat=True)
return self.course.students.exclude(id__in=present_ids)
class CourseListApi(SomeAuthenticationMixin, APIView):
class OutputSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'name', 'start_date', 'end_date')
def get(self, request):
courses = get_courses()
data = self.OutputSerializer(courses, many=True)
return Response(data)
class CourseDetailApi(SomeAuthenticationMixin, APIView):
class OutputSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'name', 'start_date', 'end_date')
def get(self, request, course_id):
course = get_course(id=course_id)
data = self.OutputSerializer(course)
return Response(data)
class CourseCreateApi(SomeAuthenticationMixin, APIView):
class InputSerializer(serializers.Serializer):
name = serializers.CharField()
start_date = serializers.DateField()
end_date = serializers.DateField()
def post(self, request):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
create_course(**serializer.validated_data)
return Response(status=status.HTTP_201_CREATED)
class CourseUpdateApi(SomeAuthenticationMixin, APIView):
class InputSerializer(serializers.Serializer):
name = serializers.CharField(required=False)
start_date = serializers.DateField(required=False)
end_date = serializers.DateField(required=False)
def post(self, request, course_id):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
update_course(course_id=course_id, **serializer.validated_data)
return Response(status=status.HTTP_200_OK)
class Serializer(serializers.Serializer):
...
weeks = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'number': serializers.IntegerField(),
})
def create_serializer_class(name, fields):
return type(name, (serializers.Serializer, ), fields)
def inline_serializer(*, fields, data=None, **kwargs):
serializer_class = create_serializer_class(name='', fields=fields)
if data is not None:
return serializer_class(data=data, **kwargs)
return serializer_class(**kwargs)