from datetime import datetime, timedelta, date from random import shuffle import short_url from django.db.models import Min, Func, F from django.contrib.auth import get_user_model from django.views.generic import TemplateView from django.utils.timezone import now from paymentwall.pingback import Pingback from apps.course.models import Course from apps.school.models import SchoolSchedule from apps.payment.models import SchoolPayment, UserGiftCertificate, Payment, DrawingCampPayment from apps.content.models import Banner, Package User = get_user_model() class AboutView(TemplateView): template_name = 'templates/lilcity/about.html' class IndexView(TemplateView): template_name = 'templates/lilcity/home.html' def get_context_data(self): referrer = self.request.GET.get('referrer') user_gift_certificate = self.request.GET.get('gift-certificate') is_referral_url = bool(referrer) context = super().get_context_data() now_time = now() try: school_schedule = SchoolSchedule.objects.get( weekday=now_time.isoweekday(), is_camp=True) except SchoolSchedule.DoesNotExist: online = False online_coming_soon = False school_schedule = None else: end_at = datetime.combine( now_time.today(), school_schedule.start_at) online = ( school_schedule.start_at <= now_time.time() and (end_at + timedelta(hours=1)).time() >= now_time.time() and school_schedule.current_camp_lesson ) online_coming_soon = ( school_schedule.start_at > now_time.time() and datetime.combine( datetime.today(), school_schedule.start_at) - timedelta(hours=12) <= datetime.combine(datetime.today(), now_time.time()) and school_schedule.current_camp_lesson ) date_now = now_time.date() if self.request.user.is_authenticated: school_payment = SchoolPayment.objects.filter( user=self.request.user, date_start__lte=date_now, date_end__gte=date_now, status__in=[ Pingback.PINGBACK_TYPE_REGULAR, Pingback.PINGBACK_TYPE_GOODWILL, Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, ], ) school_payment_exists = school_payment.exists() school_schedules_purchased = school_payment.annotate( joined_weekdays=Func(F('weekdays'), function='unnest',) ).values_list('joined_weekdays', flat=True).distinct() camp_payment = DrawingCampPayment.objects.filter( user=self.request.user, status__in=DrawingCampPayment.PW_PAID_STATUSES, date_start__lte=date_now, date_end__gte=date_now ) camp_payment_exists = camp_payment.exists() else: camp_payment_exists = False school_payment_exists = False school_schedules_purchased = [] if referrer and not self.request.user.is_authenticated: try: referrer = short_url.decode_url(referrer) referrer = User.objects.get(pk=referrer) except: referrer = None self.request.session['referrer'] = referrer and referrer.id else: referrer = None if user_gift_certificate: try: user_gift_certificate = short_url.decode_url( user_gift_certificate) user_gift_certificate = UserGiftCertificate.objects.get( pk=user_gift_certificate, bonuses_sent__isnull=True) except: user_gift_certificate = None review_images = list(map(str, range(1, 107))) shuffle(review_images) teachers = User.objects.filter( role=User.TEACHER_ROLE, show_in_mainpage=True) if teachers.count() % 2 == 0: teachers = teachers[:teachers.count() - 1] context.update({ 'banners': Banner.get_for_page(Banner.PAGE_INDEX), 'is_drawing_camp': True, 'review_images': review_images, 'gift_certificate': user_gift_certificate.gift_certificate if user_gift_certificate else None, 'user_gift_certificate': user_gift_certificate, 'is_gift_certificate_url': bool(user_gift_certificate), 'referrer': referrer, 'is_referral_url': is_referral_url, 'online': online, 'online_coming_soon': online_coming_soon, 'school_schedule': school_schedule, 'course_items': Course.shuffle(Course.objects.filter(status=Course.PUBLISHED)[:3]), 'is_purchased': camp_payment_exists, 'camp_price': DrawingCampPayment.MONTH_PRICE, 'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'], 'school_schedules': SchoolSchedule.objects.filter(weekday__in=DrawingCampPayment.WEEKDAYS, is_camp=True), 'school_schedules_purchased': DrawingCampPayment.WEEKDAYS if camp_payment_exists else [], 'teachers': sorted(list(teachers), key=lambda t: 1 if t.email == 'sasha@lil.city' else 0, reverse=True), 'works_count': Payment.objects.filter(status__in=Payment.PW_PAID_STATUSES).count() * 7, 'subscription_ends': camp_payment.latest('date_end').date_end if camp_payment_exists else None, 'subscription_ends_humanize': camp_payment.latest('date_end').date_end_humanize if camp_payment_exists else None, 'school_purchased_future': False, 'is_purchased_future': False, }) return context class SchoolSchedulesView(TemplateView): template_name = 'templates/lilcity/school_schedules.html' def get_context_data(self): context = super().get_context_data() context['school_schedules'] = SchoolSchedule.objects.filter( is_camp=True) return context class LinksView(TemplateView): template_name = 'templates/lilcity/links.html' class PackagesView(TemplateView): template_name = 'templates/lilcity/packages.html' def get_context_data(self): context = super().get_context_data() context['packages'] = Package.objects.all()[:4] context['banners'] = Banner.get_for_page(Banner.PAGE_PACKAGES)[:1] last_school_payment = None school_end = date(now().year, 5, 31) today = now().date() if self.request.user.is_authenticated: last_school_payment = SchoolPayment.objects.filter( user=self.request.user, date_end__gte=today, status__in=Payment.PW_PAID_STATUSES, ).last() context['last_school_payment'] = last_school_payment if last_school_payment: next_month = (last_school_payment.date_end + timedelta(1)).month context['next_buy_date'] = last_school_payment.date_end + \ timedelta(1) context['school_months_left'] = (school_end.month - next_month if next_month <= school_end.month else (school_end.month + 13) - next_month) else: context['school_months_left'] = (school_end.month - today.month if today.month <= school_end.month else (school_end.month + 13) - today.month) return context