Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6afb2efc94 | ||
|
|
7eb6cc88af | ||
|
|
899c4f22a5 | ||
|
|
67e1a59b2e |
@@ -9,5 +9,3 @@ omit =
|
||||
*apps*
|
||||
*commands*
|
||||
*oauth*
|
||||
*travis_test*
|
||||
*settings.py*
|
||||
|
||||
+1
-2
@@ -73,5 +73,4 @@ baidu_verify_FlHL7cUyC9.html
|
||||
BingSiteAuth.xml
|
||||
cb9339dbe2ff86a5aa169d28dba5f615.txt
|
||||
werobot_session
|
||||
django.jpg
|
||||
uploads/
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ SITE_NAME = '且听风吟'
|
||||
SITE_URL = 'http://www.lylinux.net'
|
||||
SITE_DESCRIPTION = '大巧无工,重剑无锋.'
|
||||
SITE_SEO_DESCRIPTION = '小站主要用来分享和记录学习经验,教程,记录个人生活的点滴以及一些随笔.欢迎大家访问小站'
|
||||
SITE_SEO_KEYWORDS = 'linux,apache,mysql,服务器,ubuntu,shell,web,csharp,.net,asp,mac,swift,python,django'
|
||||
SITE_SEO_KEYWORDS = 'linux,apache,mysql,服务器,ubuntu,shell,web,csharp,.net,asp,mac,swift'
|
||||
ARTICLE_SUB_LENGTH = 300
|
||||
SHOW_GOOGLE_ADSENSE = False
|
||||
# bootstrap颜色样式
|
||||
@@ -186,12 +186,10 @@ CACHE_CONTROL_MAX_AGE = 2592000
|
||||
CACHES = {
|
||||
'default': {
|
||||
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
|
||||
'TIMEOUT': 10800,
|
||||
'LOCATION': '127.0.0.1:11211',
|
||||
},
|
||||
'locmemcache': {
|
||||
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
|
||||
'TIMEOUT': 10800,
|
||||
'LOCATION': 'unique-snowflake',
|
||||
}
|
||||
}
|
||||
@@ -217,16 +215,11 @@ OAHUTH = {
|
||||
'appkey': os.environ.get('GITHUB_APP_KEY'),
|
||||
'appsecret': os.environ.get('GITHUB_APP_SECRET'),
|
||||
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=github'
|
||||
},
|
||||
'facebook': {
|
||||
'appkey': os.environ.get('FACEBOOK_APP_KEY'),
|
||||
'appsecret': os.environ.get('FACEBOOK_APP_SECRET'),
|
||||
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=facebook'
|
||||
}
|
||||
}
|
||||
|
||||
SITE_ID = 1
|
||||
BAIDU_NOTIFY_URL = "http://data.zz.baidu.com/urls?site=https://www.lylinux.net&token=1uAOGrMsUm5syDGn"
|
||||
BAIDU_NOTIFY_URL = "http://data.zz.baidu.com/urls?site=https://www.lylinux.net&token=1uAOGrMsUm5syDGn&type=original"
|
||||
|
||||
# Emial:
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
|
||||
"""
|
||||
@version: ??
|
||||
@author: liangliangyy
|
||||
@license: MIT Licence
|
||||
@contact: liangliangyy@gmail.com
|
||||
@site: https://www.lylinux.net/
|
||||
@software: PyCharm
|
||||
@file: tests.py
|
||||
@time: 2017/10/25 下午10:16
|
||||
"""
|
||||
|
||||
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 DjangoBlog.utils import *
|
||||
|
||||
|
||||
class DjangoBlogTest(TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def test_utils(self):
|
||||
md5 = get_md5('test')
|
||||
self.assertIsNotNone(md5)
|
||||
c = CommonMarkdown.get_markdown('''
|
||||
# Title1
|
||||
|
||||
```python
|
||||
import os
|
||||
```
|
||||
|
||||
[url](https://www.lylinux.org/)
|
||||
|
||||
[ddd](http://www.baidu.com)
|
||||
|
||||
|
||||
''')
|
||||
self.assertIsNotNone(c)
|
||||
d = {
|
||||
'd': 'key1',
|
||||
'd2': 'key2'
|
||||
}
|
||||
data = parse_dict_to_url(d)
|
||||
self.assertIsNotNone(data)
|
||||
|
||||
|
||||
@@ -31,9 +31,6 @@ sitemaps = {
|
||||
'static': StaticViewSitemap
|
||||
}
|
||||
|
||||
handler404 = 'blog.views.page_not_found_view'
|
||||
handler500 = 'blog.views.server_error_view'
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^admin/', admin.site.urls),
|
||||
url(r'', include('blog.urls', namespace='blog', app_name='blog')),
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ def block_code(text, lang, inlinestyles=False, linenos=False):
|
||||
|
||||
|
||||
class BlogMarkDownRenderer(mistune.Renderer):
|
||||
def block_code(self, text, lang=None):
|
||||
def block_code(self, text, lang):
|
||||
# renderer has an options
|
||||
inlinestyles = self.options.get('inlinestyles')
|
||||
linenos = self.options.get('linenos')
|
||||
|
||||
@@ -9,17 +9,17 @@
|
||||
- 支持文章全文搜索。
|
||||
- 完整的评论功能,包括发表回复评论,以及评论的邮件提醒,支持`Markdown`。
|
||||
- 侧边栏功能,最新文章,最多阅读,标签云等。
|
||||
- 支持Oauth登陆,现已有Google,GitHub,facebook,微博登录。
|
||||
- 支持Oauth登陆,现已有Google,GitHub,微博登录。
|
||||
- 支持`Memcache`缓存,支持缓存自动刷新。
|
||||
- 简单的SEO功能,新建文章等会自动通知Google和百度。
|
||||
- 集成了简单的图床功能。
|
||||
- 集成`django-compressor`,自动压缩`css`,`js`。
|
||||
- 基于`python3`,支持`Django`多版本。`Django`的1.8,1.9,1.10,1.11均测试通过。
|
||||
- 网站异常邮件提醒,若有未捕捉到的异常会自动发送提醒邮件。
|
||||
- 集成了微信公众号功能,现在可以使用微信公众号来管理你的vps了。
|
||||
|
||||
## 安装
|
||||
使用pip安装:
|
||||
`pip install -Ur requirements.txt`
|
||||
`pip install -r requirements.txt`
|
||||
|
||||
如果你没有pip,使用如下方式安装:
|
||||
OS X / Linux 电脑,终端下执行:
|
||||
@@ -44,7 +44,8 @@ windows电脑:
|
||||
有详细的部署介绍.
|
||||
|
||||
为了安全起见,没有把`SECRET_KEY`上传到Github中而是在环境变量中配置的,如果你想要正常运行的话,需要修改`settings.py`中的`SECRET_KEY`为你自己的就可以了。
|
||||
如:`SECRET_KEY = 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6'`
|
||||
如:
|
||||
`SECRET_KEY = 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6'`
|
||||
若本地部署后发现静态文件无法加载.请将`settings.py`中的`DEBUG=False`修改为`DEBUG=True`即可.
|
||||
|
||||
## 运行
|
||||
@@ -64,45 +65,30 @@ windows电脑:
|
||||
|
||||
### 创建数据库
|
||||
|
||||
终端下执行:
|
||||
终端下执行:
|
||||
|
||||
./manage.py makemigrations
|
||||
./manage.py migrate
|
||||
./manage.py migrate
|
||||
### 创建超级用户
|
||||
|
||||
终端下执行:
|
||||
终端下执行:
|
||||
|
||||
./manage.py createsuperuser
|
||||
### 创建测试数据
|
||||
终端下执行:
|
||||
终端下执行:
|
||||
|
||||
./manage.py create_testdata
|
||||
### 收集静态文件
|
||||
终端下执行:
|
||||
|
||||
./manage.py collectstatic --noinput
|
||||
./manage.py compress --force
|
||||
### 开始运行:
|
||||
执行:
|
||||
执行:
|
||||
`./manage.py runserver`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
浏览器打开: http://127.0.0.1:8000/ 就可以看到效果了。
|
||||
浏览器打开: http://127.0.0.1:8000/ 就可以看到效果了。
|
||||
|
||||
## 问题相关
|
||||
|
||||
有任何问题欢迎提Issue,或者将问题描述发送至我邮箱 `liangliangyy#gmail.com`.我会尽快解答.推荐提交Issue方式.
|
||||
## 捐赠
|
||||
如果您觉得本项目对您有所帮助,欢迎您请我喝杯咖啡,您的支持是我最大的动力,您可以扫描下方二维码为我付款,谢谢。
|
||||
### 支付宝:
|
||||
<div align="center">
|
||||
<img src="https://resource.lylinux.net/image/2017/12/16/IMG_0207.jpg" width="300" height="300" />
|
||||
</div>
|
||||
|
||||
### 微信:
|
||||
<div align="center">
|
||||
<img src="https://resource.lylinux.net/image/2017/12/16/IMG_0206.jpg" width="300" height="300" />
|
||||
</div>
|
||||
|
||||
+1
-9
@@ -3,12 +3,4 @@ from django.contrib import admin
|
||||
# Register your models here.
|
||||
from .models import BlogUser
|
||||
|
||||
|
||||
|
||||
class BlogUserAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'nickname', 'username','email','last_login','date_joined')
|
||||
list_display_links = ('id', 'username')
|
||||
|
||||
|
||||
|
||||
admin.site.register(BlogUser, BlogUserAdmin)
|
||||
admin.site.register(BlogUser)
|
||||
|
||||
@@ -2,7 +2,6 @@ from django.db import models
|
||||
from django.contrib.auth.models import AbstractUser, BaseUserManager
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib.sites.models import Site
|
||||
from django.utils.timezone import now
|
||||
|
||||
|
||||
# Create your models here.
|
||||
@@ -10,8 +9,6 @@ from django.utils.timezone import now
|
||||
class BlogUser(AbstractUser):
|
||||
nickname = models.CharField('昵称', max_length=50, blank=True)
|
||||
mugshot = models.ImageField('头像', upload_to='upload/mugshots', blank=True)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
|
||||
# objects = BlogUserManager()
|
||||
|
||||
|
||||
+2
-2
@@ -3,8 +3,8 @@
|
||||
NAME="djangoblog" # Name of the application
|
||||
DJANGODIR=//var/www/DjangoBlog # Django project directory
|
||||
SOCKFILE=/var/www/DjangoBlog/run/gunicorn.sock # we will communicte using this unix socket
|
||||
USER=root # the user to run as
|
||||
GROUP=root # the group to run as
|
||||
USER=www-data # the user to run as
|
||||
GROUP=www-data # the group to run as
|
||||
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
|
||||
DJANGO_SETTINGS_MODULE=DjangoBlog.settings # which settings file should Django use
|
||||
DJANGO_WSGI_MODULE=DjangoBlog.wsgi # WSGI module name
|
||||
|
||||
+6
-15
@@ -1,7 +1,7 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from .models import Article, Category, Tag, Links, SideBar
|
||||
from .models import Article, Category, Tag, Links
|
||||
from pagedown.widgets import AdminPagedownWidget
|
||||
from django import forms
|
||||
from django.contrib.auth import get_user_model
|
||||
@@ -39,7 +39,7 @@ class ArticlelAdmin(admin.ModelAdmin):
|
||||
list_display_links = ('id', 'title')
|
||||
list_filter = (ArticleListFilter, 'status', 'type', 'category', 'tags')
|
||||
filter_horizontal = ('tags',)
|
||||
exclude = ('slug', 'created_time', 'last_mod_time')
|
||||
exclude = ('slug', 'created_time')
|
||||
|
||||
def get_form(self, request, obj=None, **kwargs):
|
||||
form = super(ArticlelAdmin, self).get_form(request, obj, **kwargs)
|
||||
@@ -53,24 +53,15 @@ class ArticlelAdmin(admin.ModelAdmin):
|
||||
|
||||
|
||||
class TagAdmin(admin.ModelAdmin):
|
||||
exclude = ('slug', 'last_mod_time', 'created_time')
|
||||
exclude = ('slug',)
|
||||
|
||||
|
||||
class CategoryAdmin(admin.ModelAdmin):
|
||||
exclude = ('slug', 'last_mod_time', 'created_time')
|
||||
|
||||
|
||||
class LinksAdmin(admin.ModelAdmin):
|
||||
exclude = ('last_mod_time', 'created_time')
|
||||
|
||||
|
||||
class SideBarAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'content', 'is_enable', 'sequence')
|
||||
exclude = ('last_mod_time', 'created_time')
|
||||
exclude = ('slug',)
|
||||
|
||||
|
||||
admin.site.register(Article, ArticlelAdmin)
|
||||
# admin.site.register(BlogPage, ArticlelAdmin)
|
||||
admin.site.register(Category, CategoryAdmin)
|
||||
admin.site.register(Tag, TagAdmin)
|
||||
admin.site.register(Links, LinksAdmin)
|
||||
admin.site.register(SideBar, SideBarAdmin)
|
||||
admin.site.register(Links)
|
||||
|
||||
@@ -25,28 +25,25 @@ class Command(BaseCommand):
|
||||
|
||||
def handle(self, *args, **options):
|
||||
user = \
|
||||
get_user_model().objects.get_or_create(email='test@test.com', username='测试用户',
|
||||
get_user_model().objects.get_or_create(email='test@test.com', username='testuser',
|
||||
password='test!q@w#eTYU')[0]
|
||||
|
||||
pcategory = Category.objects.get_or_create(name='我是父类目', parent_category=None)[0]
|
||||
pcategory = Category.objects.get_or_create(name='pcategory', parent_category=None)[0]
|
||||
|
||||
category = Category.objects.get_or_create(name='子类目', parent_category=pcategory)[0]
|
||||
category = Category.objects.get_or_create(name='category', parent_category=pcategory)[0]
|
||||
|
||||
category.save()
|
||||
basetag = Tag()
|
||||
basetag.name = "标签"
|
||||
basetag.save()
|
||||
for i in range(1, 20):
|
||||
|
||||
for i in range(1, 10):
|
||||
article = Article.objects.get_or_create(category=category,
|
||||
title='nice title ' + str(i),
|
||||
body='nice content ' + str(i),
|
||||
author=user
|
||||
)[0]
|
||||
tag = Tag()
|
||||
tag.name = "标签" + str(i)
|
||||
tag.name = "nicetag" + str(i)
|
||||
tag.save()
|
||||
article.tags.add(tag)
|
||||
article.tags.add(basetag)
|
||||
article.save()
|
||||
|
||||
from DjangoBlog.utils import cache
|
||||
|
||||
+9
-24
@@ -6,13 +6,10 @@ from uuslug import slugify
|
||||
from django.contrib.sites.models import Site
|
||||
from DjangoBlog.utils import cache_decorator, logger, cache
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.timezone import now
|
||||
|
||||
|
||||
class BaseModel(models.Model):
|
||||
slug = models.SlugField(default='no-slug', max_length=60, blank=True)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
from DjangoBlog.blog_signals import article_save_signal
|
||||
@@ -22,7 +19,7 @@ class BaseModel(models.Model):
|
||||
super().save(*args, **kwargs)
|
||||
# type = self.__class__.__name__
|
||||
is_update_views = 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][
|
||||
0] == 'views'
|
||||
0] == 'views'
|
||||
article_save_signal.send(sender=self.__class__, is_update_views=is_update_views, id=self.id)
|
||||
|
||||
def get_full_url(self):
|
||||
@@ -50,6 +47,8 @@ class Article(BaseModel):
|
||||
)
|
||||
title = models.CharField('标题', max_length=200, unique=True)
|
||||
body = models.TextField('正文')
|
||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
|
||||
pub_time = models.DateTimeField('发布时间', blank=True, null=True)
|
||||
status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES, default='p')
|
||||
comment_status = models.CharField('评论状态', max_length=1, choices=COMMENT_STATUS, default='o')
|
||||
@@ -125,6 +124,8 @@ class Article(BaseModel):
|
||||
class Category(BaseModel):
|
||||
"""文章分类"""
|
||||
name = models.CharField('分类名', max_length=30, unique=True)
|
||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
|
||||
parent_category = models.ForeignKey('self', verbose_name="父级分类", blank=True, null=True)
|
||||
|
||||
class Meta:
|
||||
@@ -179,6 +180,8 @@ class Category(BaseModel):
|
||||
class Tag(BaseModel):
|
||||
"""文章标签"""
|
||||
name = models.CharField('标签名', max_length=30, unique=True)
|
||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@@ -201,8 +204,8 @@ class Links(models.Model):
|
||||
name = models.CharField('链接名称', max_length=30, unique=True)
|
||||
link = models.URLField('链接地址')
|
||||
sequence = models.IntegerField('排序', unique=True)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['sequence']
|
||||
@@ -211,21 +214,3 @@ class Links(models.Model):
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class SideBar(models.Model):
|
||||
"""侧边栏,可以展示一些html内容"""
|
||||
name = models.CharField('标题', max_length=100)
|
||||
content = models.TextField("内容")
|
||||
sequence = models.IntegerField('排序', unique=True)
|
||||
is_enable = models.BooleanField('是否启用', default=True)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
|
||||
class Meta:
|
||||
ordering = ['sequence']
|
||||
verbose_name = '侧边栏'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@@ -19,15 +19,13 @@ from django.template.defaultfilters import stringfilter
|
||||
from django.utils.safestring import mark_safe
|
||||
import random
|
||||
from django.core.urlresolvers import reverse
|
||||
from blog.models import Article, Category, Tag, Links, SideBar
|
||||
from blog.models import Article, Category, Tag, Links
|
||||
from django.utils.encoding import force_text
|
||||
from django.shortcuts import get_object_or_404
|
||||
import hashlib
|
||||
import urllib
|
||||
from comments.models import Comment
|
||||
from DjangoBlog.utils import cache_decorator, logger
|
||||
from django.contrib.auth import get_user_model
|
||||
from oauth.models import OAuthUser
|
||||
from DjangoBlog.utils import cache
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@@ -125,7 +123,6 @@ def load_sidebar(user):
|
||||
logger.info('load sidebar')
|
||||
recent_articles = Article.objects.filter(status='p')[:settings.SIDEBAR_ARTICLE_COUNT]
|
||||
sidebar_categorys = Category.objects.all()
|
||||
extra_sidebars = SideBar.objects.filter(is_enable=True).order_by('sequence')
|
||||
most_read_articles = Article.objects.filter(status='p').order_by('-views')[:settings.SIDEBAR_ARTICLE_COUNT]
|
||||
dates = Article.objects.datetimes('created_time', 'month', order='DESC')
|
||||
links = Links.objects.all()
|
||||
@@ -136,10 +133,10 @@ def load_sidebar(user):
|
||||
increment = 5
|
||||
tags = Tag.objects.all()
|
||||
sidebar_tags = None
|
||||
if tags and len(tags) > 0:
|
||||
if tags:
|
||||
s = list(map(lambda t: (t, t.get_article_count()), tags))
|
||||
count = sum(map(lambda t: t[1], s))
|
||||
dd = 1 if count == 0 else count / len(tags)
|
||||
dd = count / len(tags)
|
||||
sidebar_tags = list(map(lambda x: (x[0], x[1], (x[1] / dd) * increment + 10), s))
|
||||
|
||||
return {
|
||||
@@ -151,8 +148,7 @@ def load_sidebar(user):
|
||||
'sidebar_comments': commment_list,
|
||||
'user': user,
|
||||
'show_adsense': show_adsense,
|
||||
'sidebar_tags': sidebar_tags,
|
||||
'extra_sidebars': extra_sidebars
|
||||
'sidebar_tags': sidebar_tags
|
||||
}
|
||||
|
||||
|
||||
@@ -181,13 +177,12 @@ def load_pagination_info(page_obj, page_type, tag_name):
|
||||
previous_number = page_obj.previous_page_number()
|
||||
previous_url = reverse('blog:index_page', kwargs={'page': previous_number})
|
||||
if page_type == '分类标签归档':
|
||||
tag = get_object_or_404(Tag, name=tag_name)
|
||||
if page_obj.has_next():
|
||||
next_number = page_obj.next_page_number()
|
||||
next_url = reverse('blog:tag_detail_page', kwargs={'page': next_number, 'tag_name': tag.slug})
|
||||
next_url = reverse('blog:tag_detail_page', kwargs={'page': next_number, 'tag_name': tag_name})
|
||||
if page_obj.has_previous():
|
||||
previous_number = page_obj.previous_page_number()
|
||||
previous_url = reverse('blog:tag_detail_page', kwargs={'page': previous_number, 'tag_name': tag.slug})
|
||||
previous_url = reverse('blog:tag_detail_page', kwargs={'page': previous_number, 'tag_name': tag_name})
|
||||
if page_type == '作者文章归档':
|
||||
if page_obj.has_next():
|
||||
next_number = page_obj.next_page_number()
|
||||
@@ -197,15 +192,13 @@ def load_pagination_info(page_obj, page_type, tag_name):
|
||||
previous_url = reverse('blog:author_detail_page', kwargs={'page': previous_number, 'author_name': tag_name})
|
||||
|
||||
if page_type == '分类目录归档':
|
||||
category = get_object_or_404(Category, name=tag_name)
|
||||
if page_obj.has_next():
|
||||
next_number = page_obj.next_page_number()
|
||||
next_url = reverse('blog:category_detail_page',
|
||||
kwargs={'page': next_number, 'category_name': category.slug})
|
||||
next_url = reverse('blog:category_detail_page', kwargs={'page': next_number, 'category_name': tag_name})
|
||||
if page_obj.has_previous():
|
||||
previous_number = page_obj.previous_page_number()
|
||||
previous_url = reverse('blog:category_detail_page',
|
||||
kwargs={'page': previous_number, 'category_name': category.slug})
|
||||
kwargs={'page': previous_number, 'category_name': tag_name})
|
||||
|
||||
return {
|
||||
'previous_url': previous_url,
|
||||
@@ -244,11 +237,6 @@ def load_article_detail(article, isindex, user):
|
||||
@register.filter
|
||||
def gravatar_url(email, size=40):
|
||||
"""获得gravatar头像"""
|
||||
usermodels = OAuthUser.objects.filter(email=email)
|
||||
if usermodels:
|
||||
o = list(filter(lambda x: x.picture is not None, usermodels))
|
||||
if o:
|
||||
return o[0].picture
|
||||
email = email.encode('utf-8')
|
||||
|
||||
default = "https://resource.lylinux.net/image/2017/03/26/120117.jpg".encode('utf-8')
|
||||
|
||||
+2
-92
@@ -1,15 +1,9 @@
|
||||
from django.test import Client, RequestFactory, TestCase
|
||||
from blog.models import Article, Category, Tag, SideBar
|
||||
from blog.models import Article, Category, Tag
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.sites.models import Site
|
||||
from blog.forms import BlogSearchForm
|
||||
from django.core.paginator import Paginator
|
||||
from blog.templatetags.blog_tags import load_pagination_info, load_articletags
|
||||
import datetime
|
||||
from accounts.models import BlogUser
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.conf import settings
|
||||
import os
|
||||
|
||||
|
||||
# Create your tests here.
|
||||
@@ -23,19 +17,10 @@ class ArticleTest(TestCase):
|
||||
site = Site.objects.get_current().domain
|
||||
user = BlogUser.objects.get_or_create(email="liangliangyy@gmail.com", username="liangliangyy")[0]
|
||||
user.set_password("liangliangyy")
|
||||
user.is_staff = True
|
||||
user.is_superuser = True
|
||||
user.save()
|
||||
response = self.client.get(user.get_absolute_url())
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
s = SideBar()
|
||||
s.sequence = 1
|
||||
s.name = 'test'
|
||||
s.content = 'test content'
|
||||
s.is_enable = True
|
||||
s.save()
|
||||
|
||||
category = Category()
|
||||
category.name = "category"
|
||||
category.created_time = datetime.datetime.now()
|
||||
@@ -60,69 +45,17 @@ class ArticleTest(TestCase):
|
||||
article.save()
|
||||
self.assertEqual(1, article.tags.count())
|
||||
|
||||
for i in range(20):
|
||||
article = Article()
|
||||
article.title = "nicetitle" + str(i)
|
||||
article.body = "nicetitle" + str(i)
|
||||
article.author = user
|
||||
article.category = category
|
||||
article.type = 'a'
|
||||
article.status = 'p'
|
||||
article.save()
|
||||
article.tags.add(tag)
|
||||
article.save()
|
||||
response = self.client.get(article.get_absolute_url())
|
||||
self.assertEqual(response.status_code, 200)
|
||||
from DjangoBlog.spider_notify import SpiderNotify
|
||||
SpiderNotify.notify(article.get_absolute_url())
|
||||
|
||||
response = self.client.get(tag.get_absolute_url())
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
response = self.client.get(category.get_absolute_url())
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
response = self.client.get('/search', {'q': 'django'})
|
||||
self.assertEqual(response.status_code, 200)
|
||||
s = load_articletags(article)
|
||||
self.assertIsNotNone(s)
|
||||
|
||||
p = Paginator(Article.objects.all(), 2)
|
||||
self.__check_pagination__(p, '', '')
|
||||
|
||||
p = Paginator(Article.objects.filter(tags=tag), 2)
|
||||
self.__check_pagination__(p, '分类标签归档', tag.slug)
|
||||
|
||||
p = Paginator(Article.objects.filter(author__username='liangliangyy'), 2)
|
||||
self.__check_pagination__(p, '作者文章归档', 'liangliangyy')
|
||||
|
||||
p = Paginator(Article.objects.filter(category=category), 2)
|
||||
self.__check_pagination__(p, '分类目录归档', category.slug)
|
||||
|
||||
f = BlogSearchForm()
|
||||
f.search()
|
||||
self.client.login(username='liangliangyy', password='liangliangyy')
|
||||
from DjangoBlog.spider_notify import SpiderNotify
|
||||
SpiderNotify.baidu_notify([article.get_full_url()])
|
||||
rsp = self.client.get('/refresh/')
|
||||
self.assertEqual(rsp.status_code, 200)
|
||||
from blog.templatetags.blog_tags import gravatar_url, gravatar
|
||||
u = gravatar_url('liangliangyy@gmail.com')
|
||||
u = gravatar('liangliangyy@gmail.com')
|
||||
|
||||
def __check_pagination__(self, p, type, value):
|
||||
s = load_pagination_info(p.page(1), type, value)
|
||||
self.assertIsNotNone(s)
|
||||
response = self.client.get(s['previous_url'])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
response = self.client.get(s['next_url'])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
s = load_pagination_info(p.page(2), type, value)
|
||||
self.assertIsNotNone(s)
|
||||
response = self.client.get(s['previous_url'])
|
||||
self.assertEqual(response.status_code, 200)
|
||||
response = self.client.get(s['next_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]
|
||||
@@ -134,26 +67,3 @@ class ArticleTest(TestCase):
|
||||
|
||||
response = self.client.get('/sitemap.xml')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_image(self):
|
||||
import requests
|
||||
rsp = requests.get('https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2909203028,3998034658&fm=96')
|
||||
imagepath = os.path.join(settings.BASE_DIR, 'django.jpg')
|
||||
with open(imagepath, 'wb') as file:
|
||||
file.write(rsp.content)
|
||||
with open(imagepath, 'rb') as file:
|
||||
imgfile = SimpleUploadedFile('django.jpg', file.read(), content_type='image/jpg')
|
||||
form_data = {'django.jpg': imgfile}
|
||||
rsp = self.client.post('/upload', form_data, follow=True)
|
||||
|
||||
self.assertEqual(rsp.status_code, 200)
|
||||
"""
|
||||
data = SimpleUploadedFile(imagepath, b'file_content', content_type='image/jpg')
|
||||
rsp = self.client.post('/upload', {'django.jpg': data})
|
||||
self.assertEqual(rsp.status_code, 200)
|
||||
SimpleUploadedFile()
|
||||
"""
|
||||
|
||||
def test_errorpage(self):
|
||||
self.client.get('/eee')
|
||||
self.client.get('/refresh_memcache')
|
||||
|
||||
+2
-2
@@ -42,8 +42,8 @@ urlpatterns = [
|
||||
url(r'^author/(?P<author_name>\w+)/(?P<page>\d+).html$', views.AuthorDetailView.as_view(),
|
||||
name='author_detail_page'),
|
||||
|
||||
url(r'^tag/(?P<tag_name>[\w-]+).html$', views.TagDetailView.as_view(), name='tag_detail'),
|
||||
url(r'^tag/(?P<tag_name>[\w-]+)/(?P<page>\d+).html$', views.TagDetailView.as_view(), name='tag_detail_page'),
|
||||
url(r'^tag/(?P<tag_name>.+).html$', views.TagDetailView.as_view(), name='tag_detail'),
|
||||
url(r'^tag/(?P<tag_name>.+)/(?P<page>\d+).html$', views.TagDetailView.as_view(), name='tag_detail_page'),
|
||||
|
||||
url(r'^upload', views.fileupload, name='upload'),
|
||||
url(r'^refresh', views.refresh_memcache, name='refresh')
|
||||
|
||||
+1
-19
@@ -84,7 +84,7 @@ class ArticleDetailView(DetailView):
|
||||
pk_url_kwarg = 'article_id'
|
||||
context_object_name = "article"
|
||||
|
||||
def get_object(self, queryset=None):
|
||||
def get_object(self):
|
||||
obj = super(ArticleDetailView, self).get_object()
|
||||
obj.viewed()
|
||||
self.object = obj
|
||||
@@ -219,8 +219,6 @@ def fileupload(request):
|
||||
|
||||
basepath = r'/var/www/resource/{type}/{timestr}'.format(
|
||||
type='files' if not isimage else'image', timestr=timestr)
|
||||
if settings.TESTING:
|
||||
basepath = settings.BASE_DIR + '/uploads'
|
||||
url = 'https://resource.lylinux.net/{type}/{timestr}/{filename}'.format(
|
||||
type='files' if not isimage else'image', timestr=timestr, filename=filename)
|
||||
if not os.path.exists(basepath):
|
||||
@@ -254,19 +252,3 @@ def refresh_memcache(request):
|
||||
return HttpResponseForbidden()
|
||||
except Exception as e:
|
||||
return HttpResponse(e)
|
||||
|
||||
|
||||
def page_not_found_view(request):
|
||||
url = request.get_full_path()
|
||||
return render(request, 'blog/error_page.html',
|
||||
{'message': '哎呀,您访问的地址 ' + url + ' 是一个未知的地方。请点击首页看看别的?', 'statuscode': '404'})
|
||||
|
||||
|
||||
def server_error_view(request):
|
||||
return render(request, 'blog/error_page.html',
|
||||
{'message': '哎呀,出错了,我已经收集到了错误信息,之后会抓紧抢修,请点击首页看看别的?', 'statuscode': '500'})
|
||||
|
||||
|
||||
def permission_denied_view(request):
|
||||
return render(request, 'blog/error_page.html',
|
||||
{'message': '哎呀,您没有权限访问此页面,请点击首页看看别的?', 'statuscode': '403'})
|
||||
|
||||
+2
-3
@@ -2,15 +2,14 @@ from django.db import models
|
||||
from django.conf import settings
|
||||
from blog.models import Article
|
||||
from DjangoBlog.utils import logger
|
||||
from django.utils.timezone import now
|
||||
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class Comment(models.Model):
|
||||
body = models.TextField('正文', max_length=300)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
created_time = models.DateTimeField('创建时间', auto_now_add=True)
|
||||
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
|
||||
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='作者', on_delete=models.CASCADE)
|
||||
article = models.ForeignKey(Article, verbose_name='文章', on_delete=models.CASCADE)
|
||||
parent_comment = models.ForeignKey('self', verbose_name="上级评论", blank=True, null=True)
|
||||
|
||||
@@ -5,8 +5,6 @@ from django.contrib.sites.models import Site
|
||||
from django.core.urlresolvers import reverse
|
||||
import datetime
|
||||
from accounts.models import BlogUser
|
||||
from comments.templatetags.comments_tags import *
|
||||
from DjangoBlog.utils import get_max_articleid_commentid
|
||||
|
||||
|
||||
# Create your tests here.
|
||||
@@ -61,36 +59,3 @@ class CommentsTest(TestCase):
|
||||
|
||||
article = Article.objects.get(pk=article.pk)
|
||||
self.assertEqual(len(article.comment_list()), 1)
|
||||
parent_comment_id = article.comment_list()[0].id
|
||||
|
||||
response = self.client.post(commenturl,
|
||||
{
|
||||
'body': '''
|
||||
# Title1
|
||||
|
||||
```python
|
||||
import os
|
||||
```
|
||||
|
||||
[url](https://www.lylinux.org/)
|
||||
|
||||
[ddd](http://www.baidu.com)
|
||||
|
||||
|
||||
''',
|
||||
'email': user.email,
|
||||
'name': user.username,
|
||||
'parent_comment_id': parent_comment_id
|
||||
})
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
article = Article.objects.get(pk=article.pk)
|
||||
self.assertEqual(len(article.comment_list()), 2)
|
||||
comment = Comment.objects.get(id=parent_comment_id)
|
||||
tree = parse_commenttree(article.comment_list(), comment)
|
||||
self.assertEqual(len(tree), 1)
|
||||
data = show_comment_item(comment, True)
|
||||
self.assertIsNotNone(data)
|
||||
s = get_max_articleid_commentid()
|
||||
self.assertIsNotNone(s)
|
||||
|
||||
+2
-5
@@ -2,20 +2,17 @@ from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
from django.conf import settings
|
||||
from django.utils.timezone import now
|
||||
|
||||
|
||||
class OAuthUser(models.Model):
|
||||
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户', blank=True, null=True)
|
||||
openid = models.CharField(max_length=50)
|
||||
nikename = models.CharField(max_length=50, verbose_name='昵称')
|
||||
token = models.CharField(max_length=150, null=True, blank=True)
|
||||
token = models.CharField(max_length=150)
|
||||
picture = models.CharField(max_length=350, blank=True, null=True)
|
||||
type = models.CharField(blank=False, null=False, max_length=50)
|
||||
email = models.CharField(max_length=50, null=True, blank=True)
|
||||
matedata = models.CharField(max_length=2000, null=True, blank=True)
|
||||
created_time = models.DateTimeField('创建时间', default=now)
|
||||
last_mod_time = models.DateTimeField('修改时间', default=now)
|
||||
token = models.CharField(max_length=50, null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.nikename
|
||||
|
||||
+1
-68
@@ -96,6 +96,7 @@ class WBOauthManager(BaseOauthManager):
|
||||
'redirect_uri': self.callback_url
|
||||
}
|
||||
rsp = self.do_post(self.TOKEN_URL, params)
|
||||
print(rsp)
|
||||
try:
|
||||
obj = json.loads(rsp)
|
||||
self.access_token = str(obj['access_token'])
|
||||
@@ -116,7 +117,6 @@ class WBOauthManager(BaseOauthManager):
|
||||
|
||||
datas = json.loads(rsp)
|
||||
user = OAuthUser()
|
||||
user.matedata = rsp
|
||||
user.picture = datas['avatar_large']
|
||||
user.nikename = datas['screen_name']
|
||||
user.openid = datas['id']
|
||||
@@ -185,7 +185,6 @@ class GoogleOauthManager(BaseOauthManager):
|
||||
|
||||
datas = json.loads(rsp)
|
||||
user = OAuthUser()
|
||||
user.matedata = rsp
|
||||
user.picture = datas['picture']
|
||||
user.nikename = datas['name']
|
||||
user.openid = datas['sub']
|
||||
@@ -256,7 +255,6 @@ class GitHubOauthManager(BaseOauthManager):
|
||||
user.openid = datas['id']
|
||||
user.type = 'github'
|
||||
user.token = self.access_token
|
||||
user.matedata = rsp
|
||||
if datas['email']:
|
||||
user.email = datas['email']
|
||||
|
||||
@@ -266,71 +264,6 @@ class GitHubOauthManager(BaseOauthManager):
|
||||
return None
|
||||
|
||||
|
||||
class FaceBookOauthManager(BaseOauthManager):
|
||||
AUTH_URL = 'https://www.facebook.com/v2.10/dialog/oauth'
|
||||
TOKEN_URL = 'https://graph.facebook.com/v2.10/oauth/access_token'
|
||||
API_URL = 'https://graph.facebook.com/me'
|
||||
ICON_NAME = 'facebook'
|
||||
|
||||
def __init__(self, access_token=None, openid=None):
|
||||
self.client_id = settings.OAHUTH['facebook']['appkey']
|
||||
self.client_secret = settings.OAHUTH['facebook']['appsecret']
|
||||
self.callback_url = settings.OAHUTH['facebook']['callbackurl']
|
||||
super(FaceBookOauthManager, self).__init__(access_token=access_token, openid=openid)
|
||||
|
||||
def get_authorization_url(self, nexturl='/'):
|
||||
params = {
|
||||
'client_id': self.client_id,
|
||||
'response_type': 'code',
|
||||
'redirect_uri': self.callback_url, # + '&next_url=' + nexturl,
|
||||
'scope': 'email,public_profile'
|
||||
}
|
||||
url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
|
||||
return url
|
||||
|
||||
def get_access_token_by_code(self, code):
|
||||
params = {
|
||||
'client_id': self.client_id,
|
||||
'client_secret': self.client_secret,
|
||||
# 'grant_type': 'authorization_code',
|
||||
'code': code,
|
||||
|
||||
'redirect_uri': self.callback_url
|
||||
}
|
||||
rsp = self.do_post(self.TOKEN_URL, params)
|
||||
|
||||
try:
|
||||
obj = json.loads(rsp)
|
||||
token = str(obj['access_token'])
|
||||
self.access_token = token
|
||||
return self.access_token
|
||||
except:
|
||||
return None
|
||||
|
||||
def get_oauth_userinfo(self):
|
||||
params = {
|
||||
'access_token': self.access_token,
|
||||
'fields': 'id,name,picture,email'
|
||||
}
|
||||
try:
|
||||
rsp = self.do_get(self.API_URL, params)
|
||||
datas = json.loads(rsp)
|
||||
user = OAuthUser()
|
||||
user.nikename = datas['name']
|
||||
user.openid = datas['id']
|
||||
user.type = 'facebook'
|
||||
user.token = self.access_token
|
||||
user.matedata = rsp
|
||||
if datas['email']:
|
||||
user.email = datas['email']
|
||||
if datas['picture'] and datas['picture']['data'] and datas['picture']['data']['url']:
|
||||
user.picture = str(datas['picture']['data']['url'])
|
||||
return user
|
||||
except Exception as e:
|
||||
logger.warn(e)
|
||||
return None
|
||||
|
||||
|
||||
def get_oauth_apps():
|
||||
applications = BaseOauthManager.__subclasses__()
|
||||
return list(map(lambda x: x(), applications))
|
||||
|
||||
+4
-3
@@ -26,6 +26,7 @@ def oauthlogin(request):
|
||||
if not manager:
|
||||
return HttpResponseRedirect('/')
|
||||
nexturl = request.GET.get('next_url', None)
|
||||
print(nexturl)
|
||||
if not nexturl or nexturl == '/login/':
|
||||
nexturl = '/'
|
||||
authorizeurl = manager.get_authorization_url(nexturl)
|
||||
@@ -52,7 +53,7 @@ def authorize(request):
|
||||
if user:
|
||||
if not user.nikename:
|
||||
import datetime
|
||||
user.nikename = "djangoblog" + datetime.datetime.now().strftime('%y%m%d%I%M%S')
|
||||
user.nikename = "djangoblog" + datetime.datetime.now().strftime('%Y%m%f%H%m%s')
|
||||
try:
|
||||
token = user.token
|
||||
user = OAuthUser.objects.get(type=type, openid=user.openid)
|
||||
@@ -71,7 +72,7 @@ def authorize(request):
|
||||
result = get_user_model().objects.get_or_create(email=user.email)
|
||||
author = result[0]
|
||||
if result[1]:
|
||||
author.username = user.nikename
|
||||
author.username = user.nikename + '_' + str(user.openid)
|
||||
author.save()
|
||||
|
||||
user.author = author
|
||||
@@ -102,7 +103,7 @@ def emailconfirm(request, id, sign):
|
||||
result = get_user_model().objects.get_or_create(email=oauthuser.email)
|
||||
author = result[0]
|
||||
if result[1]:
|
||||
author.username = oauthuser.nikename
|
||||
author.username = oauthuser.nikename + '_' + str(oauthuser.openid)
|
||||
author.save()
|
||||
"""
|
||||
if oauthuser.email and author.email:
|
||||
|
||||
+8
-9
@@ -1,32 +1,31 @@
|
||||
appdirs==1.4.3
|
||||
coverage==4.4.1
|
||||
Django==1.11.7
|
||||
Django==1.11.4
|
||||
django-appconf==1.0.2
|
||||
django-autoslug==1.9.3
|
||||
django-compressor==2.2
|
||||
django-debug-toolbar==1.9.1
|
||||
django-debug-toolbar==1.8
|
||||
django-haystack==2.6.1
|
||||
django-ipware==1.1.6
|
||||
django-pagedown==0.1.3
|
||||
django-uuslug==1.1.8
|
||||
jieba==0.39
|
||||
jsonpickle==0.9.5
|
||||
markdown2==2.3.5
|
||||
mistune==0.8.1
|
||||
markdown2==2.3.4
|
||||
mistune==0.7.4
|
||||
olefile==0.44
|
||||
packaging==16.8
|
||||
Pillow==4.3.0
|
||||
Pillow==4.2.1
|
||||
Pygments==2.2.0
|
||||
PyMySQL==0.7.11
|
||||
pyparsing==2.2.0
|
||||
python-memcached==1.58
|
||||
python-slugify==1.2.4
|
||||
pytz==2017.3
|
||||
pytz==2017.2
|
||||
rcssmin==1.0.6
|
||||
requests==2.18.4
|
||||
rjsmin==1.0.12
|
||||
six==1.11.0
|
||||
sqlparse==0.2.4
|
||||
six==1.10.0
|
||||
sqlparse==0.2.3
|
||||
Unidecode==0.4.21
|
||||
urllib3==1.22
|
||||
webencodings==0.5.1
|
||||
|
||||
@@ -31,13 +31,13 @@ class TuLing():
|
||||
return rsp.content
|
||||
|
||||
def getdata(self, content):
|
||||
requrl = self.__build_req_url(content)
|
||||
res = self.UserAgent(requrl)
|
||||
try:
|
||||
requrl = self.__build_req_url(content)
|
||||
res = self.UserAgent(requrl).decode('utf-8')
|
||||
|
||||
jsons = json.loads(res, encoding='utf-8')
|
||||
if str(jsons["code"]) == '100000':
|
||||
return jsons["text"]
|
||||
except Exception as e:
|
||||
print(e)
|
||||
logger.warn(e)
|
||||
return "哎呀,出错啦。"
|
||||
|
||||
@@ -5,7 +5,7 @@ from .models import commands
|
||||
|
||||
|
||||
class CommandsAdmin(admin.ModelAdmin):
|
||||
list_display = ('title', 'command', 'describe')
|
||||
pass
|
||||
|
||||
|
||||
admin.site.register(commands, CommandsAdmin)
|
||||
|
||||
@@ -32,11 +32,7 @@ if memstorage.is_available:
|
||||
robot.config['SESSION_STORAGE'] = memstorage
|
||||
else:
|
||||
from werobot.session.filestorage import FileStorage
|
||||
import os
|
||||
from django.conf import settings
|
||||
|
||||
if os.path.exists(os.path.join(settings.BASE_DIR, 'werobot_session')):
|
||||
os.remove(os.path.join(settings.BASE_DIR, 'werobot_session'))
|
||||
robot.config['SESSION_STORAGE'] = FileStorage(filename='werobot_session')
|
||||
blogapi = BlogApi()
|
||||
tuling = TuLing()
|
||||
@@ -151,7 +147,7 @@ class CommandHandler():
|
||||
def get_help(self):
|
||||
rsp = ''
|
||||
for cmd in self.commands:
|
||||
rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe)
|
||||
rsp += '{c}:{d}\n'.format(c=cmd.command, d=cmd.describe)
|
||||
return rsp
|
||||
|
||||
|
||||
@@ -196,8 +192,6 @@ class MessageHandler():
|
||||
return "输入管理员密码"
|
||||
if self.userinfo.isAdmin and not self.userinfo.isPasswordSet:
|
||||
passwd = settings.WXADMIN
|
||||
if settings.TESTING:
|
||||
passwd='123'
|
||||
if passwd.upper() == get_md5(get_md5(info)).upper():
|
||||
self.userinfo.isPasswordSet = True
|
||||
self.savesession()
|
||||
|
||||
+4
-20
@@ -7,7 +7,6 @@ from blog.models import Category, Article
|
||||
from .robot import search, category, recents
|
||||
from werobot.messages.messages import TextMessage
|
||||
from .robot import MessageHandler, CommandHandler
|
||||
from servermanager.Api.commonapi import TuLing
|
||||
|
||||
|
||||
# Create your tests here.
|
||||
@@ -16,11 +15,6 @@ class ServerManagerTest(TestCase):
|
||||
self.client = Client()
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def test_tuling(self):
|
||||
t = TuLing()
|
||||
content = t.getdata('test')
|
||||
self.assertIsNotNone(content)
|
||||
|
||||
def test_validate_comment(self):
|
||||
site = Site.objects.get_current().domain
|
||||
user = BlogUser.objects.create_superuser(email="liangliangyy1@gmail.com",
|
||||
@@ -63,20 +57,10 @@ class ServerManagerTest(TestCase):
|
||||
s.source = 'u'
|
||||
s.content = 'test'
|
||||
msghandler = MessageHandler(s, {})
|
||||
|
||||
#msghandler.userinfo.isPasswordSet = True
|
||||
#msghandler.userinfo.isAdmin = True
|
||||
d = msghandler.is_admin
|
||||
e = msghandler.is_password_set
|
||||
msghandler.userinfo.isPasswordSet = True
|
||||
msghandler.userinfo.isAdmin = True
|
||||
msghandler.handler()
|
||||
s.content = 'y'
|
||||
msghandler.handler()
|
||||
s.content='idcard:12321233'
|
||||
msghandler.handler()
|
||||
s.content='weather:上海'
|
||||
msghandler.handler()
|
||||
s.content='admin'
|
||||
msghandler.handler()
|
||||
s.content='123'
|
||||
msghandler.handler()
|
||||
|
||||
s.content = 'exit'
|
||||
msghandler.handler()
|
||||
@@ -1,45 +0,0 @@
|
||||
{% extends 'share_layout/base.html' %}
|
||||
{% load blog_tags %}
|
||||
{% load cache %}
|
||||
{% block header %}
|
||||
{% if tag_name %}
|
||||
{% if statuscode == '404' %}
|
||||
<title>404 NotFound</title>
|
||||
{% elif statuscode == '500' %}
|
||||
<title>Permission Denied</title>
|
||||
{% elif statuscode == '403' %}
|
||||
<title>500 Error</title>
|
||||
{% else %}
|
||||
<title></title>
|
||||
{% endif %}
|
||||
{% comment %}<meta name="description" content="{{ page_type }}:{{ tag_name }}"/>{% endcomment %}
|
||||
{% else %}
|
||||
<title>{{ SITE_NAME }} | {{ SITE_DESCRIPTION }}</title>
|
||||
{% endif %}
|
||||
<meta name="description" content="{{ SITE_SEO_DESCRIPTION }}"/>
|
||||
<meta name="keywords" content="{{ SITE_KEYWORDS }}"/>
|
||||
<meta property="og:type" content="blog"/>
|
||||
<meta property="og:title" content="{{ SITE_NAME }}"/>
|
||||
<meta property="og:description" content="{{ SITE_DESCRIPTION }}"/>
|
||||
<meta property="og:url" content="{{ SITE_BASE_URL }}"/>
|
||||
<meta property="og:site_name" content="{{ SITE_NAME }}"/>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="primary" class="site-content">
|
||||
<div id="content" role="main">
|
||||
|
||||
<header class="archive-header">
|
||||
<h1 class="archive-title">{{ message }}</h1>
|
||||
</header><!-- .archive-header -->
|
||||
|
||||
</div><!-- #content -->
|
||||
</div><!-- #primary -->
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block sidebar %}
|
||||
{% load_sidebar user %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -8,17 +8,6 @@
|
||||
</div>
|
||||
</form>
|
||||
</aside>
|
||||
{% if extra_sidebars %}
|
||||
{% for sidebar in extra_sidebars %}
|
||||
|
||||
<aside class="widget_text widget widget_custom_html"><h3 class="widget-title">
|
||||
{{ sidebar.name }}</h3>
|
||||
<div class="textwidget custom-html-widget">
|
||||
{{ sidebar.content }}
|
||||
</div>
|
||||
</aside>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if most_read_articles %}
|
||||
|
||||
<aside id="views-4" class="widget widget_views"><h3 class="widget-title">Views</h3>
|
||||
@@ -52,7 +41,8 @@
|
||||
{% for c in sidebar_comments %}
|
||||
<li class="recentcomments">
|
||||
<span class="comment-author-link">
|
||||
{{ c.author.username }}</span>
|
||||
<a href="{{ c.author.get_absolute_url }}" rel="external"
|
||||
class="url">{{ c.author.username }}</a></span>
|
||||
发表在《
|
||||
<a href="{{ c.article.get_absolute_url }}">{{ c.article.title }}</a>》
|
||||
</li>
|
||||
@@ -119,8 +109,8 @@
|
||||
{% else %}
|
||||
<li><a href="{% url "account:login" %}">登录</a>
|
||||
{% endif %}
|
||||
<li><a href="http://gitbook.lylinux.net" target="_blank" rel="nofollow">GitBook</a></li>
|
||||
|
||||
</ul>
|
||||
</aside>
|
||||
<div id="rocket" class="show" title="点我返回顶部"></div>
|
||||
<div id="rocket" class="show" title="点我返回顶部"></div>
|
||||
</div><!-- #secondary -->
|
||||
@@ -1,24 +1,20 @@
|
||||
<script type="text/javascript">
|
||||
var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");
|
||||
document.write(unescape("%3Cspan id='cnzz_stat_icon_1261145394'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/stat.php%3Fid%3D1261145394%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));
|
||||
|
||||
(function (i, s, o, g, r, a, m) {
|
||||
i['GoogleAnalyticsObject'] = r;
|
||||
i[r] = i[r] || function () {
|
||||
(i[r].q = i[r].q || []).push(arguments)
|
||||
}, i[r].l = 1 * new Date();
|
||||
(i[r].q = i[r].q || []).push(arguments)
|
||||
}, i[r].l = 1 * new Date();
|
||||
a = s.createElement(o),
|
||||
m = s.getElementsByTagName(o)[0];
|
||||
a.async = 1;
|
||||
a.src = g;
|
||||
m.parentNode.insertBefore(a, m)
|
||||
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
|
||||
})(window, document, 'script', 'https://www.lylinux.org/analytics.js', 'ga');
|
||||
|
||||
ga('create', 'UA-27354903-4', 'auto');
|
||||
ga('send', 'pageview');
|
||||
var _hmt = _hmt || [];
|
||||
(function () {
|
||||
var hm = document.createElement("script");
|
||||
hm.src = "https://hm.baidu.com/hm.js?30dd00aec5f76607ba37c6770ae48e45";
|
||||
var s = document.getElementsByTagName("script")[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
|
||||
</script>
|
||||
<a href="https://tongji.baidu.com/sc-web/3478620/home/ico?siteId=11261596" target="_blank" rel="nofollow">百度统计</a>
|
||||
@@ -27,7 +27,7 @@
|
||||
href="{{ SITE_BASE_URL }}feed"/>
|
||||
|
||||
<link rel='stylesheet' id='twentytwelve-fonts-css'
|
||||
href='https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700&subset=latin,latin-ext'
|
||||
href='https://fonts.proxy.ustclug.org/css?family=Open+Sans:400italic,700italic,400,700&subset=latin,latin-ext'
|
||||
type='text/css' media='all'/>
|
||||
{% compress css %}
|
||||
<link rel='stylesheet' id='twentytwelve-style-css' href='{% static 'blog/css/style.css' %}' type='text/css'
|
||||
@@ -85,4 +85,4 @@
|
||||
{% block footer %}
|
||||
{% endblock %}
|
||||
</footer>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -21,9 +21,7 @@
|
||||
Powered by
|
||||
<a href="https://www.djangoproject.com/" rel="nofollow" target="blank">Django</a>
|
||||
|
|
||||
<a href="https://github.com/liangliangyy/DjangoBlog" rel="nofollow" target="blank">LiangLiangyy</a>
|
||||
|
|
||||
<a href="https://www.lylinux.net" target="blank">Lylinux</a>
|
||||
<a href="https://github.com/liangliangyy/DjangoBlog" rel="nofollow" target="blank"> LiangLiangyy</a>
|
||||
|
|
||||
本页面加载耗时:<!!LOAD_TIMES!!>s
|
||||
</div>
|
||||
|
||||
@@ -1,31 +1,30 @@
|
||||
appdirs==1.4.3
|
||||
coverage==4.4.1
|
||||
Django==1.11.7
|
||||
Django==1.11.4
|
||||
django-appconf==1.0.2
|
||||
django-autoslug==1.9.3
|
||||
django-compressor==2.2
|
||||
django-debug-toolbar==1.9.1
|
||||
django-debug-toolbar==1.8
|
||||
django-haystack==2.6.1
|
||||
django-ipware==1.1.6
|
||||
django-pagedown==0.1.3
|
||||
django-uuslug==1.1.8
|
||||
jieba==0.39
|
||||
jsonpickle==0.9.5
|
||||
markdown2==2.3.5
|
||||
mistune==0.8.1
|
||||
markdown2==2.3.4
|
||||
mistune==0.7.4
|
||||
olefile==0.44
|
||||
packaging==16.8
|
||||
Pillow==4.3.0
|
||||
Pillow==4.2.1
|
||||
Pygments==2.2.0
|
||||
PyMySQL==0.7.11
|
||||
pyparsing==2.2.0
|
||||
python-slugify==1.2.4
|
||||
pytz==2017.3
|
||||
pytz==2017.2
|
||||
rcssmin==1.0.6
|
||||
requests==2.18.4
|
||||
rjsmin==1.0.12
|
||||
six==1.11.0
|
||||
sqlparse==0.2.4
|
||||
six==1.10.0
|
||||
sqlparse==0.2.3
|
||||
Unidecode==0.4.21
|
||||
urllib3==1.22
|
||||
webencodings==0.5.1
|
||||
|
||||
@@ -216,11 +216,6 @@ OAHUTH = {
|
||||
'appkey': 'githubappkey',
|
||||
'appsecret': 'githubappsecret',
|
||||
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=github'
|
||||
},
|
||||
'facebook': {
|
||||
'appkey': 'facebookappkey',
|
||||
'appsecret': 'facebookappsecret',
|
||||
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=facebook'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user