Skip to content

Commit 99be726

Browse files
committed
Merge branch 'dev'
2 parents 2fe5faf + eb8e63a commit 99be726

27 files changed

+1432
-603
lines changed

DjangoBlog/settings.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
2020

2121
# SECURITY WARNING: keep the secret key used in production secret!
22-
SECRET_KEY = '&3g0bdza#c%dm1lf%5gi&0-*53p3t0m*hmcvo29cn^$ji7je(c'
22+
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
2323

2424
# SECURITY WARNING: don't run with debug turned on in production!
25-
#DEBUG = True
25+
# DEBUG = True
2626
DEBUG = False
2727

2828
# ALLOWED_HOSTS = []
29-
ALLOWED_HOSTS = ['www.lylinux.net', '127.0.0.1']
29+
ALLOWED_HOSTS = ['www.lylinux.net', '127.0.0.1', 'example.com']
3030
# Application definition
3131

3232
INSTALLED_APPS = [
@@ -51,9 +51,9 @@
5151
'django.middleware.security.SecurityMiddleware',
5252
'django.contrib.sessions.middleware.SessionMiddleware',
5353
'django.middleware.gzip.GZipMiddleware',
54-
#'django.middleware.cache.UpdateCacheMiddleware',
54+
# 'django.middleware.cache.UpdateCacheMiddleware',
5555
'django.middleware.common.CommonMiddleware',
56-
#'django.middleware.cache.FetchFromCacheMiddleware',
56+
# 'django.middleware.cache.FetchFromCacheMiddleware',
5757
'django.middleware.csrf.CsrfViewMiddleware',
5858
'django.contrib.auth.middleware.AuthenticationMiddleware',
5959
'django.contrib.messages.middleware.MessageMiddleware',
@@ -195,19 +195,24 @@
195195
CACHE_MIDDLEWARE_KEY_PREFIX = "djangoblog"
196196
CACHE_MIDDLEWARE_ALIAS = 'default'
197197

198-
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
199-
SESSION_CACHE_ALIAS = 'default'
198+
# SESSION_ENGINE = "django.contrib.sessions.backends.cache"
199+
# SESSION_CACHE_ALIAS = 'default'
200200

201201
OAHUTH = {
202202
'sina': {
203203
'appkey': '3161614143',
204204
'appsecret': 'ee17c099317f872eeddb25204ea46721',
205-
'callbackurl': 'http://www.lylinux.net/oauth/weibo'
205+
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=weibo'
206206
},
207207
'google': {
208208
'appkey': os.environ.get('GOOGLE_APP_KEY'),
209209
'appsecret': os.environ.get('GOOGLE_APP_SECRET'),
210-
'callbackurl': 'http://www.lylinux.net/oauth/googleauthorize'
210+
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=google'
211+
},
212+
'github': {
213+
'appkey': os.environ.get('GITHUB_APP_KEY'),
214+
'appsecret': os.environ.get('GITHUB_APP_SECRET'),
215+
'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=github'
211216
}
212217
}
213218

DjangoBlog/utils.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@
1919
from pygments.lexers import get_lexer_by_name
2020
from pygments.formatters import html
2121
import logging
22+
import _thread
23+
from django.core.mail import EmailMultiAlternatives
2224

2325
logger = logging.getLogger('djangoblog')
24-
from importlib import import_module
25-
from django.conf import settings
26-
27-
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
2826

2927

3028
def get_max_articleid_commentid():
@@ -120,3 +118,24 @@ def get_markdown(value):
120118

121119
mdp = mistune.Markdown(escape=True, renderer=renderer)
122120
return mdp(value)
121+
122+
123+
def send_email(subject, html_content, tomail):
124+
msg = EmailMultiAlternatives(subject, html_content, from_email='no-reply@lylinux.net', to=tomail)
125+
msg.content_subtype = "html"
126+
127+
def send_comment_email(msg):
128+
try:
129+
msg.send()
130+
except:
131+
print('send email error')
132+
pass
133+
134+
_thread.start_new_thread(send_comment_email, (msg,))
135+
136+
137+
def parse_dict_to_url(dict):
138+
from urllib.parse import quote
139+
url = '&'.join(['{}={}'.format(quote(k, safe='/'), quote(v, safe='/'))
140+
for k, v in dict.items()])
141+
return url

blog/admin.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,28 @@ class Meta:
1616

1717
class ArticlelAdmin(admin.ModelAdmin):
1818
form = ArticleForm
19+
list_display = ('id', 'title', 'author', 'created_time', 'views', 'status', 'type')
20+
list_display_links = ('id', 'title')
21+
list_filter = ('author', 'status', 'type', 'category', 'tags')
22+
filter_horizontal = ('tags',)
23+
exclude = ('slug', 'created_time')
1924

2025
def save_model(self, request, obj, form, change):
2126
super(ArticlelAdmin, self).save_model(request, obj, form, change)
2227
from DjangoBlog.utils import cache
2328
cache.clear()
2429

2530

31+
class TagAdmin(admin.ModelAdmin):
32+
exclude = ('slug',)
33+
34+
35+
class CategoryAdmin(admin.ModelAdmin):
36+
exclude = ('slug',)
37+
38+
2639
admin.site.register(Article, ArticlelAdmin)
2740
# admin.site.register(BlogPage, ArticlelAdmin)
28-
admin.site.register(Category)
29-
admin.site.register(Tag)
41+
admin.site.register(Category, CategoryAdmin)
42+
admin.site.register(Tag, TagAdmin)
3043
admin.site.register(Links)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/usr/bin/env python
2+
# encoding: utf-8
3+
4+
5+
"""
6+
@version: ??
7+
@author: liangliangyy
8+
@license: MIT Licence
9+
@contact: liangliangyy@gmail.com
10+
@site: https://www.lylinux.org/
11+
@software: PyCharm
12+
@file: create_testdata.py
13+
@time: 2017/3/11 上午1:58
14+
"""
15+
16+
from django.core.management.base import BaseCommand
17+
from blog.models import Article, Tag, Category
18+
from django.contrib.auth import get_user_model
19+
from django.core.exceptions import ObjectDoesNotExist
20+
import datetime
21+
22+
23+
class Command(BaseCommand):
24+
help = 'create test datas'
25+
26+
def handle(self, *args, **options):
27+
user = \
28+
get_user_model().objects.get_or_create(email='test@test.com', username='testuser',
29+
password='test!q@w#eTYU')[0]
30+
31+
pcategory = Category.objects.get_or_create(name='pcategory', parent_category=None)[0]
32+
33+
category = Category.objects.get_or_create(name='category', parent_category=pcategory)[0]
34+
35+
category.save()
36+
for i in range(1, 10):
37+
article = Article.objects.get_or_create(category=category,
38+
title='nice title ' + str(i),
39+
body='nice content ' + str(i),
40+
author=user
41+
)
42+
from DjangoBlog.utils import cache
43+
cache.clear()
44+
self.stdout.write(self.style.SUCCESS('created test datas \n'))

blog/models.py

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -141,70 +141,6 @@ def prev_article(self):
141141
return Article.objects.filter(id__lt=self.id, status='p').first()
142142

143143

144-
'''
145-
class BlogPage(models.Model):
146-
"""文章"""
147-
STATUS_CHOICES = (
148-
('d', '草稿'),
149-
('p', '发表'),
150-
)
151-
COMMENT_STATUS = (
152-
('o', '打开'),
153-
('c', '关闭'),
154-
)
155-
title = models.CharField('标题', max_length=200)
156-
body = models.TextField('正文')
157-
created_time = models.DateTimeField('创建时间', auto_now_add=True)
158-
last_mod_time = models.DateTimeField('修改时间', auto_now=True)
159-
pub_time = models.DateTimeField('发布时间', blank=True, null=True,
160-
help_text="不指定发布时间则视为草稿,可以指定未来时间,到时将自动发布。")
161-
status = models.CharField('文章状态', max_length=1, choices=STATUS_CHOICES, default='o')
162-
comment_status = models.CharField('评论状态', max_length=1, choices=COMMENT_STATUS)
163-
# summary = models.CharField('摘要', max_length=200, blank=True, help_text="可选,若为空将摘取正文的前300个字符。")
164-
views = models.PositiveIntegerField('浏览量', default=0)
165-
166-
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='作者', on_delete=models.CASCADE)
167-
slug = models.SlugField(default='no-slug', max_length=60, blank=True)
168-
169-
class Meta:
170-
ordering = ['-pub_time']
171-
verbose_name = "页面"
172-
verbose_name_plural = verbose_name
173-
174-
def __str__(self):
175-
return self.title
176-
177-
def get_absolute_url(self):
178-
return reverse('blog:pagedetail', kwargs=
179-
{
180-
'page_id': self.id,
181-
'year': self.created_time.year,
182-
'month': self.created_time.month,
183-
'day': self.created_time.day,
184-
'slug': self.slug
185-
})
186-
187-
def save(self, *args, **kwargs):
188-
# self.summary = self.summary or self.body[:settings.ARTICLE_SUB_LENGTH]
189-
if not self.slug or self.slug == 'no-slug' or not self.id:
190-
# Only set the slug when the object is created.
191-
self.slug = slugify(self.title)
192-
193-
super().save(*args, **kwargs)
194-
195-
def viewed(self):
196-
self.views += 1
197-
self.save(update_fields=['views'])
198-
199-
def comment_list(self):
200-
comments = self.comment_set.all()
201-
parent_comments = comments.filter(parent_comment=None)
202-
203-
def get_category_tree(self):
204-
return []
205-
'''
206-
207-
208144
class Category(BaseModel):
209145
"""文章分类"""
210146
name = models.CharField('分类名', max_length=30, unique=True)

blog/static/blog/css/nprogress.css

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/* Make clicks pass-through */
2+
#nprogress {
3+
pointer-events: none;
4+
}
5+
6+
#nprogress .bar {
7+
background: red;
8+
9+
position: fixed;
10+
z-index: 1031;
11+
top: 0;
12+
left: 0;
13+
14+
width: 100%;
15+
height: 2px;
16+
}
17+
18+
/* Fancy blur effect */
19+
#nprogress .peg {
20+
display: block;
21+
position: absolute;
22+
right: 0px;
23+
width: 100px;
24+
height: 100%;
25+
box-shadow: 0 0 10px #29d, 0 0 5px #29d;
26+
opacity: 1.0;
27+
28+
-webkit-transform: rotate(3deg) translate(0px, -4px);
29+
-ms-transform: rotate(3deg) translate(0px, -4px);
30+
transform: rotate(3deg) translate(0px, -4px);
31+
}
32+
33+
/* Remove these to get rid of the spinner */
34+
#nprogress .spinner {
35+
display: block;
36+
position: fixed;
37+
z-index: 1031;
38+
top: 15px;
39+
right: 15px;
40+
}
41+
42+
#nprogress .spinner-icon {
43+
width: 18px;
44+
height: 18px;
45+
box-sizing: border-box;
46+
47+
border: solid 2px transparent;
48+
border-top-color: red;
49+
border-left-color: red;
50+
border-radius: 50%;
51+
52+
-webkit-animation: nprogress-spinner 400ms linear infinite;
53+
animation: nprogress-spinner 400ms linear infinite;
54+
}
55+
56+
.nprogress-custom-parent {
57+
overflow: hidden;
58+
position: relative;
59+
}
60+
61+
.nprogress-custom-parent #nprogress .spinner,
62+
.nprogress-custom-parent #nprogress .bar {
63+
position: absolute;
64+
}
65+
66+
@-webkit-keyframes nprogress-spinner {
67+
0% { -webkit-transform: rotate(0deg); }
68+
100% { -webkit-transform: rotate(360deg); }
69+
}
70+
@keyframes nprogress-spinner {
71+
0% { transform: rotate(0deg); }
72+
100% { transform: rotate(360deg); }
73+
}
74+

0 commit comments

Comments
 (0)