Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,4 @@ target/
test.db
tests/settings_local.py
/migrations/
.vscode/
4 changes: 4 additions & 0 deletions djangoseo/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ def get_list_display():
class ModelAdmin(model_admin):
form = get_model_form(metadata_class)
list_display = model_admin.list_display + get_list_display()
save_as = True

_register_admin(admin_site, metadata_class._meta.get_model('model'),
ModelAdmin)
Expand All @@ -97,6 +98,7 @@ class ModelAdmin(model_admin):
class ViewAdmin(view_admin):
form = get_view_form(metadata_class)
list_display = view_admin.list_display + get_list_display()
save_as = True

_register_admin(admin_site, metadata_class._meta.get_model('view'),
ViewAdmin)
Expand All @@ -105,6 +107,7 @@ class ViewAdmin(view_admin):
class PathAdmin(path_admin):
form = get_path_form(metadata_class)
list_display = path_admin.list_display + get_list_display()
save_as = True

_register_admin(admin_site, metadata_class._meta.get_model('path'),
PathAdmin)
Expand All @@ -114,6 +117,7 @@ class ModelInstanceAdmin(model_instance_admin):
form = get_modelinstance_form(metadata_class)
list_display = (model_instance_admin.list_display +
get_list_display())
save_as = True

_register_admin(admin_site,
metadata_class._meta.get_model('modelinstance'),
Expand Down
6 changes: 6 additions & 0 deletions djangoseo/backends.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ class PathMetadataBase(MetadataBaseModel):
null=True,
blank=True,
verbose_name=_("site"),
on_delete=models.CASCADE
)

if options.use_i18n:
Expand Down Expand Up @@ -268,6 +269,7 @@ class ViewMetadataBase(MetadataBaseModel):
null=True,
blank=True,
verbose_name=_("site"),
on_delete=models.CASCADE
)

if options.use_i18n:
Expand Down Expand Up @@ -328,6 +330,7 @@ class ModelInstanceMetadataBase(MetadataBaseModel):
_content_type = models.ForeignKey(
ContentType,
verbose_name=_("model"),
on_delete=models.CASCADE
)

_object_id = models.PositiveIntegerField(
Expand All @@ -342,6 +345,7 @@ class ModelInstanceMetadataBase(MetadataBaseModel):
null=True,
blank=True,
verbose_name=_("site"),
on_delete=models.CASCADE
)

if options.use_i18n:
Expand Down Expand Up @@ -425,6 +429,7 @@ class ModelMetadataBase(MetadataBaseModel):
_content_type = models.ForeignKey(
ContentType,
verbose_name=_("model"),
on_delete=models.CASCADE
)

if options.use_sites:
Expand All @@ -433,6 +438,7 @@ class ModelMetadataBase(MetadataBaseModel):
null=True,
blank=True,
verbose_name=_("site"),
on_delete=models.CASCADE
)

if options.use_i18n:
Expand Down
2 changes: 1 addition & 1 deletion djangoseo/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def __init__(self, metadata, instances, path, site=None, language=None):
hexpath = hashlib.md5(
iri_to_uri(site.domain + path)).hexdigest()
else:
hexpath = hashlib.md5(iri_to_uri(path)).hexdigest()
hexpath = hashlib.md5(iri_to_uri(path).encode('utf-8')).hexdigest()
if metadata._meta.use_i18n:
self.__cache_prefix = 'djangoseo.%s.%s.%s' % (
self.__metadata.__class__.__name__, hexpath, language)
Expand Down
33 changes: 26 additions & 7 deletions djangoseo/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
from django.utils.safestring import mark_safe
from django.utils.html import conditional_escape
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import (RegexURLResolver, RegexURLPattern,
Resolver404, get_resolver)
try:
from django.urls.resolvers import URLResolver, RegexPattern as URLPattern, Resolver404, get_resolver
except Exception:
from django.core.urlresolvers import (RegexURLResolver as URLResolver, RegexURLPattern as URLPattern, Resolver404, get_resolver)


class NotSet(object):
Expand Down Expand Up @@ -44,24 +46,41 @@ def _pattern_resolve_to_name(pattern, path):
return name


def get_regex(resolver_or_pattern):
"""Utility method for django's deprecated resolver.regex"""
try:
regex = resolver_or_pattern.regex
except AttributeError:
regex = resolver_or_pattern.pattern.regex
return regex


def get_pattern(pattern):
try:
return pattern.pattern
except AttributeError:
return pattern.regex.pattern


def _resolver_resolve_to_name(resolver, path):
tried = []
match = resolver.regex.search(path)
match = get_regex(resolver).search(path)
if match:
new_path = path[match.end():]
name = None
for pattern in resolver.url_patterns:
try:
if isinstance(pattern, RegexURLPattern):
if isinstance(pattern, URLPattern):
name = _pattern_resolve_to_name(pattern, new_path)
elif isinstance(pattern, RegexURLResolver):
elif isinstance(pattern, URLResolver):
name = _resolver_resolve_to_name(pattern, new_path)
except Resolver404 as e:
tried.extend([(pattern.regex.pattern + ' ' + t) for t in
tried.extend([(get_pattern(pattern) + ' ' + t) for t in
e.args[0]['tried']])
else:
if name:
return name
tried.append(pattern.regex.pattern)
tried.append(get_pattern(pattern))
raise Resolver404({'tried': tried, 'path': new_path})


Expand Down