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(), }
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.")