diff --git a/DjangoBlog/feeds.py b/DjangoBlog/feeds.py index 32606b8..4bda173 100644 --- a/DjangoBlog/feeds.py +++ b/DjangoBlog/feeds.py @@ -17,7 +17,7 @@ from django.contrib.syndication.views import Feed from blog.models import Article from django.conf import settings from django.utils.feedgenerator import Rss201rev2Feed -from DjangoBlog.utils import common_markdown +from DjangoBlog.utils import CommonMarkdown from django.contrib.auth import get_user_model from django.contrib.auth.models import User from django.contrib.sites.models import Site @@ -44,7 +44,7 @@ class DjangoBlogFeed(Feed): return item.title def item_description(self, item): - return common_markdown.get_markdown(item.body) + return CommonMarkdown.get_markdown(item.body) def feed_copyright(self): # print(Site.objects.get_current().name) diff --git a/DjangoBlog/sitemap.py b/DjangoBlog/sitemap.py index 6c712e8..ae7d3db 100644 --- a/DjangoBlog/sitemap.py +++ b/DjangoBlog/sitemap.py @@ -19,6 +19,7 @@ from accounts.models import BlogUser from django.contrib.sitemaps import GenericSitemap from django.core.urlresolvers import reverse + class StaticViewSitemap(Sitemap): priority = 0.5 changefreq = 'daily' diff --git a/DjangoBlog/spider_notify.py b/DjangoBlog/spider_notify.py index cb47fdf..ca5fb64 100644 --- a/DjangoBlog/spider_notify.py +++ b/DjangoBlog/spider_notify.py @@ -18,7 +18,7 @@ import requests from django.conf import settings -class spider_notify(): +class SpiderNotify(): @staticmethod def baidu_notify(urls): try: @@ -38,5 +38,5 @@ class spider_notify(): @staticmethod def notify(self, url): - spider_notify.baidu_notify(url) - spider_notify.__google_notify() + SpiderNotify.baidu_notify(url) + SpiderNotify.__google_notify() diff --git a/DjangoBlog/utils.py b/DjangoBlog/utils.py index 4326680..1b25fad 100644 --- a/DjangoBlog/utils.py +++ b/DjangoBlog/utils.py @@ -111,7 +111,7 @@ class BlogMarkDownRenderer(mistune.Renderer): return block_code(text, lang, inlinestyles, linenos) -class common_markdown(): +class CommonMarkdown(): @staticmethod def get_markdown(value): renderer = BlogMarkDownRenderer(inlinestyles=False) diff --git a/accounts/forms.py b/accounts/forms.py index ea25357..bde2e3e 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -22,7 +22,8 @@ class LoginForm(AuthenticationForm): def __init__(self, *args, **kwargs): super(LoginForm, self).__init__(*args, **kwargs) self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"}) - self.fields['password'].widget = widgets.PasswordInput(attrs={'placeholder': "password", "class": "form-control"}) + self.fields['password'].widget = widgets.PasswordInput( + attrs={'placeholder': "password", "class": "form-control"}) class RegisterForm(UserCreationForm): @@ -31,8 +32,10 @@ class RegisterForm(UserCreationForm): self.fields['username'].widget = widgets.TextInput(attrs={'placeholder': "username", "class": "form-control"}) self.fields['email'].widget = widgets.EmailInput(attrs={'placeholder': "email", "class": "form-control"}) - self.fields['password1'].widget = widgets.PasswordInput(attrs={'placeholder': "password", "class": "form-control"}) - self.fields['password2'].widget = widgets.PasswordInput(attrs={'placeholder': "repeat password", "class": "form-control"}) + self.fields['password1'].widget = widgets.PasswordInput( + attrs={'placeholder': "password", "class": "form-control"}) + self.fields['password2'].widget = widgets.PasswordInput( + attrs={'placeholder': "repeat password", "class": "form-control"}) class Meta: model = get_user_model() diff --git a/accounts/models.py b/accounts/models.py index a731eaa..e156199 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -3,19 +3,8 @@ from django.contrib.auth.models import AbstractUser, BaseUserManager from django.core.urlresolvers import reverse from django.contrib.sites.models import Site -# Create your models here. - -""" -class BlogUserManager(BaseUserManager): - def create_user(self, email, username, password=None): - user = self.model( - username=username, email=email, nickname=username - ) - user.set_password(password) - user.save(using=self._db) - return user -""" +# Create your models here. class BlogUser(AbstractUser): nickname = models.CharField('昵称', max_length=50, blank=True) diff --git a/accounts/views.py b/accounts/views.py index f5c16d6..6f5cca0 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -63,7 +63,7 @@ class LoginView(FormView): if form.is_valid(): from DjangoBlog.utils import cache - if cache != None: + if cache and cache is not None: cache.clear() auth.login(self.request, form.get_user()) diff --git a/blog/management/commands/ping_baidu.py b/blog/management/commands/ping_baidu.py index 2a99ac6..6ab51b7 100644 --- a/blog/management/commands/ping_baidu.py +++ b/blog/management/commands/ping_baidu.py @@ -15,7 +15,7 @@ from django.core.management.base import BaseCommand, CommandError from blog.models import Article, Tag, Category -from DjangoBlog.spider_notify import spider_notify +from DjangoBlog.spider_notify import SpiderNotify from django.contrib.sites.models import Site site = Site.objects.get_current().domain @@ -50,5 +50,5 @@ class Command(BaseCommand): urls.append(self.get_full_url(url)) self.stdout.write(self.style.SUCCESS('start notify %d urls' % len(urls))) - spider_notify.baidu_notify(urls) + SpiderNotify.baidu_notify(urls) self.stdout.write(self.style.SUCCESS('finish notify')) diff --git a/blog/models.py b/blog/models.py index 169df92..bb570b4 100644 --- a/blog/models.py +++ b/blog/models.py @@ -2,7 +2,7 @@ from django.db import models from django.core.urlresolvers import reverse from django.conf import settings from uuslug import slugify -from DjangoBlog.spider_notify import spider_notify +from DjangoBlog.spider_notify import SpiderNotify from django.contrib.sites.models import Site from DjangoBlog.utils import cache_decorator, logger, cache from django.utils.functional import cached_property @@ -22,7 +22,7 @@ class BaseModel(models.Model): return try: notify_url = self.get_full_url() - spider_notify.baidu_notify([notify_url]) + SpiderNotify.baidu_notify([notify_url]) except Exception as ex: logger.error("notify sipder", ex) print(ex) @@ -75,8 +75,7 @@ class Article(BaseModel): def get_absolute_url(self): - return reverse('blog:detail', kwargs= - { + return reverse('blog:detail', kwargs={ 'article_id': self.id, 'year': self.created_time.year, 'month': self.created_time.month, @@ -86,14 +85,9 @@ class Article(BaseModel): @cache_decorator(60 * 60 * 10) def get_category_tree(self): - names = [] + tree = self.category.get_category_tree() + names = list(map(lambda c: (c.name, c.get_absolute_url()), tree)) - def parse(category): - names.append((category.name, category.get_absolute_url())) - if category.parent_category: - parse(category.parent_category) - - parse(self.category) return names def save(self, *args, **kwargs): @@ -159,6 +153,43 @@ class Category(BaseModel): def __str__(self): return self.name + @cache_decorator(60 * 60 * 10) + def get_category_tree(self): + """ + 递归获得分类目录的父级 + :return: + """ + categorys = [] + + def parse(category): + categorys.append(category) + if category.parent_category: + parse(category.parent_category) + + parse(self) + return categorys + + @cache_decorator(60 * 60 * 10) + def get_sub_categorys(self): + """ + 获得当前分类目录所有子集 + :return: + """ + categorys = [] + all_categorys = Category.objects.all() + + def parse(category): + if category not in categorys: + categorys.append(category) + childs = all_categorys.filter(parent_category=category) + for child in childs: + if category not in categorys: + categorys.append(child) + parse(child) + + parse(self) + return categorys + class Tag(BaseModel): """文章标签""" diff --git a/blog/search_indexes.py b/blog/search_indexes.py index f32ec4c..2cf3a67 100644 --- a/blog/search_indexes.py +++ b/blog/search_indexes.py @@ -21,7 +21,6 @@ class ArticleIndex(indexes.SearchIndex, indexes.Indexable): # title = indexes.CharField(document=True, use_template=True) text = indexes.CharField(document=True, use_template=True) - def get_model(self): return Article diff --git a/blog/templatetags/blog_tags.py b/blog/templatetags/blog_tags.py index ffd21a0..c06a596 100644 --- a/blog/templatetags/blog_tags.py +++ b/blog/templatetags/blog_tags.py @@ -51,8 +51,8 @@ def datetimeformat(data): @register.filter(is_safe=True) @stringfilter def custom_markdown(content): - from DjangoBlog.utils import common_markdown - return mark_safe(common_markdown.get_markdown(content)) + from DjangoBlog.utils import CommonMarkdown + return mark_safe(CommonMarkdown.get_markdown(content)) @register.filter(is_safe=True) @@ -228,7 +228,7 @@ def gravatar_url(email, size=40): """获得gravatar头像""" email = email.encode('utf-8') - default = "https://avatar.duoshuo.com/avatar-50/928/120117.jpg".encode('utf-8') + default = "https://resource.lylinux.net/image/2017/03/26/120117.jpg".encode('utf-8') return "https://www.gravatar.com/avatar/%s?%s" % ( hashlib.md5(email.lower()).hexdigest(), urllib.parse.urlencode({'d': default, 's': str(size)})) @@ -253,38 +253,3 @@ def query(qs, **kwargs): """ return qs.filter(**kwargs) - -""" -article = Article.objects.get(pk=4) -comments = Comment.objects.filter(article=article) -for c in comments.filter(parent_comment=None): - datas = parse_commenttree(comments, c) - print(datas) -""" -""" -@register.tag -def parseCategoryName(parser,token): - tag_name, category = token.split_contents() - print(category) - print(tag_name) - return CategoryNametag(category) - -class CategoryNametag(template.Node): - def __init__(self,category): - self.category=category - self.names=[] - - - def parseCategory(self,category): - self.names.append(category.name) - if category.parent_category: - self.parseCategory(category.parent_category) - - - def render(self, context): - self.parseCategory(self.category) - print(self.names) - return " > ".join(self.names) - - #if self.category.parent_category: -""" diff --git a/blog/tests.py b/blog/tests.py index 95b54fa..fe4ba79 100644 --- a/blog/tests.py +++ b/blog/tests.py @@ -42,4 +42,4 @@ class ArticleTest(TestCase): article.status = 'p' article.save() response = self.client.get(article.get_absolute_url()) - self.assertEqual(response.status_code, 200) \ No newline at end of file + self.assertEqual(response.status_code, 200) diff --git a/blog/views.py b/blog/views.py index 067b0cb..1949d30 100644 --- a/blog/views.py +++ b/blog/views.py @@ -123,7 +123,7 @@ class ArticleDetailView(DetailView): kwargs['form'] = comment_form kwargs['article_comments'] = article_comments - kwargs['comment_count'] = len(article_comments) if article_comments else 0; + kwargs['comment_count'] = len(article_comments) if article_comments else 0 kwargs['next_article'] = self.object.next_article kwargs['prev_article'] = self.object.prev_article @@ -137,9 +137,13 @@ class CategoryDetailView(ArticleListView): def get_queryset_data(self): slug = self.kwargs['category_name'] category = get_object_or_404(Category, slug=slug) + categoryname = category.name self.categoryname = categoryname - article_list = Article.objects.filter(category__name=categoryname, status='p') + categorynames = list(map(lambda c: c.name, category.get_sub_categorys())) + print(categorynames) + # article_list = Article.objects.filter(category__name=categoryname, status='p') + article_list = Article.objects.filter(category__name__in=categorynames, status='p') return article_list def get_queryset_cache_key(self): @@ -247,28 +251,11 @@ def refresh_memcache(request): if request.user.is_superuser: from DjangoBlog.utils import cache - if cache != None: cache.clear() + if cache and cache is not None: + cache.clear() return HttpResponse("ok") else: from django.http import HttpResponseForbidden return HttpResponseForbidden() except Exception as e: - return HttpResponse(e); - - -""" -class SeoProcessor(): - __metaclass__ = ABCMeta - - @abstractmethod - def get_title(self): - pass - - @abstractmethod - def get_keywords(self): - pass - - @abstractmethod - def get_description(self): - pass -""" + return HttpResponse(e) diff --git a/comments/models.py b/comments/models.py index 6877eef..db7b89c 100644 --- a/comments/models.py +++ b/comments/models.py @@ -1,10 +1,10 @@ from django.db import models from django.conf import settings from django.core.mail import send_mail -from blog.models import Article from django.core.mail import EmailMultiAlternatives from django.contrib.sites.models import Site import _thread +from blog.models import Article from DjangoBlog.utils import cache diff --git a/comments/templatetags/comments_tags.py b/comments/templatetags/comments_tags.py index e23ec80..148d9cf 100644 --- a/comments/templatetags/comments_tags.py +++ b/comments/templatetags/comments_tags.py @@ -30,7 +30,6 @@ def parse_commenttree(commentlist, comment): datas = [] def parse(c): - childs = commentlist.filter(parent_comment=c) for child in childs: datas.append(child) @@ -43,31 +42,8 @@ def parse_commenttree(commentlist, comment): @register.inclusion_tag('comments/tags/comment_item.html') def show_comment_item(comment, ischild): """评论""" - depth = 1 if ischild else 2; + depth = 1 if ischild else 2 return { 'comment_item': comment, 'depth': depth } - - -""" -@register.simple_tag(name='get_comment_count') -def GetCommentCount(parser, token): - commentcount = Comment.objects.filter(article__author_id=token).count() - return "0" if commentcount == 0 else str(commentcount) + " comments" - - - -@register.inclusion_tag('comments/tags/post_comment.html') -def load_post_comment(article, lastform=None): - if not lastform: - form = CommentForm() - form.article_id = article.id - form.parent_comment_id = '' - else: - form = lastform - return { - 'article': article, - 'form': form - } -""" diff --git a/comments/tests.py b/comments/tests.py index c2629a3..7ce503c 100644 --- a/comments/tests.py +++ b/comments/tests.py @@ -1,3 +1,3 @@ from django.test import TestCase -# Create your tests here. \ No newline at end of file +# Create your tests here. diff --git a/comments/views.py b/comments/views.py index 787f397..863209e 100644 --- a/comments/views.py +++ b/comments/views.py @@ -74,7 +74,7 @@ class CommentPostView(FormView): comment_cache_key = 'article_comments_{id}'.format(id=article_id) cache.delete(comment_cache_key) from django.core.cache.utils import make_template_fragment_key - username = self.request.user.username if self.request.user else '' + username = self.request.user.username if self.request.user else '' key = make_template_fragment_key('sidebar', [username]) cache.delete(key) return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk)) diff --git a/oauth/admin.py b/oauth/admin.py index 8c38f3f..9d73829 100644 --- a/oauth/admin.py +++ b/oauth/admin.py @@ -1,3 +1,22 @@ from django.contrib import admin # Register your models here. +from .models import OAuthUser + + +class OAuthUserAdmin(admin.ModelAdmin): + list_display = ('id', 'author', 'nikename', 'type', 'picture', 'email',) + list_display_links = ('id', 'nikename') + list_filter = ('author', 'type',) + + +admin.site.register(OAuthUser, OAuthUserAdmin) +""" +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) + 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) +""" diff --git a/oauth/models.py b/oauth/models.py index 33ec0da..a2ddfff 100644 --- a/oauth/models.py +++ b/oauth/models.py @@ -15,3 +15,7 @@ class OAuthUser(models.Model): def __str__(self): return self.nikename + + class Meta: + verbose_name = 'oauth用户' + verbose_name_plural = verbose_name diff --git a/oauth/oauthmanager.py b/oauth/oauthmanager.py index f9f9d71..45eb773 100644 --- a/oauth/oauthmanager.py +++ b/oauth/oauthmanager.py @@ -38,11 +38,11 @@ class BaseOauthManager(metaclass=ABCMeta): @property def is_access_token_set(self): - return self.access_token != None + return self.access_token is not None @property def is_authorized(self): - return self.is_access_token_set and self.access_token != None and self.openid != None + return self.is_access_token_set and self.access_token is not None and self.openid is not None @abstractmethod def get_authorization_url(self): diff --git a/oauth/views.py b/oauth/views.py index ebaff64..cef4b15 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -15,7 +15,7 @@ from DjangoBlog.utils import send_email, get_md5 from django.contrib.sites.models import Site from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponseForbidden -from .oauthmanager import WBOauthManager, GoogleOauthManager, get_manager_by_type +from .oauthmanager import get_manager_by_type def authorize(request): @@ -54,15 +54,14 @@ def authorize(request): if not email: # todo # 未避免用户名重复,暂时使用oauth用户名+openid这种方式来创建用户 - #author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0] - #user.author = author + # author = get_user_model().objects.get_or_create(username=user.nikename + '_' + str(user.openid))[0] + # user.author = author user.save() - url = reverse('oauth:require_email', kwargs= - { + url = reverse('oauth:require_email', kwargs={ 'oauthid': user.id }) - print(url) + return HttpResponseRedirect(url) @@ -138,7 +137,7 @@ class RequireEmailView(FormView): 'sign': sign }) url = "http://{site}{path}".format(site=site, path=path) - print(url) + content = """
请点击下面链接绑定您的邮箱
@@ -151,56 +150,3 @@ class RequireEmailView(FormView): """.format(url=url) send_email('绑定您的电子邮箱', content, [email, ]) return HttpResponseRedirect('/') - - -""" -def wbauthorize(request, sitename): - manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'], - client_secret=settings.OAHUTH['sina']['appsecret'], - callback_url=settings.OAHUTH['sina']['callbackurl']) - code = request.GET.get('code', None) - rsp = manager.get_access_token_by_code(code) - print(rsp) - return HttpResponse(rsp) - - -def wboauthurl(request): - manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'], - client_secret=settings.OAHUTH['sina']['appsecret'], - callback_url=settings.OAHUTH['sina']['callbackurl']) - url = manager.get_authorization_url() - return HttpResponse(url) - - -def googleoauthurl(request): - manager = GoogleOauthManager() - url = manager.get_authorization_url() - return HttpResponse(url) - - -def googleauthorize(request): - manager = GoogleOauthManager() - code = request.GET.get('code', None) - rsp = manager.get_access_token_by_code(code) - if not rsp: - return HttpResponseRedirect(manager.get_authorization_url()) - user = manager.get_oauth_userinfo() - if user: - email = user['email'] - if email: - author = get_user_model().objects.get(email=email) - if not author: - author = get_user_model().objects.create_user(username=user["name"], email=email) - if not GoogleUserInfo.objects.filter(author_id=author.pk): - userinfo = GoogleUserInfo() - userinfo.author = author - userinfo.picture = user["picture"] - userinfo.token = manager.access_token - userinfo.openid = manager.openid - userinfo.nikename = user["name"] - userinfo.save() - login(request, author) - else: - pass - return HttpResponseRedirect('/') -""" diff --git a/templates/blog/tags/article_info.html b/templates/blog/tags/article_info.html index 38718e4..e894313 100644 --- a/templates/blog/tags/article_info.html +++ b/templates/blog/tags/article_info.html @@ -1,6 +1,6 @@ {% load blog_tags %}