diff --git a/.gitignore b/.gitignore index 1e3586ee1..3a4f1010f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ django-apps-src docs/build demo/demo.db* django_blog_zinnia.egg-info/ +build diff --git a/setup.py b/setup.py index a6740d9f9..3447b5abe 100644 --- a/setup.py +++ b/setup.py @@ -41,5 +41,6 @@ 'pillow>=2.0.0', 'pyparsing>=2.0.3', 'pytz>=2014.10', - 'regex>=2016.3.2'] + 'regex>=2016.3.2', + 'python-slugify',] # compatible with non ASCII charaters ) diff --git a/zinnia/feeds.py b/zinnia/feeds.py index c2709f226..7e7f56c09 100644 --- a/zinnia/feeds.py +++ b/zinnia/feeds.py @@ -13,7 +13,7 @@ from django.contrib.syndication.views import Feed from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import get_object_or_404 -from django.template.defaultfilters import slugify +from slugify import slugify from django.urls import NoReverseMatch from django.urls import reverse from django.utils.encoding import smart_text diff --git a/zinnia/models_bases/entry.py b/zinnia/models_bases/entry.py index 52a3252bc..e84c6a026 100644 --- a/zinnia/models_bases/entry.py +++ b/zinnia/models_bases/entry.py @@ -4,7 +4,7 @@ from django.contrib.sites.models import Site from django.db import models from django.db.models import Q -from django.template.defaultfilters import slugify +from slugify import slugify from django.urls import reverse from django.utils import timezone from django.utils.encoding import python_2_unicode_compatible diff --git a/zinnia/templating.py b/zinnia/templating.py index 74e78c046..ffb3654e0 100644 --- a/zinnia/templating.py +++ b/zinnia/templating.py @@ -1,7 +1,7 @@ """Templates module for Zinnia""" import os -from django.template.defaultfilters import slugify +from slugify import slugify def append_position(path, position, separator=''): diff --git a/zinnia/views/comments.py b/zinnia/views/comments.py index 73a144d81..fd24fb65e 100644 --- a/zinnia/views/comments.py +++ b/zinnia/views/comments.py @@ -1,7 +1,7 @@ """Views for Zinnia comments""" from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponsePermanentRedirect -from django.template.defaultfilters import slugify +from slugify import slugify from django.views.generic.base import TemplateResponseMixin from django.views.generic.base import View diff --git a/zinnia/views/quick_entry.py b/zinnia/views/quick_entry.py index 0c7c0307b..d9e657f6b 100644 --- a/zinnia/views/quick_entry.py +++ b/zinnia/views/quick_entry.py @@ -8,7 +8,7 @@ from django.contrib.auth.decorators import permission_required from django.contrib.sites.models import Site from django.shortcuts import redirect -from django.template.defaultfilters import slugify +from slugify import slugify from django.urls import reverse from django.utils import timezone from django.utils.decorators import method_decorator diff --git a/zinnia/views/tags.py b/zinnia/views/tags.py index 653b0ffa2..ab2fb5c3d 100644 --- a/zinnia/views/tags.py +++ b/zinnia/views/tags.py @@ -1,6 +1,6 @@ """Views for Zinnia tags""" from django.http import Http404 -from django.template.defaultfilters import slugify +from slugify import slugify from django.utils.translation import ugettext as _ from django.views.generic.list import BaseListView from django.views.generic.list import ListView @@ -80,4 +80,4 @@ def get_model_name(self): """ The model name is the tag slugified. """ - return slugify(self.tag) + return slugify(self.tag.name) diff --git a/zinnia/xmlrpc/__init__.py b/zinnia/xmlrpc/__init__.py index 874595e61..9feaacfc5 100644 --- a/zinnia/xmlrpc/__init__.py +++ b/zinnia/xmlrpc/__init__.py @@ -18,10 +18,14 @@ 'wp.getAuthors'), ('zinnia.xmlrpc.metaweblog.get_tags', 'wp.getTags'), + ('zinnia.xmlrpc.metaweblog.get_categories', + 'wp.getCategories'), ('zinnia.xmlrpc.metaweblog.get_categories', 'metaWeblog.getCategories'), ('zinnia.xmlrpc.metaweblog.new_category', - 'wp.newCategory'), + 'wp.newCategory'), + ('zinnia.xmlrpc.metaweblog.set_categories', + 'mt.setPostCategories'), ('zinnia.xmlrpc.metaweblog.get_recent_posts', 'metaWeblog.getRecentPosts'), ('zinnia.xmlrpc.metaweblog.get_post', diff --git a/zinnia/xmlrpc/metaweblog.py b/zinnia/xmlrpc/metaweblog.py index cfea22745..97e4e0108 100644 --- a/zinnia/xmlrpc/metaweblog.py +++ b/zinnia/xmlrpc/metaweblog.py @@ -11,7 +11,7 @@ from django.contrib.sites.models import Site from django.core.files.base import ContentFile from django.core.files.storage import default_storage -from django.template.defaultfilters import slugify +from slugify import slugify # compatible with non-ASCII characters from django.urls import reverse from django.utils import six from django.utils import timezone @@ -204,7 +204,7 @@ def delete_post(apikey, post_id, username, password, publish): entry.delete() return True - + @xmlrpc_func(returns='struct', args=['string', 'string', 'string']) def get_post(post_id, username, password): """ @@ -261,9 +261,16 @@ def new_category(blog_id, username, password, category_struct): => category_id """ authenticate(username, password, 'zinnia.add_category') - category_dict = {'title': category_struct['name'], - 'description': category_struct['description'], - 'slug': category_struct['slug']} + category_dict = { + 'title': category_struct['name'], + 'slug': slugify(category_struct['name']), + } + if category_struct.has_key('description'): + if category_struct['description']: + category_dict['description'] = category_struct['description'] + if category_struct.has_key('slug'): + if category_struct['slug']: + category_dict['slug'] = category_struct['slug'] if int(category_struct['parent_id']): category_dict['parent'] = Category.objects.get( pk=category_struct['parent_id']) @@ -271,6 +278,17 @@ def new_category(blog_id, username, password, category_struct): return category.pk + +@xmlrpc_func(returns='boolean', args=['string', 'string', 'string', 'struct']) +def set_categories(postid, username, password, categories): + """ + mt.setPostCategories(postid, username, password, categories) + => boolean + """ + # This is useless 'cause category already set by new_post(). + # Just for the compatability with open live writer + return True + @xmlrpc_func(returns='string', args=['string', 'string', 'string', 'struct', 'boolean'])