コード例 #1
0
ファイル: views.py プロジェクト: BNLFan/ultimate-league-app
def schedulegeneration(request, year=None, season=None, division=None):
    leagues = None
    league = None
    games = None
    game_locations = None
    game_dates = None

    form = None
    schedule = None
    num_necessary_fields = 0

    if year and season and division:
        league = get_object_or_404(
            League, Q(year=year),
            Q(season__name=season) | Q(season__slug=season),
            Q(night=division) | Q(night_slug=division))
        games = league.game_set.order_by('date', 'start', 'field_name',
                                         'field_name__field')
        game_locations = league.get_game_locations(games=games)
        game_dates = league.get_game_dates(games=games,
                                           game_locations=game_locations)

        num_events = league.get_num_game_events()

        schedule = []
        teams = list(Team.objects.filter(league=league))
        num_teams = len(teams)

        if teams:
            teams = teams[0::2] + list(reversed(teams[1::2]))
            teams = teams[:1] + teams[2:] + teams[1:2]

            field_shift = 0
            for event_num in range(0, num_events):
                teams = teams[:1] + teams[-1:] + teams[1:-1]

                top = teams[:num_teams // 2]
                bottom = list(reversed(teams[num_teams // 2:]))
                games = zip(top, bottom)

                field_shift = (event_num * 2) % (num_teams // 2)

                games = games[-field_shift:] + games[:-field_shift]

                schedule_teams = [
                    team for game in games
                    for team in sorted(game, key=lambda k: k.id)
                ]
                schedule.append(schedule_teams)

        num_necessary_fields = int(
            ceil(1.0 * num_teams / 2 / league.num_time_slots))

        if request.method == 'POST':
            if 'generate_schedule' in request.POST:
                form = ScheduleGenerationForm(request.POST)
                field_names = request.POST.getlist('field_names')
                num_field_names = len(field_names)

                if form.is_valid() and num_field_names >= num_necessary_fields:
                    start_datetime = datetime.combine(datetime.min,
                                                      league.start_time)

                    if league.start_time <= league.end_time:
                        end_datetime = datetime.combine(
                            datetime.min, league.end_time)
                    else:
                        end_datetime = datetime.combine(
                            datetime.min + timedelta(days=1), league.end_time)

                    time_delta = end_datetime - start_datetime
                    time_slot_delta = time_delta / league.num_time_slots

                    event_date = league.league_start_date
                    field_names = FieldNames.objects.filter(pk__in=field_names)

                    for event in schedule:
                        event_datetime = datetime.combine(
                            event_date, league.start_time)

                        for i, team in enumerate(event):
                            if i % 2 == 0:
                                game = Game()
                                game.date = event_date
                                game.start = event_datetime
                                game.field_name = field_names[(i / 2) %
                                                              num_field_names]
                                game.league = league
                                game.save()

                            game_team = GameTeams()
                            game_team.game = game
                            game_team.team = team
                            game_team.save()

                            # if no new game/will create new game on next loop
                            if not i % 2 == 0:
                                # if out of fields for timeslot
                                if ((i / 2) + 1) % num_field_names == 0:
                                    event_datetime += time_slot_delta

                        event_date = event_date + timedelta(days=7)

                    messages.success(request,
                                     'Schedule was successfully generated.')
                    return HttpResponseRedirect(
                        reverse('schedulegeneration_league',
                                kwargs={
                                    'year': year,
                                    'season': season,
                                    'division': division
                                }))
                else:
                    if num_field_names >= num_necessary_fields:
                        messages.error(
                            request,
                            'There was an issue with the form you submitted.')
                    else:
                        messages.error(
                            request,
                            'You must pick enough fields to cover the number of games for an event.'
                        )
            elif 'clear_schedule' in request.POST:
                Game.objects.filter(league=league).delete()

                messages.success(request, 'Schedule was successfully cleared.')
                return HttpResponseRedirect(
                    reverse('schedulegeneration_league',
                            kwargs={
                                'year': year,
                                'season': season,
                                'division': division
                            }))
        else:
            form = ScheduleGenerationForm()

        form.fields['field_names'].queryset = FieldNames.objects.filter(
            field__league=league)

    else:
        leagues = League.objects.all().order_by('-league_start_date')

    return render_to_response('junta/schedulegeneration.html', {
        'leagues': leagues,
        'league': league,
        'game_locations': game_locations,
        'game_dates': game_dates,
        'form': form,
        'schedule': schedule,
        'num_necessary_fields': num_necessary_fields,
    },
                              context_instance=RequestContext(request))
コード例 #2
0
def schedulegeneration(request, year=None, season=None, division=None):
    leagues = None
    league = None
    games = None
    game_locations = None
    game_dates = None

    form = None
    schedule = None
    num_necessary_fields = 0

    if year and season and division:
        league = get_object_or_404(League, Q(year=year), Q(season__name=season) | Q(season__slug=season), Q(night=division) | Q(night_slug=division))
        games = league.game_set.order_by('date' ,'start', 'field_name', 'field_name__field')
        game_locations = league.get_game_locations(games=games)
        game_dates = league.get_game_dates(games=games, game_locations=game_locations)

        num_events = league.get_num_game_events()

        schedule = []
        teams = list(Team.objects.filter(league=league))
        num_teams = len(teams)

        if teams:
            teams = teams[0::2] + list(reversed(teams[1::2]))
            teams = teams[:1] + teams[2:] + teams[1:2]

            field_shift = 0
            for event_num in range(0, num_events):
                teams = teams[:1] + teams[-1:] + teams[1:-1]

                top = teams[:num_teams // 2]
                bottom = list(reversed(teams[num_teams // 2:]))
                games = zip(top, bottom)

                field_shift = (event_num * 2) % (num_teams // 2)

                games = games[-field_shift:] + games[:-field_shift]

                schedule_teams = [team for game in games for team in sorted(game, key=lambda k: k.id)]
                schedule.append(schedule_teams)

        num_necessary_fields = int(ceil(1.0 * num_teams / 2 / league.num_time_slots))

        if request.method == 'POST':
            if 'generate_schedule' in request.POST:
                form = ScheduleGenerationForm(request.POST)
                field_names = request.POST.getlist('field_names')
                num_field_names = len(field_names)

                if form.is_valid() and num_field_names >= num_necessary_fields:
                    start_datetime = datetime.combine(datetime.min, league.start_time)

                    if league.start_time <= league.end_time:
                        end_datetime = datetime.combine(datetime.min, league.end_time)
                    else:
                        end_datetime = datetime.combine(datetime.min + timedelta(days=1), league.end_time)

                    time_delta = end_datetime - start_datetime
                    time_slot_delta = time_delta / league.num_time_slots
                    num_time_slots = league.num_time_slots

                    event_date = league.league_start_date
                    field_names = FieldNames.objects.filter(pk__in=field_names)

                    for event in schedule:
                        event_datetime = datetime.combine(event_date, league.start_time)

                        for i, team in enumerate(event):
                            if i % 2 == 0:
                                game = Game()
                                game.date = event_date
                                game.start = event_datetime
                                game.field_name = field_names[(i / 2) % num_field_names]
                                game.league = league
                                game.save()

                            game_team = GameTeams()
                            game_team.game = game
                            game_team.team = team
                            game_team.save()

                            # if no new game/will create new game on next loop
                            if not i % 2 == 0:
                                # if out of fields for timeslot
                                if ((i / 2) + 1) % num_field_names == 0:
                                    event_datetime += time_slot_delta

                        event_date = event_date + timedelta(days=7)

                    messages.success(request, 'Schedule was successfully generated.')
                    return HttpResponseRedirect(reverse('schedulegeneration_league', kwargs={'year': year, 'season':season, 'division': division}))
                else:
                    if num_field_names >= num_necessary_fields:
                        messages.error(request, 'There was an issue with the form you submitted.')
                    else:
                        messages.error(request, 'You must pick enough fields to cover the number of games for an event.')
            elif 'clear_schedule' in request.POST:
                Game.objects.filter(league=league).delete()

                messages.success(request, 'Schedule was successfully cleared.')
                return HttpResponseRedirect(reverse('schedulegeneration_league', kwargs={'year': year, 'season':season, 'division': division}))
        else:
            form = ScheduleGenerationForm()

        form.fields['field_names'].queryset = FieldNames.objects.filter(field__league=league)


    else:
        leagues = League.objects.all().order_by('-league_start_date')

    return render_to_response('junta/schedulegeneration.html',
        {
            'leagues': leagues,
            'league': league,
            'game_locations': game_locations,
            'game_dates': game_dates,

            'form': form,
            'schedule': schedule,
            'num_necessary_fields': num_necessary_fields,
        },
        context_instance=RequestContext(request))
コード例 #3
0
ファイル: views.py プロジェクト: mjahn86/ultimate-league-app
def schedulegeneration(request, year=None, season=None, division=None):
	league = None
	leagues = None
	form = None
	schedule = None
	num_teams = 0

	if (year and season and division):
		league = get_object_or_404(League, year=year, season=season, night=division)
		num_events = league.get_num_game_events()

		schedule = []
		teams = list(Team.objects.filter(league=league))
		num_teams = len(teams)

		teams = teams[0::2] + list(reversed(teams[1::2]))
		teams = teams[:1] + teams[2:] + teams[1:2]

		shift = 0
		for event_num in range(0, num_events):
			teams = teams[:1] + teams[-1:] + teams[1:-1]

			top = teams[:num_teams // 2]
			bottom = list(reversed(teams[num_teams // 2:]))
			games = zip(top, bottom)

			field_shift = (event_num * 2) % (num_teams // 2)
			print field_shift

			games = games[-field_shift:] + games[:-field_shift]

			schedule_teams = [team for game in games for team in sorted(game, key=operator.attrgetter('id'))]
			schedule.append(schedule_teams)

		if request.method == 'POST':
			form = ScheduleGenerationForm(request.POST)
			if form.is_valid() and len(request.POST.getlist('field_names')) >= (num_teams / 2):
				event_date = league.league_start_date
				field_names = request.POST.getlist('field_names')
				for event in schedule:
					for i, team in enumerate(event):
						if (i % 2 == 0):
							game = Game()
							game.date = event_date
							game.field_name = FieldNames.objects.get(id=field_names[i / 2])
							game.league = league
							game.save()

						game_team = GameTeams()
						game_team.game = game
						game_team.team = team
						game_team.save()

					event_date = event_date + timedelta(days=7)

				messages.success(request, 'Schedule was successfully generated.')
				return HttpResponseRedirect(reverse('schedulegeneration'))
			else:
				if len(request.POST.getlist('field_names')) >= (num_teams / 2):
					messages.error(request, 'There was an issue with the form you submitted.')
				else:
					messages.error(request, 'You must pick enough fields to cover the number of games for an event.')
		else:
			form = ScheduleGenerationForm()

		form.fields['field_names'].queryset = FieldNames.objects.filter(field__league=league)


	else:
		leagues = League.objects.all().order_by('-league_start_date')

	return render_to_response('junta/schedulegeneration.html',
		{'league': league, 'leagues': leagues, 'form': form, 'schedule': schedule, 'num_games': num_teams / 2},
		context_instance=RequestContext(request))