Skip to content

Commit fc82293

Browse files
committed
修改signals
1 parent c1eea4e commit fc82293

File tree

6 files changed

+127
-97
lines changed

6 files changed

+127
-97
lines changed

DjangoBlog/blog_signals.py

+50-79
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,33 @@
1212
@file: blog_signals.py
1313
@time: 2017/8/12 上午10:18
1414
"""
15-
15+
import django
1616
import django.dispatch
1717
from django.dispatch import receiver
1818
from django.conf import settings
19-
from DjangoBlog.utils import cache, send_email, expire_view_cache, get_blog_setting
20-
from DjangoBlog.spider_notify import SpiderNotify
19+
from django.contrib.admin.models import LogEntry
2120
from django.contrib.sites.models import Site
22-
from oauth.models import OAuthUser
2321
from django.core.mail import EmailMultiAlternatives
22+
from django.db.models.signals import post_save
23+
from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
2424

25+
from DjangoBlog.utils import cache, send_email, expire_view_cache, get_blog_setting
26+
from DjangoBlog.spider_notify import SpiderNotify
27+
from oauth.models import OAuthUser
28+
from blog.models import Article, Category, Tag, Links, SideBar, BlogSettings
29+
from comments.models import Comment
30+
from comments.utils import send_comment_email
31+
import _thread
2532
import logging
2633

2734
logger = logging.getLogger(__name__)
2835

29-
comment_save_signal = django.dispatch.Signal(providing_args=["comment_id", "username", "serverport"])
30-
article_save_signal = django.dispatch.Signal(providing_args=['id', 'is_update_views'])
31-
user_login_logout_signal = django.dispatch.Signal(providing_args=['id', 'type'])
3236
oauth_user_login_signal = django.dispatch.Signal(providing_args=['id'])
3337
send_email_signal = django.dispatch.Signal(providing_args=['emailto', 'title', 'content'])
3438

3539

3640
@receiver(send_email_signal)
37-
def send_email_callback(sender, **kwargs):
41+
def send_email_signal_handler(sender, **kwargs):
3842
emailto = kwargs['emailto']
3943
title = kwargs['title']
4044
content = kwargs['content']
@@ -58,7 +62,7 @@ def send_email_callback(sender, **kwargs):
5862

5963

6064
@receiver(oauth_user_login_signal)
61-
def oauth_user_login_callback(sender, **kwargs):
65+
def oauth_user_login_signal_handler(sender, **kwargs):
6266
id = kwargs['id']
6367
oauthuser = OAuthUser.objects.get(id=id)
6468
setting = get_blog_setting()
@@ -68,79 +72,46 @@ def oauth_user_login_callback(sender, **kwargs):
6872
oauthuser.save()
6973

7074

71-
@receiver(article_save_signal)
72-
def article_save_callback(sender, **kwargs):
73-
id = kwargs['id']
74-
is_update_views = kwargs['is_update_views']
75-
type = sender.__name__
76-
obj = None
77-
from blog.models import Article, Category, Tag
78-
if type == 'Article':
79-
obj = Article.objects.get(id=id)
80-
elif type == 'Category':
81-
obj = Category.objects.get(id=id)
82-
elif type == 'Tag':
83-
obj = Tag.objects.get(id=id)
84-
if obj is not None:
75+
@receiver(post_save)
76+
def model_post_save_callback(sender, instance, created, raw, using, update_fields, **kwargs):
77+
clearcache = False
78+
if isinstance(instance, LogEntry):
79+
return
80+
if 'get_full_url' in dir(instance):
81+
is_update_views = update_fields == {'views'}
8582
if not settings.TESTING and not is_update_views:
8683
try:
87-
notify_url = obj.get_full_url()
84+
notify_url = instance.get_full_url()
8885
SpiderNotify.baidu_notify([notify_url])
8986
except Exception as ex:
9087
logger.error("notify sipder", ex)
91-
92-
from DjangoBlog.utils import cache
88+
if not is_update_views:
89+
clearcache = True
90+
if isinstance(instance, Comment):
91+
92+
path = instance.article.get_absolute_url()
93+
site = Site.objects.get_current().domain
94+
if site.find(':') > 0:
95+
site = site[0:site.find(':')]
96+
97+
expire_view_cache(path, servername=site, serverport=80, key_prefix='blogdetail')
98+
if cache.get('seo_processor'):
99+
cache.delete('seo_processor')
100+
comment_cache_key = 'article_comments_{id}'.format(id=instance.article.id)
101+
cache.delete(comment_cache_key)
102+
from django.core.cache.utils import make_template_fragment_key
103+
key = make_template_fragment_key('sidebar', [instance.author.username])
104+
logger.info('delete sidebar key:' + key)
105+
cache.delete(key)
106+
107+
_thread.start_new(send_comment_email, (instance,))
108+
109+
if clearcache:
110+
cache.clear()
111+
112+
113+
@receiver(user_logged_in)
114+
@receiver(user_logged_out)
115+
def user_auth_callback(sender, request, user, **kwargs):
116+
logger.info(user)
93117
cache.clear()
94-
95-
96-
@receiver(comment_save_signal)
97-
def comment_save_callback(sender, **kwargs):
98-
from comments.models import Comment
99-
100-
serverport = kwargs['serverport']
101-
username = kwargs['username']
102-
comment = Comment.objects.get(id=kwargs['comment_id'])
103-
site = Site.objects.get_current().domain
104-
article = comment.article
105-
# if not settings.DEBUG:
106-
if True:
107-
subject = '感谢您发表的评论'
108-
article_url = "https://{site}{path}".format(site=site, path=comment.article.get_absolute_url())
109-
html_content = """
110-
<p>非常感谢您在本站发表评论</p>
111-
您可以访问
112-
<a href="%s" rel="bookmark">%s</a>
113-
来查看您的评论,
114-
再次感谢您!
115-
<br />
116-
如果上面链接无法打开,请将此链接复制至浏览器。
117-
%s
118-
""" % (article_url, comment.article.title, article_url)
119-
tomail = comment.author.email
120-
send_email([tomail], subject, html_content)
121-
122-
if comment.parent_comment:
123-
html_content = """
124-
您在 <a href="%s" rel="bookmark">%s</a> 的评论 <br/> %s <br/> 收到回复啦.快去看看吧
125-
<br/>
126-
如果上面链接无法打开,请将此链接复制至浏览器。
127-
%s
128-
""" % (article_url, article.title, comment.parent_comment.body, article_url)
129-
tomail = comment.parent_comment.author.email
130-
send_email([tomail], subject, html_content)
131-
132-
path = article.get_absolute_url()
133-
site = Site.objects.get_current().domain
134-
if site.find(':') > 0:
135-
site = site[0:site.find(':')]
136-
137-
expire_view_cache(path, servername=site, serverport=serverport, key_prefix='blogdetail')
138-
if cache.get('seo_processor'):
139-
cache.delete('seo_processor')
140-
comment_cache_key = 'article_comments_{id}'.format(id=article.id)
141-
cache.delete(comment_cache_key)
142-
from django.core.cache.utils import make_template_fragment_key
143-
144-
key = make_template_fragment_key('sidebar', [username])
145-
logger.info('delete sidebar key:' + key)
146-
cache.delete(key)

blog/models.py

+18-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import logging
2+
from abc import ABCMeta, abstractmethod, abstractproperty
3+
14
from django.db import models
25
from django.urls import reverse
36
from django.conf import settings
47
from uuslug import slugify
5-
import logging
68
from django.core.exceptions import ValidationError
79
from django.utils.translation import gettext_lazy as _
810
from django.contrib.sites.models import Site
@@ -14,20 +16,21 @@
1416

1517

1618
class BaseModel(models.Model):
19+
id = models.AutoField(primary_key=True)
1720
created_time = models.DateTimeField('创建时间', default=now)
1821
last_mod_time = models.DateTimeField('修改时间', default=now)
1922

2023
def save(self, *args, **kwargs):
21-
from DjangoBlog.blog_signals import article_save_signal
22-
if not isinstance(self, Article):
23-
if not self.slug or self.slug == 'no-slug' or not self.id:
24-
slug = self.title if 'title' in self.__dict__ else self.name
25-
self.slug = slugify(slug)
24+
25+
if not isinstance(self, Article) and 'slug' in self.__dict__:
26+
if getattr(self, 'slug') == 'no-slug' or not self.id:
27+
slug = getattr(self, 'title') if 'title' in self.__dict__ else getattr(self, 'name')
28+
setattr(self, 'slug', slugify(slug))
2629
super().save(*args, **kwargs)
27-
# type = self.__class__.__name__
28-
is_update_views = 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][
29-
0] == 'views'
30-
article_save_signal.send(sender=self.__class__, is_update_views=is_update_views, id=self.id)
30+
# is_update_views = 'update_fields' in kwargs and len(kwargs['update_fields']) == 1 and kwargs['update_fields'][
31+
# 0] == 'views'
32+
# from DjangoBlog.blog_signals import article_save_signal
33+
# article_save_signal.send(sender=self.__class__, is_update_views=is_update_views, id=self.id)
3134

3235
def get_full_url(self):
3336
site = Site.objects.get_current().domain
@@ -37,6 +40,10 @@ def get_full_url(self):
3740
class Meta:
3841
abstract = True
3942

43+
@abstractmethod
44+
def get_absolute_url(self):
45+
pass
46+
4047

4148
class Article(BaseModel):
4249
"""文章"""
@@ -71,7 +78,7 @@ class Meta:
7178
ordering = ['-article_order', '-pub_time']
7279
verbose_name = "文章"
7380
verbose_name_plural = verbose_name
74-
get_latest_by = 'created_time'
81+
get_latest_by = 'id'
7582

7683
def get_absolute_url(self):
7784
return reverse('blog:detailbyid', kwargs={

blog/tests.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def test_validate_article(self):
2929
user.save()
3030
response = self.client.get(user.get_absolute_url())
3131
self.assertEqual(response.status_code, 200)
32-
32+
response = self.client.get('/admin/servermanager/emailsendlog/')
33+
response = self.client.get('admin/admin/logentry/')
3334
s = SideBar()
3435
s.sequence = 1
3536
s.name = 'test'
@@ -161,6 +162,9 @@ def test_image(self):
161162
rsp = self.client.post('/upload', form_data, follow=True)
162163

163164
self.assertEqual(rsp.status_code, 200)
165+
from DjangoBlog.utils import save_user_avatar, send_email
166+
send_email(['[email protected]'], 'testTitle', 'testContent')
167+
save_user_avatar('https://www.python.org/static/img/[email protected]')
164168
"""
165169
data = SimpleUploadedFile(imagepath, b'file_content', content_type='image/jpg')
166170
rsp = self.client.post('/upload', {'django.jpg': data})

comments/utils.py

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env python
2+
# encoding: utf-8
3+
4+
5+
"""
6+
@version: ??
7+
@author: liangliangyy
8+
@license: MIT Licence
9+
10+
@site: https://www.lylinux.net/
11+
@software: PyCharm
12+
@file: utils.py
13+
@time: 2018/10/8 10:24 PM
14+
"""
15+
16+
from DjangoBlog.utils import send_email
17+
from django.contrib.sites.models import Site
18+
import logging
19+
20+
logger = logging.getLogger(__name__)
21+
22+
23+
def send_comment_email(comment):
24+
site = Site.objects.get_current().domain
25+
subject = '感谢您发表的评论'
26+
article_url = "https://{site}{path}".format(site=site, path=comment.article.get_absolute_url())
27+
html_content = """
28+
<p>非常感谢您在本站发表评论</p>
29+
您可以访问
30+
<a href="%s" rel="bookmark">%s</a>
31+
来查看您的评论,
32+
再次感谢您!
33+
<br />
34+
如果上面链接无法打开,请将此链接复制至浏览器。
35+
%s
36+
""" % (article_url, comment.article.title, article_url)
37+
tomail = comment.author.email
38+
send_email([tomail], subject, html_content)
39+
try:
40+
if comment.parent_comment:
41+
html_content = """
42+
您在 <a href="%s" rel="bookmark">%s</a> 的评论 <br/> %s <br/> 收到回复啦.快去看看吧
43+
<br/>
44+
如果上面链接无法打开,请将此链接复制至浏览器。
45+
%s
46+
""" % (article_url, comment.article.title, comment.parent_comment.body, article_url)
47+
tomail = comment.parent_comment.author.email
48+
send_email([tomail], subject, html_content)
49+
except Exception as e:
50+
logger.error(e)

comments/views.py

-6
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,4 @@ def form_valid(self, form):
6262
comment.parent_comment = parent_comment
6363

6464
comment.save(True)
65-
66-
from DjangoBlog.blog_signals import comment_save_signal
67-
68-
port = self.request.get_port()
69-
username = self.request.user.username if self.request.user else ''
70-
comment_save_signal.send(sender=self.__class__, comment_id=comment.id, username=username, serverport=port)
7165
return HttpResponseRedirect("%s#div-comment-%d" % (article.get_absolute_url(), comment.pk))

owntracks/tests.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.test import Client, RequestFactory, TestCase
22
from .models import OwnTrackLog
33
from accounts.models import BlogUser
4+
from owntracks.views import convert_to_amap
45
import json
56

67

@@ -17,6 +18,7 @@ def test_own_track_log(self):
1718
'lat': 123.123,
1819
'lon': 134.341
1920
}
21+
2022
self.client.post('/owntracks/logtracks', json.dumps(o), content_type='application/json')
2123
length = len(OwnTrackLog.objects.all())
2224
self.assertEqual(length, 1)
@@ -25,6 +27,7 @@ def test_own_track_log(self):
2527
'tid': 12,
2628
'lat': 123.123
2729
}
30+
2831
self.client.post('/owntracks/logtracks', json.dumps(o), content_type='application/json')
2932
length = len(OwnTrackLog.objects.all())
3033
self.assertEqual(length, 1)
@@ -41,6 +44,7 @@ def test_own_track_log(self):
4144
s.lon = 123.234
4245
s.lat = 34.234
4346
s.save()
47+
convert_to_amap([s])
4448
rsp = self.client.get('/owntracks/show_dates')
4549
self.assertEqual(rsp.status_code, 200)
4650
rsp = self.client.get('/owntracks/show_maps')

0 commit comments

Comments
 (0)