rosedu/wouso

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

Summary

Maintainability
A
2 hrs
Test Coverage
from django.http import HttpResponseRedirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.template.loader import render_to_string
from django.utils.translation import ugettext as _
from datetime import date
from wouso.core.ui import register_sidebar_block, register_header_link
from wouso.core.user.models import Player
from models import SpecialQuestUser, SpecialQuestTask, SpecialQuestGame, \
    SpecialQuestGroup, Invitation


@login_required
def index(request, error=''):
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    tasks_done, tasks_not_done = SpecialQuestGame.tasks_for_user(user)
    today = date.today()
    tasks_not_done = [(t, (t.end_date - today).days + 1)
                      for t in tasks_not_done]

    return render_to_response('specialquest/index.html',
                              {'tasks_done': tasks_done,
                               'tasks_not_done': tasks_not_done,
                               'squser': user, 'error': error},
                              context_instance=RequestContext(request))


@login_required
def task(request, task_id):
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    t = get_object_or_404(SpecialQuestTask, pk=task_id)
    done = (t in user.done_tasks.all())
    days_left = (t.end_date - date.today()).days
    days_left += 1  # including current day

    return render_to_response('specialquest/task.html',
                              {'task': t, 'done': done,
                               'days_left': days_left},
                              context_instance=RequestContext(request))


@login_required
def setup_accept(request, group_id):
    MAX_GROUP_MEMBERS = 4
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    group = get_object_or_404(SpecialQuestGroup, pk=group_id)

    if group.active:
        error = _('Group is already active, you cannot accept the invitation')
        messages.error(request, error)
        return HttpResponseRedirect(reverse('specialquest_index_view'))

    if user.group is not None:
        error = _('You are already in a group, cannot accept the invitation')
        messages.error(request, error)
        return HttpResponseRedirect(reverse('specialquest_index_view'))

    if group.players.count() >= MAX_GROUP_MEMBERS:
        error = _('Group is full, you cannot accept the invitation')
        messages.error(request, error)
        return HttpResponseRedirect(reverse('specialquest_index_view'))

    user.add_to_group(group)

    return HttpResponseRedirect(reverse('specialquest_index_view'))


@login_required
def setup_leave(request):
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    group = user.group
    group.remove(user)
    if group is None or group.active or ((group.head == user) and not group.is_empty()):
        # do nothing
        pass
    else:
        user.group = None
        user.save()

        if group.head == user:
            group.delete()

    return HttpResponseRedirect(reverse('specialquest_index_view'))


@login_required
def setup_create(request):
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    group = user.group
    error = ''
    if group is not None:
        error = _('You already have a group')
    else:
        if request.method == "POST":
            name = request.POST.get('name', '')
            if not name:
                error = _('Please specify a name')
            else:
                eg = SpecialQuestGroup.objects.filter(name=name).count()
                if eg:
                    error = _('A group with this name already exists')
                else:
                    group = SpecialQuestGroup.create(head=user, name=name)
                    return HttpResponseRedirect(reverse('specialquest_index_view'))

    if error:
        messages.error(request, error)

    return render_to_response('specialquest/create.html',
                              context_instance=RequestContext(request))


@login_required
def setup_invite(request, user_id):
    user = request.user.get_profile().get_extension(SpecialQuestUser)
    to_user = get_object_or_404(Player, pk=user_id)
    to_user = to_user.get_extension(SpecialQuestUser)
    group = user.group
    error, message = '', ''
    if group is None:
        error = _("You don't have a group")
    elif to_user.group is not None:
        error = _("User already in a group")
    else:
        if request.method == "POST":
            Invitation.objects.create(group=user.group, to=to_user)
            message = _("Invitation sent")

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

    return render_to_response('specialquest/invite.html',
                              dict(to_user=to_user, squser=user),
                              context_instance=RequestContext(request))


@login_required
def view_group(request, group_id):
    group = get_object_or_404(SpecialQuestGroup, pk=group_id)

    return render_to_response('specialquest/group.html',
                              dict(sqgroup=group),
                              context_instance=RequestContext(request))


def sidebar_widget(context):
    user = context.get('user', None)
    if SpecialQuestGame.disabled() or not user or not user.is_authenticated():
        return ''
    user = user.get_profile().get_extension(SpecialQuestUser)
    count = len(user.active_tasks)

    if not count:
        return ''

    return render_to_string('specialquest/sidebar.html',
                            {'not_done': count})


register_sidebar_block('specialquest', sidebar_widget)


def header_link(context):
    user = context.get('user', None)
    if not user or not user.is_authenticated() or SpecialQuestGame.disabled():
        return {}
    profile = user.get_profile()
    if profile:
        user = profile.get_extension(SpecialQuestUser)
        count = len(user.active_tasks)
    else:
        count = 0
    url = reverse('wouso.games.specialquest.views.index')

    return dict(link=url, count=count, text=_('Special'))


register_header_link('specialquest', header_link)