rosedu/wouso

View on GitHub
wouso/games/specialquest/cpanel.py

Summary

Maintainability
B
5 hrs
Test Coverage
# views for wouso cpanel
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.shortcuts import get_object_or_404, redirect
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils.translation import ugettext_noop
from django.views.generic import ListView, UpdateView
from wouso.core.user.models import Player
from wouso.core import scoring, signals
from models import SpecialQuestTask, SpecialQuestUser, SpecialQuestGame, SpecialQuestGroup
from forms import TaskForm

class HomeView(ListView):
    model = SpecialQuestTask
    template_name = 'specialquest/cpanel_home.html'
    context_object_name = 'tasks'


home = permission_required('specialquest.change_specialquestuser')(HomeView.as_view())


class GroupsView(ListView):
    model = SpecialQuestGroup
    template_name = 'specialquest/cpanel_groups.html'
    context_object_name = 'groups'

    
groups = permission_required('specialquest.change_specialquestuser')(GroupsView.as_view())


class GroupEditView(UpdateView):
    model = SpecialQuestGroup
    template_name = 'specialquest/cpanel_group_edit.html'
    context_object_name = 'group'


group_edit = permission_required('specialquest.change_specialquestuser')(GroupEditView.as_view())


@permission_required('specialquest.change_specialquestuser')
def edit(request, id=None):
    if id is not None:
        task = get_object_or_404(SpecialQuestTask, pk=id)
    else:
        task = None

    form = TaskForm(instance=task)

    if request.method == 'POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('wouso.games.specialquest.cpanel.home'))

    return render_to_response('specialquest/cpanel_edit.html',
                              {'task': task,
                               'form': form,
                               'module': 'specialquest'},
                              context_instance=RequestContext(request))


@permission_required('specialquest.change_specialquestuser')
def delete(request, id=None):
    if id is None:
        return HttpResponseRedirect(reverse('wouso.games.specialquest.cpanel.home'))
    task = get_object_or_404(SpecialQuestTask, pk=id)
    task.delete()
    return HttpResponseRedirect(reverse('wouso.games.specialquest.cpanel.home'))


@permission_required('specialquest.change_specialquestuser')
def manage_player(request, player_id):
    player = get_object_or_404(Player, pk=player_id)
    player = player.get_extension(SpecialQuestUser)
    tasks_not_done = SpecialQuestTask.objects.exclude(id__in=player.done_tasks.all().values('id')).all()

    # TODO: use smth like django-flash for this
    message, error = '', ''

    if request.method == "POST":
        # do bonuses
        if request.POST.get('gold', False):
            try:
                amount = int(request.POST.get('gold', 0))
            except ValueError:
                amount = 0
            if amount > 0:
                scoring.score(player, None, 'bonus-gold', external_id=request.user.get_profile().id, gold=amount)
                message = 'Successfully given bonus'
                if request.POST.get('comment', None):
                    signal_msg = ugettext_noop('received {gold} gold bonus for {comment}')
                    signals.addActivity.send(sender=None, user_from=player, user_to=player, message=signal_msg,
                                        arguments=dict(gold=amount, comment=request.POST['comment']),
                                        game=SpecialQuestGame.get_instance()
                    )
            else:
                error = 'Invalid amount'
        elif request.POST.get('points', False):
            try:
                amount = int(request.POST.get('points', 0))
                #assert amount > 0
            except (ValueError, AssertionError):
                error = 'Invalid amount'
            else:
                scoring.score(player, None, 'penalty-points', external_id=request.user.get_profile().id, points=amount)
                message = 'Successfully punished'

    bonuses = scoring.History.objects.filter(user=player, formula__name='bonus-gold').order_by('-timestamp')
    penalties = scoring.History.objects.filter(user=player, formula__name='penalty-points').order_by('-timestamp')

    if error:
        messages.error(request, error)
    if messages:
        messages.success(request, message)

    return render_to_response('specialquest/cpanel_manage.html',
                    dict(mplayer=player, tasks_not_done=tasks_not_done,
                         bonuses=bonuses, penalties=penalties),
                    context_instance=RequestContext(request))


@permission_required('specialquest.change_specialquestuser')
def manage_player_set(request, player_id, task_id):
    player = get_object_or_404(SpecialQuestUser, id=player_id)
    task = get_object_or_404(SpecialQuestTask, id=task_id)

    if task not in player.done_tasks.all():
        if player.group:
            members = player.group.members
            player.group.set_task_done(task)
        else:
            members = (player,)

        for member in members:
            if task not in member.done_tasks.all():
                member.done_tasks.add(task)
                scoring.score(member, SpecialQuestGame, 'specialquest-passed',external_id=task.id, value=task.value)

                signal_msg = ugettext_noop('completed special quest {task_name} and earned {value} gold')
                action_msg = 'specialq-ok-gold'
                signals.addActivity.send(sender=None, user_from=member, \
                                         user_to=member, \
                                         message=signal_msg,
                                         arguments=dict(task_name=task.name, value=task.value), \
                                         game=SpecialQuestGame.get_instance(),
                                         action=action_msg)

    return HttpResponseRedirect(reverse('specialquest_manage', args=(player.id,)))


@permission_required('specialquest.change_specialquestuser')
def manage_player_unset(request, player_id, task_id):
    player = get_object_or_404(SpecialQuestUser, id=player_id)
    task = get_object_or_404(SpecialQuestTask, id=task_id)

    if task in player.done_tasks.all():
        player.done_tasks.remove(task)
        scoring.unset(player, SpecialQuestGame, 'specialquest-passed', external_id=task.id)
        signal_msg = ugettext_noop('completed special quest {task_name}')
        arguments = dict(task_name=task.name)
        from wouso.interface.activity.models import Activity
        Activity.delete(SpecialQuestGame.get_instance(), player, player, signal_msg, arguments)

    return HttpResponseRedirect(reverse('specialquest_manage', args=(player.id,)))


@permission_required('specialquest.change_specialquestuser')
def group_active_toggle(request, group):
    group = get_object_or_404(SpecialQuestGroup, id=group)

    group.active = not group.active
    group.save()

    return redirect('specialquest_cpanel_groups')


@permission_required('specialquest.change_specialquestuser')
def group_delete(request, group):
    group = get_object_or_404(SpecialQuestGroup, id=group)
    group.destroy()
    return redirect('specialquest_cpanel_groups')


@permission_required('specialquest.change_specialquestuser')
def group_drop_player(request, group, player):
    group = get_object_or_404(SpecialQuestGroup, id=group)
    player = get_object_or_404(SpecialQuestUser, id=player)

    if group.head == player or player not in group.members:
        return redirect('specialquest_group', group_id=group.id)

    group.players.remove(player.user.player_related.get())
    player.group = None
    player.save()

    return redirect('specialquest_group_edit', group.id)