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')