forked from liangliangyy/DjangoBlog
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
892e03d
commit 4500c0b
Showing
13 changed files
with
426 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# Generated by Django 4.1.7 on 2023-03-02 07:14 | ||
|
||
import django.contrib.auth.models | ||
import django.contrib.auth.validators | ||
from django.db import migrations, models | ||
import django.utils.timezone | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
('auth', '0012_alter_user_first_name_max_length'), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='BlogUser', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('password', models.CharField(max_length=128, verbose_name='password')), | ||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), | ||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), | ||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), | ||
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), | ||
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), | ||
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), | ||
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), | ||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), | ||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), | ||
('nickname', models.CharField(blank=True, max_length=100, verbose_name='昵称')), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('source', models.CharField(blank=True, max_length=100, verbose_name='创建来源')), | ||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), | ||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), | ||
], | ||
options={ | ||
'verbose_name': '用户', | ||
'verbose_name_plural': '用户', | ||
'ordering': ['-id'], | ||
'get_latest_by': 'id', | ||
}, | ||
managers=[ | ||
('objects', django.contrib.auth.models.UserManager()), | ||
], | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,26 +1,38 @@ | ||
import requests | ||
from django.core.management.base import BaseCommand | ||
from django.template.context_processors import static | ||
from django.templatetags.static import static | ||
|
||
from djangoblog.utils import save_user_avatar | ||
from oauth.models import OAuthUser | ||
from oauth.oauthmanager import get_manager_by_type | ||
|
||
|
||
class Command(BaseCommand): | ||
help = 'sync user avatar' | ||
|
||
def test_picture(self, url): | ||
try: | ||
if requests.get(url, timeout=2).status_code == 200: | ||
return True | ||
except: | ||
pass | ||
|
||
def handle(self, *args, **options): | ||
static_url = static("avatar/") | ||
users = OAuthUser.objects.filter(picture__isnull=False).exclude( | ||
picture__istartswith=static_url).all() | ||
self.stdout.write('开始同步{count}个用户头像'.format(count=len(users))) | ||
static_url = static("../") | ||
users = OAuthUser.objects.filter(picture__isnull=False).all() | ||
self.stdout.write(f'开始同步{len(users)}个用户头像') | ||
for u in users: | ||
self.stdout.write('开始同步:{id}'.format(id=u.nikename)) | ||
self.stdout.write(f'开始同步:{u.nickname}') | ||
url = u.picture | ||
if self.test_picture(url): | ||
continue | ||
if url.startswith(static_url): | ||
manage = get_manager_by_type(u.type) | ||
url = manage.get_picture(u.metadata) | ||
url = save_user_avatar(url) | ||
if url: | ||
self.stdout.write( | ||
'结束同步:{id}.url:{url}'.format( | ||
id=u.nikename, url=url)) | ||
f'结束同步:{u.nickname}.url:{url}') | ||
u.picture = url | ||
u.save() | ||
self.stdout.write('结束同步') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
# Generated by Django 4.1.7 on 2023-03-02 07:14 | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
import django.utils.timezone | ||
import mdeditor.fields | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='BlogSettings', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('sitename', models.CharField(default='', max_length=200, verbose_name='网站名称')), | ||
('site_description', models.TextField(default='', max_length=1000, verbose_name='网站描述')), | ||
('site_seo_description', models.TextField(default='', max_length=1000, verbose_name='网站SEO描述')), | ||
('site_keywords', models.TextField(default='', max_length=1000, verbose_name='网站关键字')), | ||
('article_sub_length', models.IntegerField(default=300, verbose_name='文章摘要长度')), | ||
('sidebar_article_count', models.IntegerField(default=10, verbose_name='侧边栏文章数目')), | ||
('sidebar_comment_count', models.IntegerField(default=5, verbose_name='侧边栏评论数目')), | ||
('article_comment_count', models.IntegerField(default=5, verbose_name='文章页面默认显示评论数目')), | ||
('show_google_adsense', models.BooleanField(default=False, verbose_name='是否显示谷歌广告')), | ||
('google_adsense_codes', models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='广告内容')), | ||
('open_site_comment', models.BooleanField(default=True, verbose_name='是否打开网站评论功能')), | ||
('beiancode', models.CharField(blank=True, default='', max_length=2000, null=True, verbose_name='备案号')), | ||
('analyticscode', models.TextField(default='', max_length=1000, verbose_name='网站统计代码')), | ||
('show_gongan_code', models.BooleanField(default=False, verbose_name='是否显示公安备案号')), | ||
('gongan_beiancode', models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='公安备案号')), | ||
], | ||
options={ | ||
'verbose_name': '网站配置', | ||
'verbose_name_plural': '网站配置', | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='Links', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('name', models.CharField(max_length=30, unique=True, verbose_name='链接名称')), | ||
('link', models.URLField(verbose_name='链接地址')), | ||
('sequence', models.IntegerField(unique=True, verbose_name='排序')), | ||
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), | ||
('show_type', models.CharField(choices=[('i', '首页'), ('l', '列表页'), ('p', '文章页面'), ('a', '全站'), ('s', '友情链接页面')], default='i', max_length=1, verbose_name='显示类型')), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
], | ||
options={ | ||
'verbose_name': '友情链接', | ||
'verbose_name_plural': '友情链接', | ||
'ordering': ['sequence'], | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='SideBar', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('name', models.CharField(max_length=100, verbose_name='标题')), | ||
('content', models.TextField(verbose_name='内容')), | ||
('sequence', models.IntegerField(unique=True, verbose_name='排序')), | ||
('is_enable', models.BooleanField(default=True, verbose_name='是否启用')), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
], | ||
options={ | ||
'verbose_name': '侧边栏', | ||
'verbose_name_plural': '侧边栏', | ||
'ordering': ['sequence'], | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='Tag', | ||
fields=[ | ||
('id', models.AutoField(primary_key=True, serialize=False)), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('name', models.CharField(max_length=30, unique=True, verbose_name='标签名')), | ||
('slug', models.SlugField(blank=True, default='no-slug', max_length=60)), | ||
], | ||
options={ | ||
'verbose_name': '标签', | ||
'verbose_name_plural': '标签', | ||
'ordering': ['name'], | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='Category', | ||
fields=[ | ||
('id', models.AutoField(primary_key=True, serialize=False)), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('name', models.CharField(max_length=30, unique=True, verbose_name='分类名')), | ||
('slug', models.SlugField(blank=True, default='no-slug', max_length=60)), | ||
('index', models.IntegerField(default=0, verbose_name='权重排序-越大越靠前')), | ||
('parent_category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='父级分类')), | ||
], | ||
options={ | ||
'verbose_name': '分类', | ||
'verbose_name_plural': '分类', | ||
'ordering': ['-index'], | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='Article', | ||
fields=[ | ||
('id', models.AutoField(primary_key=True, serialize=False)), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('title', models.CharField(max_length=200, unique=True, verbose_name='标题')), | ||
('body', mdeditor.fields.MDTextField(verbose_name='正文')), | ||
('pub_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='发布时间')), | ||
('status', models.CharField(choices=[('d', '草稿'), ('p', '发表')], default='p', max_length=1, verbose_name='文章状态')), | ||
('comment_status', models.CharField(choices=[('o', '打开'), ('c', '关闭')], default='o', max_length=1, verbose_name='评论状态')), | ||
('type', models.CharField(choices=[('a', '文章'), ('p', '页面')], default='a', max_length=1, verbose_name='类型')), | ||
('views', models.PositiveIntegerField(default=0, verbose_name='浏览量')), | ||
('article_order', models.IntegerField(default=0, verbose_name='排序,数字越大越靠前')), | ||
('show_toc', models.BooleanField(default=False, verbose_name='是否显示toc目录')), | ||
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), | ||
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='分类')), | ||
('tags', models.ManyToManyField(blank=True, to='blog.tag', verbose_name='标签集合')), | ||
], | ||
options={ | ||
'verbose_name': '文章', | ||
'verbose_name_plural': '文章', | ||
'ordering': ['-article_order', '-pub_time'], | ||
'get_latest_by': 'id', | ||
}, | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# Generated by Django 4.1.7 on 2023-03-02 07:14 | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
import django.utils.timezone | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
('blog', '0001_initial'), | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='Comment', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('body', models.TextField(max_length=300, verbose_name='正文')), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), | ||
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')), | ||
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), | ||
('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')), | ||
], | ||
options={ | ||
'verbose_name': '评论', | ||
'verbose_name_plural': '评论', | ||
'ordering': ['-id'], | ||
'get_latest_by': 'id', | ||
}, | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# Generated by Django 4.1.7 on 2023-03-07 09:53 | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
import django.utils.timezone | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='OAuthConfig', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('type', models.CharField(choices=[('weibo', '微博'), ('google', '谷歌'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='类型')), | ||
('appkey', models.CharField(max_length=200, verbose_name='AppKey')), | ||
('appsecret', models.CharField(max_length=200, verbose_name='AppSecret')), | ||
('callback_url', models.CharField(default='http://www.baidu.com', max_length=200, verbose_name='回调地址')), | ||
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
], | ||
options={ | ||
'verbose_name': 'oauth配置', | ||
'verbose_name_plural': 'oauth配置', | ||
'ordering': ['-created_time'], | ||
}, | ||
), | ||
migrations.CreateModel( | ||
name='OAuthUser', | ||
fields=[ | ||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('openid', models.CharField(max_length=50)), | ||
('nickname', models.CharField(max_length=50, verbose_name='昵称')), | ||
('token', models.CharField(blank=True, max_length=150, null=True)), | ||
('picture', models.CharField(blank=True, max_length=350, null=True)), | ||
('type', models.CharField(max_length=50)), | ||
('email', models.CharField(blank=True, max_length=50, null=True)), | ||
('metadata', models.TextField(blank=True, null=True)), | ||
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), | ||
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), | ||
('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')), | ||
], | ||
options={ | ||
'verbose_name': 'oauth用户', | ||
'verbose_name_plural': 'oauth用户', | ||
'ordering': ['-created_time'], | ||
}, | ||
), | ||
] |
Oops, something went wrong.