Beispiel #1
0
def klb_person_refresh_stat(request, person_id):
    person = get_object_or_404(models.Klb_person, pk=person_id)
    n_results_changed_total = 0
    for participant in person.klb_participant_set.all():
        year = participant.match_year
        if models.is_active_klb_year(year, True):
            age_group_res = participant.fill_age_group()
            if age_group_res == -1:
                messages.warning(
                    request,
                    u'Не удалось заполнить участнику группу за {} год!'.format(
                        year))
            else:
                if age_group_res:
                    messages.success(
                        request,
                        u'Группа участника в КЛБМатче–{} изменена'.format(
                            year))
                n_results_changed = 0
                team = participant.team
                for klb_result in person.klb_result_set.filter(
                        race__event__start_date__year=year):
                    if recalc_klb_result(
                            klb_result,
                            request.user,
                            comment=
                            u'При пересчёте всех результатов участника КЛБМатча'
                    ):
                        n_results_changed += 1
                        if team:
                            prev_score = team.score
                            team.refresh_from_db()
                            models.Klb_team_score_change.objects.create(
                                team=team,
                                race=klb_result.race,
                                clean_sum=team.score - team.bonus_score,
                                bonus_sum=team.bonus_score,
                                delta=team.score - prev_score,
                                n_persons_touched=1,
                                comment=
                                u'Пересчёт администратором всех очков участника {} {}'
                                .format(person.fname, person.lname),
                                added_by=request.user,
                            )
                if n_results_changed:
                    n_results_changed_total += n_results_changed
                    update_participant_score(participant,
                                             to_calc_sum=True,
                                             to_update_team=True)
                messages.success(
                    request,
                    u"Статистика участника и его команды в КЛБМатче–{} обновлена."
                    .format(year))
    if n_results_changed_total:
        messages.success(
            request, u'Изменилось результатов у бегуна: {}'.format(
                n_results_changed_total))
    else:
        messages.warning(request, u'Ни одного результата не изменилось')
    return redirect(person)
Beispiel #2
0
def klb_make_individual_payment(request, year):
	context = user_edit_vars(request.user)
	year = models.int_safe(year)
	if not models.is_active_klb_year(year, context['is_admin']):
		messages.warning(request, u'Сейчас нельзя заявиться в КЛБМатч–{}'.format(year))
		return redirect(reverse('results:klb_match_summary', kwargs={'year': year}))
	participant = models.Klb_participant.objects.filter(klb_person__runner__user_id=request.user.id, match_year=year).first()
	if not participant:
		messages.warning(request, u'Вы ещё не заявлены в КЛБМатч–{}'.format(year))
		return redirect(reverse('results:klb_application', kwargs={'year': year}))
	person = participant.klb_person
	if participant.paid_status != models.PAID_STATUS_NO:
		messages.warning(request, u'Вы уже оплатили участие в КЛБМатче–{}'.format(year))
		return redirect(person)
	if participant.team and not participant.team.club.members_can_pay_themselves:
		messages.warning(request, u'Ваше участие в КЛБМатче может оплатить только капитан команды «{}»; Вам достаточно передать деньги ему.'.format(
			participant.team.name))
		return redirect(person)
	payment = models.Payment_moneta.objects.create(
		amount=models_klb.get_participation_price(year),
		description=u'Оплата за себя: {} {}'.format(person.fname, person.lname),
		user=request.user,
		sender=request.user.get_full_name(),
	)
	payment.refresh_from_db()
	payment.transaction_id = DESCRIPTION_PREFIX + unicode(payment.id)
	payment.signature = get_payment_md5(payment)
	payment.save()

	participant.payment = payment
	participant.save()
	models.write_log('klb_make_individual_payment: Redirecting to {}'.format(get_redirect_url(payment)))
	return redirect(get_redirect_url(payment))
Beispiel #3
0
def make_klb_result(table_update, user, only_bonus_score=False): # Only if is_for_klb=True
	result = models.Result.objects.filter(pk=table_update.child_id).first()
	if not result:
		return False, u'Результат с id {} не найден'.format(table_update.child_id), None
	runner = result.runner
	if not runner:
		return False, u'Бегун у результата с id {} не найден'.format(result.id), None
	person = runner.klb_person
	if not person:
		return False, u'Бегун {} {} (id {}) не участвовал в КЛБМатчах'.format(runner.fname, runner.lname, runner.id), None

	race = result.race
	event = race.event
	race_date = race.start_date if race.start_date else event.start_date
	year = race_date.year
	if not models.is_active_klb_year(year, True):
		return False, u'Забег {} (id {}) относится к году {}. Забеги этого года не могут быть учтены в КЛБМатче'.format(event.name, event.id, year), None
	participant = person.klb_participant_set.filter(match_year=year).first()
	if not participant:
		return False, u'Участник КЛБМатчей {} {} (id {}) не участвует в текущем КЛБМатче'.format(person.fname, person.lname, person.id), None
	if not ( ((participant.date_registered is None) or (participant.date_registered <= race_date)) \
			and ((participant.date_removed is None) or (participant.date_removed >= race_date)) ):
		return False, u'Участник КЛБМатчей {} {} (id {}) не участвовал в КЛБМатче в день забега {} (id {})'.format(
			person.fname, person.lname, person.id, event.name, event.id), None
	if models.Klb_result.objects.filter(race__event=result.race.event, klb_person=person).exists():
		return False, u'У участника КЛБМатчей {} {} (id {}) уже есть в зачёте результат на забеге «{}» (id {})'.format(
			person.fname, person.lname, person.id, event.name, event.id), None
	klb_result = create_klb_result(result, person, user, only_bonus_score=only_bonus_score, participant=participant,
		comment=u'При одобрении действия с id {} администратором'.format(table_update.id))
	return True, '', (result.race, race_date.year, person, participant.team)
Beispiel #4
0
def result_mark_as_error(request, result_id):
	if not ('frmKlbErrorResult_submit' in request.POST):
		return redirect(result.get_editor_url())
	result = get_object_or_404(models.Result, pk=result_id)
	if not hasattr(result, 'klb_result'):
		messages.warning(request, u'Этот результат и так не учтён в КЛБМатчах')
		return redirect(result.get_editor_url())
	klb_result = result.klb_result
	event = result.race.event 
	year = event.start_date.year
	if models.is_active_klb_year(year):
		messages.warning(request, u'Этот результат относится к продолжающемуся КЛБМатчу. Просто удалите его и, если нужно, отвяжите от бегуна')
		return redirect(result.get_editor_url())
	klb_result.result = None
	klb_result.is_error = True
	klb_result.save()

	touched_fields = []
	runner = result.runner
	if runner:
		touched_fields.append('runner')
		result.runner = None
	user = result.user
	if user:
		touched_fields.append('user')
		result.user = None
	result.save()
	if user:
		update_runner_stat(user=user)
	if runner:
		update_runner_stat(runner=runner)
	models.log_obj_create(request.user, event, models.ACTION_RESULT_UPDATE, field_list=touched_fields, child_object=result,
		comment=u'При помечании КЛБ-результата как ошибочного')
	messages.success(request, u'КЛБ-результат помечен как ошибочный и отвязан от бегуна')
	return redirect(result.get_editor_url())
Beispiel #5
0
def about_match(request, year=models.CUR_KLB_YEAR):
    year = models.int_safe(year)
    context = user_edit_vars(request.user)
    if (year < FIRST_YEAR_WITH_INVITATION) or (
        (year > models.CUR_KLB_YEAR)
            and not models.is_active_klb_year(year, context['is_admin'])):
        year = models.CUR_KLB_YEAR
    elif year < models.CUR_KLB_YEAR:
        context['this_is_old_match'] = True

    year_for_results = models.CUR_KLB_YEAR
    N_PERSONS_PER_TABLE = 3
    teams = models.Klb_team.objects.filter(year=year_for_results).exclude(
        number=models.INDIVIDUAL_RUNNERS_CLUB_NUMBER).select_related('club')
    if not context['is_admin']:
        teams = teams.filter(n_members_started__gt=0)
    context['teams_all'] = teams.order_by('place')
    context['teams_medium'] = teams.filter(
        place_medium_teams__isnull=False).order_by('place_medium_teams')
    context['teams_small'] = teams.filter(
        place_small_teams__isnull=False).order_by('place_small_teams')
    context['groups'] = []
    all_participants = models.Klb_participant.objects.filter(
        match_year=year_for_results, place__isnull=False)
    for group in list(
            models.Klb_age_group.get_groups_by_year(year_for_results)):
        if group.gender == models.GENDER_UNKNOWN:
            participants = all_participants.order_by('place')
        elif group.birthyear_min is None:
            participants = all_participants.filter(
                klb_person__gender=group.gender,
                place_gender__isnull=False).order_by('place_gender')
        else:
            participants = group.klb_participant_set.filter(
                place_group__isnull=False).order_by('place_group')
        context['groups'].append({
            'group':
            group,
            'participants':
            participants.select_related('klb_person__city',
                                        'team')[:N_PERSONS_PER_TABLE]
        })
    context['page_title'] = u'Приглашение на КЛБМатч–{}'.format(year)
    context['year'] = year
    context['year_for_results'] = year_for_results
    context['small_team_size'] = models_klb.get_small_team_limit(
        year_for_results)
    context['medium_team_size'] = models_klb.get_medium_team_limit(
        year_for_results)
    context['regulations_link'] = models_klb.get_regulations_link(year)
    context[
        'regulations_changes_link'] = models_klb.get_regulations_changes_link(
            year)
    context['n_results'] = get_stat_value('n_results')
    return render(request, 'klb/about_match_{}.html'.format(year), context)
Beispiel #6
0
def payment_delete_participant(request, payment_id, participant_id):
    if 'btnDeleteParticipant' in request.POST:
        payment = get_object_or_404(models.Payment_moneta, pk=payment_id)
        participant = get_object_or_404(models.Klb_participant,
                                        pk=participant_id)
        person = participant.klb_person
        year = participant.match_year

        if not models.is_active_klb_year(year):
            messages.warning(
                request,
                u'Сейчас нельзя менять платежи за {} год'.format(year))
        elif participant.payment_id is None:
            messages.warning(
                request,
                u'Участник {} за {} год пока не привязан ни к какому платежу'.
                format(person, year))
        elif participant.payment_id != payment.id:
            messages.warning(
                request,
                u'Участник {} за {} год привязан к другому платежу — с id {}'.
                format(person, year, participant.payment_id))
        elif participant.is_paid_through_site:
            messages.warning(
                request,
                u'Участник {} за {} год входил в этот платёж при оплате через сайт. Такого нельзя удалить'
                .format(person, year))
        elif not payment.is_paid:
            messages.warning(
                request,
                u'Платёж с id {} ещё не оплачен. Такие редактировать нельзя'.
                format(payment.id))
        elif participant.paid_status == models.PAID_STATUS_NO:
            messages.warning(
                request,
                u'Участник {} за {} год и так помечен как не оплачивавший участие. Что-то не то'
                .format(person, year))
        else:
            participant.paid_status = models.PAID_STATUS_NO
            participant.payment = None
            participant.save()
            models.log_obj_create(request.user,
                                  person,
                                  models.ACTION_KLB_PARTICIPANT_UPDATE,
                                  child_object=participant,
                                  field_list=['payment', 'paid_status'],
                                  comment=u'Удалён из платежа {}'.format(
                                      payment.id),
                                  verified_by=models.USER_ROBOT_CONNECTOR)
            messages.success(
                request,
                u'Участник {} за {} год удалён из этого платежа'.format(
                    person, year))
    return redirect(payment)
Beispiel #7
0
def klb_team_details(request,
                     team_id,
                     show_all_results=False,
                     ordering=models.ORDERING_CLEAN_SCORE):
    ordering = models.int_safe(ordering)
    team = get_object_or_404(models.Klb_team, pk=team_id)
    context = user_edit_vars(request.user, club=team.club)
    participants = team.klb_participant_set.select_related('klb_person')
    context['klb_results'] = []
    for participant in participants.order_by('klb_person__lname',
                                             'klb_person__fname'):
        person = participant.klb_person
        results = person.klb_result_set.filter(
            event_raw__start_date__year=team.year).select_related(
                'race__event', 'event_raw', 'result')
        if show_all_results:
            results = results.order_by('-event_raw__start_date')
        else:
            results = results.order_by('-klb_score', '-event_raw__start_date')
        if not show_all_results:
            results = results.filter(is_in_best=True)
        context['klb_results'] += [{
            'participant': participant,
            'klb_result': klb_result
        } for klb_result in results]
    context['page_title'] = u'Команда в КЛБМатче: {}, {} год'.format(
        team.name, team.year)
    context['show_all_results'] = show_all_results
    if context['is_admin']:
        context['n_seniors'] = participants.filter(is_senior=True).count()
        first_participant = participants.exclude(
            date_registered=None).order_by('date_registered').first()
        if first_participant:
            context[
                'first_participant_date'] = first_participant.date_registered

    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=ordering)

    if models.is_active_klb_year(
            team.year, context['is_admin']) and (context['is_admin']
                                                 or context['is_editor']):
        context['n_unpaid_participants'] = team.klb_participant_set.filter(
            paid_status=models.PAID_STATUS_NO).count()
        if context['n_unpaid_participants']:
            context['last_day_to_pay'] = get_last_day_to_pay(team.year)
            context[
                'n_unpaid_from_all_club_teams'] = models.Klb_participant.objects.filter(
                    team__club=team.club,
                    match_year=team.year,
                    paid_status=models.PAID_STATUS_NO).count()
    return render(request, 'klb/team_details.html', context)
Beispiel #8
0
def klb_participant_for_captain_details(request, participant_id):
    participant = get_object_or_404(models.Klb_participant,
                                    pk=participant_id,
                                    team__isnull=False)
    person = participant.klb_person
    team = participant.team
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете изменять контактные данные членов команды {} года. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)

    if 'frmParticipant_submit' in request.POST:
        form = forms.KlbParticipantForTeamCaptainForm(request.POST,
                                                      instance=participant)
        if form.is_valid():
            participant = form.save()
            log_form_change(request.user,
                            form,
                            models.ACTION_KLB_PARTICIPANT_UPDATE,
                            obj=participant.klb_person,
                            child_id=participant.id)
            messages.success(
                request,
                u'Данные об участнике {} {} в КЛБМатче-{} успешно обновлены. Изменены следующие поля: {}'
                .format(person.fname, person.lname, team.year,
                        ", ".join(form.changed_data)))
            person.update_person_contact_fields_and_prepare_letter(
                request.user, team, participant.email,
                participant.phone_number)
            return redirect(team.get_contact_info_url())
        else:
            messages.warning(
                request,
                u"Данные об участнике {} {} в КЛБМатче-{} не обновлены. Пожалуйста, исправьте ошибки в форме."
                .format(person.fname, person.lname, team.year))
    else:
        form = forms.KlbParticipantForTeamCaptainForm(instance=participant)

    context['form'] = form
    context['team'] = team
    context['person'] = person
    context['participant'] = participant
    context[
        'page_title'] = u'Изменение контактных данных участника {} {} в КЛБМатче-{}'.format(
            person.fname, person.lname, team.year)
    context = team.update_context_for_team_page(context, request.user)
    return render(request, "klb/participant_for_captain_details.html", context)
Beispiel #9
0
def klb_team_delete_participants(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    if 'delete_submit' in request.POST:
        participants_deleted = 0
        for key, val in request.POST.items():
            if key.startswith("to_delete_"):
                person_id = models.int_safe(key[len("to_delete_"):])
                person = models.Klb_person.objects.filter(pk=person_id).first()
                if person is None:
                    messages.warning(
                        request,
                        u'Участник КЛБМатчей с id {} не найден. Пропускаем'.
                        format(person_id))
                    continue
                participant = person.klb_participant_set.filter(
                    match_year=team.year).first()
                if participant is None:
                    messages.warning(
                        request,
                        u'Участник КЛБМатчей {} (id {}) и так не числится в команде. Пропускаем'
                        .format(person, person.id))
                    continue
                if person.klb_result_set.filter(
                        race__event__start_date__year=team.year).exists():
                    messages.warning(
                        request,
                        u'Участник КЛБМатчей {} (id {}) уже имеет результаты в зачёт КЛБМатча. Пропускаем'
                        .format(person, person.id))
                    continue
                models.log_klb_participant_delete(request.user, participant)
                participant.delete()
                participants_deleted += 1
        messages.success(
            request,
            u'Удалено участников из команды: {}'.format(participants_deleted))
        update_team_score(team, to_clean=False, to_calc_sum=True)
    return redirect(team)
Beispiel #10
0
def klb_team_contact_info(request, team_id, ordering=models.ORDERING_NAME):
    ordering = models.int_safe(ordering)
    team = get_object_or_404(models.Klb_team, pk=team_id)
    context, has_rights, target = check_rights(request, club=team.club)
    if not has_rights:
        return target
    context[
        'page_title'] = u'КЛБМатч–{}, команда {}: контактные данные участников'.format(
            team.year, team.name)
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=ordering)
    context['all_emails'] = u', '.join(
        participant.email for participant in context['participants']
        if participant.email)
    context['is_active_klb_year'] = models.is_active_klb_year(team.year)
    return render(request, 'klb/team_contact_info.html', context)
Beispiel #11
0
def klb_team_change_name(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    if not models.is_active_klb_year(team.year, True):
        messages.warning(
            request,
            u'Вы уже не можете менять название команды за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    if 'changeName_submit' in request.POST:
        name_new = request.POST.get('teamName', '').strip()
        if name_new == team.name:
            messages.warning(
                request,
                u'Вы не изменили название команды. Всё осталось по-прежнему.')
            return redirect(team)
        if name_new == '':
            messages.warning(
                request,
                u'Название команды не может быть пустым. Всё осталось по-прежнему.'
            )
            return redirect(team)
        if not (name_new[0].isalpha() or name_new[0].isdigit()):
            messages.warning(
                request,
                u'Название команды должно начинаться с буквы или цифры. Всё осталось по-прежнему.'
            )
            return redirect(team)
        if models.Klb_team.objects.filter(
                year=team.year, club__city=team.club.city,
                name__iexact=name_new).exclude(pk=team.id).exists():
            messages.warning(
                request,
                u'Команда с названием «{}» {}уже заявлена в КЛБМатч–{}. Название не изменено.'
                .format(
                    name_new, u'из города {} '.format(team.club.city.name)
                    if team.club.city else '', team.year))
            return redirect(team)
        team.name = name_new
        team.save()
        models.log_obj_create(request.user,
                              team,
                              models.ACTION_UPDATE,
                              field_list=['name'])
        messages.success(request, u'Название команды успешно изменено')
    return redirect(team)
Beispiel #12
0
def application_payment(request, year=models.CUR_KLB_YEAR):
    context = user_edit_vars(request.user)
    year = models.int_safe(year)
    if not models.is_active_klb_year(year, context['is_admin']):
        year = models.CUR_KLB_YEAR
    context['year'] = year
    context['price'] = models_klb.get_participation_price(year)

    participant = models.Klb_participant.objects.filter(
        klb_person__runner__user_id=request.user.id, match_year=year).first()
    if not participant:
        messages.warning(request,
                         u'Вы ещё не заявлены в КЛБМатч–{}'.format(year))
        return redirect(
            reverse('results:klb_application', kwargs={'year': year}))

    person = participant.klb_person
    if participant.paid_status != models.PAID_STATUS_NO:
        messages.warning(
            request,
            u'Ваше участие в КЛБМатче–{} уже оплачено. Отлично!'.format(year))
        return redirect(person)
    if participant.team:
        club = participant.team.club
        if not club.members_can_pay_themselves:
            messages.warning(
                request,
                u'Ваше участие в КЛБМатче может оплатить только капитан команды; Вам достаточно передать деньги ему.'
            )
            return redirect(person)
        context['club'] = club

    if participant.is_senior:
        context['can_pay_zero'] = True
        age = year - person.birthday.year
        context['reason'] = u'на конец {} года Вам будет {} {}'.format(
            year, age, plural_ending_11(age))
    elif person.disability_group != 0:
        context['can_pay_zero'] = True
        context['reason'] = u'у Вас {} группа инвалидности'.format(
            person.disability_group)
    else:
        context['can_pay_zero'] = False
    return render(request, 'klb/application_payment.html', context)
Beispiel #13
0
def make_report(request, year, role):
    year = models.int_safe(year)
    if not models.is_active_klb_year(year):
        messages.warning(
            request,
            u'Сейчас нельзя создавать слепки КЛБМатча за {} год'.format(year))
        return redirect('results:reports')

    if role != 'client':
        role = 'editor'

    result, error = mk_table_set_wrapper(role, year, request.user)
    if result:
        messages.success(
            request, u'Слепок КЛБМатча за {} год успешно создан'.format(year))
    else:
        messages.warning(request,
                         u'Слепок не создан. Причина: {}'.format(error))
    return redirect('results:klb_reports', year=year)
Beispiel #14
0
def club_details(request, club_id):
    club = get_object_or_404(models.Club, pk=club_id)
    user = request.user
    context = user_edit_vars(user, club=club)
    context['club'] = club
    teams_by_year = OrderedDict()
    teams = club.klb_team_set.order_by('-year', 'name')
    for team in teams:
        if team.year not in teams_by_year:
            teams_by_year[team.year] = []
        row = {'team': team}
        if team.place:
            row['n_teams'] = models.Klb_team.get_teams_number(year=team.year)
            if team.place_medium_teams:
                row['n_medium_teams'] = models.Klb_team.get_medium_teams_number(
                    year=team.year)
            elif team.place_small_teams:
                row['n_small_teams'] = models.Klb_team.get_small_teams_number(
                    year=team.year)
        teams_by_year[team.year].append(row)
    context['teams_by_year'] = teams_by_year
    context['page_title'] = u'Клуб любителей бега {}'.format(club.name)
    context['club_names'] = club.club_name_set.order_by('name')
    if club.city:
        context['page_title'] += u' ({})'.format(club.strCity())
    if context['is_admin'] or context['is_editor']:
        if datetime.date.today().year <= models.CUR_KLB_YEAR:
            context['cur_year_team_name'] = club.get_next_team_name(
                models.CUR_KLB_YEAR)
            context['CUR_KLB_YEAR'] = models.CUR_KLB_YEAR
        if models.is_active_klb_year(models.NEXT_KLB_YEAR,
                                     context['is_admin']):
            context['next_year_team_name'] = club.get_next_team_name(
                models.NEXT_KLB_YEAR)
            context['NEXT_KLB_YEAR'] = models.NEXT_KLB_YEAR
    if user.is_authenticated and hasattr(user, 'runner'):
        context[
            'is_active_member'] = user.runner.id in club.get_active_members_or_klb_participants_runner_ids(
            )

    context.update(get_club_records_context(club=club))
    return render(request, 'club/club_details.html', context)
Beispiel #15
0
def klb_team_refresh_stat(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    if not models.is_active_klb_year(team.year, True):
        messages.warning(
            request,
            u"Сейчас нельзя обновлять статистику команд за {} год".format(
                team.year))
        return redirect(team)
    participants = models.Klb_participant.objects.filter(team=team)
    person_ids = set(participants.values_list('klb_person_id', flat=True))
    models.Klb_result.objects.filter(event_raw__start_date__year=team.year,
                                     klb_person_id__in=person_ids).update(
                                         is_in_best=False,
                                         is_in_best_bonus=False)
    for participant in participants:
        update_participant_score(participant, to_clean=False)
    update_team_score(team, to_calc_sum=True)
    fill_match_places(year=team.year, fill_age_places=False)
    messages.success(request, u"Статистика команды обновлена")
    return redirect(team)
Beispiel #16
0
def individual_pay_nothing(request, year=models.CUR_KLB_YEAR):
    context = user_edit_vars(request.user)
    year = models.int_safe(year)
    if not models.is_active_klb_year(year, context['is_admin']):
        year = models.CUR_KLB_YEAR
    context['year'] = year
    participant = models.Klb_participant.objects.filter(
        klb_person__runner__user_id=request.user.id, match_year=year).first()
    if not participant:
        messages.warning(request,
                         u'Вы ещё не заявлены в КЛБМатч–{}'.format(year))
        return redirect(
            reverse('results:klb_application', kwargs={'year': year}))
    if participant.paid_status != models.PAID_STATUS_NO:
        messages.warning(request,
                         u'Вы уже оплатили участие в КЛБМатче–{}'.format(year))
        return redirect(participant.klb_person)
    if 'btnJoinForFree' not in request.POST:
        return redirect(participant.klb_person)
    payment = models.Payment_moneta.objects.create(
        amount=0,
        is_dummy=True,
        is_paid=True,
        user=request.user,
    )
    payment.transaction_id = models.PAYMENT_DUMMY_PREFIX + unicode(payment.id)
    payment.save()

    participant.payment = payment
    participant.paid_status = models.PAID_STATUS_FREE
    participant.save()
    models.log_obj_create(request.user,
                          participant.klb_person,
                          models.ACTION_KLB_PARTICIPANT_UPDATE,
                          child_object=participant,
                          field_list=['payment', 'paid_status'],
                          comment=u'Индивидуальная оплата')
    messages.success(request,
                     u'Отлично, с оплатой разобрались. Пора стартовать!')
    return redirect(participant.klb_person)
Beispiel #17
0
def remove_from_match(request, year):
    year = models.int_safe(year)
    target = redirect(
        reverse('results:klb_match_summary', kwargs={'year': year}))
    if not models.is_active_klb_year(year, models.is_admin(request.user)):
        messages.warning(
            request,
            u'Участников КЛБМатча–{} сейчас нельзя редактировать'.format(year))
        return target
    participant = None
    user = request.user
    if hasattr(user, 'runner'):
        person = user.runner.klb_person
        if person:
            participant = person.klb_participant_set.filter(
                match_year=year).first()
    if participant is None:
        messages.warning(request,
                         u'Вы и не были заявлены в КЛБМатч–{}'.format(year))
        return target
    if person.klb_result_set.filter(
            race__event__start_date__year=year).exists():
        messages.warning(request, (
            u'У Вас уже есть результаты в зачёт КЛБМатча–{}. Если Вы всё равно хотите отказаться от участия, '
            + u'пожалуйста, напишите нам на {}').format(year, models.KLB_MAIL))
        return target
    if participant.team:
        messages.warning(
            request,
            (u'Вы заявлены в КЛБМатч–{} за команду «{}». ' +
             u'Для отзаявки обратитесь, пожалуйста, к руководителю клуба'
             ).format(year, participant.team.name))
        return target
    models.log_klb_participant_delete(user, participant)
    participant.delete()
    messages.warning(request,
                     u'Вы успешно отзаявлены из КЛБМатча–{}'.format(year))
    return target
Beispiel #18
0
def result_delete(request, result_id):
	result = get_object_or_404(models.Result, pk=result_id)
	race = result.race
	models.log_obj_delete(request.user, race.event, child_object=result)
	res_str = unicode(result)
	if hasattr(result, 'klb_result'):
		year = race.event.start_date.year
		if models.is_active_klb_year(year):
			person = result.klb_result.klb_person
			team = result.klb_result.klb_participant.team
			result.klb_result.delete()
			update_persons_score(year=year, persons_to_update=[person], update_runners=True)
			if team:
				prev_score = team.score
				team.refresh_from_db()
				models.Klb_team_score_change.objects.create(
					team=team,
					race=result.race,
					clean_sum=team.score - team.bonus_score,
					bonus_sum=team.bonus_score,
					delta=team.score - prev_score,
					n_persons_touched=1,
					comment=u'Удаление результата участника {} {} насовсем'.format(person.fname, person.lname),
					added_by=request.user,
				)
			messages.warning(request, u'Результат из КЛБМатча успешно удалён')
	runner = result.runner
	result.delete()
	if runner:
		update_runner_stat(runner=runner)
		if runner.user:
			update_runner_stat(user=runner.user)
	fill_places(race)
	fill_race_headers(race)
	messages.success(request, u"Результат {} на забеге «{}» успешно удалён. Места проставлены заново, числа участников обновлены".format(
		res_str, race))
	return redirect(race)
Beispiel #19
0
def klb_match_summary(request, year=models.CUR_KLB_YEAR, tab=KLB_TAB_DEFAULT):
    user = request.user
    context = user_edit_vars(user)
    year = models.int_safe(year)
    if (year < 2010) or (year > max(models.CUR_KLB_YEAR,
                                    models.NEXT_KLB_YEAR)):
        year = models.CUR_KLB_YEAR
    if (year == models.NEXT_KLB_YEAR) and not (
            models.NEXT_KLB_YEAR_AVAILABLE_FOR_ALL or context['is_admin']):
        year = models.CUR_KLB_YEAR
    context['active_tab'] = tab if (tab in KLB_TABS) else KLB_TAB_DEFAULT
    N_PERSONS_PER_TABLE = 3
    teams = models.Klb_team.objects.filter(year=year).exclude(
        number=models.INDIVIDUAL_RUNNERS_CLUB_NUMBER).select_related(
            'club__city__region__country')
    if context['is_admin']:
        context['teams_not_paid_ids'] = set(
            models.Klb_participant.objects.exclude(team=None).filter(
                match_year=year,
                paid_status=models.PAID_STATUS_NO).values_list('team_id',
                                                               flat=True))
    else:
        teams = teams.filter(n_members__gt=0)

    context['teams_all'] = teams.order_by('place', 'name')
    context['teams_medium'] = teams.filter(
        place_medium_teams__isnull=False).order_by('place_medium_teams',
                                                   'name')
    context['teams_small'] = teams.filter(
        place_small_teams__isnull=False).order_by('place_small_teams', 'name')
    if year >= 2019:
        context['teams_secondary'] = teams.filter(
            place_secondary_teams__isnull=False).order_by(
                'place_secondary_teams', 'name')

    context['groups'] = []
    all_participants = models.Klb_participant.objects.filter(
        match_year=year, place__isnull=False)
    for group in list(models.Klb_age_group.get_groups_by_year(year)):
        if group.gender == models.GENDER_UNKNOWN:
            participants = all_participants.order_by('place')
        elif group.birthyear_min is None:
            participants = all_participants.filter(
                klb_person__gender=group.gender,
                place_gender__isnull=False).order_by('place_gender')
        else:
            participants = group.klb_participant_set.filter(
                place_group__isnull=False).order_by('place_group')
        context['groups'].append({
            'group':
            group,
            'participants':
            participants.exclude(n_starts=0).select_related(
                'klb_person__city__region__country',
                'team')[:N_PERSONS_PER_TABLE]
        })

    context['stats'] = []
    for category in models.Klb_match_category.objects.filter(
            year=year).order_by('stat_type'):
        context['stats'].append({
            'category':
            category,
            'stats':
            models.Klb_participant_stat.objects.filter(
                klb_participant__match_year=year,
                stat_type=category.stat_type,
                place__isnull=False).select_related(
                    'klb_participant__klb_person__city',
                    'klb_participant__team').order_by('place')
            [:N_PERSONS_PER_TABLE]
        })

    context['page_title'] = u'КЛБМатч–{}: Текущие результаты'.format(year)
    context['year'] = year
    context['is_active_klb_year'] = models.is_active_klb_year(
        year, context['is_admin'])
    context['individual_participants'] = models.Klb_participant.objects.filter(
        match_year=year,
        team=None).select_related('klb_person__city').order_by(
            '-score_sum', 'klb_person__lname', 'klb_person__fname')
    context['cur_participant_ids'] = get_cur_participant_ids(user)
    context['small_team_size'] = models_klb.get_small_team_limit(year)
    context['medium_team_size'] = models_klb.get_medium_team_limit(year)
    context['regulations_link'] = models_klb.get_regulations_link(year)
    context['old_match_link'] = models_klb.get_old_match_link(year)
    context['show_link_on_winners_by_regions'] = (
        models.FIRST_YEAR_WITH_KLBMATCH_STAT_BY_REGIONS <= year <
        models.CUR_KLB_YEAR)

    context['large_teams_count'] = models.Klb_team.get_large_teams_number(year)
    context['medium_teams_count'] = models.Klb_team.get_medium_teams_number(
        year)
    context['small_teams_count'] = models.Klb_team.get_small_teams_number(year)
    return render(request, 'klb/match_summary.html', context)
Beispiel #20
0
def payment_add_participant(request, payment_id):
    if 'btnAddParticipant' in request.POST:
        payment = get_object_or_404(models.Payment_moneta, pk=payment_id)
        participant_id = models.int_safe(
            request.POST.get('select_participant'))
        participant = get_object_or_404(models.Klb_participant,
                                        pk=participant_id)
        person = participant.klb_person
        year = participant.match_year

        if not models.is_active_klb_year(year):
            messages.warning(
                request,
                u'Сейчас нельзя менять платежи за {} год'.format(year))
        elif participant.payment_id:
            messages.warning(
                request,
                u'Участник {} за {} год уже привязан к платежу с id {}'.format(
                    person, year, participant.payment_id))
        elif not payment.is_paid:
            messages.warning(
                request,
                u'Платёж с id {} ещё не оплачен. Такие редактировать нельзя'.
                format(payment.id))
        elif participant.paid_status != models.PAID_STATUS_NO:
            messages.warning(
                request,
                u'Участник {} за {} год и так помечен как оплативший участие. Что-то не то'
                .format(person, year))
        else:
            participant.payment = payment
            participant.is_paid_through_site = False
            amount_str = request.POST.get('amount')
            if amount_str == '0':
                participant.paid_status = models.PAID_STATUS_FREE
                participant.save()
                models.log_obj_create(
                    request.user,
                    person,
                    models.ACTION_KLB_PARTICIPANT_UPDATE,
                    child_object=participant,
                    field_list=[
                        'payment', 'is_paid_through_site', 'paid_status'
                    ],
                    comment=u'Добавлен к платежу {}'.format(payment.id),
                    verified_by=models.USER_ROBOT_CONNECTOR)
                messages.success(
                    request,
                    u'Участник {} за {} год добавлен к платежу как участвующий бесплатно'
                    .format(person, year))
            else:
                amount = models.int_safe(amount_str)
                if amount == get_participation_price(year):
                    participant.paid_status = models.PAID_STATUS_FULL
                    participant.save()
                    models.log_obj_create(
                        request.user,
                        person,
                        models.ACTION_KLB_PARTICIPANT_UPDATE,
                        child_object=participant,
                        field_list=[
                            'payment', 'is_paid_through_site', 'paid_status'
                        ],
                        comment=u'Добавлен к платежу {}'.format(payment.id),
                        verified_by=models.USER_ROBOT_CONNECTOR)
                    messages.success(
                        request,
                        u'Участник {} за {} год добавлен к платежу как участвующий за полную стоимость'
                        .format(person, year))
                else:
                    messages.warning(
                        request,
                        u'Участник {} за {} год не привязан к платежу: недопустимая цена участия {}'
                        .format(person, year, amount))
    return redirect(payment)
Beispiel #21
0
def klb_team_add_new_participant(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    user = request.user
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    form = None
    to_create_runner = to_create_person = to_create_participant = False

    if 'step1_submit' in request.POST:
        form = RunnerForKlbForm(user=user, year=team.year, data=request.POST)
        if form.is_valid():
            new_runner = form.instance
            runners = models.Runner.objects.filter(
                Q(birthday=None) | Q(birthday__year=new_runner.birthday.year,
                                     birthday_known=False)
                | Q(birthday=new_runner.birthday, birthday_known=True),
                lname=new_runner.lname,
                fname=new_runner.fname,
                # n_starts__gt=0,
            ).select_related('city__region__country',
                             'klb_person').order_by('-n_starts')
            if new_runner.midname:
                runners = runners.filter(midname__in=['', new_runner.midname])
            if runners.exists(
            ):  # We want to ask whether we should create new runner or use some of old ones
                context['runners'] = []
                for runner in runners:
                    runner_dict = {}
                    runner_dict['runner'] = runner
                    info = []
                    if runner.birthday_known:
                        info.append(u'дата рождения {}'.format(
                            runner.birthday.strftime("%d.%m.%Y")))
                    elif runner.birthday:
                        info.append(u'{} год рождения'.format(
                            runner.birthday.year))
                    if runner.city:
                        info.append(runner.city.nameWithCountry())
                    n_starts = runner.n_starts if runner.n_starts else 0
                    info.append(u'{} результат{} в базе данных'.format(
                        n_starts,
                        results_util.plural_ending_new(runner.n_starts, 1)))
                    if runner.klb_person:
                        person = runner.klb_person
                        n_klb_starts = person.klb_result_set.count()
                        if n_klb_starts:
                            info.append(
                                u'{} результат{} в зачёт КЛБМатчей'.format(
                                    n_klb_starts,
                                    results_util.plural_ending_new(
                                        n_klb_starts, 1)))
                        runner_dict[
                            'cur_participant'] = person.klb_participant_set.filter(
                                match_year=team.year).first()
                    runner_dict['info'] = ', '.join(info)
                    context['runners'].append(runner_dict)
            else:  # There are no similar runners, so we can create him
                to_create_runner = True
        else:
            messages.warning(request, u'Пожалуйста, исправьте ошибки в форме')
    elif 'step2_submit' in request.POST:
        form = RunnerForKlbForm(user=user, year=team.year, data=request.POST)
        if form.is_valid():
            new_runner = form.instance
            runner_id = models.int_safe(request.POST.get('runner_id', 0))
            if runner_id == -1:  # This special value means we should create new runner
                to_create_runner = True
            else:  # We should add some existing runner
                cur_year_person_ids = set(
                    models.Klb_participant.objects.filter(
                        match_year=team.year).values_list('klb_person_id',
                                                          flat=True))
                runner = models.Runner.objects.filter(pk=runner_id).first()
                if runner:
                    person = runner.klb_person
                    if person:
                        if person.id in cur_year_person_ids:
                            person_team = person.klb_participant_set.filter(
                                match_year=team.year).first().team
                            if person_team:
                                messages.warning(
                                    request,
                                    u'{} {} (id {}) уже заявлен в КЛБМатч-{} в команду {}'
                                    .format(person.fname, person.lname,
                                            person.id, team.year,
                                            person_team.name))
                            else:
                                messages.warning(
                                    request,
                                    u'{} {} (id {}) уже заявлен в КЛБМатч-{} как индивидуальный участник'
                                    .format(person.fname, person.lname,
                                            person.id, team.year))
                            return redirect(team)
                        else:
                            to_create_participant = True
                    else:  # So we should create new person for this runner. And maybe we can update runner?
                        changed_fields = []
                        if runner.midname.lower() != new_runner.midname.lower(
                        ):
                            runner.midname = new_runner.midname
                            changed_fields.append('midname')
                        if (runner.birthday != new_runner.birthday
                            ) or not runner.birthday_known:
                            runner.birthday = new_runner.birthday
                            changed_fields.append('birthday')
                            if not runner.birthday_known:
                                runner.birthday_known = True
                                changed_fields.append('birthday_known')
                        if runner.city != new_runner.city:
                            runner.city = new_runner.city
                            changed_fields.append('city')
                        if changed_fields:
                            models.log_obj_create(
                                user,
                                runner,
                                models.ACTION_UPDATE,
                                field_list=changed_fields,
                                comment=
                                u'При добавлении отдельного участника в КЛБМатч'
                            )
                        to_create_person = True
                else:
                    messages.warning(
                        request,
                        u'К сожалению, выбранный Вами бегун (id {}) не найден. Попробуйте ещё раз'
                        .format(runner_id))
        else:
            messages.warning(request, u'Пожалуйста, исправьте ошибки в форме')

    if to_create_runner:
        runner = form.save(commit=False)
        runner.birthday_known = True
        runner.created_by = user
        runner.save()
        models.log_obj_create(
            user,
            runner,
            models.ACTION_CREATE,
            comment=u'При добавлении нового участника в КЛБМатч')
        to_create_person = True
    if to_create_person:
        person = runner.create_klb_person(
            user, comment=u'При добавлении нового участника в КЛБМатч')
        to_create_participant = True
    if to_create_participant:
        email = form.cleaned_data.get('email', '')
        phone_number = form.cleaned_data.get('phone_number', '')

        participant, club_member, is_changed = person.create_participant(
            team,
            user,
            email=email,
            phone_number=phone_number,
            comment=u'При добавлении нового участника в КЛБМатч-{}'.format(
                team.year),
            add_to_club=form.cleaned_data.get('and_to_club_members'))
        if is_changed:
            update_runner_stat(club_member=club_member)

        messages.success(
            request, u'{} {} успешно добавлен{} в команду с {}'.format(
                runner.fname, runner.lname,
                u'а' if person.gender == models.GENDER_FEMALE else '',
                participant.date_registered.strftime("%d.%m.%Y")))
        update_team_score(team, to_clean=False, to_calc_sum=True)
        return redirect(team)

    if form is None:
        initial = {}
        if club.city:
            initial['city_id'] = club.city.id
            initial['region'] = club.city.region.id
        form = RunnerForKlbForm(user=user, year=team.year, initial=initial)
    context['form'] = form
    context['page_title'] = u'Команда в КЛБМатче: {}, {} год'.format(
        team.name, team.year)
    context['year'] = team.year
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=models.ORDERING_NAME)
    if 'runners' in context:
        template = 'klb/team_add_new_participants_step2.html'
    else:
        template = 'klb/team_add_new_participants_step1.html'
    return render(request, template, context)
Beispiel #22
0
def application(request, year=models.CUR_KLB_YEAR):
    context = user_edit_vars(request.user)
    year = models.int_safe(year)
    if (year < datetime.date.today().year) or not models.is_active_klb_year(
            year, context['is_admin']):
        year = models.CUR_KLB_YEAR
    if (year < datetime.date.today().year) and models.NEXT_KLB_YEAR:
        year = models.NEXT_KLB_YEAR
    context['year'] = year
    context['was_participant'] = False
    user = request.user
    absent_fields = []
    to_create_runner = to_create_person = to_create_participant = False

    if user.is_authenticated:
        context['authenticated'] = True
        if hasattr(user, 'runner'):
            runner = user.runner
            person = runner.klb_person
            if person:
                if person.klb_participant_set.filter(match_year=year).exists():
                    messages.warning(
                        request,
                        u'Вы уже заявлены в КЛБМатч–{}. Успешных стартов!'.
                        format(year))
                    return redirect(
                        reverse('results:klb_match_summary',
                                kwargs={'year': year}))
                if person.klb_participant_set.exists():
                    context['was_participant'] = True
            else:
                to_create_person = True
        else:
            to_create_runner = True
        if not user.last_name.strip():
            absent_fields.append(u'Фамилия')
        if not user.first_name.strip():
            absent_fields.append(u'Имя')
        if not user.email.strip():
            absent_fields.append(u'Адрес электронной почты')
        if hasattr(user, 'user_profile'):
            profile = user.user_profile
            if not profile.email_is_verified:
                context['email_not_verified'] = True
            if not profile.midname.strip():
                absent_fields.append(u'Отчество')
            if profile.gender == models.GENDER_UNKNOWN:
                absent_fields.append(u'Пол')
            if profile.birthday is None:
                absent_fields.append(u'Дата рождения')
            if profile.city is None:
                absent_fields.append(u'Город')
        else:
            absent_fields += [u'Отчество', u'Пол', u'Дата рождения', u'Город']
        context['absent_fields'] = ', '.join(absent_fields)
        if len(absent_fields) == 1:
            context['absent_field'] = absent_fields[0]
    else:
        context['authenticated'] = False

    if context['authenticated'] and (not absent_fields) and ('submit_register'
                                                             in request.POST):
        comment = u'При индивидуальной заявке в КЛБМатч–{}'.format(year)
        if to_create_runner:
            runner = profile.create_runner(user, comment=comment)
            to_create_person = True
        if to_create_person:
            person = runner.create_klb_person(user, comment=comment)
        if (request.POST.get('was_participant', '')
                == 'yes') and (not context['was_participant']):
            comment += u'. Пишет, что уже участвовал!'
        elif (request.POST.get('was_participant', '')
              == 'no') and (context['was_participant']):
            comment += u'. Пишет, что раньше не участвовал!'

        disability_group = models.int_safe(
            request.POST.get('disability_group', 0))
        if not (0 <= disability_group <= 3):
            disability_group = 0
        participant, _, _ = person.create_participant(
            None,
            user,
            year=year,
            comment=comment,
            email=user.email,
            phone_number=profile.phone_number,
            disability_group=disability_group)
        # if context['is_admin'] or (request.user.id == 3231):
        return redirect(
            reverse('results:klb_application_payment', kwargs={'year': year}))
        # messages.success(request, u'Вы успешно заявлены в КЛБМатч–{}. Мы напишем Вам письмо до конца января, как оплатить участие в матче'.format(year))
        # return redirect(reverse('results:klb_match_summary', kwargs={'year': year}))
    context[
        'page_title'] = u'Подача индивидуальной заявки в КЛБМатч–{}'.format(
            year)
    context['regulations_link'] = models_klb.get_regulations_link(year)
    context['disability_groups'] = models.DISABILITY_GROUPS
    return render(request, 'klb/application_{}.html'.format(year), context)
Beispiel #23
0
def klb_team_move_participants(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    if datetime.date.today() > datetime.date(team.year, 5, 31):
        messages.warning(
            request,
            u'Перемещать людей между командами можно только до 31 мая.')
        return redirect(team)
    other_teams = club.klb_team_set.filter(year=team.year).exclude(pk=team.id)
    if not other_teams.exists():
        messages.warning(
            request,
            u'В Матч–{} вы заявили всего одну команду. Перемещать людей неоткуда.'
            .format(team.year))
        return redirect(team)

    if 'frmMoveParticipants_submit' in request.POST:
        participant_ids = set(
            models.Klb_participant.objects.filter(
                team__in=list(other_teams)).values_list('id', flat=True))
        persons_moved = 0
        move_limit = models_klb.get_team_limit(
            team.year) - team.klb_participant_set.count()
        touched_teams = set()
        today = datetime.date.today()
        for key, val in request.POST.items():
            if key.startswith("move_"):
                if persons_moved >= move_limit:
                    messages.warning(
                        request,
                        u'Вы достигли максимального числа людей в команде. Больше не перемещаем.'
                    )
                    break
                participant_id = models.int_safe(key[len("move_"):])
                participant = models.Klb_participant.objects.filter(
                    pk=participant_id).first()
                if participant is None:
                    messages.warning(
                        request,
                        u'Участник КЛБМатчей с id {} не найден. Пропускаем'.
                        format(participant_id))
                    continue
                if participant.id in participant_ids:
                    touched_teams.add(participant.team)
                    touched_teams.add(team)
                    participant.team = team
                    participant.clean()
                    participant.save()
                    models.log_obj_create(
                        request.user,
                        team,
                        models.ACTION_PERSON_MOVE,
                        child_object=participant,
                        field_list=['team'],
                        comment=u'При перемещении участников между командами')
                    persons_moved += 1
        messages.success(
            request, u'Перемещено участников в команду {}: {}'.format(
                team.name, persons_moved))
        for touched_team in touched_teams:
            update_team_score(touched_team, to_clean=True, to_calc_sum=True)
        return redirect(team)

    context[
        'other_teams_participants'] = models.Klb_participant.objects.filter(
            team__in=list(other_teams)).select_related('team',
                                                       'klb_person').order_by(
                                                           'team__name',
                                                           'klb_person__lname',
                                                           'klb_person__fname')
    context['team_limit'] = models_klb.get_team_limit(team.year)
    context['medium_team_limit'] = models_klb.get_medium_team_limit(team.year)
    context['small_team_limit'] = models_klb.get_small_team_limit(team.year)
    context['page_title'] = u'Команда в КЛБМатче: {}, {} год'.format(
        team.name, team.year)
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=models.ORDERING_NAME)
    return render(request, 'klb/team_move_participants.html', context)
Beispiel #24
0
def klb_team_add_old_participants(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    prev_year = team.year - 1

    context['max_email_length'] = models.MAX_EMAIL_LENGTH
    context['max_phone_number_length'] = models.MAX_PHONE_NUMBER_LENGTH

    prev_year_participants = models.Klb_participant.objects.filter(
        team__club=club, match_year=prev_year).select_related(
            'klb_person__runner__user__user_profile',
            'team').order_by('team__name', 'klb_person__lname',
                             'klb_person__fname')
    prev_year_participants_runner_ids = set(
        prev_year_participants.values_list('klb_person__runner__id',
                                           flat=True))

    club_members = club.club_member_set.filter(
        Q(date_removed=None) | Q(date_removed__year__gte=prev_year),
        runner__birthday__isnull=False,
        runner__birthday_known=True).exclude(
            runner__gender=models.GENDER_UNKNOWN).exclude(
                runner__lname='').exclude(runner__fname='').exclude(
                    runner_id__in=prev_year_participants_runner_ids
                ).select_related('runner__user__user_profile')

    runner_ids = prev_year_participants_runner_ids | set(
        club_members.values_list('runner_id', flat=True))

    if not runner_ids:
        messages.warning(
            request,
            u'Ваш клуб не участвовал в КЛБМатче–{}, и в клубе за последний год никто не состоял. Некого добавлять'
            .format(prev_year))
        return redirect(team)

    incorrect_emails = set()
    incorrect_phones = set()
    if 'frmAddOldParticipants_submit' in request.POST:
        n_persons_added = 0
        n_persons_wrong_data = 0
        cur_year_person_ids = set(
            models.Klb_participant.objects.filter(
                match_year=team.year).values_list('klb_person_id', flat=True))
        move_limit = models_klb.get_team_limit(
            team.year) - team.klb_participant_set.count()
        today = datetime.date.today()
        for key, val in request.POST.items():
            if key.startswith("add_"):
                if n_persons_added >= move_limit:
                    messages.warning(
                        request,
                        u'Вы достигли максимального числа людей в команде. Больше не добавляем.'
                    )
                    break
                runner_id = models.int_safe(key[len("add_"):])
                runner = models.Runner.objects.filter(pk=runner_id).first()
                if runner is None:
                    messages.warning(
                        request,
                        u'Участник забегов с id {} не найден. Пропускаем'.
                        format(runner_id))
                    continue
                if runner_id not in runner_ids:
                    messages.warning(
                        request,
                        u'У Вас нет прав добавить участника забегов {} (id {}). Пропускаем'
                        .format(runner.name(), runner.id))
                    continue
                person = runner.klb_person
                if person and (person.id in cur_year_person_ids):
                    person_team = person.klb_participant_set.filter(
                        match_year=team.year).first().team
                    if person_team:
                        messages.warning(
                            request,
                            u'{} {} (id {}) уже заявлен в КЛБМатч–{} в команду {}. Пропускаем'
                            .format(person.fname, person.lname, person.id,
                                    team.year, person_team.name))
                    else:
                        messages.warning(
                            request,
                            u'{} {} (id {}) уже заявлен в КЛБМатч–{} как индивидуальный участник. Пропускаем'
                            .format(person.fname, person.lname, person.id,
                                    team.year))
                    continue
                ok_to_add = True
                email = ''
                phone_number = ''
                email = request.POST.get('email_{}'.format(runner.id),
                                         '').strip()
                if email and not models.is_email_correct(email):
                    incorrect_emails.add(runner.id)
                    n_persons_wrong_data += 1
                    ok_to_add = False
                phone_number = request.POST.get(
                    'phone_number_{}'.format(runner.id), '').strip()
                if phone_number and not models.is_phone_number_correct(
                        phone_number):
                    incorrect_phones.add(runner.id)
                    n_persons_wrong_data += 1
                    ok_to_add = False
                if (email == '') and (phone_number == ''):
                    messages.warning(
                        request,
                        u'{} {} (id {}) — не указаны ни электронный адрес, ни телефон. Пропускаем'
                        .format(runner.fname, runner.lname, runner.id,
                                team.year))
                    ok_to_add = False
                if ok_to_add:
                    if not person:
                        person = runner.create_klb_person(
                            request.user,
                            comment=u'При добавлении члена клуба в КЛБМатч')
                    participant, club_member, is_changed = person.create_participant(
                        team,
                        request.user,
                        email=email,
                        phone_number=phone_number,
                        comment=
                        u'При добавлении участников предыдущего матча и членов клуба',
                        add_to_club=request.POST.get('and_to_club_members'))
                    if is_changed:
                        update_runner_stat(club_member=club_member)

                    n_persons_added += 1
        if n_persons_added:
            messages.success(
                request,
                u'Добавлено участников в команду с сегодняшнего дня: {}'.
                format(n_persons_added))
            update_team_score(team, to_clean=False, to_calc_sum=True)
        if n_persons_wrong_data:
            messages.warning(
                request,
                u'Не добавлено из-за ошибок в почтах и телефонах: {}. Подробности указаны ниже в табличке'
                .format(n_persons_wrong_data))
        # return redirect(team)

    context['runners_to_add'] = []
    for participant in prev_year_participants:
        context['runners_to_add'].append(
            get_runner_dict(request, team.year, participant.klb_person.runner,
                            participant, None, incorrect_emails,
                            incorrect_phones))
    for club_member in club_members:
        context['runners_to_add'].append(
            get_runner_dict(request, team.year, club_member.runner, None,
                            club_member, incorrect_emails, incorrect_phones))
    context['runners_to_add'].sort(
        key=lambda x: (x['runner'].lname, x['runner'].fname))

    context['page_title'] = u'КЛБМатч–{}: команда «{}»'.format(
        team.year, team.name)
    context['year'] = team.year
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=models.ORDERING_NAME)
    return render(request, 'klb/team_add_old_participants.html', context)
Beispiel #25
0
def klb_person_participant_update(request, person_id, year):
    person = get_object_or_404(models.Klb_person, pk=person_id)
    year = models.int_safe(year)
    if not models.is_active_klb_year(year, True):
        messages.warning(
            request, u'Участников КЛБМатча-{} сейчас нельзя редактировать')
        return redirect(person)
    participant = person.klb_participant_set.filter(match_year=year).first()
    if 'frmParticipant_submit' in request.POST:
        if participant:  # We just update participant's fields
            form = forms.KlbParticipantForm(request.POST,
                                            instance=participant,
                                            year=year)
            if form.is_valid():
                participant = form.save()
                team = participant.team
                log_form_change(request.user,
                                form,
                                models.ACTION_KLB_PARTICIPANT_UPDATE,
                                obj=person,
                                child_id=participant.id)
                messages.success(
                    request,
                    u'Данные об участии в КЛБМатче-{} успешно обновлены. Изменены следующие поля: {}'
                    .format(year, ", ".join(form.changed_data)))
                person.update_person_contact_fields_and_prepare_letter(
                    request.user, team, participant.email,
                    participant.phone_number)
                deleted_race_ids = []
                klb_results = person.klb_result_set.filter(
                    race__event__start_date__year=year)
                if ('date_registered'
                        in form.changed_data) and participant.date_registered:
                    for klb_result in klb_results.filter(
                            race__event__start_date__lt=participant.
                            date_registered):
                        models.log_obj_delete(
                            request.user,
                            klb_result.race.event,
                            child_object=klb_result,
                            action_type=models.ACTION_KLB_RESULT_DELETE,
                            comment=u'При изменении дат участия в КЛБМатче')
                        deleted_race_ids.append(klb_result.race.id)
                        if team:
                            prev_score = team.score
                            team.refresh_from_db()
                            models.Klb_team_score_change.objects.create(
                                team=team,
                                race=klb_result.race,
                                clean_sum=team.score - team.bonus_score,
                                bonus_sum=team.bonus_score,
                                delta=team.score - prev_score,
                                n_persons_touched=1,
                                comment=
                                u'Изменение даты включения участника {} {} в команду на {}'
                                .format(
                                    person.fname, person.lname,
                                    participant.date_registered.isoformat()),
                                added_by=request.user,
                            )
                        klb_result.delete()
                if ('date_removed'
                        in form.changed_data) and participant.date_removed:
                    for klb_result in klb_results.filter(
                            race__event__start_date__gt=participant.
                            date_removed):
                        models.log_obj_delete(
                            request.user,
                            klb_result.race.event,
                            child_object=klb_result,
                            action_type=models.ACTION_KLB_RESULT_DELETE,
                            comment=u'При изменении дат участия в КЛБМатче')
                        deleted_race_ids.append(klb_result.race.id)
                        if team:
                            prev_score = team.score
                            team.refresh_from_db()
                            models.Klb_team_score_change.objects.create(
                                team=team,
                                race=klb_result.race,
                                clean_sum=team.score - team.bonus_score,
                                bonus_sum=team.bonus_score,
                                delta=team.score - prev_score,
                                n_persons_touched=1,
                                comment=
                                u'Изменение даты исключения участника {} {} из команды на {}'
                                .format(person.fname, person.lname,
                                        participant.date_removed.isoformat()),
                                added_by=request.user,
                            )
                        klb_result.delete()
                if deleted_race_ids:
                    messages.warning(
                        request,
                        u'Удалены КЛБ-результаты со стартов со следующими id: {}'
                        .format(', '.join(
                            unicode(x) for x in deleted_race_ids)))
                    update_participant_score(participant, to_update_team=True)
                    if participant.team:
                        fill_match_places(year=year, fill_age_places=False)
                return redirect(person.get_editor_url())
            else:
                messages.warning(
                    request,
                    u"Данные об участии в КЛБМатче-{} не обновлены. Пожалуйста, исправьте ошибки в форме."
                    .format(year))
        else:  # We should create new participant
            participant = models.Klb_participant(added_by=request.user,
                                                 klb_person=person,
                                                 match_year=year)
            form = forms.KlbParticipantForm(request.POST,
                                            instance=participant,
                                            year=year)
            if form.is_valid():
                team = form.instance.team
                team_limit = models_klb.get_team_limit(year)
                if (team is None) or (team.n_members < team_limit):
                    participant = form.save()
                    participant.fill_age_group()
                    log_form_change(request.user,
                                    form,
                                    models.ACTION_KLB_PARTICIPANT_CREATE,
                                    obj=person,
                                    child_id=participant.id)
                    person.update_person_contact_fields_and_prepare_letter(
                        request.user,
                        team,
                        participant.email,
                        participant.phone_number,
                        prepare_letter=True,
                        year=year)

                    if ('and_to_club_members' in request.POST) and team:
                        if participant.date_registered:
                            date_from = max(participant.date_registered,
                                            datetime.date(year, 1, 1))
                        else:
                            date_from = datetime.date(year, 1, 1)
                        if participant.date_removed:
                            date_to = min(participant.date_removed,
                                          datetime.date(year, 12, 31))
                        else:
                            date_to = datetime.date(year, 12, 31)
                        club_member, is_changed = person.runner.add_to_club(
                            request.user, team.club, participant, date_from,
                            date_to)
                        if is_changed:
                            update_runner_stat(club_member=club_member)

                    messages.success(
                        request,
                        u'Участник успешно добавлен в КЛБМатч-{}'.format(year))
                    if participant.team:
                        update_team_score(participant.team, to_calc_sum=True)
                    return redirect(person.get_editor_url())
                else:
                    messages.warning(
                        request,
                        u"В команде «{}» достигнут лимит участников ({} человек)."
                        .format(team.name, team_limit))
            else:
                messages.warning(
                    request,
                    u"Данные об участии в КЛБМатче-{} не обновлены. Пожалуйста, исправьте ошибки в форме."
                    .format(year))
    elif 'frmParticipant_delete' in request.POST:
        if participant:
            deleted_race_ids = []
            team = participant.team
            for klb_result in person.klb_result_set.filter(
                    race__event__start_date__year=year):
                models.log_obj_delete(
                    request.user,
                    klb_result.race.event,
                    child_object=klb_result,
                    action_type=models.ACTION_KLB_RESULT_DELETE,
                    comment=u'При удалении человека из КЛБМатча')
                deleted_race_ids.append(klb_result.race.id)
                klb_result.delete()
            if deleted_race_ids:
                messages.warning(
                    request,
                    u'Удалены КЛБ-результаты со стартов со следующими id: {}'.
                    format(', '.join(unicode(x) for x in deleted_race_ids)))
            models.log_klb_participant_delete(request.user, participant)
            participant.delete()
            messages.success(request, u'Участник удалён из КЛБМатча')
            if team:
                update_team_score(team,
                                  to_calc_sum=(len(deleted_race_ids) > 0))
                fill_match_places(year=year, fill_age_places=False)
            return redirect(person.get_editor_url())
        else:  # We should create new participant
            messages.warning(
                request,
                u"Этот человек и так не участвует в КЛБМатче-{}".format(year))
    else:
        form = None
    return klb_person_details(request,
                              person_id=person_id,
                              person=person,
                              frmParticipant=form)
Beispiel #26
0
def main_page(request):
    context = user_edit_vars(request.user)
    context['all_news'] = models.News.objects.select_related(
        'event__city__region__country', 'event__series__city__region__country',
        'event__series__city_finish__region__country').filter(
            is_for_social=False).order_by('-date_posted')[:N_FIRST_NEWS]
    context['is_authenticated'] = request.user.is_authenticated

    today = datetime.date.today()
    year = today.year if (today.month > 1 or today.day > 16) else (today.year -
                                                                   1)
    if not models.is_active_klb_year(year):
        year = models.CUR_KLB_YEAR

    teams = models.Klb_team.objects.filter(year=year).exclude(
        number=models.INDIVIDUAL_RUNNERS_CLUB_NUMBER).select_related(
            'club__city__region__country')

    context['year'] = year
    context['klb_categories'] = []
    context['klb_categories'].append({
        'name':
        u'Абсолютный зачёт',
        'teams':
        teams.order_by('place', 'name')[:N_FIRST_TEAMS],
        'link':
        reverse('results:klb_match_summary', kwargs={'tab': 'all'}),
    })
    context['klb_categories'].append({
        'name':
        u'Средние клубы',
        'teams':
        teams.filter(place_medium_teams__isnull=False).order_by(
            'place_medium_teams', 'name')[:N_FIRST_TEAMS],
        'link':
        reverse('results:klb_match_summary', kwargs={'tab': 'medium'}),
    })
    context['klb_categories'].append({
        'name':
        u'Малые клубы',
        'teams':
        teams.filter(place_small_teams__isnull=False).order_by(
            'place_small_teams', 'name')[:N_FIRST_TEAMS],
        'link':
        reverse('results:klb_match_summary', kwargs={'tab': 'small'}),
    })

    context['participants'] = models.Klb_participant.objects.filter(
        match_year=year, place__isnull=False,
        n_starts__gt=0).order_by('place').select_related(
            'klb_person__city__region__country', 'team')[:N_FIRST_PERSONS]
    context['absolute_table_link'] = models.Klb_age_group.objects.get(
        match_year=year, gender=models.GENDER_UNKNOWN).get_absolute_url()

    if not context['is_authenticated']:
        context['n_events_in_past'] = get_stat_value('n_events_in_past')
        context['n_events_in_future'] = get_stat_value('n_events_in_future')
        # context['n_events_this_week'] = get_stat_value('n_events_this_week')
        context['n_events_this_month_RU_UA_BY'] = get_stat_value(
            'n_events_this_month_RU_UA_BY')
        context['n_results'] = get_stat_value('n_results')
        context['n_results_with_runner'] = get_stat_value(
            'n_results_with_runner')
    return render(request, 'results/main_page.html', context=context)
Beispiel #27
0
def klb_race_details(request, race_id, page=0):
    race = get_object_or_404(models.Race, pk=race_id)
    event = race.event
    year = event.start_date.year
    if not models.is_active_klb_year(year):
        messages.warning(
            request,
            u'Вы уже не можете изменять результаты забега {} года. Тот матч давно в прошлом.'
            .format(year))
        return redirect(race)
    user = request.user
    context = {}
    context['race'] = race
    context['event'] = event
    context['results_in_klb'] = 0
    context['results_to_add'] = 0
    context['results_errors'] = 0
    context['page_title'] = u'{}: результаты забега для КЛБМатча'.format(
        race.name_with_event())
    if race.distance_real and (race.distance_real.length <
                               race.distance.length):
        distance = race.distance_real
    else:
        distance = race.distance
    context['distance'] = distance

    official_results = race.result_set.filter(
        source=models.RESULT_SOURCE_DEFAULT,
        status=models.STATUS_FINISHED).select_related('runner').order_by(
            'lname', 'fname', 'pk')
    n_official_results = official_results.count()

    if models.Klb_result.objects.filter(race=race, result=None).exists():
        context['hasUnboundResults'] = 1
        return render(request, 'editor/klb/race_details.html', context)
    if n_official_results and race.get_unofficial_results().exists():
        context['hasOffAndUnoffResults'] = 1
        return render(request, 'editor/klb/race_details.html', context)
    results = []
    race_date = race.start_date if race.start_date else event.start_date
    klb_participant_ids = set(
        models.Klb_participant.objects.filter(
            Q(date_registered=None) | Q(date_registered__lte=race_date),
            Q(date_removed=None) | Q(date_removed__gte=race_date),
            was_deleted_from_team=False,
            match_year=year,
        ).values_list('klb_person__id', flat=True))
    has_results_to_work = False
    # event_person_ids = set(models.Klb_result.objects.filter(race__event=event).values_list('klb_person_id', flat=True))
    event_person_ids = set(
        models.Klb_result.objects.filter(
            race__event=event,
            race__start_date=race.start_date,
            race__start_time=race.start_time).values_list('klb_person_id',
                                                          flat=True))

    if n_official_results >= MIN_RESULTS_TO_USE_PAGES:
        context['using_pages'] = True
        pages_number = get_pages_number(n_official_results)
        context['pages'] = range(pages_number)
        page = models.int_safe(page)
        context['page'] = page
        official_results = list(
            official_results[(page * RESULTS_PER_PAGE):((page + 1) *
                                                        RESULTS_PER_PAGE)])
        context['n_results_on_cur_page'] = RESULTS_PER_PAGE if (n_official_results >= (page + 1) * RESULTS_PER_PAGE) \
         else n_official_results - page * RESULTS_PER_PAGE
        context['first_lname'] = official_results[0].lname
        context['last_lname'] = official_results[-1].lname
    else:
        context['using_pages'] = False

    for result in official_results:
        errors = []
        person = None
        candidates = []
        compared_type = COMPARED_BY_NOTHING
        has_checkboxes = False
        value_for_order = 0
        if hasattr(result, 'klb_result'):
            context['results_in_klb'] += 1
        elif (distance.distance_type == models.TYPE_MINUTES) and (
                result.result < models_klb.get_min_distance_for_bonus(year)):
            errors.append(u'Результат слишком мал для КЛБМатча.')
        else:  # Let's try to find person in KLBmatch for this result
            value_for_order = 10

            persons = models.Klb_person.objects.filter(
                pk__in=klb_participant_ids,
                runner__id__in=get_runner_ids_for_result(result),
                # lname=result.lname,
                # fname=result.fname
            ).select_related('city__region__country')
            if result.birthday:
                if result.birthday_known:
                    persons = persons.filter(birthday=result.birthday)
                    compared_type = COMPARED_BY_BIRTHDAY
                else:
                    persons = persons.filter(
                        birthday__year=result.birthday.year)
                    compared_type = COMPARED_BY_BIRTHYEAR
            elif result.age:
                birthyear_around = year - result.age
                persons = persons.filter(
                    birthday__year__range=(birthyear_around - 1,
                                           birthyear_around + 1))
                compared_type = COMPARED_BY_AGE
            if not persons.exists():
                continue
            value_for_order += compared_type
            for person in persons:
                has_results_to_work = True
                candidate_errors = []
                candidate_comments = []
                show_checkbox = True
                team = person.get_team(year)
                club = team.club if team else None
                if person.id in event_person_ids:
                    candidate_errors.append(
                        u'У этого участника КЛБМатча уже есть зачтенный результат в этом забеге с тем же временем старта'
                    )
                    show_checkbox = False
                if club and result.club_name:
                    club_name_found = False
                    for club_name in [club.name, team.name] + list(
                            club.club_name_set.values_list('name', flat=True)):
                        if club_name.lower()[:6] in result.club_name.lower():
                            club_name_found = True
                            break
                    if club_name_found:
                        candidate_comments.append(u'Клуб указан в протоколе')
                        value_for_order += 5
                    else:
                        candidate_errors.append(
                            u'Клуб бегуна противоречит протоколу')
                runner = result.runner
                if runner:
                    if runner.klb_person_id and (runner.klb_person_id !=
                                                 person.id):
                        candidate_errors.append(
                            u'В БД результатов указан другой бегун – с id {}'.
                            format(runner.klb_person_id))
                        show_checkbox = False
                    elif (runner.klb_person_id is None) and hasattr(
                            person, 'runner') and person.runner.klb_person_id:
                        candidate_errors.append(
                            u'К результату уже привязан другой бегун')
                        show_checkbox = False
                if show_checkbox:
                    has_checkboxes = True
                candidates.append({
                    'person': person,
                    'errors': candidate_errors,
                    'comments': candidate_comments,
                    'show_checkbox': show_checkbox,
                    'team': team,
                    'club': club,
                })
            if has_checkboxes:
                context['results_to_add'] += 1
        if hasattr(result, 'klb_result') or candidates or errors:
            results.append({
                'result':
                result,
                'candidates':
                candidates,
                'errors':
                errors,
                'value_for_order':
                value_for_order,
                'checked_by_default': (len(candidates) == 1)
                and (not candidates[0]['errors'])
                and (((result.club_name != '') and team) or
                     (compared_type >= COMPARED_BY_BIRTHYEAR)),
                'compared_type':
                COMPARED_TYPES[compared_type][1],
                'has_checkboxes':
                has_checkboxes,
            })
        if errors:
            context['results_errors'] += 1
    if (not has_results_to_work) and (not race.was_checked_for_klb) and (
        (not context['using_pages']) or (page == pages_number - 1)):
        race.was_checked_for_klb = True
        race.save()
        models.log_obj_create(user,
                              event,
                              models.ACTION_RACE_UPDATE,
                              field_list=['was_checked_for_klb'],
                              child_object=race)
        context['just_checked'] = 1
    context['results'] = sorted(results, key=lambda x: -x['value_for_order'])
    context['results_total'] = n_official_results
    context['results_unbound'] = race.klb_result_set.filter(result=None)
    context['races'] = event.race_set.select_related('distance').order_by(
        'distance__distance_type', '-distance__length')
    context['KLB_STATUS_OK'] = models.KLB_STATUS_OK
    return render(request, 'editor/klb/race_details.html', context)