mirror of
https://github.com/evennia/evennia.git
synced 2026-03-31 13:07:16 +02:00
Adds puppet quick links to dropdown menu, implements views and adds tests. Converts index view to CBV.
This commit is contained in:
parent
836a1fabf5
commit
013299a65c
4 changed files with 65 additions and 18 deletions
|
|
@ -41,13 +41,19 @@ folder and edit it to add/remove links to the menu.
|
|||
{% block navbar_user %}
|
||||
{% if account %}
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" id="user_options" aria-expanded="false">Logged in as {{user.username}} <span class="caret"></span></a>
|
||||
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" id="user_options" aria-expanded="false">
|
||||
{% if puppet %}
|
||||
Welcome, {{ puppet }}! <span class="text-muted">({{ account.username }})</span> <span class="caret"></span>
|
||||
{% else %}
|
||||
Logged in as {{ account.username }} <span class="caret"></span>
|
||||
{% endif %}
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="user_options">
|
||||
<a class="dropdown-item" href="{% url 'character-create' %}">Create Character</a>
|
||||
<a class="dropdown-item" href="{% url 'character-manage' %}">Manage Characters</a>
|
||||
<div class="dropdown-divider"></div>
|
||||
{% for character in account.characters|slice:"10" %}
|
||||
<a class="dropdown-item" href="#">{{ character }}</a>
|
||||
<a class="dropdown-item" href="{{ character.web_get_puppet_url }}?next={{ request.path }}">{{ character }}</a>
|
||||
{% empty %}
|
||||
<a class="dropdown-item" href="#">No characters found!</a>
|
||||
{% endfor %}
|
||||
|
|
|
|||
|
|
@ -136,6 +136,29 @@ class CharacterCreateView(EvenniaWebTest):
|
|||
# Make sure the character was actually created
|
||||
self.assertTrue(len(self.account.db._playable_characters) > 1, 'Account only has the following characters attributed to it: %s' % self.account.db._playable_characters)
|
||||
|
||||
class CharacterPuppetView(EvenniaWebTest):
|
||||
url_name = 'character-puppet'
|
||||
unauthenticated_response = 302
|
||||
|
||||
def get_kwargs(self):
|
||||
return {
|
||||
'pk': self.char1.pk,
|
||||
'slug': slugify(self.char1.name)
|
||||
}
|
||||
|
||||
def test_invalid_access(self):
|
||||
"Account1 should not be able to puppet Account2:Char2"
|
||||
# Login account
|
||||
self.login()
|
||||
|
||||
# Try to access puppet page for char2
|
||||
kwargs = {
|
||||
'pk': self.char2.pk,
|
||||
'slug': slugify(self.char2.name)
|
||||
}
|
||||
response = self.client.get(reverse(self.url_name, kwargs=kwargs), follow=True)
|
||||
self.assertTrue(response.status_code >= 400, "Invalid access should return a 4xx code-- either obj not found or permission denied! (Returned %s)" % response.status_code)
|
||||
|
||||
class CharacterManageView(EvenniaWebTest):
|
||||
url_name = 'character-manage'
|
||||
unauthenticated_response = 302
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ from django import views as django_views
|
|||
from evennia.web.website import views as website_views
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', website_views.page_index, name="index"),
|
||||
url(r'^$', website_views.EvenniaIndexView.as_view(), name="index"),
|
||||
url(r'^tbi/', website_views.to_be_implemented, name='to_be_implemented'),
|
||||
|
||||
# User Authentication (makes login/logout url names available)
|
||||
|
|
@ -19,6 +19,7 @@ urlpatterns = [
|
|||
# Character management
|
||||
url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="character-create"),
|
||||
url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="character-manage"),
|
||||
url(r'^characters/puppet/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterPuppetView.as_view(), name="character-puppet"),
|
||||
url(r'^characters/update/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterUpdateView.as_view(), name="character-update"),
|
||||
url(r'^characters/delete/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDeleteView.as_view(), name="character-delete"),
|
||||
|
||||
|
|
|
|||
|
|
@ -15,8 +15,9 @@ from django.core.exceptions import PermissionDenied
|
|||
from django.db.models.functions import Lower
|
||||
from django.http import HttpResponseBadRequest, HttpResponseRedirect, Http404
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse_lazy
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.views.generic import View, TemplateView, ListView, DetailView, FormView
|
||||
from django.views.generic.base import RedirectView
|
||||
from django.views.generic.edit import CreateView, UpdateView, DeleteView
|
||||
|
||||
from evennia import SESSION_HANDLER
|
||||
|
|
@ -102,20 +103,6 @@ def _gamestats():
|
|||
return pagevars
|
||||
|
||||
|
||||
def page_index(request):
|
||||
"""
|
||||
Main root page.
|
||||
"""
|
||||
|
||||
# handle webclient-website shared login
|
||||
_shared_login(request)
|
||||
|
||||
# get game db stats
|
||||
pagevars = _gamestats()
|
||||
|
||||
return render(request, 'index.html', pagevars)
|
||||
|
||||
|
||||
def to_be_implemented(request):
|
||||
"""
|
||||
A notice letting the user know that this particular feature hasn't been
|
||||
|
|
@ -149,6 +136,20 @@ def admin_wrapper(request):
|
|||
# Class-based views
|
||||
#
|
||||
|
||||
class EvenniaIndexView(TemplateView):
|
||||
# Display this HTML page
|
||||
template_name = 'website/index.html'
|
||||
|
||||
# Display these variables on it
|
||||
def get_context_data(self, **kwargs):
|
||||
# Call the base implementation first to get a context object
|
||||
context = super(EvenniaIndexView, self).get_context_data(**kwargs)
|
||||
|
||||
# Add game statistics and other pagevars
|
||||
context.update(_gamestats())
|
||||
|
||||
return context
|
||||
|
||||
class EvenniaCreateView(CreateView):
|
||||
|
||||
@property
|
||||
|
|
@ -324,6 +325,22 @@ class CharacterMixin(object):
|
|||
# Return a queryset consisting of those characters
|
||||
return self.model.objects.filter(id__in=ids).order_by(Lower('db_key'))
|
||||
|
||||
class CharacterPuppetView(LoginRequiredMixin, CharacterMixin, RedirectView, ObjectDetailView):
|
||||
|
||||
def get_redirect_url(self, *args, **kwargs):
|
||||
# Get the requested character, if it belongs to the authenticated user
|
||||
char = self.get_object()
|
||||
next = self.kwargs.get('next', reverse('character-manage'))
|
||||
|
||||
if char:
|
||||
self.request.session['puppet'] = int(char.pk)
|
||||
messages.success(self.request, "You become '%s'!" % char)
|
||||
else:
|
||||
self.request.session['puppet'] = None
|
||||
messages.error(self.request, "You cannot become '%s'." % char)
|
||||
|
||||
return next
|
||||
|
||||
class CharacterManageView(LoginRequiredMixin, CharacterMixin, ListView):
|
||||
|
||||
paginate_by = 10
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue