diff --git a/DjangoBlog/blog_signals.py b/DjangoBlog/blog_signals.py index 061d9d9..7133a83 100644 --- a/DjangoBlog/blog_signals.py +++ b/DjangoBlog/blog_signals.py @@ -12,29 +12,33 @@ @file: blog_signals.py @time: 2017/8/12 上午10:18 """ - +import django import django.dispatch from django.dispatch import receiver from django.conf import settings -from DjangoBlog.utils import cache, send_email, expire_view_cache, get_blog_setting -from DjangoBlog.spider_notify import SpiderNotify +from django.contrib.admin.models import LogEntry from django.contrib.sites.models import Site -from oauth.models import OAuthUser from django.core.mail import EmailMultiAlternatives +from django.db.models.signals import post_save +from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed +from DjangoBlog.utils import cache, send_email, expire_view_cache, get_blog_setting +from DjangoBlog.spider_notify import SpiderNotify +from oauth.models import OAuthUser +from blog.models import Article, Category, Tag, Links, SideBar, BlogSettings +from comments.models import Comment +from comments.utils import send_comment_email +import _thread import logging logger = logging.getLogger(__name__) -comment_save_signal = django.dispatch.Signal(providing_args=["comment_id", "username", "serverport"]) -article_save_signal = django.dispatch.Signal(providing_args=['id', 'is_update_views']) -user_login_logout_signal = django.dispatch.Signal(providing_args=['id', 'type']) oauth_user_login_signal = django.dispatch.Signal(providing_args=['id']) send_email_signal = django.dispatch.Signal(providing_args=['emailto', 'title', 'content']) @receiver(send_email_signal) -def send_email_callback(sender, **kwargs): +def send_email_signal_handler(sender, **kwargs): emailto = kwargs['emailto'] title = kwargs['title'] content = kwargs['content'] @@ -58,7 +62,7 @@ def send_email_callback(sender, **kwargs): @receiver(oauth_user_login_signal) -def oauth_user_login_callback(sender, **kwargs): +def oauth_user_login_signal_handler(sender, **kwargs): id = kwargs['id'] oauthuser = OAuthUser.objects.get(id=id) setting = get_blog_setting() @@ -68,79 +72,46 @@ def oauth_user_login_callback(sender, **kwargs): oauthuser.save() -@receiver(article_save_signal) -def article_save_callback(sender, **kwargs): - id = kwargs['id'] - is_update_views = kwargs['is_update_views'] - type = sender.__name__ - obj = None - from blog.models import Article, Category, Tag - if type == 'Article': - obj = Article.objects.get(id=id) - elif type == 'Category': - obj = Category.objects.get(id=id) - elif type == 'Tag': - obj = Tag.objects.get(id=id) - if obj is not None: +@receiver(post_save) +def model_post_save_callback(sender, instance, created, raw, using, update_fields, **kwargs): + clearcache = False + if isinstance(instance, LogEntry): + return + if 'get_full_url' in dir(instance): + is_update_views = update_fields == {'views'} if not settings.TESTING and not is_update_views: try: - notify_url = obj.get_full_url() + notify_url = instance.get_full_url() SpiderNotify.baidu_notify([notify_url]) except Exception as ex: logger.error("notify sipder", ex) - - from DjangoBlog.utils import cache + if not is_update_views: + clearcache = True + if isinstance(instance, Comment): + + path = instance.article.get_absolute_url() + site = Site.objects.get_current().domain + if site.find(':') > 0: + site = site[0:site.find(':')] + + expire_view_cache(path, servername=site, serverport=80, key_prefix='blogdetail') + if cache.get('seo_processor'): + cache.delete('seo_processor') + comment_cache_key = 'article_comments_{id}'.format(id=instance.article.id) + cache.delete(comment_cache_key) + from django.core.cache.utils import make_template_fragment_key + key = make_template_fragment_key('sidebar', [instance.author.username]) + logger.info('delete sidebar key:' + key) + cache.delete(key) + + _thread.start_new(send_comment_email, (instance,)) + + if clearcache: + cache.clear() + + +@receiver(user_logged_in) +@receiver(user_logged_out) +def user_auth_callback(sender, request, user, **kwargs): + logger.info(user) cache.clear() - - -@receiver(comment_save_signal) -def comment_save_callback(sender, **kwargs): - from comments.models import Comment - - serverport = kwargs['serverport'] - username = kwargs['username'] - comment = Comment.objects.get(id=kwargs['comment_id']) - site = Site.objects.get_current().domain - article = comment.article - # if not settings.DEBUG: - if True: - subject = '感谢您发表的评论' - article_url = "https://{site}{path}".format(site=site, path=comment.article.get_absolute_url()) - html_content = """ -

非常感谢您在本站发表评论

- 您可以访问 - %s - 来查看您的评论, - 再次感谢您! -
- 如果上面链接无法打开,请将此链接复制至浏览器。 - %s - """ % (article_url, comment.article.title, article_url) - tomail = comment.author.email - send_email([tomail], subject, html_content) - - if comment.parent_comment: - html_content = """ - 您在 %s 的评论
%s
收到回复啦.快去看看吧 -
- 如果上面链接无法打开,请将此链接复制至浏览器。 - %s - """ % (article_url, article.title, comment.parent_comment.body, article_url) - tomail = comment.parent_comment.author.email - send_email([tomail], subject, html_content) - - path = article.get_absolute_url() - site = Site.objects.get_current().domain - if site.find(':') > 0: - site = site[0:site.find(':')] - - expire_view_cache(path, servername=site, serverport=serverport, key_prefix='blogdetail') - if cache.get('seo_processor'): - cache.delete('seo_processor') - 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 - - key = make_template_fragment_key('sidebar', [username]) - logger.info('delete sidebar key:' + key) - cache.delete(key) diff --git a/blog/models.py b/blog/models.py index 9bab31e..16957d8 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,8 +1,10 @@ +import logging +from abc import ABCMeta, abstractmethod, abstractproperty + from django.db import models from django.urls import reverse from django.conf import settings from uuslug import slugify -import logging from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from django.contrib.sites.models import Site @@ -14,20 +16,21 @@ logger = logging.getLogger(__name__) class BaseModel(models.Model): + id = models.AutoField(primary_key=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 - if not isinstance(self, Article): - if not self.slug or self.slug == 'no-slug' or not self.id: - slug = self.title if 'title' in self.__dict__ else self.name - self.slug = slugify(slug) + + if not isinstance(self, Article) and 'slug' in self.__dict__: + if getattr(self, 'slug') == 'no-slug' or not self.id: + slug = getattr(self, 'title') if 'title' in self.__dict__ else getattr(self, 'name') + setattr(self, 'slug', slugify(slug)) 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' - article_save_signal.send(sender=self.__class__, is_update_views=is_update_views, id=self.id) + # is_update_views = 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][ + # 0] == 'views' + # from DjangoBlog.blog_signals import article_save_signal + # article_save_signal.send(sender=self.__class__, is_update_views=is_update_views, id=self.id) def get_full_url(self): site = Site.objects.get_current().domain @@ -37,6 +40,10 @@ class BaseModel(models.Model): class Meta: abstract = True + @abstractmethod + def get_absolute_url(self): + pass + class Article(BaseModel): """文章""" @@ -71,7 +78,7 @@ class Article(BaseModel): ordering = ['-article_order', '-pub_time'] verbose_name = "文章" verbose_name_plural = verbose_name - get_latest_by = 'created_time' + get_latest_by = 'id' def get_absolute_url(self): return reverse('blog:detailbyid', kwargs={ diff --git a/blog/tests.py b/blog/tests.py index c328df6..1a7ce34 100644 --- a/blog/tests.py +++ b/blog/tests.py @@ -29,7 +29,8 @@ class ArticleTest(TestCase): user.save() response = self.client.get(user.get_absolute_url()) self.assertEqual(response.status_code, 200) - + response = self.client.get('/admin/servermanager/emailsendlog/') + response = self.client.get('admin/admin/logentry/') s = SideBar() s.sequence = 1 s.name = 'test' @@ -161,6 +162,9 @@ class ArticleTest(TestCase): rsp = self.client.post('/upload', form_data, follow=True) self.assertEqual(rsp.status_code, 200) + from DjangoBlog.utils import save_user_avatar, send_email + send_email(['qq@qq.com'], 'testTitle', 'testContent') + save_user_avatar('https://www.python.org/static/img/python-logo@2x.png') """ data = SimpleUploadedFile(imagepath, b'file_content', content_type='image/jpg') rsp = self.client.post('/upload', {'django.jpg': data}) diff --git a/comments/utils.py b/comments/utils.py new file mode 100644 index 0000000..ca667f9 --- /dev/null +++ b/comments/utils.py @@ -0,0 +1,50 @@ +#!/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: utils.py +@time: 2018/10/8 10:24 PM +""" + +from DjangoBlog.utils import send_email +from django.contrib.sites.models import Site +import logging + +logger = logging.getLogger(__name__) + + +def send_comment_email(comment): + site = Site.objects.get_current().domain + subject = '感谢您发表的评论' + article_url = "https://{site}{path}".format(site=site, path=comment.article.get_absolute_url()) + html_content = """ +

非常感谢您在本站发表评论

+ 您可以访问 + %s + 来查看您的评论, + 再次感谢您! +
+ 如果上面链接无法打开,请将此链接复制至浏览器。 + %s + """ % (article_url, comment.article.title, article_url) + tomail = comment.author.email + send_email([tomail], subject, html_content) + try: + if comment.parent_comment: + html_content = """ + 您在 %s 的评论
%s
收到回复啦.快去看看吧 +
+ 如果上面链接无法打开,请将此链接复制至浏览器。 + %s + """ % (article_url, comment.article.title, comment.parent_comment.body, article_url) + tomail = comment.parent_comment.author.email + send_email([tomail], subject, html_content) + except Exception as e: + logger.error(e) diff --git a/comments/views.py b/comments/views.py index a25ecad..21b4955 100644 --- a/comments/views.py +++ b/comments/views.py @@ -62,10 +62,4 @@ class CommentPostView(FormView): comment.parent_comment = parent_comment comment.save(True) - - from DjangoBlog.blog_signals import comment_save_signal - - port = self.request.get_port() - username = self.request.user.username if self.request.user else '' - comment_save_signal.send(sender=self.__class__, comment_id=comment.id, username=username, serverport=port) return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk)) diff --git a/owntracks/tests.py b/owntracks/tests.py index cb850fd..b5c4950 100644 --- a/owntracks/tests.py +++ b/owntracks/tests.py @@ -1,6 +1,7 @@ from django.test import Client, RequestFactory, TestCase from .models import OwnTrackLog from accounts.models import BlogUser +from owntracks.views import convert_to_amap import json @@ -17,6 +18,7 @@ class OwnTrackLogTest(TestCase): 'lat': 123.123, 'lon': 134.341 } + self.client.post('/owntracks/logtracks', json.dumps(o), content_type='application/json') length = len(OwnTrackLog.objects.all()) self.assertEqual(length, 1) @@ -25,6 +27,7 @@ class OwnTrackLogTest(TestCase): 'tid': 12, 'lat': 123.123 } + self.client.post('/owntracks/logtracks', json.dumps(o), content_type='application/json') length = len(OwnTrackLog.objects.all()) self.assertEqual(length, 1) @@ -41,6 +44,7 @@ class OwnTrackLogTest(TestCase): s.lon = 123.234 s.lat = 34.234 s.save() + convert_to_amap([s]) rsp = self.client.get('/owntracks/show_dates') self.assertEqual(rsp.status_code, 200) rsp = self.client.get('/owntracks/show_maps')