Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
{
"python.analysis.typeCheckingMode": "basic"
"python.analysis.typeCheckingMode": "basic",
"python.analysis.extraPaths": [
"./equestlms"
]
}
13 changes: 13 additions & 0 deletions blog/migrations/0014_merge_20221021_0706.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Generated by Django 4.1.2 on 2022-10-21 07:06

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("blog", "0009_alter_blog_options_alter_category_options_and_more"),
("blog", "0013_alter_blog_image"),
]

operations = []
3 changes: 3 additions & 0 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
path("accounts/", include("allauth.urls")),
# Blog
path("blog/", include("blog.urls", namespace="blog")),
# Course
path("course/", include("course.urls", namespace="course")),
# vVideos
path("videos/", include("videos.urls", namespace="videos")),
# Tutor
path("tutor/", include("tutor.urls", namespace="tutor")),
Expand Down
12 changes: 7 additions & 5 deletions course/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ class CourseCategory(models.Model):
is_top = models.BooleanField(default=False)
courses = models.ManyToManyField("course.Course", blank=True)

class Meta:
verbose_name_plural = 'Course categories'

def __str__(self):
return self.title

def get_absolute_url(self):
return reverse("home:courses", kwargs={"slug": self.title})
return reverse("home:course", kwargs={"slug": self.title})

def get_all_courses(self):
courses_in_category = Course.objects.filter(category=self.title)
Expand All @@ -40,9 +43,7 @@ class Course(TimeBasedModel):
"""

title = models.CharField(max_length=125, help_text="Title of the course")
category = models.ForeignKey(
CourseCategory, on_delete=models.CASCADE, default=1
) # Remove thhe default in develop branch
category = models.ForeignKey(CourseCategory, on_delete=models.CASCADE) # Remove thhe default in develop branch
slug = models.SlugField(max_length=125, blank=True, null=True)
overview = RichTextField()
cover_image = models.ImageField(upload_to="./courses_cover_images/")
Expand All @@ -68,6 +69,7 @@ def __str__(self) -> str:

def save(self, *args, **kwargs):
uuid_start = str(uuid.uuid1()).split("-", 1)[0]
print(uuid_start)
if not self.pk:
self.slug = slugify(self.title) + "-" + uuid_start

Expand All @@ -78,7 +80,7 @@ def get_absolute_url(self):

@property
def tutor_courses_count(self):
return Course.objects.filter(tutors=self.tutors).count()
return Course.objects.filter(tutor=self.tutor).count()

@property
def student_courses_count(self):
Expand Down
2 changes: 1 addition & 1 deletion course/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def create_new_course_classroom(sender, instance, **kwargs):

if instance.is_new is True:
ClassRoom.objects.create(
tutor=instance.tutors, course=Course.objects.get(slug=instance.slug)
tutor=instance.tutor, course=Course.objects.get(slug=instance.slug)
)
instance.is_new = False
instance.save()
Expand Down
5 changes: 5 additions & 0 deletions course/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@
view=course_view.CourseDetailView.as_view(),
name="course-detail",
),
path(
"handle-purchase/<slug:slug>/",
view=course_view.HandlePurchaseView.as_view(),
name="handle-purchase",
),
]
47 changes: 44 additions & 3 deletions course/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
from django.shortcuts import redirect
from django.views.generic import DetailView, ListView

from course.models import Course
from django.views import View
from .models import ClassRoom, Course
from django.core.mail import send_mail
from django.contrib.auth import get_user_model
from django.contrib import messages
User = get_user_model()


class AvailableCourseListView(ListView):
Expand All @@ -16,5 +21,41 @@ def get_queryset(self):

class CourseDetailView(DetailView):
model = Course
template_name = "course/course_detail.html"
template_name = "course/course-details.html"
context_object_name = "course"

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
course = Course.objects.get(slug=self.kwargs.get('slug'))
print(course)
context['classroom'] = ClassRoom.objects.get(course=course)
print("Me", context)
return super().get_context_data(**kwargs)


class HandlePurchaseView(View):
"""
Sends user details to admin admin and displays purchase status to user
"""

def get(self, request, slug):
course = Course.objects.get(slug=slug)
if request.user.is_authenticated:
user = User.objects.get(pk=request.user.pk)
# Email admin
admin_email_details = {
'subject': 'COURSE PURCHASE NOTIFICATION',
# type: ignore
# type: ignore
'message': f'A user with name {user} made a purchase request. \n User details are as follows: \n Email: {user.email}',
'recipient_list': ['solomonuche42@gmail.com'],
'from_email': 'equestlms@equestlms.com'

}
send_mail(subject=admin_email_details['subject'], message=admin_email_details["message"],
from_email=admin_email_details['from_email'], recipient_list=admin_email_details['recipient_list']) # type: ignore
# display message to user
messages.add_message(request, messages.INFO,
'Thank you for learning with Equest, your purchase request has been sent.')

return redirect(course)
Loading