From fc55f0f2a14d56cbfae673d119f08f78d107d35f Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 5 Oct 2018 22:30:12 +0000 Subject: [PATCH] Adds dynamic get_*_url() fields to DefaultObject and children and static get_*_url() fields to DefaultAccount. --- evennia/accounts/accounts.py | 16 +++++++++++ evennia/objects/objects.py | 56 +++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/evennia/accounts/accounts.py b/evennia/accounts/accounts.py index f90575edd2..bd1fb4f573 100644 --- a/evennia/accounts/accounts.py +++ b/evennia/accounts/accounts.py @@ -204,6 +204,22 @@ class DefaultAccount(with_metaclass(TypeclassBase, AccountDB)): try: return reverse_lazy('account-detail', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) except: return '#' + def get_delete_url(self): + """ + Returns the canonical URL to the page that allows deleting an object. + + """ + try: return reverse('account-delete', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) + except: return '#' + + def get_update_url(self): + """ + Returns the canonical URL to the page that allows updating an object. + + """ + try: return reverse('account-update', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) + except: return '#' + def get_admin_url(self): """ Returns a link to this object's entry within the Django Admin panel. diff --git a/evennia/objects/objects.py b/evennia/objects/objects.py index 167cd60612..71ccb28f77 100644 --- a/evennia/objects/objects.py +++ b/evennia/objects/objects.py @@ -7,6 +7,7 @@ entities. """ import time import inflect +import re from builtins import object from future.utils import with_metaclass from collections import defaultdict @@ -328,21 +329,48 @@ class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)): self.aliases.add(singular, category="plural_key") return singular, plural + def get_url_prefix(self): + """ + Derives the object name from the class name. + + i.e. 'DefaultAccount' = 'default-account', 'Character' = 'character' + """ + klass = self.__class__.__name__ + terms = [x.lower() for x in re.split('([A-Z][a-z]+)', klass) if x] + return slugify(' '.join(terms)) + def get_absolute_url(self): """ - Returns the canonical URL for an object. + Returns the canonical URL to view an object. To callers, this method should appear to return a string that can be used to refer to the object over HTTP. https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url """ - try: return reverse('object-detail', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) + try: return reverse('%s-detail' % self.get_url_prefix(), kwargs={'pk': self.pk, 'slug': slugify(self.name)}) + except: return '#' + + def get_delete_url(self): + """ + Returns the canonical URL to the page that allows deleting an object. + + """ + try: return reverse('%s-delete' % self.get_url_prefix(), kwargs={'pk': self.pk, 'slug': slugify(self.name)}) + except: return '#' + + def get_update_url(self): + """ + Returns the canonical URL to the page that allows updating an object. + + """ + try: return reverse('%s-update' % self.get_url_prefix(), kwargs={'pk': self.pk, 'slug': slugify(self.name)}) except: return '#' def get_admin_url(self): """ Returns a link to this object's entry within the Django Admin panel. + """ content_type = ContentType.objects.get_for_model(self.__class__) return reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,)) @@ -1843,18 +1871,6 @@ class DefaultCharacter(DefaultObject): a character avatar controlled by an account. """ - def get_absolute_url(self): - """ - Returns the canonical URL for a Character. - - To callers, this method should appear to return a string that can be - used to refer to the object over HTTP. - - https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url - """ - try: return reverse('character-detail', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) - except: return super(DefaultCharacter, self).get_absolute_url() - def basetype_setup(self): """ Setup character-specific security. @@ -1971,18 +1987,6 @@ class DefaultRoom(DefaultObject): This is the base room object. It's just like any Object except its location is always `None`. """ - def get_absolute_url(self): - """ - Returns the canonical URL for a Room. - - To callers, this method should appear to return a string that can be - used to refer to the object over HTTP. - - https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url - """ - try: return reverse('location-detail', kwargs={'pk': self.pk, 'slug': slugify(self.name)}) - except: return super(DefaultRoom, self).get_absolute_url() - def basetype_setup(self): """ Simple room setup setting locks to make sure the room