예제 #1
0
파일: views_club.py 프로젝트: comcur/ProBEG
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)
예제 #2
0
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)
예제 #3
0
def result_mark_as_error(request, result_id):
	if not ('frmKlbErrorResult_submit' in request.POST):
		return redirect(result.get_editor_url())
	result = get_object_or_404(models.Result, pk=result_id)
	if not hasattr(result, 'klb_result'):
		messages.warning(request, u'Этот результат и так не учтён в КЛБМатчах')
		return redirect(result.get_editor_url())
	klb_result = result.klb_result
	event = result.race.event 
	year = event.start_date.year
	if models.is_active_klb_year(year):
		messages.warning(request, u'Этот результат относится к продолжающемуся КЛБМатчу. Просто удалите его и, если нужно, отвяжите от бегуна')
		return redirect(result.get_editor_url())
	klb_result.result = None
	klb_result.is_error = True
	klb_result.save()

	touched_fields = []
	runner = result.runner
	if runner:
		touched_fields.append('runner')
		result.runner = None
	user = result.user
	if user:
		touched_fields.append('user')
		result.user = None
	result.save()
	if user:
		update_runner_stat(user=user)
	if runner:
		update_runner_stat(runner=runner)
	models.log_obj_create(request.user, event, models.ACTION_RESULT_UPDATE, field_list=touched_fields, child_object=result,
		comment=u'При помечании КЛБ-результата как ошибочного')
	messages.success(request, u'КЛБ-результат помечен как ошибочный и отвязан от бегуна')
	return redirect(result.get_editor_url())
예제 #4
0
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')
예제 #5
0
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)
예제 #6
0
def payment_delete_participant(request, payment_id, participant_id):
    if 'btnDeleteParticipant' in request.POST:
        payment = get_object_or_404(models.Payment_moneta, pk=payment_id)
        participant = get_object_or_404(models.Klb_participant,
                                        pk=participant_id)
        person = participant.klb_person
        year = participant.match_year

        if not models.is_active_klb_year(year):
            messages.warning(
                request,
                u'Сейчас нельзя менять платежи за {} год'.format(year))
        elif participant.payment_id is None:
            messages.warning(
                request,
                u'Участник {} за {} год пока не привязан ни к какому платежу'.
                format(person, year))
        elif participant.payment_id != payment.id:
            messages.warning(
                request,
                u'Участник {} за {} год привязан к другому платежу — с id {}'.
                format(person, year, participant.payment_id))
        elif participant.is_paid_through_site:
            messages.warning(
                request,
                u'Участник {} за {} год входил в этот платёж при оплате через сайт. Такого нельзя удалить'
                .format(person, year))
        elif not payment.is_paid:
            messages.warning(
                request,
                u'Платёж с id {} ещё не оплачен. Такие редактировать нельзя'.
                format(payment.id))
        elif participant.paid_status == models.PAID_STATUS_NO:
            messages.warning(
                request,
                u'Участник {} за {} год и так помечен как не оплачивавший участие. Что-то не то'
                .format(person, year))
        else:
            participant.paid_status = models.PAID_STATUS_NO
            participant.payment = None
            participant.save()
            models.log_obj_create(request.user,
                                  person,
                                  models.ACTION_KLB_PARTICIPANT_UPDATE,
                                  child_object=participant,
                                  field_list=['payment', 'paid_status'],
                                  comment=u'Удалён из платежа {}'.format(
                                      payment.id),
                                  verified_by=models.USER_ROBOT_CONNECTOR)
            messages.success(
                request,
                u'Участник {} за {} год удалён из этого платежа'.format(
                    person, year))
    return redirect(payment)
예제 #7
0
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)
예제 #8
0
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)
예제 #9
0
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)
예제 #10
0
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)
예제 #11
0
def klb_team_change_name(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    if not models.is_active_klb_year(team.year, True):
        messages.warning(
            request,
            u'Вы уже не можете менять название команды за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    if 'changeName_submit' in request.POST:
        name_new = request.POST.get('teamName', '').strip()
        if name_new == team.name:
            messages.warning(
                request,
                u'Вы не изменили название команды. Всё осталось по-прежнему.')
            return redirect(team)
        if name_new == '':
            messages.warning(
                request,
                u'Название команды не может быть пустым. Всё осталось по-прежнему.'
            )
            return redirect(team)
        if not (name_new[0].isalpha() or name_new[0].isdigit()):
            messages.warning(
                request,
                u'Название команды должно начинаться с буквы или цифры. Всё осталось по-прежнему.'
            )
            return redirect(team)
        if models.Klb_team.objects.filter(
                year=team.year, club__city=team.club.city,
                name__iexact=name_new).exclude(pk=team.id).exists():
            messages.warning(
                request,
                u'Команда с названием «{}» {}уже заявлена в КЛБМатч–{}. Название не изменено.'
                .format(
                    name_new, u'из города {} '.format(team.club.city.name)
                    if team.club.city else '', team.year))
            return redirect(team)
        team.name = name_new
        team.save()
        models.log_obj_create(request.user,
                              team,
                              models.ACTION_UPDATE,
                              field_list=['name'])
        messages.success(request, u'Название команды успешно изменено')
    return redirect(team)
예제 #12
0
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)
예제 #13
0
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)
예제 #14
0
파일: views_user.py 프로젝트: comcur/ProBEG
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
예제 #15
0
파일: views_klb.py 프로젝트: comcur/ProBEG
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)
예제 #16
0
def klb_team_move_participants(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    if datetime.date.today() > datetime.date(team.year, 5, 31):
        messages.warning(
            request,
            u'Перемещать людей между командами можно только до 31 мая.')
        return redirect(team)
    other_teams = club.klb_team_set.filter(year=team.year).exclude(pk=team.id)
    if not other_teams.exists():
        messages.warning(
            request,
            u'В Матч–{} вы заявили всего одну команду. Перемещать людей неоткуда.'
            .format(team.year))
        return redirect(team)

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

    context[
        'other_teams_participants'] = models.Klb_participant.objects.filter(
            team__in=list(other_teams)).select_related('team',
                                                       'klb_person').order_by(
                                                           'team__name',
                                                           'klb_person__lname',
                                                           'klb_person__fname')
    context['team_limit'] = models_klb.get_team_limit(team.year)
    context['medium_team_limit'] = models_klb.get_medium_team_limit(team.year)
    context['small_team_limit'] = models_klb.get_small_team_limit(team.year)
    context['page_title'] = u'Команда в КЛБМатче: {}, {} год'.format(
        team.name, team.year)
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=models.ORDERING_NAME)
    return render(request, 'klb/team_move_participants.html', context)
예제 #17
0
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)
예제 #18
0
def klb_race_details(request, race_id, page=0):
    race = get_object_or_404(models.Race, pk=race_id)
    event = race.event
    year = event.start_date.year
    if not models.is_active_klb_year(year):
        messages.warning(
            request,
            u'Вы уже не можете изменять результаты забега {} года. Тот матч давно в прошлом.'
            .format(year))
        return redirect(race)
    user = request.user
    context = {}
    context['race'] = race
    context['event'] = event
    context['results_in_klb'] = 0
    context['results_to_add'] = 0
    context['results_errors'] = 0
    context['page_title'] = u'{}: результаты забега для КЛБМатча'.format(
        race.name_with_event())
    if race.distance_real and (race.distance_real.length <
                               race.distance.length):
        distance = race.distance_real
    else:
        distance = race.distance
    context['distance'] = distance

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

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

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

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

            persons = models.Klb_person.objects.filter(
                pk__in=klb_participant_ids,
                runner__id__in=get_runner_ids_for_result(result),
                # lname=result.lname,
                # fname=result.fname
            ).select_related('city__region__country')
            if result.birthday:
                if result.birthday_known:
                    persons = persons.filter(birthday=result.birthday)
                    compared_type = COMPARED_BY_BIRTHDAY
                else:
                    persons = persons.filter(
                        birthday__year=result.birthday.year)
                    compared_type = COMPARED_BY_BIRTHYEAR
            elif result.age:
                birthyear_around = year - result.age
                persons = persons.filter(
                    birthday__year__range=(birthyear_around - 1,
                                           birthyear_around + 1))
                compared_type = COMPARED_BY_AGE
            if not persons.exists():
                continue
            value_for_order += compared_type
            for person in persons:
                has_results_to_work = True
                candidate_errors = []
                candidate_comments = []
                show_checkbox = True
                team = person.get_team(year)
                club = team.club if team else None
                if person.id in event_person_ids:
                    candidate_errors.append(
                        u'У этого участника КЛБМатча уже есть зачтенный результат в этом забеге с тем же временем старта'
                    )
                    show_checkbox = False
                if club and result.club_name:
                    club_name_found = False
                    for club_name in [club.name, team.name] + list(
                            club.club_name_set.values_list('name', flat=True)):
                        if club_name.lower()[:6] in result.club_name.lower():
                            club_name_found = True
                            break
                    if club_name_found:
                        candidate_comments.append(u'Клуб указан в протоколе')
                        value_for_order += 5
                    else:
                        candidate_errors.append(
                            u'Клуб бегуна противоречит протоколу')
                runner = result.runner
                if runner:
                    if runner.klb_person_id and (runner.klb_person_id !=
                                                 person.id):
                        candidate_errors.append(
                            u'В БД результатов указан другой бегун – с id {}'.
                            format(runner.klb_person_id))
                        show_checkbox = False
                    elif (runner.klb_person_id is None) and hasattr(
                            person, 'runner') and person.runner.klb_person_id:
                        candidate_errors.append(
                            u'К результату уже привязан другой бегун')
                        show_checkbox = False
                if show_checkbox:
                    has_checkboxes = True
                candidates.append({
                    'person': person,
                    'errors': candidate_errors,
                    'comments': candidate_comments,
                    'show_checkbox': show_checkbox,
                    'team': team,
                    'club': club,
                })
            if has_checkboxes:
                context['results_to_add'] += 1
        if hasattr(result, 'klb_result') or candidates or errors:
            results.append({
                'result':
                result,
                'candidates':
                candidates,
                'errors':
                errors,
                'value_for_order':
                value_for_order,
                'checked_by_default': (len(candidates) == 1)
                and (not candidates[0]['errors'])
                and (((result.club_name != '') and team) or
                     (compared_type >= COMPARED_BY_BIRTHYEAR)),
                'compared_type':
                COMPARED_TYPES[compared_type][1],
                'has_checkboxes':
                has_checkboxes,
            })
        if errors:
            context['results_errors'] += 1
    if (not has_results_to_work) and (not race.was_checked_for_klb) and (
        (not context['using_pages']) or (page == pages_number - 1)):
        race.was_checked_for_klb = True
        race.save()
        models.log_obj_create(user,
                              event,
                              models.ACTION_RACE_UPDATE,
                              field_list=['was_checked_for_klb'],
                              child_object=race)
        context['just_checked'] = 1
    context['results'] = sorted(results, key=lambda x: -x['value_for_order'])
    context['results_total'] = n_official_results
    context['results_unbound'] = race.klb_result_set.filter(result=None)
    context['races'] = event.race_set.select_related('distance').order_by(
        'distance__distance_type', '-distance__length')
    context['KLB_STATUS_OK'] = models.KLB_STATUS_OK
    return render(request, 'editor/klb/race_details.html', context)
예제 #19
0
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)
예제 #20
0
파일: views_club.py 프로젝트: comcur/ProBEG
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)
예제 #21
0
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)
예제 #22
0
def klb_team_add_new_participant(request, team_id):
    team = get_object_or_404(models.Klb_team, pk=team_id)
    club = team.club
    context, has_rights, target = check_rights(request, club=club)
    if not has_rights:
        return target
    user = request.user
    if not models.is_active_klb_year(team.year, context['is_admin']):
        messages.warning(
            request,
            u'Вы уже не можете добавлять людей в команду за {} год. Тот матч давно в прошлом.'
            .format(team.year))
        return redirect(team)
    form = None
    to_create_runner = to_create_person = to_create_participant = False

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

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

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

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

    if form is None:
        initial = {}
        if club.city:
            initial['city_id'] = club.city.id
            initial['region'] = club.city.region.id
        form = RunnerForKlbForm(user=user, year=team.year, initial=initial)
    context['form'] = form
    context['page_title'] = u'Команда в КЛБМатче: {}, {} год'.format(
        team.name, team.year)
    context['year'] = team.year
    context = team.update_context_for_team_page(context,
                                                request.user,
                                                ordering=models.ORDERING_NAME)
    if 'runners' in context:
        template = 'klb/team_add_new_participants_step2.html'
    else:
        template = 'klb/team_add_new_participants_step1.html'
    return render(request, template, context)
예제 #23
0
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')
예제 #24
0
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)
예제 #25
0
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')
예제 #26
0
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)
예제 #27
0
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)
예제 #28
0
def payment_add_participant(request, payment_id):
    if 'btnAddParticipant' in request.POST:
        payment = get_object_or_404(models.Payment_moneta, pk=payment_id)
        participant_id = models.int_safe(
            request.POST.get('select_participant'))
        participant = get_object_or_404(models.Klb_participant,
                                        pk=participant_id)
        person = participant.klb_person
        year = participant.match_year

        if not models.is_active_klb_year(year):
            messages.warning(
                request,
                u'Сейчас нельзя менять платежи за {} год'.format(year))
        elif participant.payment_id:
            messages.warning(
                request,
                u'Участник {} за {} год уже привязан к платежу с id {}'.format(
                    person, year, participant.payment_id))
        elif not payment.is_paid:
            messages.warning(
                request,
                u'Платёж с id {} ещё не оплачен. Такие редактировать нельзя'.
                format(payment.id))
        elif participant.paid_status != models.PAID_STATUS_NO:
            messages.warning(
                request,
                u'Участник {} за {} год и так помечен как оплативший участие. Что-то не то'
                .format(person, year))
        else:
            participant.payment = payment
            participant.is_paid_through_site = False
            amount_str = request.POST.get('amount')
            if amount_str == '0':
                participant.paid_status = models.PAID_STATUS_FREE
                participant.save()
                models.log_obj_create(
                    request.user,
                    person,
                    models.ACTION_KLB_PARTICIPANT_UPDATE,
                    child_object=participant,
                    field_list=[
                        'payment', 'is_paid_through_site', 'paid_status'
                    ],
                    comment=u'Добавлен к платежу {}'.format(payment.id),
                    verified_by=models.USER_ROBOT_CONNECTOR)
                messages.success(
                    request,
                    u'Участник {} за {} год добавлен к платежу как участвующий бесплатно'
                    .format(person, year))
            else:
                amount = models.int_safe(amount_str)
                if amount == get_participation_price(year):
                    participant.paid_status = models.PAID_STATUS_FULL
                    participant.save()
                    models.log_obj_create(
                        request.user,
                        person,
                        models.ACTION_KLB_PARTICIPANT_UPDATE,
                        child_object=participant,
                        field_list=[
                            'payment', 'is_paid_through_site', 'paid_status'
                        ],
                        comment=u'Добавлен к платежу {}'.format(payment.id),
                        verified_by=models.USER_ROBOT_CONNECTOR)
                    messages.success(
                        request,
                        u'Участник {} за {} год добавлен к платежу как участвующий за полную стоимость'
                        .format(person, year))
                else:
                    messages.warning(
                        request,
                        u'Участник {} за {} год не привязан к платежу: недопустимая цена участия {}'
                        .format(person, year, amount))
    return redirect(payment)
예제 #29
0
파일: views_ak.py 프로젝트: comcur/ProBEG
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
예제 #30
0
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))