diff --git a/evennia/web/website/forms.py b/evennia/web/website/forms.py index ca93dd2c3b..937c6be6e8 100644 --- a/evennia/web/website/forms.py +++ b/evennia/web/website/forms.py @@ -4,7 +4,7 @@ from django.contrib.auth.forms import UserCreationForm, UsernameField from evennia.utils import class_from_module from random import choice, randint -class AccountCreationForm(UserCreationForm): +class AccountForm(UserCreationForm): class Meta: model = class_from_module(settings.BASE_ACCOUNT_TYPECLASS) @@ -13,7 +13,7 @@ class AccountCreationForm(UserCreationForm): email = forms.EmailField(help_text="A valid email address. Optional; used for password resets.", required=False) -class CharacterCreationForm(forms.Form): +class CharacterForm(forms.Form): name = forms.CharField(help_text="The name of your intended character.") age = forms.IntegerField(min_value=3, max_value=99, help_text="How old your character should be once spawned.") description = forms.CharField(widget=forms.Textarea(attrs={'rows': 3}), max_length=2048, min_length=160, required=False) @@ -82,8 +82,12 @@ class CharacterCreationForm(forms.Form): indices = [i for (i, value) in enumerate(buckets) if (value < min_points) or (value < max_points)] return buckets + +class CharacterUpdateForm(CharacterForm): + class Meta: + fields = ('description',) -class ExtendedCharacterCreationForm(forms.Form): +class ExtendedCharacterForm(CharacterForm): GENDERS = ( ('male', 'Male'), diff --git a/evennia/web/website/urls.py b/evennia/web/website/urls.py index d7b10208de..d6dfc0c748 100644 --- a/evennia/web/website/urls.py +++ b/evennia/web/website/urls.py @@ -17,8 +17,10 @@ urlpatterns = [ url(r'^auth/register', website_views.AccountCreationView.as_view(), name="register"), # Character management - url(r'^characters/create/', website_views.CharacterCreationView.as_view(), name="chargen"), - + url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="chargen"), + url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="manage-characters"), + url(r'^characters/update/(?P[\w\d\-]+)/(?P[0-9]+)/$', website_views.CharacterUpdateView.as_view(), name="update-character"), + # Django original admin page. Make this URL is always available, whether # we've chosen to use Evennia's custom admin or not. url(r'django_admin/', website_views.admin_wrapper, name="django_admin"), diff --git a/evennia/web/website/views.py b/evennia/web/website/views.py index 9a7d62d8c2..d25c3493ec 100644 --- a/evennia/web/website/views.py +++ b/evennia/web/website/views.py @@ -7,22 +7,17 @@ templates on the fly. """ from django.contrib.admin.sites import site from django.conf import settings -from django.contrib import messages from django.contrib.auth import authenticate -from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.admin.views.decorators import staff_member_required -from django.http import HttpResponseRedirect from django.shortcuts import render -from django.urls import reverse, reverse_lazy -from django.views.generic import View, DetailView, ListView, FormView from evennia import SESSION_HANDLER from evennia.objects.models import ObjectDB from evennia.accounts.models import AccountDB from evennia.utils import logger -from evennia.web.website.forms import AccountCreationForm, CharacterCreationForm from django.contrib.auth import login +from django.utils.text import slugify _BASE_CHAR_TYPECLASS = settings.BASE_CHARACTER_TYPECLASS @@ -140,9 +135,19 @@ def admin_wrapper(request): Wrapper that allows us to properly use the base Django admin site, if needed. """ return staff_member_required(site.index)(request) + +class ObjectDetailView(DetailView): + model = ObjectDB + + def get_object(self, queryset=None): + obj = super(ObjectDetailView, self).get_object(queryset) + if not slugify(obj.name) == self.kwargs.get('slug'): + raise Http404(u"No %(verbose_name)s found matching the query" % + {'verbose_name': queryset.model._meta.verbose_name}) + return obj class AccountCreationView(FormView): - form_class = AccountCreationForm + form_class = AccountForm template_name = 'website/registration/register.html' success_url = reverse_lazy('login') @@ -178,8 +183,23 @@ class AccountCreationView(FormView): messages.success(self.request, "Your account '%s' was successfully created! You may log in using it now." % account.name) return HttpResponseRedirect(self.success_url) -class CharacterCreationView(LoginRequiredMixin, FormView): - form_class = CharacterCreationForm +class CharacterManageView(LoginRequiredMixin, ListView): + model = ObjectDB + + def get_queryset(self): + # Get IDs of characters owned by account + ids = [getattr(x, 'id') for x in self.request.user.db._playable_characters] + + # Return a queryset consisting of those characters + return self.model.filter(id__in=ids) + +class CharacterUpdateView(LoginRequiredMixin, FormView): + form_class = CharacterUpdateForm + template_name = 'website/generic_form.html' + success_url = '/'#reverse_lazy('character-manage') + +class CharacterCreateView(LoginRequiredMixin, FormView): + form_class = CharacterForm template_name = 'website/chargen_form.html' success_url = '/'#reverse_lazy('character-manage') @@ -232,4 +252,4 @@ class CharacterCreationView(LoginRequiredMixin, FormView): return HttpResponseRedirect(self.success_url) else: messages.error(self.request, "Your character could not be created. Please contact an admin.") - return self.form_invalid(form) \ No newline at end of file + return self.form_invalid(form)