def get_events(request): if request.user.is_authenticated: coder = request.user.coder else: coder = None referer = request.META.get('HTTP_REFERER') if referer: parsed = urlparse(referer) as_coder = parse_qs(parsed.query).get('as_coder') if as_coder and request.user.has_perm('as_coder'): coder = Coder.objects.get(user__username=as_coder[0]) tzname = get_timezone(request) offset = get_timezone_offset(tzname) query = Q() categories = request.POST.getlist('categories') ignore_filters = request.POST.getlist('ignore_filters') if coder: query = coder.get_contest_filter(categories, ignore_filters) if not coder or coder.settings.get('calendar_filter_long', True): if categories == ['calendar'] and '0' not in ignore_filters: query &= Q(duration_in_secs__lt=timedelta(days=1).total_seconds()) start_time = arrow.get(request.POST.get('start', timezone.now())).datetime end_time = arrow.get(request.POST.get('end', timezone.now() + timedelta(days=31))).datetime query = query & Q(end_time__gte=start_time) & Q(start_time__lte=end_time) search_query = request.POST.get('search_query', None) if search_query: search_query_re = verify_regex(search_query) query &= Q(host__iregex=search_query_re) | Q(title__iregex=search_query_re) party_slug = request.POST.get('party') if party_slug: party = get_object_or_404(Party.objects.for_user(request.user), slug=party_slug) query = Q(rating__party=party) & query contests = Contest.objects if party_slug else Contest.visible try: result = [] for contest in contests.filter(query): c = { 'id': contest.pk, 'title': contest.title, 'host': contest.host, 'url': contest.url, 'start': (contest.start_time + timedelta(minutes=offset)).strftime("%Y-%m-%dT%H:%M:%S"), 'end': (contest.end_time + timedelta(minutes=offset)).strftime("%Y-%m-%dT%H:%M:%S"), 'countdown': contest.next_time, 'hr_duration': contest.hr_duration, 'color': contest.resource.color, } result.append(c) except Exception as e: return JsonResponse({'message': f'query = `{search_query}`, error = {e}'}, safe=False, status=400) return JsonResponse(result, safe=False)
def main(request, party=None): viewmode = settings.VIEWMODE_ open_new_tab = settings.OPEN_NEW_TAB_ add_to_calendar = settings.ADD_TO_CALENDAR_ hide_contest = settings.HIDE_CONTEST_ if request.user.is_authenticated: if request.GET.get('as_coder') and request.user.has_perm('as_coder'): coder = Coder.objects.get(user__username=request.GET['as_coder']) else: coder = request.user.coder viewmode = coder.settings.get("view_mode", viewmode) hide_contest = coder.settings.get("hide_contest", hide_contest) open_new_tab = coder.settings.get("open_new_tab", open_new_tab) add_to_calendar = coder.settings.get("add_to_calendar", add_to_calendar) else: coder = None viewmode = request.GET.get("view", viewmode) hide_contest = request.GET.get("hide_contest", hide_contest) hide_contest = int(str(hide_contest).lower() in settings.YES_) time_format = get_timeformat(request) action = request.GET.get("action") if action is not None: if action == "party-contest-toggle" and request.user.is_authenticated: party = get_object_or_404(Party.objects.for_user(request.user), slug=request.GET.get("party"), author=coder) contest = get_object_or_404(Contest, pk=request.GET.get("pk")) rating, created = Rating.objects.get_or_create(contest=contest, party=party) if not created: rating.delete() return HttpResponse("ok") if action == "hide-contest-toggle": contest = get_object_or_404(Contest, pk=request.GET.get("pk")) filt, created = Filter.objects.get_or_create(coder=coder, contest=contest, to_show=False) if not created: filt.delete() return HttpResponse("deleted") return HttpResponse("created") return HttpResponseBadRequest("fail") tzname = get_timezone(request) if tzname is None: return HttpResponse("accepted") if coder: ignore_filters = coder.ordered_filter_set.filter(categories__contains=['calendar']) ignore_filters = ignore_filters.filter(name__isnull=False).exclude(name='') ignore_filters = list(ignore_filters.values('id', 'name')) else: ignore_filters = [] if not coder or coder.settings.get('calendar_filter_long', True): ignore_filters = ignore_filters + [{'id': 0, 'name': 'Disabled fitler'}] context = { "ignore_filters": ignore_filters, "contests": get_view_contests(request, coder), } if isinstance(party, Party): context["party"] = { "id": party.id, "toggle_contest": 1, "has_permission_toggle": int(party.has_permission_toggle_contests(coder)), "contest_ids": party.rating_set.values_list('contest__id', flat=True), } now = timezone.now() banners = Banner.objects.filter(end_time__gt=now) if not settings.DEBUG: banners = banners.filter(enable=True) offset = get_timezone_offset(tzname) timezone_hm = f'{"+" if offset > 0 else "-"}{abs(offset // 60):02d}:{abs(offset % 60):02d}' context.update({ "offset": offset, "now": now, "viewmode": viewmode, "hide_contest": hide_contest, "timezone": tzname, "timezone_hm": timezone_hm, "time_format": time_format, "open_new_tab": open_new_tab, "add_to_calendar": settings.ACE_CALENDARS_[add_to_calendar]['id'], "banners": banners, }) return render(request, "main.html", context)
def get_events(request): if request.user.is_authenticated: coder = request.user.coder else: coder = None categories = request.POST.getlist('categories') ignore_filters = request.POST.getlist('ignore_filters') has_filter = False referer = request.META.get('HTTP_REFERER') if referer: parsed = urlparse(referer) query_dict = parse_qs(parsed.query) as_coder = query_dict.get('as_coder') if as_coder and request.user.has_perm('as_coder'): coder = Coder.objects.get(user__username=as_coder[0]) has_filter = 'filter' in query_dict categories = query_dict.get('filter', categories) tzname = get_timezone(request) offset = get_timezone_offset(tzname) query = Q() if coder: query = coder.get_contest_filter(categories, ignore_filters) elif has_filter: query = Coder.get_contest_filter(None, categories, ignore_filters) if not coder or coder.settings.get('calendar_filter_long', True): if categories == ['calendar'] and '0' not in ignore_filters: query &= Q(duration_in_secs__lt=timedelta(days=1).total_seconds()) past_action = settings.PAST_CALENDAR_DEFAULT_ACTION_ if coder: past_action = coder.settings.get('past_action_in_calendar', past_action) start_time = arrow.get(request.POST.get('start', timezone.now())).datetime end_time = arrow.get( request.POST.get('end', timezone.now() + timedelta(days=31))).datetime query = query & Q(end_time__gte=start_time) & Q(start_time__lte=end_time) search_query = request.POST.get('search_query', None) if search_query: search_query_re = verify_regex(search_query) query &= Q(host__iregex=search_query_re) | Q( title__iregex=search_query_re) party_slug = request.POST.get('party') if party_slug: party = get_object_or_404(Party.objects.for_user(request.user), slug=party_slug) query = Q(rating__party=party) & query contests = Contest.objects if party_slug else Contest.visible contests = contests.select_related('resource') contests = contests.annotate(has_statistics=Exists('statistics')) contests = contests.order_by('start_time', 'title') if past_action == 'hide': contests = contests.filter(end_time__gte=timezone.now()) now = timezone.now() try: result = [] for contest in contests.filter(query): color = contest.resource.color if past_action not in ['show', 'hide'] and contest.end_time < now: color = contest.resource.info.get('get_events', {}).get( 'colors', {}).get(past_action, color) c = { 'id': contest.pk, 'title': contest.title, 'host': contest.host, 'url': (reverse('ranking:standings', args=(slug(contest.title), contest.pk)) if contest.has_statistics else (contest.standings_url if contest.standings_url and contest.end_time < now else contest.url)), 'start': (contest.start_time + timedelta(minutes=offset)).strftime("%Y-%m-%dT%H:%M:%S"), 'end': (contest.end_time + timedelta(minutes=offset)).strftime("%Y-%m-%dT%H:%M:%S"), 'countdown': contest.next_time_to(now), 'hr_duration': contest.hr_duration, 'color': color, 'icon': contest.resource.icon, } result.append(c) except Exception as e: return JsonResponse( {'message': f'query = `{search_query}`, error = {e}'}, safe=False, status=400) return JsonResponse(result, safe=False)