diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000..1668be1
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,10 @@
+[run]
+source = .
+include = *.py
+omit =
+ *migrations*
+ *tests*
+ *.html
+ *whoosh_cn_backend*
+ *apps*
+ *commands*
diff --git a/.travis.yml b/.travis.yml
index 0c8a5b0..16357d8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -23,6 +23,8 @@ install:
- pip install coverage
before_script:
- mysql -e 'CREATE DATABASE `djangoblog` /*!40100 DEFAULT CHARACTER SET utf8 */;'
+ - python manage.py makemigrations
+ - python manage.py makemigrations sites
- python manage.py makemigrations accounts
- python manage.py makemigrations blog
- python manage.py makemigrations comments
diff --git a/DjangoBlog/settings.py b/DjangoBlog/settings.py
index 2aeab8b..98d212b 100644
--- a/DjangoBlog/settings.py
+++ b/DjangoBlog/settings.py
@@ -9,7 +9,7 @@ https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
-
+import sys
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
@@ -24,6 +24,7 @@ SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
DEBUG = False
+TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
# ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['www.lylinux.net', '127.0.0.1', 'example.com']
diff --git a/DjangoBlog/utils.py b/DjangoBlog/utils.py
index 1b25fad..0feff66 100644
--- a/DjangoBlog/utils.py
+++ b/DjangoBlog/utils.py
@@ -13,8 +13,10 @@
@time: 2017/1/19 上午2:30
"""
from django.core.cache import cache
+from django.contrib.sites.models import Site
from hashlib import md5
import mistune
+from mistune import escape, escape_link
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import html
@@ -110,6 +112,28 @@ class BlogMarkDownRenderer(mistune.Renderer):
linenos = self.options.get('linenos')
return block_code(text, lang, inlinestyles, linenos)
+ def autolink(self, link, is_email=False):
+ text = link = escape(link)
+
+ if is_email:
+ link = 'mailto:%s' % link
+ if not link:
+ link = "#"
+ site = Site.objects.get_current()
+ nofollow = "" if link.find(site.domain) > 0 else "rel='nofollow'"
+ return '%s' % (link, nofollow, text)
+
+ def link(self, link, title, text):
+ link = escape_link(link, quote=True)
+ site = Site.objects.get_current()
+ nofollow = "" if link.find(site.domain) > 0 else "rel='nofollow'"
+ if not link:
+ link = "#"
+ if not title:
+ return '%s' % (link, nofollow, text)
+ title = escape(title, quote=True)
+ return '%s' % (link, title, nofollow, text)
+
class CommonMarkdown():
@staticmethod
diff --git a/accounts/tests.py b/accounts/tests.py
index 7ce503c..ea7a1e1 100644
--- a/accounts/tests.py
+++ b/accounts/tests.py
@@ -1,3 +1,41 @@
-from django.test import TestCase
+from django.test import Client, RequestFactory, TestCase
+from blog.models import Article, Category, Tag
+from django.contrib.auth import get_user_model
+from django.contrib.sites.models import Site
+import datetime
+from accounts.models import BlogUser
+
# Create your tests here.
+
+class AccountTest(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.factory = RequestFactory()
+
+ def test_validate_account(self):
+ site = Site.objects.get_current().domain
+ user = BlogUser.objects.create_superuser(email="liangliangyy1@gmail.com",
+ username="liangliangyy1", password="liangliangyy1")
+
+ self.client.login(username='liangliangyy1', password='liangliangyy1')
+ response = self.client.get('/admin/')
+ self.assertEqual(response.status_code, 200)
+
+ category = Category()
+ category.name = "categoryaaa"
+ category.created_time = datetime.datetime.now()
+ category.last_mod_time = datetime.datetime.now()
+ category.save()
+
+ article = Article()
+ article.title = "nicetitleaaa"
+ article.body = "nicecontentaaa"
+ article.author = user
+ article.category = category
+ article.type = 'a'
+ article.status = 'p'
+ article.save()
+
+ response = self.client.get(article.get_admin_url())
+ self.assertEqual(response.status_code, 200)
diff --git a/blog/models.py b/blog/models.py
index bb570b4..eaa40f2 100644
--- a/blog/models.py
+++ b/blog/models.py
@@ -21,8 +21,9 @@ class BaseModel(models.Model):
if 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][0] == 'views':
return
try:
- notify_url = self.get_full_url()
- SpiderNotify.baidu_notify([notify_url])
+ if not settings.TESTING:
+ notify_url = self.get_full_url()
+ SpiderNotify.baidu_notify([notify_url])
except Exception as ex:
logger.error("notify sipder", ex)
print(ex)
diff --git a/blog/tests.py b/blog/tests.py
index fe4ba79..0e2345e 100644
--- a/blog/tests.py
+++ b/blog/tests.py
@@ -3,6 +3,7 @@ from blog.models import Article, Category, Tag
from django.contrib.auth import get_user_model
from django.contrib.sites.models import Site
import datetime
+from accounts.models import BlogUser
# Create your tests here.
@@ -13,12 +14,8 @@ class ArticleTest(TestCase):
self.factory = RequestFactory()
def test_validate_article(self):
- from accounts.models import BlogUser
site = Site.objects.get_current().domain
- user = BlogUser()
- user.email = "liangliangyy@gmail.com"
- user.username = "liangliangyy"
- user.password = "liangliangyy"
+ user = BlogUser.objects.get_or_create(email="liangliangyy@gmail.com", username="liangliangyy")[0]
user.set_password("liangliangyy")
user.save()
response = self.client.get(user.get_absolute_url())
@@ -32,6 +29,9 @@ class ArticleTest(TestCase):
response = self.client.get(category.get_absolute_url())
self.assertEqual(response.status_code, 200)
+ tag = Tag()
+ tag.name = "nicetag"
+ tag.save()
article = Article()
article.title = "nicetitle"
@@ -40,6 +40,26 @@ class ArticleTest(TestCase):
article.category = category
article.type = 'a'
article.status = 'p'
+
+ article.save()
+ self.assertEqual(0, article.tags.count())
+ article.tags.add(tag)
article.save()
+ self.assertEqual(1, article.tags.count())
+
response = self.client.get(article.get_absolute_url())
self.assertEqual(response.status_code, 200)
+
+ response = self.client.get(tag.get_absolute_url())
+ self.assertEqual(response.status_code, 200)
+
+ def test_validate_feed(self):
+ user = BlogUser.objects.get_or_create(email="liangliangyy12@gmail.com", username="liangliangyy")[0]
+ user.set_password("liangliangyy")
+ user.save()
+
+ response = self.client.get('/feed/')
+ self.assertEqual(response.status_code, 200)
+
+ response = self.client.get('/sitemap.xml')
+ self.assertEqual(response.status_code, 200)
diff --git a/comments/tests.py b/comments/tests.py
index 7ce503c..fd3a768 100644
--- a/comments/tests.py
+++ b/comments/tests.py
@@ -1,3 +1,61 @@
-from django.test import TestCase
+from django.test import Client, RequestFactory, TestCase
+from blog.models import Article, Category, Tag
+from django.contrib.auth import get_user_model
+from django.contrib.sites.models import Site
+from django.core.urlresolvers import reverse
+import datetime
+from accounts.models import BlogUser
+
# Create your tests here.
+
+class CommentsTest(TestCase):
+ def setUp(self):
+ self.client = Client()
+ self.factory = RequestFactory()
+
+ def test_validate_comment(self):
+ site = Site.objects.get_current().domain
+ user = BlogUser.objects.create_superuser(email="liangliangyy1@gmail.com",
+ username="liangliangyy1", password="liangliangyy1")
+
+ self.client.login(username='liangliangyy1', password='liangliangyy1')
+
+ category = Category()
+ category.name = "categoryccc"
+ category.created_time = datetime.datetime.now()
+ category.last_mod_time = datetime.datetime.now()
+ category.save()
+
+ article = Article()
+ article.title = "nicetitleccc"
+ article.body = "nicecontentccc"
+ article.author = user
+ article.category = category
+ article.type = 'a'
+ article.status = 'p'
+ article.save()
+
+ commenturl = reverse('comments:postcomment', kwargs={'article_id': article.id})
+
+ response = self.client.post(commenturl,
+ {
+ 'body': '123ffffffffff'
+ })
+
+ self.assertEqual(response.status_code, 200)
+
+ article = Article.objects.get(pk=article.pk)
+ self.assertEqual(len(article.comment_list()), 0)
+
+ response = self.client.post(commenturl,
+ {
+ 'body': '123ffffffffff',
+ 'email': user.email,
+ 'name': user.username
+ })
+
+ self.assertEqual(response.status_code, 302)
+
+ article = Article.objects.get(pk=article.pk)
+ self.assertEqual(len(article.comment_list()), 1)
diff --git a/comments/views.py b/comments/views.py
index 863209e..0c8bf7d 100644
--- a/comments/views.py
+++ b/comments/views.py
@@ -68,7 +68,13 @@ class CommentPostView(FormView):
site = Site.objects.get_current().domain
if site.find(':') > 0:
site = site[0:site.find(':')]
- expire_view_cache(path, servername=site, serverport=self.request.get_port(), key_prefix='blogdetail')
+ port = 80
+ try:
+ # django1.8 没有这个方法...
+ port = self.request.get_port()
+ except:
+ pass
+ expire_view_cache(path, servername=site, serverport=port, key_prefix='blogdetail')
if cache.get('seo_processor'):
cache.delete('seo_processor')
comment_cache_key = 'article_comments_{id}'.format(id=article_id)
diff --git a/test/travis_settings.py b/test/travis_settings.py
index ed4c831..99d6660 100644
--- a/test/travis_settings.py
+++ b/test/travis_settings.py
@@ -9,7 +9,7 @@ https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
-
+import sys
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
@@ -25,8 +25,11 @@ SECRET_KEY = '&3g0bdza#c%dm1lf%5gi&0-*53p3t0m*hmcvo29cn^$ji7je(c'
DEBUG = True
# DEBUG = False
+
+TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
+
# ALLOWED_HOSTS = []
-ALLOWED_HOSTS = ['www.lylinux.net', '127.0.0.1']
+ALLOWED_HOSTS = ['www.lylinux.net', '127.0.0.1', 'example.com']
# Application definition
INSTALLED_APPS = [
@@ -51,7 +54,9 @@ MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.gzip.GZipMiddleware',
+ # 'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
+ # 'django.middleware.cache.FetchFromCacheMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
@@ -192,8 +197,8 @@ CACHE_MIDDLEWARE_SECONDS = 60 * 60 * 10
CACHE_MIDDLEWARE_KEY_PREFIX = "djangoblog"
CACHE_MIDDLEWARE_ALIAS = 'default'
-SESSION_ENGINE = "django.contrib.sessions.backends.cache"
-SESSION_CACHE_ALIAS = 'default'
+# SESSION_ENGINE = "django.contrib.sessions.backends.cache"
+# SESSION_CACHE_ALIAS = 'default'
OAHUTH = {
'sina': {