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)
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))
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)
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())
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)