rosedu/wouso

View on GitHub
wouso/interface/profile/views.py

Summary

Maintainability
A
1 hr
Test Coverage
from datetime import date

from django import forms
from django.core.exceptions import ValidationError
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.core import serializers
from django.http import Http404, HttpResponse, HttpResponseBadRequest
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext
from django.utils.html import strip_tags

from wouso.core.config.models import BoolSetting
from wouso.core.god import God
from wouso.core.magic.models import Spell, PlayerSpellDue
from wouso.core.scoring.models import History
from wouso.core.user.models import Player, PlayerGroup, Race
from wouso.games.challenge.models import Challenge
from wouso.games.specialquest.models import SpecialQuestGame
from wouso.interface.activity.models import Activity
from wouso.interface.top.models import TopUser, GroupHistory, NewHistory, ObjectHistory


@login_required
def player_points_history(request, id):
    player = get_object_or_404(Player, pk=id)
    hist = History.objects.filter(user=player).order_by('-timestamp')[:500]
    return render_to_response('profile/points_history.html',
                              {'pplayer': player, 'history': hist},
                              context_instance=RequestContext(request))


@login_required
def set_profile(request):
    user = request.user.get_profile()

    class SForm(forms.ModelForm):
        class Meta:
            model = Player
            fields = ('nickname',)

        def clean_nickname(self):
            if Player.objects.exclude(id=self.instance.id).filter(nickname=self.cleaned_data['nickname']).count():
                raise ValidationError("Nickname is used")
            self.cleaned_data['nickname'] = strip_tags(self.cleaned_data['nickname'].strip().replace(' ', '_'))
            return self.cleaned_data['nickname']


    if request.method == 'POST':
        form = SForm(request.POST, instance=user)
        if form.is_valid():
            form.save()
            return redirect('player_profile', id=user.id)
    else:
        form = SForm(instance=user)

    return render_to_response('profile/set_profile.html',
                              {'profile': user, 'form': form},
                              context_instance=RequestContext(request))


@login_required
def save_profile(request):
    # TODO: clean this mess
    user = request.user.get_profile()
    data = request.REQUEST

    try:
        Player.objects.exclude(nickname = user.nickname).get(nickname = data['nickname'])
        #print "exista!"
        return HttpResponseBadRequest()
    except:
        user.nickname = data['nickname']
        user.user.first_name = data['firstname']
        user.description = data['description']
        user.save()
        user.user.save()
    return HttpResponse()


@login_required
def user_profile(request, id, page=u'1'):
    profile = get_object_or_404(Player, id=id)

    activity_list = Activity.get_player_activity(profile)

    top_user = profile.get_extension(TopUser)
    history = History.user_points(profile.user)
    paginator = Paginator(activity_list, 10)

    try:
        activity = paginator.page(page)
    except (EmptyPage, InvalidPage):
        activity = paginator.page(paginator.num_pages)

        # some hackish introspection
        if hasattr(g, 'user_model'):
            model = getattr(g, 'user_model')
            setattr(profile, model.__name__.lower(), profile.get_extension(model))
    #Fix to show succes message from report user form
    if 'report_msg' in request.session:
        message = request.session['report_msg']
        del request.session['report_msg']
    else:
        message=''

    challenge_launched_recently = Challenge.exist_last_day(date.today(),
                                        request.user.get_profile(), profile)
    specialquest_button = SpecialQuestGame.get_specialquest_user_button(request, profile)
    config_disable_magic = BoolSetting.get('setting-magic').get_value() is False

    return render_to_response('profile/profile.html',
                              {'profile': profile,
                               'activity': activity,
                               'top': top_user,
                               'scoring': history,
                               'challenge_launched_recently': challenge_launched_recently,
                               'specialquest_button': specialquest_button,
                               'config_disable_magic': config_disable_magic,
                               'message': message},
                              context_instance=RequestContext(request))


@login_required
def player_group(request, id, page=u'1'):
    group = get_object_or_404(PlayerGroup, pk=id)

    top_users = group.players.all().order_by('-points')
    subgroups = group.children
    if group.parent:
        sistergroups = NewHistory.get_children_top(group.parent, PlayerGroup)
    else:
        sistergroups = None
    history = GroupHistory(group)

    for g in group.sisters:
        g.top = GroupHistory(g)

    activity_list = Activity.get_group_activiy(group)
    paginator = Paginator(activity_list, 10)
    try:
        activity = paginator.page(page)
    except (EmptyPage, InvalidPage):
        activity = paginator.page(paginator.num_pages)

    return render_to_response('profile/group.html',
                              {'group': group,
                               'top_users': top_users,
                               'subgroups': subgroups,
                               'sistergroups': sistergroups,
                               'top': history,
                               'activity': activity,
                               },
                              context_instance=RequestContext(request))

@login_required
def player_race(request, race_id):
    race = get_object_or_404(Race, pk=race_id)

    top_users = race.player_set.order_by('-points')
    activity_qs = Activity.get_race_activity(race)
    paginator = Paginator(activity_qs, 20)
    activity = paginator.page(1)

    # get top position
    races = list(Race.objects.filter(can_play=True))
    races.sort(key=lambda a: a.points, reverse=True)
    if race in races:
        top_rank = races.index(race) + 1
    else:
        top_rank = '-'

    groups = NewHistory.get_children_top(race, PlayerGroup)

    # Get levels
    levels = []
    for i, limit in enumerate(God.get_level_limits()):
        l = God.get_race_level(level_no=i + 1, race=race)
        l.limit = limit
        levels.append(l)

    return render_to_response('profile/race.html',
                            {'race': race,
                             'children': groups,
                             'top_users': top_users,
                             'top_rank': top_rank,
                             'top': ObjectHistory(),
                             'activity': activity,
                             'levels': levels},
                            context_instance=RequestContext(request)
    )


@login_required
def groups_index(request):
    PlayerGroup.top = lambda(self): GroupHistory(self)
    groups = PlayerGroup.objects.exclude(parent=None).order_by('name')

    return render_to_response('profile/groups.html',
                              {'groups': groups},
                              context_instance=RequestContext(request))


@login_required
def magic_summary(request):
    """ Display a summary of spells cast by me or on me """
    player = request.user.get_profile()

    cast_spells = PlayerSpellDue.objects.filter(source=player).all()

    return render_to_response('profile/spells.html',
                              {'cast': cast_spells,
                              'theowner': player},
                              context_instance=RequestContext(request))


@login_required
def magic_spell(request):
    try:
        spell = int(request.GET.get('id', None))
    except:
        raise Http404
    spell = get_object_or_404(Spell, pk=spell)

    return HttpResponse(serializers.serialize('json', (spell,)))