diff --git a/.gitignore b/.gitignore index 3492d58..b0e7fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ target/ test.db tests/settings_local.py /migrations/ +.vscode/ diff --git a/djangoseo/admin.py b/djangoseo/admin.py index b639894..274733b 100644 --- a/djangoseo/admin.py +++ b/djangoseo/admin.py @@ -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) @@ -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) @@ -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) @@ -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'), diff --git a/djangoseo/backends.py b/djangoseo/backends.py index 25a481b..7bc32cc 100644 --- a/djangoseo/backends.py +++ b/djangoseo/backends.py @@ -201,6 +201,7 @@ class PathMetadataBase(MetadataBaseModel): null=True, blank=True, verbose_name=_("site"), + on_delete=models.CASCADE ) if options.use_i18n: @@ -268,6 +269,7 @@ class ViewMetadataBase(MetadataBaseModel): null=True, blank=True, verbose_name=_("site"), + on_delete=models.CASCADE ) if options.use_i18n: @@ -328,6 +330,7 @@ class ModelInstanceMetadataBase(MetadataBaseModel): _content_type = models.ForeignKey( ContentType, verbose_name=_("model"), + on_delete=models.CASCADE ) _object_id = models.PositiveIntegerField( @@ -342,6 +345,7 @@ class ModelInstanceMetadataBase(MetadataBaseModel): null=True, blank=True, verbose_name=_("site"), + on_delete=models.CASCADE ) if options.use_i18n: @@ -425,6 +429,7 @@ class ModelMetadataBase(MetadataBaseModel): _content_type = models.ForeignKey( ContentType, verbose_name=_("model"), + on_delete=models.CASCADE ) if options.use_sites: @@ -433,6 +438,7 @@ class ModelMetadataBase(MetadataBaseModel): null=True, blank=True, verbose_name=_("site"), + on_delete=models.CASCADE ) if options.use_i18n: diff --git a/djangoseo/base.py b/djangoseo/base.py index 6b5f577..71bc710 100644 --- a/djangoseo/base.py +++ b/djangoseo/base.py @@ -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) diff --git a/djangoseo/utils.py b/djangoseo/utils.py index f345d7b..f64b9fa 100644 --- a/djangoseo/utils.py +++ b/djangoseo/utils.py @@ -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): @@ -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})