Example #1
0
def search(request):
    user = request.user
    tutors = None
    
    subjects = set()
    levels = set()
    
    query = request.GET.get('text', '')
    what = request.GET.get('what', None)
    
    system = request.GET.get('system', '')
    subject = request.GET.get('subject', '')
    level = request.GET.get('level', '')

    try:
        price_from = int(request.GET.get('price-from', 0))
    except ValueError:
        price_from = 0
        
    try:
        price_to = int(request.GET.get('price-to', 0))
    except ValueError:
        price_to = 0
    
    day = int(request.GET.get('day', -1))
    time = int(request.GET.get('time', -1))
    crb = request.GET.get('crb', False)
    sort = request.GET.get('sort', 'price')
    favorite = request.GET.get('favorite', False)
    
    results_per_page = request.GET.get('results_per_page', 10)
    
    tutors = Tutor.objects.select_related()    
    
    today = datetime.date.today()
    
    if crb:
        tutors = tutors.filter(profile__crb_expiry_date__gte=today)
    
    if query:
        if what == 'tutor':
            words = query.split()
            for word in words:
                tutors = tutors.filter(Q(first_name__icontains=word) | Q(last_name__icontains=word) | Q(username__icontains=word))
        elif what == 'subject':
            words = query.split()
            for word in words:
                tutors = tutors.filter(Q(subjects__subject__subject__icontains=word) | Q(subjects__level__level__icontains=word))

    if system:
        tutors = tutors.filter(subjects__system__id = system)

    if subject:
        tutors = tutors.filter(subjects__subject__id = subject)

    if level:
        tutors = tutors.filter(subjects__level__id = level)

    if favorite and user.is_authenticated():
        tutors = tutors.filter(profile__favorite = user)
    
    if price_from:
        tutors = tutors.filter(Q(subjects__credits__gte=price_from))

    if price_to:
        tutors = tutors.filter(Q(subjects__credits__lte=price_to))
    
    if tutors and (day>=0 or time>=0):
        date = datetime.datetime.combine(first_day_of_week(datetime.datetime.now()).date(), datetime.time(time if time>0 else 0, 0))
        gtz = user.profile.timezone if user.is_authenticated() else pytz.tz
        filtered_tutors = []
        
        for tutor in tutors:
            tutor_date = convert_datetime(date, gtz, tutor.profile.timezone)
            tutor_time = tutor_date.time()

            if day>=0 and time>=0:
                filtered_tutors.append(Q(id=tutor.id, week_availability__weekday=tutor_date.weekday(), week_availability__begin__lte=tutor_time, week_availability__end__gt=tutor_time))
            elif day>=0:
                filtered_tutors.append(Q(id=tutor.id, week_availability__weekday=tutor_date.weekday()))
            else:
                filtered_tutors.append(Q(id=tutor.id, week_availability__begin__lte=tutor_time, week_availability__end__gt=tutor_time))                
        

        tutors = tutors.filter(reduce(operator.or_, filtered_tutors))

    if sort == 'price':
        tutors = tutors.annotate(price = Max('subjects__credits')).order_by('price')
    elif sort == 'rating':
        tutors = tutors.distinct().order_by('-profile__avg_rate')
    elif sort == 'classes':
        tutors = tutors.distinct().order_by('-profile__classes_given')
    
    if system:
        try:
            selected_system = EducationalSystem.objects.get(id = system)
        except EducationalSystem.DoesNotExist:
            selected_system = None
    else:
        selected_system = None
          
    return { 
        'systems': EducationalSystem.objects.all(),
        'subjects': ClassSubject.objects.all(),
        'levels': ClassLevel.objects.all(),
        'selected_system': selected_system,
        'results_per_page': results_per_page,
        'user': user,
        'tutors': tutors.distinct(),
        'currencies': Currency.objects.all(),
    }
Example #2
0
def book_class(request, tutor_id):
    user = request.user
    profile = user.profile
    
    if request.method != 'POST' or profile.type == profile.TYPES.TUTOR:
        raise http.Http404()
    
    subject_id = request.POST.get('subject', 0)
    date = request.POST.get('date', '')
    start = request.POST.get('start', '')
    duration = int(request.POST.get('duration', 0))
    cover = request.POST.get('cover', None)
    message = request.POST.get('message', None)
    child_id = request.POST.get('child', 0)

    if profile.type == profile.TYPES.PARENT:
        try:
            child = User.objects.select_related().get(id=child_id)
            profile = child.profile
            if profile.parent == user:
                user = child
            else:
                raise http.Http404()
        except User.DoesNotExist:
            return http.HttpResponse("Please select one of your children.") 

    if duration < 30 or duration > 120 or (duration % 30 != 0):
        raise http.Http404()

    try:
        tutor = User.objects.select_related().get(id=tutor_id, profile__type=UserProfile.TYPES.TUTOR)
    except User.DoesNotExist:
        raise http.Http404()

    try:
        subject = tutor.subjects.get(id=subject_id)
    except TutorSubject.DoesNotExist:
        raise http.Http404()

    try:
        date_str = date.split('-')
        date = datetime.date(int(date_str[0]), int(date_str[1]), int(date_str[2]))
        start_array = start.split('-')
        start_time = datetime.time(int(start_array[0]), int(start_array[1]) / MINIMUM_PERIOD * MINIMUM_PERIOD)
    except ValueError:
        raise http.Http404()
    except IndexError:
        raise http.Http404()

    
    date = datetime.datetime.combine(date, start_time)
    date = convert_datetime(date, profile.timezone, pytz.utc)
    
    class_ = Class(
        tutor = tutor,
        student = user,
        subject = '%s' % subject,
        only_subject = '%s' % subject.subject,
        level = '%s' % subject.level,
        system = '%s' % subject.system,
        subject_credits_per_hour = subject.credits,
        date = date,
        duration = duration,
        cover = cover,
    )

    credit_fee = class_.get_updated_credit_fee(commit=False)
    if credit_fee > profile.credit:
        return http.HttpResponse("You don't have enough credits.")
    
    class_.save()    
    if not class_.id:
        return http.HttpResponse("This class can't be created right now. Please try again later.")    
    class_.book()

    if message:
        user.sent_messages.create(
            to = tutor,
            message = message,
            related_class = class_,
            read = False,
            email_sent = False,
        )

    return http.HttpResponse("Done.")