def add_team(request, club_id, year): club = get_object_or_404(models.Club, pk=club_id) context, has_rights, target = check_rights(request, club=club) if not has_rights: return target if models.Klb_team.objects.filter(year=year, number=club.id).exists(): last_team = models.Klb_team.objects.filter( year=year, number__gte=FIRST_TEAM_NUMBER).order_by('-number').first() if last_team: number = last_team.number + 1 else: number = FIRST_TEAM_NUMBER else: number = club.id team = models.Klb_team.objects.create( club=club, number=number, year=year, name=club.get_next_team_name(year), added_by=request.user, ) models.log_obj_create(request.user, team, models.ACTION_CREATE) answer = u'Команда успешно создана. Вы можете добавить в неё новых участников' if club.klb_team_set.filter(year=year - 1).exists(): answer += u' или участников команд Вашего клуба из предыдущего Матча' messages.success(request, answer) fill_match_places(year) return redirect(team)
def remove_series(request, organizer_id, series_id): organizer = get_object_or_404(models.Organizer, pk=organizer_id) if 'btnRemoveSeries' in request.POST: series = get_object_or_404(models.Series, pk=series_id) if series.organizer != organizer: messages.warning(request, u'У серии {} (id {}) и так не указан организатор {} (id {}).'.format( series.name, series_id, series.organizer.name, series.organizer.id)) else: log = logging.getLogger('structure_modification') log_prefix = 'remove_series {} from organizer {} by user {}.'.format(series.id, organizer_id, request.user.id) log.debug('{} before flock'.format(log_prefix)) log_exc_info = False with Flock_mutex(LOCK_FILE_FOR_RATED_TREE_MODIFICATIONS): log.debug('{} trnsctn start'.format(log_prefix)) try: with transaction.atomic(): change_parent(series, models.Organizer.objects.fake_object) # ^ to adapt the starrating data) ^ series.organizer_id = models.FAKE_ORGANIZER_ID series.save() models.log_obj_create(request.user, series, models.ACTION_UPDATE, field_list=['organizer']) log.debug('{} trnsctn end'.format(log_prefix)) except (UpdatedRecordExistsError, AssertionError) as e: error_msg = repr(e) if isinstance(e, AssertionError): log_exc_info = True else: error_msg = None if error_msg is None: log.info('{} OK'.format(log_prefix)) messages.success(request, u'Серия «{}» (id {}) успешно отвязана от этого организатора.'.format(series.name, series_id)) else: log.error('{} {}'.format(log_prefix, error_msg), exc_info=log_exc_info) messages.warning(request, u'Не удалось отвязать серию «{}» (id {}) от этого организатора ({}).'.format(series.name, series_id, error_msg)) return redirect(organizer)
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 pay_url_tmp(request): params = request.POST if (request.method == 'POST') else request.GET models.write_log(u'At {} we received a response from Moneta. Method: {}. Params: {}'.format(timezone.now(), request.method, params)) response = models.Payment_moneta_response.objects.create( account_number=params.get('MNT_ID', ''), transaction_id=params.get('MNT_TRANSACTION_ID', ''), moneta_operation_id=params.get('MNT_OPERATION_ID', ''), moneta_subscriber_id=params.get('MNT_SUBSCRIBER_ID', ''), moneta_user_account=params.get('MNT_USER', ''), moneta_user_corr_account=params.get('MNT_CORRACCOUNT', ''), payment_system=params.get('paymentSystem_unitId', ''), withdraw_amount=params.get('MNT_AMOUNT', 0), fee=params.get('MNT_FEE', 0), currency=params.get('MNT_CURRENCY_CODE', ''), is_test_mode=(params.get('MNT_TEST_MODE') == '1'), signature=params.get('MNT_SIGNATURE', ''), ) response.refresh_from_db() response.is_signature_correct = (get_response_md5(response) == response.signature) response.save() payment = models.Payment_moneta.objects.filter(transaction_id=response.transaction_id).first() if payment is None: raise ValueError(u'Не найден платёж с id {}'.format(response.transaction_id)) to_return_ok = True if payment.response: raise ValueError(u'Получено повторное сообщение об оплате платежа с id {}. Скорее всего, всё хорошо!'.format(response.transaction_id)) payment.response = response payment.payment_time = timezone.now() payment.amount = response.withdraw_amount payment.withdraw_amount = response.withdraw_amount + response.fee payment.is_paid = True payment.save() participants_paid = [] participants_paid_before = [] medal_order = None for participant in payment.klb_participant_set.select_related('klb_person', 'team'): if participant.paid_status == models.PAID_STATUS_NO: participant.paid_status = models.PAID_STATUS_FREE if participant.wants_to_pay_zero else models.PAID_STATUS_FULL participant.wants_to_pay_zero = False participant.save() models.log_obj_create(payment.user, participant.klb_person, models.ACTION_KLB_PARTICIPANT_UPDATE, child_object=participant, field_list=['paid_status', 'wants_to_pay_zero'], comment=u'Платёж {}'.format(payment.id), verified_by=models.USER_ROBOT_CONNECTOR) participants_paid.append(participant) else: participants_paid_before.append(participant) if hasattr(payment, 'medal_order'): medal_order = payment.medal_order send_success_mail(payment, response, participants_paid, participants_paid_before, medal_order) return HttpResponse(u'SUCCESS' if to_return_ok else u'FAIL', content_type='text/plain')
def runner_update(request, runner_id): runner = get_object_or_404(models.Runner, pk=runner_id) if 'frmRunner_submit' in request.POST: frmRunner = forms.RunnerForm(request.POST, instance=runner) if frmRunner.is_valid(): runner = frmRunner.save() log_form_change(request.user, frmRunner, action=models.ACTION_UPDATE, exclude=['country', 'region']) messages.success( request, u'Бегун «{}» успешно обновлён. Изменены поля: {}'.format( runner.name(), ", ".join(frmRunner.changed_data))) klb_person = runner.klb_person if klb_person: fields_for_klb_person = [] if ('birthday' in frmRunner.changed_data) and runner.birthday_known: fields_for_klb_person.append('birthday') for field in [ 'lname', 'fname', 'midname', 'gender', 'city_id' ]: if field in frmRunner.changed_data: fields_for_klb_person.append(field) if fields_for_klb_person: for field in fields_for_klb_person: setattr(klb_person, field, getattr(runner, field)) klb_person.clean() klb_person.save() if ('birthday' in fields_for_klb_person) or ( 'gender' in fields_for_klb_person): participant = klb_person.klb_participant_set.filter( match_year=models.CUR_KLB_YEAR).first() if participant: participant.fill_age_group() models.log_obj_create(request.user, klb_person, models.ACTION_UPDATE, field_list=fields_for_klb_person, comment=u'При правке бегуна') messages.success( request, u'У участника КЛБМатчей изменены поля: {}'.format( ", ".join(fields_for_klb_person))) return redirect(runner) else: messages.warning( request, u"Бегун не обновлён. Пожалуйста, исправьте ошибки в форме.") else: frmRunner = None return runner_details(request, runner_id=runner_id, runner=runner, frmRunner=frmRunner)
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 registration_create_step1(request, event_id, cloned_event_id=None): event = get_object_or_404(models.Event, pk=event_id) if event.is_in_past(): messages.warning(request, u'Этот забег уже прошёл. На него нельзя открыть регистрацию') return redirect(event) if hasattr(event, 'registration'): messages.warning(request, u'Регистрация на этот забег уже создана') return redirect(event.registration.get_details_url()) user = request.user context = {} context['event'] = event registration = None if cloned_event_id: # Clone event from event with this id cloned_event = get_object_or_404(models.Event, pk=cloned_event_id) if hasattr(cloned_event, 'registration'): registration = cloned_event.registration registration.id = None if registration is None: registration = models.Registration() registration.start_date = datetime.datetime.combine(datetime.date.today() + datetime.timedelta(days=1), datetime.time.min) registration.finish_date = datetime.datetime.combine(event.start_date - datetime.timedelta(days=2), datetime.time.max) registration.created_by = request.user registration.event = event if 'frmRegistration_submit' in request.POST: frmRegistration = forms.RegistrationForm(request.POST, instance=registration) frmSampleRace = forms.RegRaceForm(request.POST, is_sample=True) formset = getRaceCheckFormSet(event, request.POST) if frmRegistration.is_valid() and frmSampleRace.is_valid() and formset.is_valid(): registration = frmRegistration.save() log_form_change(user, frmRegistration, action=models.ACTION_CREATE) sample_race_details = frmSampleRace.instance for raceform in formset: if raceform.cleaned_data['is_checked']: reg_race_details = models.Reg_race_details(race=raceform.instance, created_by=user) for field in forms.RegRaceForm.Meta.fields: if hasattr(sample_race_details, field): if field != 'created_by': setattr(reg_race_details, field, getattr(sample_race_details, field)) reg_race_details.save() models.log_obj_create(user, registration, models.ACTION_REG_RACE_CREATE, child_object=reg_race_details, comment=u'При создании регистрации') return redirect(registration.get_create_step2_url()) else: messages.warning(request, u"Регистрация не создана. Пожалуйста, исправьте ошибки в форме.") else: frmRegistration = forms.RegistrationForm(instance=registration) frmSampleRace = forms.RegRaceForm(is_sample=True) formset = getRaceCheckFormSet(event) context['frmRegistration'] = frmRegistration context['frmSampleRace'] = frmSampleRace context['formset'] = formset return render(request, "editor/registration/reg_create_step1.html", context)
def runner_name_delete(request, runner_id, name_id): runner = get_object_or_404(models.Runner, pk=runner_id) name = models.Extra_name.objects.filter(pk=name_id, runner=runner).first() if name: models.log_obj_create(request.user, name, models.ACTION_DELETE, comment=u'Удалено со страницы бегуна') name.delete() messages.success(request, u'Имя успешно удалено.') else: messages.warning(request, u'Имя для удаления не найдено. Ничего не удалено.') return redirect(runner)
def create_distances_from_raw(user, event): for distance_raw in event.distances_raw.split(','): _, distance = models.Distance.try_parse_distance( distance_raw.strip(u' ."«»').lower()) if distance and not event.race_set.filter(distance=distance).exists(): race = models.Race( event=event, created_by=user, distance=distance, ) race.clean() race.save() models.log_obj_create(user, event, models.ACTION_RACE_CREATE, child_object=race)
def delete_unofficial_result(request, result_id): result = get_object_or_404(models.Result, pk=result_id) result_user = result.user race = result.race user = request.user if hasattr(result, 'klb_result'): messages.warning( request, u'Вы не можете удалить результат, учтённый в КЛБМатче. Если это не Ваш результат, пожалуйста, напишите нам на {}' ).format(models.INFO_MAIL) elif (result_user != user) and (not models.is_admin(user)) and ( result.runner not in user.user_profile.get_runners_to_add_results()): messages.warning(request, u'Вы не можете удалить чужой результат.') elif result.source == models.RESULT_SOURCE_DEFAULT: messages.warning( request, u'Вы не можете удалить этот результат – он взят из протокола соревнований.' ) else: runner = result.runner models.log_obj_create(user, race.event, models.ACTION_RESULT_DELETE, child_object=result) result.delete() update_runner_stat(runner=runner) if result_user: update_runner_stat(user=result_user, update_club_members=False) if result_user == user: messages.success( request, u'Ваш неофициальный результат на забеге {} успешно удалён.'. format(race.name_with_event())) else: runner_name = '' if result_user: runner_name = result_user.get_full_name() elif runner: runner_name = runner.name() messages.success( request, u'Неофициальный результат бегуна {} на забеге {} успешно удалён.' .format(runner_name, race.name_with_event())) return redirect(race)
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 reg_delete(request, registrant_id): context = user_edit_vars(request.user) if context['is_admin']: registrant = get_object_or_404(models.Registrant, pk=registrant_id) else: registrant = get_object_or_404(models.Registrant, pk=registrant_id, user=request.user) race = registrant.race event = race.event if registrant.is_paid: messages.warning(request, u'Регистрация бегуна {} {} на забег {} уже оплачена и не может быть отменена. Придётся бежать!'.format( registrant.fname, registrant.lname, race.name_with_event())) return redirect(event) models.log_obj_create(request.user, event.registration, models.ACTION_REGISTRANT_DELETE, child_object=registrant, comment=u'При отмене регистрации') messages.success(request, u'Регистрация бегуна {} {} на забег {} успешно отменена'.format(registrant.fname, registrant.lname, race.name_with_event())) registrant.delete() return redirect(event)
def series_by_letter(request, letter=None): context = {} if request.method == 'POST': saved_series = 0 for key, val in request.POST.items(): if key.startswith('series_'): series_id = models.int_safe(key[len('series_'):]) series = models.Series.objects.filter(pk=series_id).first() if series: new_val = models.int_safe(val) if series.surface_type != new_val: series.surface_type = new_val series.save() models.log_obj_create( request.user, series, models.ACTION_UPDATE, field_list=['surface_type'], comment=u'Массовое проставление типа забега') saved_series += 1 messages.success( request, u'Сохранено значений для серий: {}. Спасибо!'.format(saved_series)) # models.Letter_of_series.objects.filter(letter=letter).update(is_checked=True) return redirect( reverse('editor:series_by_letter', kwargs={'letter': letter})) context['letters'] = models.Letter_of_series.objects.all().order_by( 'letter') context['surface_types'] = models.SURFACE_TYPES if letter: context['page_title'] = u"Все серии на символ {}".format(letter) context['seria'] = models.Series.objects.filter( name__istartswith=letter, series_type=models.SERIES_TYPE_RUN, surface_type__in=(models.SURFACE_DEFAULT, models.SURFACE_HARD)).order_by('name') # context['q'] = models.Series.objects.filter(name__istartswith=letter).order_by('name').query else: context[ 'page_title'] = u"Заполняем тип забегов у серий. Выберите любую букву" return render(request, "editor/series_by_letter.html", context)
def create_user_profiles_once(): # For those users who didn't have them. As of 2018-07-23, All new users should have them count = 0 count_wo_gender = 0 count_not_created = 0 for user in User.objects.filter(user_profile=None).order_by('pk'): profile, profile_just_created = models.User_profile.objects.get_or_create(user=user) if profile_just_created: models.log_obj_create(models.USER_ROBOT_CONNECTOR, profile, models.ACTION_CREATE, comment=u'Запоздало добавляем профили, у кого их нет') count += 1 runner_name = models.Runner_name.objects.filter(name__iexact=user.first_name).first() if runner_name: profile.gender = runner_name.gender profile.save() else: print user.id, user.first_name, user.last_name count_wo_gender += 1 else: count_not_created if (user.id % 200) == 0: print user.id, count, count_wo_gender, count_not_created print 'Done!', count, count_wo_gender, count_not_created
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 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 registration_create_step2(request, event_id): user = request.user event = get_object_or_404(models.Event, pk=event_id) if not hasattr(event, 'registration'): messages.warning(request, u'Регистрация на этот забег ещё не создана') return redirect(event) registration = event.registration if registration.is_step2_passed: messages.warning(request, u'Вы уже прошли этот шаг. Теперь вы можете править цены на регистрацию на вкладках отдельных дистанций') return redirect(registration.get_editor_url()) if models.Race_cost.objects.filter(race__event=event).exists(): registration.is_step2_passed = True registration.save() models.log_obj_create(user, registration, models.ACTION_UPDATE, field_list=['is_step2_passed'], comment=u'Автоматом: цена есть, галочки не было') messages.warning(request, u'Вы уже прошли этот шаг. Теперь вы можете править цены на регистрацию на вкладках отдельных дистанций') return redirect(registration.get_editor_url()) races = event.get_reg_race_set() if 'frmRegistration_submit' in request.POST: final_prices_are_ok = True # First, we need to have correct final prices final_prices = {} for race in races: price_field_name = 'price_race_{}_finish'.format(race.id) if price_field_name not in request.POST: messages.warning(request, u'Окончательная цена у дистанции {} не указана. Нужно указать их у всех дистанций'.format(race)) final_prices_are_ok = False break cost = models.int_safe(request.POST.get(price_field_name)) if cost > models.REG_MAX_RACE_COST: messages.warning(request, u'Окончательная цена у дистанции {} некорректная. Она не может превышать {} ₽'.format(race, models.REG_MAX_RACE_COST)) final_prices_are_ok = False break if (cost < models.REG_MIN_RACE_COST) and (cost != 0): messages.warning(request, u'Окончательная цена у дистанции {} некорректная. Она должна быть или нулевой, или не меньше {} ₽'.format( race, models.REG_MIN_RACE_COST)) final_prices_are_ok = False break final_prices[race.id] = cost if final_prices_are_ok: col_dates = [None] * N_PRICE_COLS_DEFAULT cols_to_use = [False] * N_PRICE_COLS_DEFAULT dates_in_cols = set() for i in range(N_PRICE_COLS_DEFAULT): try: col_dates[i] = datetime.datetime.strptime(request.POST.get('price_date_{}'.format(i + 1)), '%Y-%m-%d').date() messages.warning(request, u'Распознана дата в столбце {}: {}'.format(i, col_dates[i])) except: pass if col_dates[i]: if col_dates[i] in dates_in_cols: messages.warning(request, u'Дата {} встречается больше одного раза. Смотрим только на первый столбец'.format( col_dates[i].isoformat())) elif col_dates[i] == event.finish_date: messages.warning(request, u'{} — дата закрытия регистрации. Цены для неё берём из последнего столбца'.format( col_dates[i].isoformat())) elif col_dates[i] < registration.start_date.date(): messages.warning(request, u'Дата {} раньше даты открытия регистрации. Игнорируем столбец с ней'.format( col_dates[i].isoformat())) elif col_dates[i] > registration.finish_date.date(): messages.warning(request, u'Дата {} позже даты закрытия регистрации. Игнорируем столбец с ней'.format( col_dates[i].isoformat())) else: dates_in_cols.add(col_dates[i]) cols_to_use[i] = True for race in races: for i in range(N_PRICE_COLS_DEFAULT): cost = models.int_safe(request.POST.get('price_race_{}_date_{}'.format(race.id, i + 1))) if not cols_to_use[i]: continue if cost <= 0: continue race_cost = models.Race_cost.objects.create( race=race, finish_date=col_dates[i], cost=cost, created_by=user, ) models.log_obj_create(user, registration, models.ACTION_RACE_COST_CREATE, child_object=race_cost, comment=u'При создании регистрации') race_cost = models.Race_cost.objects.create( race=race, cost=final_prices[race.id], created_by=user, ) models.log_obj_create(user, registration, models.ACTION_RACE_COST_CREATE, child_object=race_cost, comment=u'При создании регистрации') add_tshirt_question = False tshirt_choice = models.int_safe(request.POST.get('tshirts', 0)) if tshirt_choice == TSHIRT_FREE: add_tshirt_question = True tshirt_price = 0 elif tshirt_choice == TSHIRT_FOR_MONEY: add_tshirt_question = True tshirt_price = models.int_safe(request.POST.get('tshirt_price', 0)) if add_tshirt_question: if tshirt_price > 0: question_name = u'Вы можете сразу заказать фирменную футболку соревнований. Стоимость футболке — {} рублей'.format(tshirt_price) else: question_name = u'Укажите, футболку какого размера вы хотите получить. Стоимость футболки входит в регистрационный взнос' question = models.Reg_question.objects.create( event=event, number=1, title=u'Размер футболки', name=question_name, multiple_answers=False, is_required=True, created_by=user, ) question.save() models.log_obj_create(user, registration, models.ACTION_QUESTION_CREATE, child_object=question, comment=u'При создании регистрации') for number, size in enumerate(['XS', 'S', 'M', 'L', 'XL', 'XXL', ]): choice = models.Reg_question_choice.objects.create( reg_question=question, number=number, name=size, cost=tshirt_price, created_by=user, ) models.log_obj_create(user, registration, models.ACTION_QUESTION_CHOICE_CREATE, child_object=choice, comment=u'При создании регистрации') for race in races: models.Reg_question_race.objects.create( reg_question=question, race=race, added_by=user, ) registration.is_step2_passed = True registration.save() models.log_obj_create(user, registration, models.ACTION_UPDATE, field_list=['is_step2_passed'], comment=u'При создании регистрации') messages.success(request, u'Ура! Регистрация для забега «{}» успешно создана. Теперь вы можете добавить дополнительные вопросы.'.format(event)) return redirect(registration.get_editor_url()) context = {} context['event'] = event context['races'] = races context['n_price_cols'] = N_PRICE_COLS_DEFAULT context['event'] = event return render(request, "editor/registration/reg_create_step2.html", 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)
def registration_details(request, event_id=None): registration = get_object_or_404(models.Registration, event_id=event_id) event = registration.event context, has_rights, target = check_rights(request, event=event) if not has_rights: return target user = request.user frmRegistration = None frmQuestions = None frmNewRace = None frmRaces = None if 'frmRegistration_submit' in request.POST: frmRegistration = forms.RegistrationForm(request.POST, instance=registration) if frmRegistration.is_valid(): if ('is_open' in frmRegistration.changed_data) and frmRegistration.instance.is_open: if not models.Reg_race_details.objects.filter(race__event=event, is_open=True).exists(): frmRegistration.instance.is_open = False messages.warning(request, u'Регистрация оставлена закрытой, поскольку закрыты регистрации на все дистанции. Сначала откройте хотя бы одну ниже') registration = frmRegistration.save() log_form_change(user, frmRegistration, action=models.ACTION_UPDATE) messages.success(request, u'Регистрация на забег «{}» успешно обновлена. Проверьте, всё ли правильно.'.format(event)) return redirect(registration.get_editor_url()) else: messages.warning(request, u"Регистрация не обновлена. Пожалуйста, исправьте ошибки в форме.") elif 'frmQuestions_submit' in request.POST: frmQuestions = getRegQuestionFormSet(event, user, data=request.POST, files=request.FILES) if frmQuestions.is_valid(): instances = frmQuestions.save() log_document_formset(user, registration, frmQuestions) if len(frmQuestions.deleted_objects): refresh_numbers(event.reg_question_set) for question in frmQuestions.new_objects: for race in event.get_reg_race_set(): models.Reg_question_race.objects.create( reg_question=question, race=race, added_by=user, ) messages.success(request, (u'Вопросы регистрации на забег«{}» успешно обновлены: {} вопросов добавлено, {} обновлено, ' + u'{} удалено. Проверьте, всё ли правильно.').format( event, len(frmQuestions.new_objects), len(frmQuestions.changed_objects), len(frmQuestions.deleted_objects))) return redirect(registration.get_editor_url()) else: messages.warning(request, u"Вопросы регистрации не обновлены. Пожалуйста, исправьте ошибки в форме.") elif 'frmRaces_submit' in request.POST: frmRaces = getRegRaceFormSet(event, data=request.POST) if frmRaces.is_valid(): instances = frmRaces.save() log_document_formset(user, registration, frmRaces) messages.success(request, (u'Дистанции регистрации на забег«{}» успешно обновлены: {} вопросов добавлено, {} обновлено, ' + u'{} удалено. Проверьте, всё ли правильно.').format( event, len(frmRaces.new_objects), len(frmRaces.changed_objects), len(frmRaces.deleted_objects))) return redirect(registration.get_editor_url()) else: messages.warning(request, u"Дистанции не обновлены. Пожалуйста, исправьте ошибки в форме.") elif 'frmNewRace_submit' in request.POST: frmNewRace = forms.RegNewRaceForm(event=event, data=request.POST) if frmNewRace.is_valid(): race_new = frmNewRace.cleaned_data['race_new'] race_template = frmNewRace.cleaned_data.get('race_template') if race_template: reg_race_details = race_template.reg_race_details reg_race_details.id = None else: reg_race_details = models.Reg_race_details() reg_race_details.race = race_new reg_race_details.created_by = user reg_race_details.save() models.log_obj_create(user, registration, models.ACTION_REG_RACE_CREATE, child_object=reg_race_details, comment=u'При добавлении регистрации на дистанцию') if race_template: for question in race_template.reg_question_set.all(): models.Reg_question_race.objects.create( reg_question=question, race=race_new, added_by=user, ) for race_cost in list(race_template.race_cost_set.all()): race_cost_new = race_cost race_cost_new.id = None race_cost_new.race = race_new race_cost_new.created_by = user race_cost_new.save() models.log_obj_create(user, registration, models.ACTION_RACE_COST_CREATE, child_object=race_cost_new, comment=u'При добавлении регистрации на дистанцию') messages.success(request, u'Регистрация на дистанцию {} по образцу дистанции {} открыта. Проверьте, всё ли правильно'.format( race_new, race_template)) else: race_cost_new = models.Race_cost.objects.filter(race__event=event, finish_date=None).first() if race_cost_new: race_cost_new.id = None else: race_cost_new = models.Race_cost(cost=models.Race_cost.get_default_cost()) race_cost_new.race = race_new race_cost_new.created_by = user race_cost_new.save() models.log_obj_create(user, registration, models.ACTION_RACE_COST_CREATE, child_object=race_cost_new, comment=u'При добавлении регистрации на дистанцию') messages.success(request, u'Регистрация на дистанцию {} открыта. Проверьте, всё ли правильно, и добавьте нужные цены регистрации и вопросы'.format( race_new)) return redirect(registration.get_editor_url()) else: messages.warning(request, u"Новая регистрация не создана. Пожалуйста, исправьте ошибки в форме.") elif 'frmDeleteRegistration_submit' in request.POST: if not registration.has_dependent_objects(): models.log_obj_delete(user, registration) registration.delete() messages.success(request, u'Регистрация успешно удалена.') return redirect(event) else: messages.warning(request, u'Для удаления регистрации не должно быть ни вопросов в ней, ни уже зарегистрированных людей') else: for question in event.reg_question_set.all(): if 'move_question_{}_submit'.format(question.id) in request.POST: if try_move_choice(event.reg_question_set, question, models.int_safe(request.POST.get('move_question_{}'.format(question.id)))): messages.success(request, u'Вопрос «{}» успешно перемещён'.format(question.title)) else: messages.success(request, u'Вопрос «{}» оставлен на месте'.format(question.title)) return redirect(registration.get_editor_url()) context['event'] = event context['registration'] = registration context['n_questions'] = event.reg_question_set.count() context['move_choices'] = forms.QUESTION_MOVE_CHOICES context['races_with_registration'] = event.get_reg_race_set() context['page_title'] = u'Регистрация на забег «{}»'.format(event) context['frmRegistration'] = frmRegistration if frmRegistration else forms.RegistrationForm(instance=registration) context['frmQuestions'] = frmQuestions if frmQuestions else getRegQuestionFormSet(event, user) context['frmRaces'] = frmRaces if frmRaces else getRegRaceFormSet(event) if context['races_with_registration'].count() < event.race_set.count(): context['frmNewRace'] = frmNewRace if frmNewRace else forms.RegNewRaceForm(event=event) return render(request, "editor/registration/reg_details.html", context)
def add_club_member(request, club_id): club = get_object_or_404(models.Club, pk=club_id) context, has_rights, target = check_rights(request, club=club) if not has_rights: return target user = request.user form = None to_create_runner = to_create_member = False if 'step1_submit' in request.POST: form = RunnerForClubForm(user=user, 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').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(n_starts, 1))) runner_dict['info'] = ', '.join(info) runner_dict['club_member'] = runner.club_member_set.filter( club=club).first() context['runners'].append(runner_dict) else: # There are no similar runners, so we can create him/her to_create_runner = True else: messages.warning(request, u'Пожалуйста, исправьте ошибки в форме') elif 'step2_submit' in request.POST: form = RunnerForClubForm(user=user, 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 runner = models.Runner.objects.filter(pk=runner_id).first() if runner: club_member = runner.club_member_set.filter( club=club).first() if club_member: if club_member.is_already_removed(): messages.warning( request, u'{} (id {}) уже был членом клуба «{}» до {}'. format(runner.name(), runner.id, club.name, club_member.date_removed)) else: messages.warning( request, u'{} (id {}) уже и так член клуба «{}»'.format( runner.name(), runner.id, club.name)) return redirect(club) else: to_create_member = 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_member = True if to_create_member: email = form.cleaned_data.get('email', '') phone_number = form.cleaned_data.get('phone_number', '') club_member = models.Club_member.objects.create( runner=runner, club=club, email=form.cleaned_data.get('email', ''), phone_number=form.cleaned_data.get('phone_number', ''), date_registered=form.cleaned_data['date_registered'], added_by=user, ) if runner.user and (runner.user != user): models.User_added_to_team_or_club.objects.create( user=runner.user, club=club, added_by=user, ) update_runner_stat(club_member=club_member) models.log_obj_create( user, club, models.ACTION_CLUB_MEMBER_CREATE, child_object=club_member, comment=u'При добавлении нового участника в клуб') messages.success( request, u'{} успешно добавлен{} в команду'.format( runner.name(), u'а' if runner.gender == models.GENDER_FEMALE else '')) return redirect(club) if form is None: initial = {} if club.city: initial['city_id'] = club.city.id initial['region'] = club.city.region.id form = RunnerForClubForm(user=user, initial=initial) context['club'] = club context['members'] = get_cur_year_members(club) context['cur_stat_year'] = models.CUR_RUNNERS_ORDERING_YEAR context['form'] = form context['page_title'] = u'Добавление участника в клуб «{}»'.format( club.name) context['cur_klb_teams'] = club.klb_team_set.filter( year=models.CUR_KLB_YEAR) if 'runners' in context: template = 'club/add_club_member_step2.html' else: template = 'club/add_club_member_step1.html' return render(request, template, context)
def klb_make_team_or_club_payment(request, team_id=None, club_id=None): team, club, team_or_club, year, context, target, participants = get_team_club_year_context_target(request, team_id, club_id) if target: return target if 'btnPayForTeam' not in request.POST: return redirect(team_or_club.get_payment_url()) good_participant_ids = set(participants.filter(payment=None).values_list('pk', flat=True)) bad_participant_ids = set(participants.exclude(payment=None).values_list('pk', flat=True)) good_participants = [] bad_participants = [] total_amount = models.int_safe(request.POST.get('total_amount', 0)) price = get_participation_price(year) sum_of_prices = 0 user = request.user for key, val in request.POST.items(): if key.startswith("amount_"): participant_id = models.int_safe(key[len("amount_"):]) if participant_id in bad_participant_ids: bad_participants.append((participant_id, u'Участие уже оплачено')) elif participant_id not in good_participant_ids: bad_participants.append((participant_id, u'Участник не выступает за нужную команду')) else: # So participant_id is in good_participant_ids participant = models.Klb_participant.objects.get(pk=participant_id) person = participant.klb_person participant_price = models.int_safe(val) if participant_price not in (0, price): bad_participants.append((participant_id, u'Недопустимая цена участия: {}'.format(participant_price))) elif (participant_price == 0) and (not participant.is_senior) and (person.disability_group == 0): bad_participants.append((participant_id, u'Цена участия — 0, хотя участник молод и здоров')) else: good_participants.append((participant, participant_price == 0)) sum_of_prices += participant_price problems_desc = '' if bad_participants: problems_desc = u'\n'.join(u'{}: {}'.format(participant_id, desc) for participant_id, desc in bad_participants) elif sum_of_prices != total_amount: problems_desc = u'Общая цена — {}, но сумма по отдельным участникам — {}'.format(total_amount, sum_of_prices) if problems_desc: models.send_panic_email( u'Problem when paying for club {} (id {}), team {} (id {})'.format(club.name, club.id, team.name if team else '-', team.id if team else '-'), u'User {} {}{} was trying to pay for this club. Correct participants: {}. Incorrect participants: {}. Problems:\n\n{}'.format( user.get_full_name(), models.SITE_URL, user.user_profile.get_absolute_url(), len(good_participants), len(bad_participants), problems_desc), to_all=True ) messages.warning(request, (u'К сожалению, при создании заказа возникла проблема. Администраторы уже знают об этом. ' + u'Вы можете попробовать ещё раз или подождать письма от нас о том, что проблема исправлена.')) return redirect(team_or_club.get_payment_url()) if len(good_participants) == 0: messages.warning(request, u'Похоже, вы пытались заплатить за 0 человек. Не стоит этого делать :)') return redirect(team_or_club) if total_amount == 0: payment = models.Payment_moneta.objects.create( amount=0, is_dummy=True, is_paid=True, user=user, ) payment.transaction_id = models.PAYMENT_DUMMY_PREFIX + unicode(payment.id) payment.save() for participant, _ in good_participants: 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=['paid_status', 'payment'], comment=u'Платёж {}'.format(payment.id), verified_by=models.USER_ROBOT_CONNECTOR) messages.success(request, u'Вы оплатили участие {} человек на общую сумму 0 рублей. Ура!'.format(len(good_participants))) return redirect(team_or_club) payment = models.Payment_moneta.objects.create( amount=total_amount, description=u'Оплата за {} участник{} {} {} в КЛБМатче–{}'.format( len(good_participants), results_util.plural_ending_new(len(good_participants), 16), u'команды' if team else u'клуба', team_or_club.name, year), user=user, sender=user.get_full_name(), ) payment.refresh_from_db() payment.transaction_id = DESCRIPTION_PREFIX + unicode(payment.id) payment.signature = get_payment_md5(payment) payment.save() for participant, wants_to_pay_zero in good_participants: participant.payment = payment participant.wants_to_pay_zero = wants_to_pay_zero participant.save() models.log_obj_create(request.user, participant.klb_person, models.ACTION_KLB_PARTICIPANT_UPDATE, child_object=participant, field_list=['wants_to_pay_zero', 'payment'], comment=u'Платёж {}'.format(payment.id), verified_by=models.USER_ROBOT_CONNECTOR) redirect_url = get_redirect_url(payment) return redirect(redirect_url)
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 add_unofficial_result(request, event_id): event = get_object_or_404(models.Event, pk=event_id) context = {} message_text = '' res = {} res['success'] = 0 user = request.user profile = user.user_profile if hasattr(user, 'user_profile') else None if (user.last_name.strip() == '') or (user.first_name.strip() == '') or ( profile is None) or (profile.gender == models.GENDER_UNKNOWN): res['error'] = u'Для добавления результатов Вам нужно указать в профиле свои имя, фамилию и пол.' elif not profile.email_is_verified: res['error'] = u'Для добавления результатов Вам нужно подтвердить свой электронный адрес на странице «Личные данные», ' \ + u'чтобы мы могли связаться с Вами.' elif request.method == 'POST': if hasattr(user, 'runner'): runner = user.runner else: runner = None result = models.Result( runner=runner, user=user, loaded_by=user, source=models.RESULT_SOURCE_USER, gender=profile.gender, ) form = forms.UnofficialResultForm(request.POST, instance=result, event=event) if form.is_valid(): if models.Result.objects.filter(user=user, race=form.instance.race).exists(): res['error'] = u'Вы уже вводили свой неофициальный результат на этой дистанции.' else: result = form.save() if runner is None: runner = models.Runner.objects.create( user=user, lname=user.last_name, fname=user.first_name, birthday=profile.birthday, birthday_known=(profile.birthday is not None), city=profile.city, gender=profile.gender, ) result.runner = runner result.save() update_runner_stat(runner=runner) update_runner_stat(user=user, update_club_members=False) will_be_counted_for_klb = False is_klb_participant, can_be_counted_for_klb, _ = check_event_for_klb( user, event) res['can_be_counted_for_klb'] = 1 if can_be_counted_for_klb else 0 if is_klb_participant and can_be_counted_for_klb: klb_status = result.race.get_klb_status() will_be_counted_for_klb = ( klb_status == models.KLB_STATUS_OK) res['will_be_counted_for_klb'] = 1 if will_be_counted_for_klb else 0 res['reason'] = models.KLB_STATUSES[klb_status][1] res['url_my_results'] = reverse('results:home') models.log_obj_create(user, event, models.ACTION_UNOFF_RESULT_CREATE, child_object=result, is_for_klb=will_be_counted_for_klb) if result.race.loaded == models.RESULTS_NOT_LOADED: result.race.loaded = models.RESULTS_SOME_UNOFFICIAL result.race.save() strava_number = form.cleaned_data.get('strava_number') if strava_number: result_on_strava = models.Result_on_strava.objects.create( result=result, link=strava_number, added_by=user, ) models.log_obj_create( user, result_on_strava, models.ACTION_CREATE, comment=u'При создании неофициального результата') res['success'] = 1 else: res['error'] = get_first_form_error(form) else: res['error'] = u'Запрос не получен.' return HttpResponse(json.dumps(res), content_type='application/json')
def klb_race_add_results(request, race_id): race = get_object_or_404(models.Race, pk=race_id) event = race.event year = event.start_date.year user = request.user context = user_edit_vars(user, series=event.series) race_is_for_klb = race.get_klb_status() == models.KLB_STATUS_OK context['race'] = race context['event'] = event if race_is_for_klb: context['page_title'] = u'{}: ввод результатов для КЛБМатча'.format( race) else: context['page_title'] = u'{}: ввод отдельных результатов'.format(race) context['race_is_ok_for_klb'] = race_is_for_klb context['KLB_STATUS_OK'] = models.KLB_STATUS_OK context['user_is_female'] = user.user_profile.is_female() club_id = models.int_safe(request.POST.get('club', 0)) if context[ 'is_admin']: # Only admins can add results to individual participants here club = models.Club.objects.filter(pk=club_id).first() else: club = get_object_or_404(models.Club, pk=club_id) if (not context['is_admin']) and ( club not in user.user_profile.get_club_set_to_add_results()): messages.warning(request, u'У Вас нет прав на это действие') return redirect(race) # if club: # participants = models.Klb_participant.objects.filter(match_year=year, team__club=club) # else: # participants = models.Klb_participant.objects.filter(match_year=year, team=None) # possible_person_ids = set(participants.values_list('klb_person_id', flat=True)) - set(race.result_set.values_list('runner__klb_person_id', flat=True)) runners_for_user = user.user_profile.get_runners_to_add_results( race, race_is_for_klb=race_is_for_klb, club=club, for_given_club_only=True) n_persons = models.int_safe( request.POST.get('n_persons', N_PERSONS_DEFAULT)) formset_kwargs = { 'race': race, 'extra': n_persons, 'is_admin': context['is_admin'], 'race_is_for_klb': race_is_for_klb, 'runner_choices': [('', u'(пропускаем)')] + [(runner.id, data['text']) for runner, data in runners_for_user.items()], 'disabled_choices': set(runner.id for runner, data in runners_for_user.items() if data['is_already_in_race']), } if 'formset_submit' in request.POST: formset = getKlbResultFormSet(data=request.POST, **formset_kwargs) if formset.is_valid(): n_results_created = 0 n_klb_results_created = 0 touched_persons = set() touched_runners = set() touched_teams = Counter() loaded_from = request.POST.get('source', '') distance, was_real_distance_used = race.get_distance_and_flag_for_klb( ) for form in formset: runner = form.cleaned_data.get('runner') if runner: if runner not in runners_for_user: messages.warning( request, u'Участник забегов {} (id {}) не относится к выбранному клубу. Пропускаем' .format(runner.name(), runner.id)) continue result = models.Result.objects.create( race=race, runner=runner, user=runner.user, loaded_by=user, lname=runner.lname, fname=runner.fname, source=models.RESULT_SOURCE_USER, loaded_from=loaded_from, result=form.cleaned_data['result'], ) touched_runners.add(runner) n_results_created += 1 # And now try to create result for KLBMatch if needed will_be_counted_for_klb = False only_bonus_score = False if race_is_for_klb and runners_for_user[runner][ 'is_in_klb'] and form.cleaned_data.get( 'is_for_klb', False): person = runner.klb_person if person and check_distance_and_result(request, distance, person, result, year) \ and check_results_with_same_time(request, race, event, person, result): if context['is_admin']: create_klb_result( result, person, user, distance, was_real_distance_used, only_bonus_score=form.cleaned_data.get( 'only_bonus_score', False), comment= u'Со страницы добавления отдельных результатов' ) touched_persons.add(person) team = person.get_team(year) if team: touched_teams[team] += 1 else: will_be_counted_for_klb = True n_klb_results_created += 1 models.log_obj_create(user, event, models.ACTION_UNOFF_RESULT_CREATE, child_object=result, is_for_klb=will_be_counted_for_klb) if n_results_created: if race.loaded == models.RESULTS_NOT_LOADED: race.loaded = models.RESULTS_SOME_UNOFFICIAL race.save() for runner in touched_runners: update_runner_stat(runner=runner) if runner.user: update_runner_stat(user=runner.user, update_club_members=False) messages.success( request, u'Добавлено результатов: {}. Статистика этих бегунов обновлена' .format(n_results_created)) if n_klb_results_created: messages.success( request, u'В том числе результатов в КЛБМатч: {}.{}'.format( n_klb_results_created, '' if context['is_admin'] else u' Очки за них будут добавлены после добавления модератором' )) if touched_persons: update_persons_score(year=year, persons_to_update=touched_persons, update_runners=True) messages.success( request, u'Затронуто участников Матча: {}. Их результаты пересчитаны.' .format(len(touched_persons))) if touched_teams: for team in touched_teams: prev_score = team.score team.refresh_from_db() models.Klb_team_score_change.objects.create( team=team, race=race, clean_sum=team.score - team.bonus_score, bonus_sum=team.bonus_score, delta=team.score - prev_score, n_persons_touched=touched_teams[team], comment= u'Добавление администратором отдельных результатов', added_by=user, ) return redirect(race) else: messages.warning( request, u"Результаты не добавлены. Пожалуйста, исправьте ошибки в форме." ) else: # So we just arrived here or have errors in POST request formset = getKlbResultFormSet(**formset_kwargs) context['club'] = club context['n_persons'] = n_persons context['formset'] = formset context['hasOfficialResults'] = race.get_official_results().exists() context['type_minutes'] = ( race.distance.distance_type == models.TYPE_MINUTES) return render(request, 'editor/klb/race_add_results.html', context)
def add_review(request): context = {} message_text = '' res = {} res['success'] = 0 if request.method == 'POST': user = request.user form = forms.AddReviewForm(request.POST, request.FILES) if form.is_valid(): event = get_object_or_404(models.Event, pk=form.cleaned_data['event_id']) attachment = request.FILES.get('attachment', None) doc_type = results_util.int_safe(form.cleaned_data['doc_type']) doc_type_name = u'отчёт' if doc_type == models.DOC_TYPE_IMPRESSIONS else u'фотоальбом' doc = models.Document.objects.create( event=event, document_type=doc_type, loaded_type=models.LOAD_TYPE_LOADED if attachment else models.LOAD_TYPE_NOT_LOADED, upload=attachment, url_original=form.cleaned_data['url'], author=form.cleaned_data['author'], created_by=user) models.log_obj_create(user, event, models.ACTION_DOCUMENT_CREATE, child_object=doc) doc.process_review_or_photo() generate_last_added_reviews() res['success'] = 1 res['link'] = models.SITE_URL + event.get_absolute_url() if not models.is_admin(user): message_from_site = models.Message_from_site.objects.create( sender_name=user.first_name + ' ' + user.last_name, sender_email=models.ROBOT_MAIL_HEADER, target_email=models.INFO_MAIL, # target_email='*****@*****.**', title=u'Добавлен новый {} к забегу {} ({})'.format( doc_type_name, event.name, event.date(with_nobr=False)), attachment=attachment, ) if attachment: body = u'Только что пользователь {} ({}{}) добавил на сайт отчёт к забегу «{}»:\n\n {}/{}\n\n'.format( user.get_full_name(), models.SITE_URL, user.user_profile.get_absolute_url(), unicode(event), models.SITE_URL_OLD, message_from_site.attachment.name) else: body = u'Только что пользователь {} ({}{}) добавил на сайт ссылку на {} к забегу «{}»:\n{}\n\n'.format( user.get_full_name(), models.SITE_URL, user.user_profile.get_absolute_url(), doc_type_name, unicode(event), form.cleaned_data['url']) body += u'Все документы забега: {}{}\n\n'.format( models.SITE_URL, event.get_absolute_url()) body += u'Успешных стартов!\nВаш робот' message_from_site.body = body message_from_site.save() message_from_site.try_send(attach_file=False) else: res['error'] = get_first_form_error(form) else: res['error'] = u'Запрос не получен.' return HttpResponse(json.dumps(res), content_type='application/json')
def reg_step2(request, race_id, registrant_id): race = get_object_or_404(models.Race, pk=race_id) event = race.event context = user_edit_vars(request.user) registration = get_object_or_404(models.Registration, event__id=event.id, is_open=True) registrant_id = models.int_safe(registrant_id) reg_is_open, message = check_if_reg_is_open(registration, race) if not reg_is_open: messages.warning(request, message) return redirect(event) kwargs = {'registration': registration, 'registrant_id': registrant_id} registrant = models.Registrant(race=race, user=request.user, registers_himself=(registrant_id == 0), created_by=request.user) if 'frmRegistration_submit' in request.POST: frmRegistration = forms.RegistrationForm(request.POST, instance=registrant, **kwargs) if frmRegistration.is_valid(): registrant = frmRegistration.save() cleaned_data = frmRegistration.cleaned_data if cleaned_data.get('save_registrant_data'): saved_registrant = models.Saved_registrant(user=request.user) for field in saved_registrant.__class__._meta.get_fields(): if field.name not in ['id', 'user', 'created_time']: try: setattr(saved_registrant, field.name, cleaned_data.get(field.name)) except: pass saved_registrant.save() models.log_obj_create(request.user, saved_registrant, models.ACTION_CREATE, comment=u'При регистрации на забег {} (id {})'.format( event, event.id)) price = registrant.race_cost.cost for question in race.get_reg_question_set_for_today(): field_name = 'question_{}'.format(question.id) if question.multiple_answers: answers = cleaned_data.get(field_name) for answer in answers: choice = question.reg_question_choice_set.filter(is_visible=True, pk=answer).first() if choice: models.Reg_answer.objects.create(registrant=registrant, reg_question_choice=choice, created_by=request.user) price += choice.cost else: answer = cleaned_data.get(field_name) if answer: choice = question.reg_question_choice_set.filter(is_visible=True, pk=answer).first() if choice: models.Reg_answer.objects.create(registrant=registrant, reg_question_choice=choice, created_by=request.user) price += choice.cost registrant.price = price registrant.save() models.log_obj_create(request.user, registration, models.ACTION_REGISTRANT_CREATE, child_object=registrant, comment=u'При регистрации') return redirect('results:reg_step3', race_id=race.id, registrant_id=registrant.id) else: messages.warning(request, u"Пожалуйста, исправьте ошибки в форме.") else: frmRegistration = forms.RegistrationForm(instance=registrant, **kwargs) context['frmRegistration'] = frmRegistration context['event'] = event context['race'] = race context['registration'] = registration context['page_title'] = u'Регистрация на {}. Шаг 2'.format(event.name) return render(request, 'registration/reg_step2.html', context)
def replace_in_event_names(request): if request.method != 'POST': return util(request) replace_what = request.POST.get('replace_what', '') if replace_what and len(replace_what) >= 3: replace_to = request.POST.get('replace_to', '') else: messages.warning(request, u'Можно заменять строку длиной хотя бы 3 символа') return util(request) to_replace = ('btnReplace' in request.POST) events = models.Event.objects.filter(name__icontains=replace_what) messages.success(request, u'Всего {} забегов на замену'.format(events.count())) n_events_to_change = 0 for event in events: new_name = event.name.replace(replace_what, replace_to) if new_name != event.name: messages.warning( request, u'Забег {}: {} -> {}'.format(event.id, event.name, new_name)) n_events_to_change += 1 if to_replace: event.name = new_name event.save() models.log_obj_create(request.user, event, models.ACTION_UPDATE, field_list=['name'], comment=u'Массовое переименование') seria = models.Series.objects.filter(name__icontains=replace_what) messages.success(request, u'Всего {} серий на замену'.format(seria.count())) n_series_to_change = 0 for series in seria: new_name = series.name.replace(replace_what, replace_to) if new_name != series.name: messages.warning( request, u'Серия {}: {} -> {}'.format( series.id, series.name, series.name.replace(replace_what, replace_to))) n_series_to_change += 1 if to_replace: series.name = new_name series.save() models.log_obj_create(request.user, series, models.ACTION_UPDATE, field_list=['name'], comment=u'Массовое переименование') messages.success( request, u'Всего изменяем {} забегов, {} серий'.format(n_events_to_change, n_series_to_change)) context = {} context['replace_what'] = replace_what context['replace_to'] = replace_to return util(request, 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 create_result_from_ak(user, race, ak_result, first_name_position, to_log_action=False): #if debug: # messages.success(request, u'Грузим человека {}.'.format(ak_result.name_raw)) ak_person = ak_result.ak_person # Runner always should be found, not created: we must add all new runners from AK before importing results from AK runner, created = models.Runner.objects.get_or_create( ak_person=ak_person, defaults={ 'lname': ak_person.lname, 'fname': ak_person.fname, 'city': ak_person.city, 'gender': models.GENDER_MALE if ak_person.gender_raw.lower() == u'м' else models.GENDER_FEMALE }) result = models.Result(race=race, runner=runner, ak_person=ak_result.ak_person, name_raw=ak_result.name_raw.strip(), time_raw=ak_result.time_raw.strip(), country_raw=ak_result.country_raw.strip(), city_raw=ak_result.city_raw.strip(), club_raw=ak_result.club_raw.strip(), birthday_raw=ak_result.birthday_raw, birthyear_raw=ak_result.birthyear_raw, place_raw=ak_result.place, place_category_raw=ak_result.place_category, age_raw=ak_result.age_raw, category=ak_result.category.strip(), comment_raw=ak_result.comment.strip(), bib=ak_result.bib.strip()) result.country_name = result.country_raw result.city_name = result.city_raw result.club_name = result.club_raw result.age = result.age_raw result.comment = result.comment_raw if ak_result.result == 0 or ak_result.result == 99999.9: result.status = process_ak_status(result.time_raw) else: if race.distance.distance_type == models.TYPE_MINUTES: result.result = round( float(race.distance.length) * 60 * 10000 / ak_result.result) else: result.result = round(ak_result.result * 100) if ak_result.birthday_raw is None: result.birthday_known = False if ak_result.birthyear_raw is None: result.birthday = None else: result.birthday = datetime.date(ak_result.birthyear_raw, 1, 1) else: result.birthday_known = True result.birthday = ak_result.birthday_raw result.lname, result.fname, result.midname = split_name( result.name_raw, first_name_position) result.gender = models.string2gender( ak_result.ak_person.gender_raw ) if ak_result.ak_person else models.GENDER_UNKNOWN result.loaded_by = user result.loaded_from = "AK55: table {}, RACEID {}, result id {}".format( ak_result.__class__._meta.db_table, ak_result.ak_race.id, ak_result.id) result.save() if to_log_action: models.log_obj_create(user, race.event, models.ACTION_RESULT_CREATE, child_object=result) return result
def klb_race_process(request, race_id=None): race = get_object_or_404(models.Race, pk=race_id) event = race.event year = event.start_date.year user = request.user distance, was_real_distance_used = race.get_distance_and_flag_for_klb() page = None if models.Klb_result.objects.filter(race=race, result=None).exists(): messages.warning( request, u'На этой дистанции есть результаты, проведённые в КЛБМатч, но не привязанные к загруженным результатам.' ) elif request.method == 'POST': results_added = 0 results_deleted = 0 results_errors = 0 touched_persons = set() touched_teams = Counter() page = models.int_safe(request.POST.get('page', 0)) pages_number = get_pages_number( race.result_set.filter(source=models.RESULT_SOURCE_DEFAULT, status=models.STATUS_FINISHED).count()) only_bonus_score = 'only_bonus_score' in request.POST for key, val in request.POST.items(): if key.startswith("person_for_"): person_id = models.int_safe(val) if person_id == 0: continue result_id = models.int_safe(key[len("person_for_"):]) result = models.Result.objects.filter(race=race, id=result_id, klb_result=None).first() if result is None: messages.warning( request, u'Результат с id {} не найден. Пропускаем'.format( result_id)) continue if hasattr(result, 'klb_result'): messages.warning( request, u'Результат с id {} уже учтён в КЛБМатче. Пропускаем'. format(result_id)) continue person = models.Klb_person.objects.filter(pk=person_id).first() if not person: messages.warning( request, u'{} {}: участник КЛБМатчей с id {} не найден. Пропускаем' .format(result.fname, result.lname, person_id)) continue if not check_results_with_same_time(request, race, event, person, result): continue # We can have two runners: from result and from person if result.runner: runner = result.runner if hasattr(person, 'runner'): if runner != person.runner: messages.warning(request, ( u'{} {}: у результата и участника Матча два разных бегуна, {} и {}. ' + u'Сначала объедините их').format( result.fname, result.lname, result.runner, person.runner)) continue # If runner == person.runner, we just do nothing elif runner.klb_person_id and (runner.klb_person_id != person.id): messages.warning(request, ( u'{} {}: В БД результатов указан другой бегун – с id {}. Пропускаем' ).format(result.fname, result.lname, runner.klb_person_id)) continue # So result has its runner, person doesn't have, and either runner.klb_person_id = person.id or runner.klb_person_id=None if runner.klb_person_id is None: runner.klb_person = person runner.save() person.refresh_from_db() # Great! That's time to create KLBResult create_klb_result( result, person, user, distance, was_real_distance_used, only_bonus_score=only_bonus_score, comment=u'Со страницы обработки официальных результатов') table_update = models.Table_update.objects.filter( model_name=event.__class__.__name__, row_id=event.id, child_id=result.id, action_type=models.ACTION_RESULT_UPDATE, is_verified=False, ).first() if table_update: table_update.verify( request.user, comment=u'одобрено при обработке старта целиком') touched_persons.add(person) # update_participant_score(person) team = person.get_team(year) if team: touched_teams[team] += 1 results_added += 1 elif key.startswith("to_delete_"): result_id = models.int_safe(key[len("to_delete_"):]) result = models.Result.objects.filter( race=race, id=result_id, klb_result__isnull=False).first() if not result: messages.warning( request, u'Результат с id {} не найден. Пропускаем'.format( result_id)) continue klb_result = result.klb_result touched_persons.add(klb_result.klb_person) team = klb_result.get_team() if team: touched_teams[team] += 1 models.log_obj_delete( user, event, child_object=klb_result, action_type=models.ACTION_KLB_RESULT_DELETE) klb_result.delete() if 'to_unclaim_{}'.format(result_id) in request.POST: result.unclaim_from_runner(user) results_deleted += 1 if results_added: messages.success( request, u'В КЛБМатч добавлено результатов: {}'.format(results_added)) race.fill_winners_info() if results_deleted: messages.success( request, u'Из КЛБМатча удалено результатов: {}'.format(results_deleted)) if touched_persons: update_persons_score(year=year, persons_to_update=touched_persons, update_runners=True) messages.success( request, u'Затронуто участников Матча: {}. Их результаты пересчитаны.'. format(len(touched_persons))) if touched_teams: messages.success( request, u'Затронуты команды: {}'.format(', '.join( team.name for team in touched_teams))) for team in touched_teams: prev_score = team.score team.refresh_from_db() models.Klb_team_score_change.objects.create( team=team, race=race, clean_sum=team.score - team.bonus_score, bonus_sum=team.bonus_score, delta=team.score - prev_score, n_persons_touched=touched_teams[team], comment=u'Обработка всей дистанции в КЛБМатч', added_by=user, ) if (not race.was_checked_for_klb) and (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) return redirect(race.get_klb_editor_url(page=page))