Renames all URL methods to web_*, moves to TypedObject model.
This commit is contained in:
parent
d3c6359b09
commit
e1b4e6f7bc
4 changed files with 148 additions and 86 deletions
|
|
@ -14,9 +14,7 @@ instead for most things).
|
||||||
import time
|
import time
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth import password_validation
|
from django.contrib.auth import password_validation
|
||||||
from django.contrib.contenttypes.models import ContentType
|
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.urls import reverse
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from evennia.typeclasses.models import TypeclassBase
|
from evennia.typeclasses.models import TypeclassBase
|
||||||
from evennia.accounts.manager import AccountManager
|
from evennia.accounts.manager import AccountManager
|
||||||
|
|
@ -192,41 +190,6 @@ class DefaultAccount(with_metaclass(TypeclassBase, AccountDB)):
|
||||||
def sessions(self):
|
def sessions(self):
|
||||||
return AccountSessionHandler(self)
|
return AccountSessionHandler(self)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
|
||||||
"""
|
|
||||||
Returns the canonical URL for an Account.
|
|
||||||
|
|
||||||
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('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.
|
|
||||||
"""
|
|
||||||
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,))
|
|
||||||
|
|
||||||
# session-related methods
|
# session-related methods
|
||||||
|
|
||||||
def disconnect_session_from_account(self, session, reason=None):
|
def disconnect_session_from_account(self, session, reason=None):
|
||||||
|
|
|
||||||
|
|
@ -64,14 +64,14 @@ class TestDefaultAccount(TestCase):
|
||||||
"Get URL for account detail page on website"
|
"Get URL for account detail page on website"
|
||||||
self.account = create.create_account("TestAccount%s" % randint(100000, 999999),
|
self.account = create.create_account("TestAccount%s" % randint(100000, 999999),
|
||||||
email="test@test.com", password="testpassword", typeclass=DefaultAccount)
|
email="test@test.com", password="testpassword", typeclass=DefaultAccount)
|
||||||
self.assertTrue(self.account.get_absolute_url())
|
self.assertTrue(self.account.web_detail_url())
|
||||||
|
|
||||||
def test_admin_url(self):
|
def test_admin_url(self):
|
||||||
"Get object's URL for access via Admin pane"
|
"Get object's URL for access via Admin pane"
|
||||||
self.account = create.create_account("TestAccount%s" % randint(100000, 999999),
|
self.account = create.create_account("TestAccount%s" % randint(100000, 999999),
|
||||||
email="test@test.com", password="testpassword", typeclass=DefaultAccount)
|
email="test@test.com", password="testpassword", typeclass=DefaultAccount)
|
||||||
self.assertTrue(self.account.get_admin_url())
|
self.assertTrue(self.account.web_admin_url())
|
||||||
self.assertTrue(self.account.get_admin_url() != '#')
|
self.assertTrue(self.account.web_admin_url() != '#')
|
||||||
|
|
||||||
def test_password_validation(self):
|
def test_password_validation(self):
|
||||||
"Check password validators deny bad passwords"
|
"Check password validators deny bad passwords"
|
||||||
|
|
|
||||||
|
|
@ -329,52 +329,6 @@ class DefaultObject(with_metaclass(TypeclassBase, ObjectDB)):
|
||||||
self.aliases.add(singular, category="plural_key")
|
self.aliases.add(singular, category="plural_key")
|
||||||
return singular, plural
|
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 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('%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,))
|
|
||||||
|
|
||||||
def search(self, searchdata,
|
def search(self, searchdata,
|
||||||
global_search=False,
|
global_search=False,
|
||||||
use_nicks=True,
|
use_nicks=True,
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,12 @@ from django.db.models import signals
|
||||||
|
|
||||||
from django.db.models.base import ModelBase
|
from django.db.models.base import ModelBase
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.encoding import smart_str
|
from django.utils.encoding import smart_str
|
||||||
|
from django.utils.text import slugify
|
||||||
|
|
||||||
from evennia.typeclasses.attributes import Attribute, AttributeHandler, NAttributeHandler
|
from evennia.typeclasses.attributes import Attribute, AttributeHandler, NAttributeHandler
|
||||||
from evennia.typeclasses.tags import Tag, TagHandler, AliasHandler, PermissionHandler
|
from evennia.typeclasses.tags import Tag, TagHandler, AliasHandler, PermissionHandler
|
||||||
|
|
@ -733,3 +736,145 @@ class TypedObject(SharedMemoryModel):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
#
|
||||||
|
# Web/Django methods
|
||||||
|
#
|
||||||
|
|
||||||
|
def web_admin_url(self):
|
||||||
|
"""
|
||||||
|
Returns the URI path for the Django Admin page for this object.
|
||||||
|
|
||||||
|
ex. Account#1 = '/admin/accounts/accountdb/1/change/'
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to Django Admin page for object.
|
||||||
|
|
||||||
|
"""
|
||||||
|
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,))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def web_create_url(cls):
|
||||||
|
"""
|
||||||
|
Returns the URI path for a View that allows users to create new
|
||||||
|
instances of this object.
|
||||||
|
|
||||||
|
ex. Chargen = '/characters/create/'
|
||||||
|
|
||||||
|
For this to work, the developer must have defined a named view somewhere
|
||||||
|
in urls.py that follows the format 'modelname-action', so in this case
|
||||||
|
a named view of 'character-create' would be referenced by this method.
|
||||||
|
|
||||||
|
ex.
|
||||||
|
url(r'characters/create/', ChargenView.as_view(), name='character-create')
|
||||||
|
|
||||||
|
If no View has been created and defined in urls.py, returns an
|
||||||
|
HTML anchor.
|
||||||
|
|
||||||
|
This method is naive and simply returns a path. Securing access to
|
||||||
|
the actual view and limiting who can create new objects is the
|
||||||
|
developer's responsibility.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to object creation page, if defined.
|
||||||
|
|
||||||
|
"""
|
||||||
|
try: return reverse('%s-create' % cls._meta.verbose_name.lower())
|
||||||
|
except: return '#'
|
||||||
|
|
||||||
|
def web_detail_url(self):
|
||||||
|
"""
|
||||||
|
Returns the URI path for a View that allows users to view details for
|
||||||
|
this object.
|
||||||
|
|
||||||
|
ex. Oscar (Character) = '/characters/oscar/1/'
|
||||||
|
|
||||||
|
For this to work, the developer must have defined a named view somewhere
|
||||||
|
in urls.py that follows the format 'modelname-action', so in this case
|
||||||
|
a named view of 'character-detail' would be referenced by this method.
|
||||||
|
|
||||||
|
ex.
|
||||||
|
url(r'characters/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', CharDetailView.as_view(), name='character-detail')
|
||||||
|
|
||||||
|
If no View has been created and defined in urls.py, returns an
|
||||||
|
HTML anchor.
|
||||||
|
|
||||||
|
This method is naive and simply returns a path. Securing access to
|
||||||
|
the actual view and limiting who can view this object is the developer's
|
||||||
|
responsibility.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to object detail page, if defined.
|
||||||
|
|
||||||
|
"""
|
||||||
|
try: return reverse('%s-detail' % self._meta.verbose_name.lower(), kwargs={'pk': self.pk, 'slug': slugify(self.name)})
|
||||||
|
except: return '#'
|
||||||
|
|
||||||
|
def web_update_url(self):
|
||||||
|
"""
|
||||||
|
Returns the URI path for a View that allows users to update this
|
||||||
|
object.
|
||||||
|
|
||||||
|
ex. Oscar (Character) = '/characters/oscar/1/change/'
|
||||||
|
|
||||||
|
For this to work, the developer must have defined a named view somewhere
|
||||||
|
in urls.py that follows the format 'modelname-action', so in this case
|
||||||
|
a named view of 'character-update' would be referenced by this method.
|
||||||
|
|
||||||
|
ex.
|
||||||
|
url(r'characters/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/change/$', CharUpdateView.as_view(), name='character-update')
|
||||||
|
|
||||||
|
If no View has been created and defined in urls.py, returns an
|
||||||
|
HTML anchor.
|
||||||
|
|
||||||
|
This method is naive and simply returns a path. Securing access to
|
||||||
|
the actual view and limiting who can modify objects is the developer's
|
||||||
|
responsibility.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to object update page, if defined.
|
||||||
|
|
||||||
|
"""
|
||||||
|
try: return reverse('%s-update' % self._meta.verbose_name.lower(), kwargs={'pk': self.pk, 'slug': slugify(self.name)})
|
||||||
|
except: return '#'
|
||||||
|
|
||||||
|
def web_delete_url(self):
|
||||||
|
"""
|
||||||
|
Returns the URI path for a View that allows users to delete this object.
|
||||||
|
|
||||||
|
ex. Oscar (Character) = '/characters/oscar/1/delete/'
|
||||||
|
|
||||||
|
For this to work, the developer must have defined a named view somewhere
|
||||||
|
in urls.py that follows the format 'modelname-action', so in this case
|
||||||
|
a named view of 'character-detail' would be referenced by this method.
|
||||||
|
|
||||||
|
ex.
|
||||||
|
url(r'characters/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/delete/$', CharDeleteView.as_view(), name='character-delete')
|
||||||
|
|
||||||
|
If no View has been created and defined in urls.py, returns an
|
||||||
|
HTML anchor.
|
||||||
|
|
||||||
|
This method is naive and simply returns a path. Securing access to
|
||||||
|
the actual view and limiting who can delete this object is the developer's
|
||||||
|
responsibility.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to object deletion page, if defined.
|
||||||
|
|
||||||
|
"""
|
||||||
|
try: return reverse('%s-delete' % self._meta.verbose_name.lower(), kwargs={'pk': self.pk, 'slug': slugify(self.name)})
|
||||||
|
except: return '#'
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
"""
|
||||||
|
Django construct; used by Django Sites framework and within the Admin
|
||||||
|
panel for reverse linking to the object detail page.
|
||||||
|
|
||||||
|
https://docs.djangoproject.com/en/2.1/ref/models/instances/#get-absolute-url
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
path (str): URI path to object detail page, if defined.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return self.web_detail_url()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue