diff --git a/.idea/DjangoBlog-gst_branch.iml b/.idea/DjangoBlog-gst_branch.iml new file mode 100644 index 00000000..6275760a --- /dev/null +++ b/.idea/DjangoBlog-gst_branch.iml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index db8786c0..19a75bd1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 3d4e23c6..c308e83b 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddf..94a25f7f 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/DjangoBlog-master/.idea/.gitignore b/djangoblog/.idea/.gitignore similarity index 100% rename from src/DjangoBlog-master/.idea/.gitignore rename to djangoblog/.idea/.gitignore diff --git a/src/DjangoBlog-master/.idea/inspectionProfiles/profiles_settings.xml b/djangoblog/.idea/inspectionProfiles/profiles_settings.xml similarity index 100% rename from src/DjangoBlog-master/.idea/inspectionProfiles/profiles_settings.xml rename to djangoblog/.idea/inspectionProfiles/profiles_settings.xml diff --git a/djangoblog/.idea/misc.xml b/djangoblog/.idea/misc.xml new file mode 100644 index 00000000..db8786c0 --- /dev/null +++ b/djangoblog/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/djangoblog/.idea/modules.xml b/djangoblog/.idea/modules.xml new file mode 100644 index 00000000..3d4e23c6 --- /dev/null +++ b/djangoblog/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/djangoblog/.idea/vcs.xml b/djangoblog/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/djangoblog/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/zyl_django.iml b/djangoblog/.idea/zyl_django.iml similarity index 100% rename from .idea/zyl_django.iml rename to djangoblog/.idea/zyl_django.iml diff --git a/README.md b/djangoblog/README.md similarity index 100% rename from README.md rename to djangoblog/README.md diff --git a/doc/DjangoBlog开源代码的泛读报告.docx b/djangoblog/doc/DjangoBlog开源代码的泛读报告.docx similarity index 100% rename from doc/DjangoBlog开源代码的泛读报告.docx rename to djangoblog/doc/DjangoBlog开源代码的泛读报告.docx diff --git a/djangoblog/src/DjangoBlog-master/.idea/.gitignore b/djangoblog/src/DjangoBlog-master/.idea/.gitignore new file mode 100644 index 00000000..35410cac --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/src/DjangoBlog-master/.idea/DjangoBlog-master.iml b/djangoblog/src/DjangoBlog-master/.idea/DjangoBlog-master.iml similarity index 100% rename from src/DjangoBlog-master/.idea/DjangoBlog-master.iml rename to djangoblog/src/DjangoBlog-master/.idea/DjangoBlog-master.iml diff --git a/djangoblog/src/DjangoBlog-master/.idea/inspectionProfiles/profiles_settings.xml b/djangoblog/src/DjangoBlog-master/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/DjangoBlog-master/.idea/misc.xml b/djangoblog/src/DjangoBlog-master/.idea/misc.xml similarity index 100% rename from src/DjangoBlog-master/.idea/misc.xml rename to djangoblog/src/DjangoBlog-master/.idea/misc.xml diff --git a/src/DjangoBlog-master/.idea/modules.xml b/djangoblog/src/DjangoBlog-master/.idea/modules.xml similarity index 100% rename from src/DjangoBlog-master/.idea/modules.xml rename to djangoblog/src/DjangoBlog-master/.idea/modules.xml diff --git a/src/DjangoBlog-master/DjangoBlog-master/.coveragerc b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.coveragerc similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.coveragerc rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.coveragerc diff --git a/src/DjangoBlog-master/DjangoBlog-master/.dockerignore b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.dockerignore similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.dockerignore rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.dockerignore diff --git a/src/DjangoBlog-master/DjangoBlog-master/.gitattributes b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.gitattributes similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.gitattributes rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.gitattributes diff --git a/src/DjangoBlog-master/DjangoBlog-master/.github/ISSUE_TEMPLATE.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/ISSUE_TEMPLATE.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.github/ISSUE_TEMPLATE.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/ISSUE_TEMPLATE.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/codeql-analysis.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/codeql-analysis.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.github/workflows/codeql-analysis.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/codeql-analysis.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/django.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/django.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.github/workflows/django.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/django.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/docker.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/docker.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.github/workflows/docker.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/docker.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/publish-release.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/publish-release.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.github/workflows/publish-release.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.github/workflows/publish-release.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/.gitignore b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/.gitignore similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/.gitignore rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/.gitignore diff --git a/src/DjangoBlog-master/DjangoBlog-master/Dockerfile b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/Dockerfile similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/Dockerfile rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/Dockerfile diff --git a/src/DjangoBlog-master/DjangoBlog-master/LICENSE b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/LICENSE similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/LICENSE rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/LICENSE diff --git a/src/DjangoBlog-master/DjangoBlog-master/README.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/README.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/README.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/README.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/admin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/admin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/admin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/forms.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/forms.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/forms.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/forms.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0001_initial.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0001_initial.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0001_initial.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/migrations/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/models.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/models.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/models.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/templatetags/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/templatetags/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/templatetags/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/templatetags/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/user_login_backend.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/user_login_backend.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/user_login_backend.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/user_login_backend.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/utils.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/utils.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/utils.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/utils.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/accounts/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/views.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/accounts/views.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/accounts/views.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/admin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/admin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/admin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/context_processors.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/context_processors.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/context_processors.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/context_processors.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/documents.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/documents.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/documents.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/documents.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/forms.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/forms.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/forms.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/forms.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_index.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_index.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_index.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_index.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_search_words.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_search_words.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_search_words.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/build_search_words.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/clear_cache.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/clear_cache.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/clear_cache.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/clear_cache.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/create_testdata.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/create_testdata.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/create_testdata.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/create_testdata.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/ping_baidu.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/sync_user_avatar.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/sync_user_avatar.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/sync_user_avatar.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/management/commands/sync_user_avatar.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/middleware.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/middleware.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/middleware.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/middleware.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0001_initial.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0001_initial.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0001_initial.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0002_blogsettings_global_footer_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0002_blogsettings_global_footer_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0002_blogsettings_global_footer_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0002_blogsettings_global_footer_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0003_blogsettings_comment_need_review.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0003_blogsettings_comment_need_review.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0003_blogsettings_comment_need_review.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0003_blogsettings_comment_need_review.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0006_alter_blogsettings_options.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0006_alter_blogsettings_options.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0006_alter_blogsettings_options.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/0006_alter_blogsettings_options.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/migrations/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/models.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/models.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/models.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/search_indexes.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/search_indexes.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/search_indexes.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/search_indexes.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/blog_tags.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/blog_tags.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/blog_tags.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/templatetags/blog_tags.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/blog/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/views.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/blog/views.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/blog/views.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/comments/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/__init__.py diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py new file mode 100644 index 00000000..969e829b --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py @@ -0,0 +1,84 @@ +# gst: 导入Django admin模块,用于自定义后台管理功能 +from django.contrib import admin +# gst: 导入reverse用于生成后台管理页面的URL +from django.urls import reverse +# gst: 导入format_html用于在管理界面生成HTML链接 +from django.utils.html import format_html +# gst: 导入gettext_lazy用于国际化翻译(别名_) +from django.utils.translation import gettext_lazy as _ + + +def disable_commentstatus(modeladmin, request, queryset): + """ + gst: 定义admin动作函数,批量将选中的评论设置为“不显示” + :param modeladmin: 模型管理类实例 + :param request: 请求对象 + :param queryset: 选中的评论查询集 + """ + queryset.update(is_enable=False) + + +def enable_commentstatus(modeladmin, request, queryset): + """ + gst: 定义admin动作函数,批量将选中的评论设置为“显示” + :param modeladmin: 模型管理类实例 + :param request: 请求对象 + :param queryset: 选中的评论查询集 + """ + queryset.update(is_enable=True) + + +# gst: 为动作函数设置后台显示名称(支持国际化) +disable_commentstatus.short_description = _('Disable comments') +enable_commentstatus.short_description = _('Enable comments') + + +class CommentAdmin(admin.ModelAdmin): + """ + gst: 自定义Comment模型的后台管理类,配置列表显示、过滤、动作等功能 + """ + list_per_page = 20 # gst: 后台列表每页显示20条数据 + list_display = ( + 'id', + 'body', + 'link_to_userinfo', # gst: 自定义列,显示评论作者的可点击链接 + 'link_to_article', # gst: 自定义列,显示评论关联文章的可点击链接 + 'is_enable', + 'creation_time' + ) + list_display_links = ('id', 'body', 'is_enable') # gst: 这些字段可点击进入详情页 + list_filter = ('is_enable',) # gst: 后台列表过滤条件(按是否显示过滤) + exclude = ('creation_time', 'last_modify_time') # gst: 编辑页排除这些字段(不允许编辑) + actions = [disable_commentstatus, enable_commentstatus] # gst: 注册批量动作 + + def link_to_userinfo(self, obj): + """ + gst: 生成评论作者的后台管理链接(点击可进入用户详情页) + :param obj: Comment模型实例 + :return: 带HTML链接的作者信息 + """ + # 获取用户模型的app_label和model_name,用于生成URL + info = (obj.author._meta.app_label, obj.author._meta.model_name) + # 生成用户详情页的URL(如admin/auth/user/1/change/) + link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,)) + # 优先显示用户昵称,无昵称则显示邮箱 + display_text = obj.author.nickname if obj.author.nickname else obj.author.email + # 生成带链接的HTML内容 + return format_html(u'%s' % (link, display_text)) + + def link_to_article(self, obj): + """ + gst: 生成评论关联文章的后台管理链接(点击可进入文章详情页) + :param obj: Comment模型实例 + :return: 带HTML链接的文章标题 + """ + # 获取文章模型的app_label和model_name,用于生成URL + info = (obj.article._meta.app_label, obj.article._meta.model_name) + # 生成文章详情页的URL(如admin/blog/article/1/change/) + link = reverse('admin:%s_%s_change' % info, args=(obj.article.id,)) + # 生成带链接的HTML内容(显示文章标题) + return format_html(u'%s' % (link, obj.article.title)) + + # gst: 为自定义列设置后台显示名称(支持国际化) + link_to_userinfo.short_description = _('User') + link_to_article.short_description = _('Article') \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py new file mode 100644 index 00000000..31ed1b2d --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py @@ -0,0 +1,11 @@ +# gst: 导入Django的AppConfig类,用于配置应用的元数据和初始化行为 +from django.apps import AppConfig + + +class CommentsConfig(AppConfig): + """ + gst: 评论应用(comments)的配置类,继承自Django的AppConfig + 用于定义应用的核心配置信息,Django启动时会自动加载该配置 + """ + # gst: 应用的唯一标识名称(必须与应用目录名一致),用于Django识别和引用该应用 + name = 'comments' \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py new file mode 100644 index 00000000..308da938 --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py @@ -0,0 +1,23 @@ +# gst: 导入Django表单核心模块,用于构建表单基础功能 +from django import forms +# gst: 导入ModelForm(模型表单),可直接关联数据模型快速生成表单 +from django.forms import ModelForm + +# gst: 导入当前应用的Comment模型,表单将与该模型关联 +from .models import Comment + + +class CommentForm(ModelForm): + """ + gst: 评论表单类,继承自ModelForm,用于处理评论提交(含回复功能) + 自动关联Comment模型字段,简化表单验证和数据保存逻辑 + """ + # gst: 父评论ID字段,用于实现评论回复功能 + # 隐藏输入(HiddenInput),用户不可见,仅用于传递上级评论ID + # required=False 表示非必填(普通评论无父评论时可不传) + parent_comment_id = forms.IntegerField( + widget=forms.HiddenInput, required=False) + + class Meta: + model = Comment # gst: 关联的数据库模型(Comment) + fields = ['body'] # gst: 表单需要渲染的模型字段(仅评论正文body) \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py new file mode 100644 index 00000000..64d36348 --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# Generated by Django 4.1.7 on 2023-03-02 07:14 + +from django.conf import settings # gst: 导入Django项目配置(包含用户模型等核心配置) +from django.db import migrations, models # gst: 导入数据库迁移与模型字段相关模块 +import django.db.models.deletion # gst: 导入外键删除行为处理模块 +import django.utils.timezone # gst: 导入Django时区工具(用于时间字段默认值) + + +class Migration(migrations.Migration): # gst: 定义迁移类,管理数据库模型的迁移操作 + initial = True # gst: 标记为初始迁移(首次创建该模型的迁移) + + dependencies = [ # gst: 迁移依赖项,指定执行当前迁移前需完成的其他迁移 + ('blog', '0001_initial'), # gst: 依赖blog应用的0001号初始迁移(确保Article模型已存在) + migrations.swappable_dependency(settings.AUTH_USER_MODEL), # gst: 依赖可替换的用户模型(支持自定义用户扩展) + ] + + operations = [ # gst: 迁移操作列表,定义当前迁移要执行的数据库操作 + migrations.CreateModel( # gst: 执行“创建模型”的迁移操作 + name='Comment', # gst: 模型名称(对应数据库表:comments_comment) + fields=[ # gst: 模型字段定义集合 + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), # gst: 自增主键字段,适用于大数据量场景 + ('body', models.TextField(max_length=300, verbose_name='正文')), # gst: 评论正文字段,文本类型且限制最大长度300,后台显示“正文” + ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), # gst: 创建时间字段,默认值为当前时区时间,后台显示“创建时间” + ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), # gst: 修改时间字段,默认值为当前时区时间,后台显示“修改时间” + ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), # gst: 布尔字段,控制评论是否显示(默认显示),后台显示“是否显示” + ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')), # gst: 外键关联blog应用的Article模型,删除文章时级联删除评论,后台显示“文章” + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), # gst: 外键关联用户模型,删除用户时级联删除评论,后台显示“作者” + ('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')), # gst: 自关联外键(支持评论回复),允许为空,删除上级评论时级联删除子评论,后台显示“上级评论” + ], + options={ # gst: 模型额外配置项 + 'verbose_name': '评论', # gst: 后台管理中模型的单数显示名称 + 'verbose_name_plural': '评论', # gst: 后台管理中模型的复数显示名称 + 'ordering': ['-id'], # gst: 数据查询默认排序(按主键倒序,最新评论在前) + 'get_latest_by': 'id', # gst: 调用latest()方法时按id字段获取最新记录 + }, + ), + ] diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py new file mode 100644 index 00000000..f53c7de0 --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.7 on 2023-04-24 13:48 +from django.db import migrations, models # gst: 导入数据库迁移和模型字段相关模块 + + +class Migration(migrations.Migration): # gst: 定义迁移类,管理数据库模型的修改操作 + + dependencies = [ # gst: 迁移依赖项,指定执行当前迁移前需完成的其他迁移 + ('comments', '0001_initial'), # gst: 依赖comments应用的0001号初始迁移(确保Comment模型已存在) + ] + + operations = [ # gst: 迁移操作列表,定义当前迁移要执行的数据库操作 + migrations.AlterField( # gst: 执行“修改字段”的迁移操作 + model_name='comment', # gst: 要修改的模型名称(Comment) + name='is_enable', # gst: 要修改的字段名称(是否显示字段) + field=models.BooleanField(default=False, verbose_name='是否显示'), # gst: 修改后字段类型为布尔型,默认值改为False,后台显示名称为“是否显示” + ), + ] \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py new file mode 100644 index 00000000..bd06cd8f --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.2.5 on 2023-09-06 13:13 +from django.conf import settings # gst: 导入Django项目配置(含用户模型配置) +from django.db import migrations, models # gst: 导入数据库迁移和模型字段相关模块 +import django.db.models.deletion # gst: 导入外键删除行为相关模块 +import django.utils.timezone # gst: 导入Django时区工具(用于时间字段默认值) + + +class Migration(migrations.Migration): # gst: 定义迁移类,管理数据库模型的修改操作 + + dependencies = [ # gst: 迁移依赖项,指定执行当前迁移前需完成的其他迁移 + migrations.swappable_dependency(settings.AUTH_USER_MODEL), # gst: 依赖可替换的用户模型(支持自定义用户) + ('blog', '0005_alter_article_options_alter_category_options_and_more'), # gst: 依赖blog应用的0005号迁移(确保Article模型结构最新) + ('comments', '0002_alter_comment_is_enable'), # gst: 依赖comments应用的0002号迁移(确保Comment模型已有基础修改) + ] + + operations = [ # gst: 迁移操作列表,定义当前迁移要执行的数据库操作 + migrations.AlterModelOptions( # gst: 执行“修改模型选项”的迁移操作 + model_name='comment', # gst: 要修改的模型名称(Comment) + options={ # gst: 模型选项的新配置 + 'get_latest_by': 'id', # gst: 使用latest()方法时按id字段获取最新记录 + 'ordering': ['-id'], # gst: 数据查询默认排序:按主键倒序(最新评论在前) + 'verbose_name': 'comment', # gst: 后台管理中模型的单数显示名称(改为英文) + 'verbose_name_plural': 'comment', # gst: 后台管理中模型的复数显示名称(改为英文) + }, + ), + migrations.RemoveField( # gst: 执行“删除字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='created_time', # gst: 要删除的字段名称(原创建时间字段) + ), + migrations.RemoveField( # gst: 执行“删除字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='last_mod_time', # gst: 要删除的字段名称(原修改时间字段) + ), + migrations.AddField( # gst: 执行“添加字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='creation_time', # gst: 新增字段名称(创建时间,替换原created_time) + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), # gst: 字段类型为日期时间,默认值为当前时区时间,后台显示名称为“creation time” + ), + migrations.AddField( # gst: 执行“添加字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='last_modify_time', # gst: 新增字段名称(修改时间,替换原last_mod_time) + field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), # gst: 字段类型为日期时间,默认值为当前时区时间,后台显示名称为“last modify time” + ), + migrations.AlterField( # gst: 执行“修改字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='article', # gst: 要修改的字段名称(关联文章字段) + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='article'), # gst: 外键关联blog应用的Article模型,删除文章时级联删除评论,后台显示名称为“article” + ), + migrations.AlterField( # gst: 执行“修改字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='author', # gst: 要修改的字段名称(关联作者字段) + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'), # gst: 外键关联用户模型,删除用户时级联删除评论,后台显示名称为“author” + ), + migrations.AlterField( # gst: 执行“修改字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='is_enable', # gst: 要修改的字段名称(是否显示字段) + field=models.BooleanField(default=False, verbose_name='enable'), # gst: 字段类型为布尔型,默认值为False,后台显示名称为“enable” + ), + migrations.AlterField( # gst: 执行“修改字段”的迁移操作 + model_name='comment', # gst: 要操作的模型(Comment) + name='parent_comment', # gst: 要修改的字段名称(上级评论字段) + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='parent comment'), # gst: 自关联外键(支持评论回复),允许为空,删除上级评论时级联删除子评论,后台显示名称为“parent comment” + ), + ] \ No newline at end of file diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/comments/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/__init__.py diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/models.py new file mode 100644 index 00000000..f5e9270a --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/models.py @@ -0,0 +1,61 @@ +# gst: 导入Django项目配置(含用户模型等核心配置) +from django.conf import settings +# gst: 导入Django数据库模型相关模块,用于定义数据模型 +from django.db import models +# gst: 导入Django时区工具,用于时间字段默认值 +from django.utils.timezone import now +# gst: 导入国际化翻译工具(别名_),支持多语言显示 +from django.utils.translation import gettext_lazy as _ + +# gst: 导入blog应用的Article模型,用于关联评论与文章 +from blog.models import Article + + +# Create your models here. + +class Comment(models.Model): + """ + gst: 评论数据模型,存储博客文章的评论信息(支持评论回复功能) + 关联用户、文章模型,包含评论正文、时间、状态等核心字段 + """ + # 评论正文:文本字段,最大长度300字符,后台管理显示名称为“正文” + body = models.TextField('正文', max_length=300) + # 创建时间:日期时间字段,支持国际化翻译,默认值为当前时间 + creation_time = models.DateTimeField(_('creation time'), default=now) + # 最后修改时间:日期时间字段,支持国际化翻译,默认值为当前时间 + last_modify_time = models.DateTimeField(_('last modify time'), default=now) + # 关联作者:外键关联Django用户模型,支持国际化翻译 + # 删除用户时,级联删除该用户的所有评论(CASCADE) + author = models.ForeignKey( + settings.AUTH_USER_MODEL, + verbose_name=_('author'), + on_delete=models.CASCADE) + # 关联文章:外键关联blog应用的Article模型,支持国际化翻译 + # 删除文章时,级联删除该文章的所有评论(CASCADE) + article = models.ForeignKey( + Article, + verbose_name=_('article'), + on_delete=models.CASCADE) + # 父评论:自关联外键,支持评论回复功能,支持国际化翻译 + # blank=True 允许表单提交为空,null=True 允许数据库存储NULL值 + # 删除父评论时,级联删除所有子评论(CASCADE) + parent_comment = models.ForeignKey( + 'self', + verbose_name=_('parent comment'), + blank=True, + null=True, + on_delete=models.CASCADE) + # 是否启用:布尔字段,支持国际化翻译,默认值为False(不显示) + # blank=False 和 null=False 表示该字段为必填项,不允许为空 + is_enable = models.BooleanField(_('enable'), + default=False, blank=False, null=False) + + class Meta: + ordering = ['-id'] # 数据查询默认排序:按主键倒序(最新评论在前) + verbose_name = _('comment') # 后台管理模型单数名称(支持国际化) + verbose_name_plural = verbose_name # 后台管理模型复数名称(与单数一致) + get_latest_by = 'id' # 使用latest()方法时,按id字段获取最新记录 + + def __str__(self): + """gst: 模型实例的字符串表示,返回评论正文(方便后台管理查看)""" + return self.body \ No newline at end of file diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/__init__.py diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py new file mode 100644 index 00000000..7b40d3fe --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py @@ -0,0 +1,46 @@ +from django import template + +# gst: 注册模板标签库,使自定义标签可在模板中使用 +register = template.Library() + + +@register.simple_tag +def parse_commenttree(commentlist, comment): + """ + gst: 定义simple_tag,用于获取当前评论的所有子评论列表(递归遍历) + 用法: {% parse_commenttree article_comments comment as childcomments %} + :param commentlist: 评论查询集(需包含所有待筛选的评论) + :param comment: 父评论对象,以此为根节点查找子评论 + :return: 子评论列表(包含多级嵌套的子评论) + """ + datas = [] + + def parse(c): + """ + gst: 递归函数,用于遍历父评论的所有子评论并加入结果列表 + :param c: 当前父评论对象 + """ + # 筛选出当前父评论的有效子评论(is_enable=True) + childs = commentlist.filter(parent_comment=c, is_enable=True) + for child in childs: + datas.append(child) # 将子评论加入结果列表 + parse(child) # 递归遍历该子评论的子评论 + + parse(comment) # 从传入的comment开始递归解析 + return datas + + +@register.inclusion_tag('comments/tags/comment_item.html') +def show_comment_item(comment, ischild): + """ + gst: 定义inclusion_tag,用于渲染评论项模板(区分父子评论的显示层级) + :param comment: 要渲染的评论对象 + :param ischild: 是否为子评论(布尔值) + :return: 模板上下文,包含评论对象和显示层级 + """ + # 根据是否为子评论设置深度(父评论深度为2,子评论深度为1) + depth = 1 if ischild else 2 + return { + 'comment_item': comment, # 传递评论对象到模板 + 'depth': depth # 传递显示层级到模板 + } \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py new file mode 100644 index 00000000..0696e377 --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py @@ -0,0 +1,165 @@ +# gst: 导入Django测试相关核心模块,用于模拟请求和执行测试 +from django.test import Client, RequestFactory, TransactionTestCase +# gst: 导入reverse,用于反向解析URL路径 +from django.urls import reverse + +# gst: 导入关联数据模型,为测试准备基础数据 +from accounts.models import BlogUser +from blog.models import Category, Article +from comments.models import Comment +# gst: 导入自定义评论模板标签,测试其功能可用性 +from comments.templatetags.comments_tags import * +# gst: 导入工具函数,测试辅助功能 +from djangoblog.utils import get_max_articleid_commentid + + +# Create your tests here. + +class CommentsTest(TransactionTestCase): + """ + gst: 评论功能集成测试类,继承TransactionTestCase以支持事务管理 + 主要测试评论提交、审核、回复、模板标签及工具函数等核心流程 + """ + + def setUp(self): + """ + gst: 测试前置初始化方法,每个测试用例执行前自动执行 + 初始化测试客户端、博客设置和测试用户 + """ + # gst: 初始化Django测试客户端,用于模拟用户发起HTTP请求 + self.client = Client() + # gst: 初始化RequestFactory,用于构造自定义请求对象 + self.factory = RequestFactory() + + # gst: 导入博客设置模型,配置评论需要审核的规则 + from blog.models import BlogSettings + value = BlogSettings() + value.comment_need_review = True # gst: 开启评论审核,提交后需审核才显示 + value.save() + + # gst: 创建超级用户,用于测试登录状态下的评论操作 + self.user = BlogUser.objects.create_superuser( + email="liangliangyy1@gmail.com", + username="liangliangyy1", + password="liangliangyy1") + + def update_article_comment_status(self, article): + """ + gst: 辅助测试方法,用于批量启用指定文章的所有评论 + 模拟评论审核通过的场景,方便后续测试评论显示逻辑 + :param article: 接收文章对象,对其关联的评论进行状态更新 + """ + # gst: 获取当前文章下的所有评论记录 + comments = article.comment_set.all() + # gst: 遍历评论,将每条评论的is_enable设为True(启用状态) + for comment in comments: + comment.is_enable = True + comment.save() # gst: 保存修改后的评论状态 + + def test_validate_comment(self): + """ + gst: 核心测试用例,验证评论相关完整流程 + 涵盖登录、创建测试文章、提交评论、审核、回复、标签功能等场景 + """ + # gst: 模拟用户登录,使用 setUp 中创建的超级用户账号 + self.client.login(username='liangliangyy1', password='liangliangyy1') + + # gst: 创建测试分类,用于关联测试文章 + category = Category() + category.name = "categoryccc" + category.save() # gst: 保存分类到测试数据库 + + # gst: 创建测试文章,作为评论的关联对象 + article = Article() + article.title = "nicetitleccc" + article.body = "nicecontentccc" + article.author = self.user # gst: 关联文章作者为测试超级用户 + article.category = category # gst: 关联文章到测试分类 + article.type = 'a' + article.status = 'p' # gst: 设置文章状态为已发布(可评论状态) + article.save() # gst: 保存文章到测试数据库 + + # gst: 反向解析评论提交接口的URL,传入文章ID参数 + comment_url = reverse( + 'comments:postcomment', kwargs={ + 'article_id': article.id}) + + # gst: 第一次提交普通评论(无父评论,非回复场景) + response = self.client.post(comment_url, + { + 'body': '123ffffffffff' # gst: 评论正文内容 + }) + + # gst: 验证评论提交后是否重定向(预期HTTP状态码302) + self.assertEqual(response.status_code, 302) + + # gst: 重新查询文章,获取最新关联数据 + article = Article.objects.get(pk=article.pk) + # gst: 验证未审核的评论是否不显示(此时评论is_enable为False) + self.assertEqual(len(article.comment_list()), 0) + + # gst: 调用辅助方法,启用该文章的所有评论(模拟审核通过) + self.update_article_comment_status(article) + + # gst: 验证审核通过后,评论是否正常显示(预期1条评论) + self.assertEqual(len(article.comment_list()), 1) + + # gst: 第二次提交普通评论,验证多评论提交功能 + response = self.client.post(comment_url, + { + 'body': '123ffffffffff', # gst: 重复正文,测试重复提交允许性 + }) + + # gst: 验证第二次提交是否成功重定向 + self.assertEqual(response.status_code, 302) + # gst: 启用第二次提交的评论 + self.update_article_comment_status(article) + # gst: 重新查询文章,刷新评论数据 + article = Article.objects.get(pk=article.pk) + # gst: 验证两次提交的评论是否都正常显示(预期2条评论) + self.assertEqual(len(article.comment_list()), 2) + + # gst: 获取第一条评论的ID,作为父评论ID,用于测试回复功能 + parent_comment_id = article.comment_list()[0].id + + # gst: 提交带Markdown格式、链接和代码块的回复评论 + response = self.client.post(comment_url, + { + 'body': ''' + # Title1 + + ```python + import os + ``` + + [url](https://www.lylinux.net/) + + [ddd](http://www.baidu.com) + + + ''', + 'parent_comment_id': parent_comment_id + }) + #gst: 验证回复评论提交是否成功重定向 + self.assertEqual(response.status_code, 302) + self.update_article_comment_status(article) + #gst: 重新查询文章,获取最新评论数据 + article = Article.objects.get(pk=article.pk) + #gst: 验证三次提交(2 条普通 + 1 条回复)是否都显示(预期 3 条评论) + self.assertEqual(len(article.comment_list()), 3) + #gst: 测试 parse_commenttree 模板标签,获取父评论的子评论链 + comment = Comment.objects.get(id=parent_comment_id) + tree = parse_commenttree(article.comment_list(), comment) + #gst: 验证子评论数量是否正确(预期 1 条回复) + self.assertEqual(len(tree), 1) + #gst: 测试 show_comment_item 模板标签,验证评论项渲染数据 + data = show_comment_item(comment, True) + #gst: 验证标签是否返回有效数据(非空) + self.assertIsNotNone(data) + #gst: 测试 get_max_articleid_commentid 工具函数 + s = get_max_articleid_commentid() + #gst: 验证工具函数是否返回有效结果(非空) + self.assertIsNotNone(s) + #gst: 测试评论邮件发送功能,导入工具函数并调用 + from comments.utils import send_comment_email + send_comment_email(comment) diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py new file mode 100644 index 00000000..e59d757f --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py @@ -0,0 +1,17 @@ +# gst: 导入Django的path函数,用于定义URL路由规则 +from django.urls import path + +# gst: 导入当前应用(comments)的视图模块,关联URL与视图逻辑 +from . import views + +# gst: 定义应用命名空间,避免不同应用间URL名称冲突 +app_name = "comments" + +# gst: URL路由配置列表,映射URL路径到对应的视图处理类 +urlpatterns = [ + path( + 'article//postcomment', # gst: 评论提交URL路径,为文章ID路径参数(整数类型) + views.CommentPostView.as_view(), # gst: 关联评论提交处理视图(基于类的视图) + name='postcomment' # gst: URL名称,用于模板反向解析(如reverse('comments:postcomment')) + ), +] \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py new file mode 100644 index 00000000..c2cb1ffa --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py @@ -0,0 +1,65 @@ +# gst: 导入日志模块,用于记录函数执行过程中的异常信息 +import logging + +# gst: 导入国际化翻译工具(别名_),支持邮件内容多语言显示 +from django.utils.translation import gettext_lazy as _ + +# gst: 导入项目工具函数,用于获取当前站点信息和发送邮件 +from djangoblog.utils import get_current_site # 获取当前站点域名 +from djangoblog.utils import send_email # 邮件发送工具函数 + +# gst: 初始化日志器,日志名称为当前模块名(便于定位日志来源) +logger = logging.getLogger(__name__) + + +def send_comment_email(comment): + """ + gst: 评论邮件通知函数,发送两类邮件: + 1. 给评论者的感谢邮件(确认评论提交成功) + 2. 给父评论者的回复通知邮件(告知其评论收到回复) + :param comment: 评论对象(包含评论者、关联文章、父评论等信息) + """ + # gst: 获取当前站点域名(用于拼接文章访问链接) + site = get_current_site().domain + # gst: 邮件主题(支持国际化翻译) + subject = _('Thanks for your comment') + # gst: 拼接文章的完整访问URL(HTTPS协议 + 站点域名 + 文章绝对路径) + article_url = f"https://{site}{comment.article.get_absolute_url()}" + + # gst: 构造给评论者的感谢邮件HTML内容 + html_content = _("""

Thank you very much for your comments on this site

+ You can visit %(article_title)s + to review your comments, + Thank you again! +
+ If the link above cannot be opened, please copy this link to your browser. + %(article_url)s""") % {'article_url': article_url, 'article_title': comment.article.title} + + # gst: 获取评论者的邮箱地址(邮件接收人) + tomail = comment.author.email + # gst: 发送感谢邮件(接收人列表、主题、HTML内容) + send_email([tomail], subject, html_content) + + try: + # gst: 判断当前评论是否为回复(存在父评论) + if comment.parent_comment: + # gst: 构造给父评论者的回复通知邮件HTML内容 + html_content = _("""Your comment on %(article_title)s
has + received a reply.
%(comment_body)s +
+ go check it out! +
+ If the link above cannot be opened, please copy this link to your browser. + %(article_url)s + """) % { + 'article_url': article_url, # 文章访问链接 + 'article_title': comment.article.title, # 文章标题 + 'comment_body': comment.parent_comment.body # 父评论的正文内容 + } + # gst: 获取父评论者的邮箱地址(回复通知接收人) + tomail = comment.parent_comment.author.email + # gst: 发送回复通知邮件 + send_email([tomail], subject, html_content) + except Exception as e: + # gst: 捕获邮件发送过程中的异常,记录错误日志(不中断程序执行) + logger.error(e) \ No newline at end of file diff --git a/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/views.py new file mode 100644 index 00000000..94056678 --- /dev/null +++ b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/comments/views.py @@ -0,0 +1,91 @@ +# gst: 导入Django核心模块,用于异常处理、HTTP响应、数据查询等 +from django.core.exceptions import ValidationError # 数据验证异常(用于评论关闭时抛出错误) +from django.http import HttpResponseRedirect # 重定向响应类 +from django.shortcuts import get_object_or_404 # 查找数据,不存在则返回404 +from django.utils.decorators import method_decorator # 用于给类视图方法添加装饰器 +from django.views.decorators.csrf import csrf_protect # CSRF保护装饰器(防止跨站请求伪造) +from django.views.generic.edit import FormView # 基于类的表单处理视图(简化表单提交逻辑) + +# gst: 导入关联模型和表单,用于视图数据处理 +from accounts.models import BlogUser # 用户模型(评论作者) +from blog.models import Article # 文章模型(评论关联对象) +from .forms import CommentForm # 评论表单(用于数据验证和提交) +from .models import Comment # 评论模型(用于保存评论数据) + + +class CommentPostView(FormView): + """ + gst: 评论提交视图类,继承FormView(专门处理表单提交的通用视图) + 负责评论表单的展示、数据验证、提交保存及跳转逻辑 + """ + form_class = CommentForm # gst: 关联的表单类(CommentForm),用于验证提交数据 + template_name = 'blog/article_detail.html' # gst: 表单验证失败时渲染的模板(文章详情页) + + @method_decorator(csrf_protect) + def dispatch(self, *args, **kwargs): + """ + gst: 重写dispatch方法,添加CSRF保护装饰器 + 确保所有通过该视图的请求都经过CSRF验证,防止跨站请求伪造攻击 + """ + return super(CommentPostView, self).dispatch(*args, **kwargs) # gst: 调用父类dispatch方法,保持原有逻辑 + + def get(self, request, *args, **kwargs): + """ + gst: 处理GET请求(直接访问评论提交URL时) + 重定向到对应文章详情页的评论区,避免直接访问表单提交接口 + """ + article_id = self.kwargs['article_id'] # gst: 从URL路径参数中获取文章ID + article = get_object_or_404(Article, pk=article_id) # gst: 查找文章,不存在则返回404 + url = article.get_absolute_url() # gst: 获取文章的绝对路径(详情页URL) + return HttpResponseRedirect(url + "#comments") # gst: 重定向到文章详情页的评论区锚点 + + def form_invalid(self, form): + """ + gst: 表单数据验证失败时的处理逻辑 + 渲染文章详情页,携带错误表单数据,展示验证失败信息 + """ + article_id = self.kwargs['article_id'] # gst: 从URL参数获取文章ID + article = get_object_or_404(Article, pk=article_id) # gst: 获取对应的文章对象 + + # gst: 返回文章详情页模板,传递错误表单和文章对象(用于页面渲染错误信息) + return self.render_to_response({ + 'form': form, # 验证失败的表单(含错误信息) + 'article': article # 关联的文章对象 + }) + + def form_valid(self, form): + """ + gst: 表单数据验证合法后的核心逻辑 + 处理评论保存、状态设置、回复关联等业务,最后重定向到评论位置 + """ + user = self.request.user # gst: 获取当前登录用户(评论提交者) + author = BlogUser.objects.get(pk=user.pk) # gst: 通过用户ID获取对应的BlogUser对象(评论作者) + article_id = self.kwargs['article_id'] # gst: 从URL参数获取文章ID + article = get_object_or_404(Article, pk=article_id) # gst: 获取评论关联的文章,不存在则404 + + # gst: 检查文章状态:评论关闭(comment_status='c')或文章草稿(status='c')时,禁止评论 + if article.comment_status == 'c' or article.status == 'c': + raise ValidationError("该文章评论已关闭.") # gst: 抛出验证错误,终止评论提交 + + comment = form.save(False) # gst: 表单数据暂存(不立即保存到数据库) + comment.article = article # gst: 关联评论到当前文章 + + # gst: 获取博客全局设置,判断评论是否需要审核 + from djangoblog.utils import get_blog_setting + settings = get_blog_setting() + if not settings.comment_need_review: # gst: 若不需要审核,直接启用评论 + comment.is_enable = True + comment.author = author # gst: 关联评论作者 + + # gst: 处理回复功能:若表单提交了父评论ID,关联到对应的父评论 + if form.cleaned_data['parent_comment_id']: + parent_comment = Comment.objects.get( + pk=form.cleaned_data['parent_comment_id']) # gst: 根据ID获取父评论对象 + comment.parent_comment = parent_comment # gst: 关联当前评论到父评论 + + comment.save(True) # gst: 最终保存评论数据到数据库(True表示执行完整保存逻辑) + + # gst: 重定向到文章详情页的当前评论位置(锚点定位到具体评论) + return HttpResponseRedirect( + "%s#div-comment-%d" % + (article.get_absolute_url(), comment.pk)) # 拼接URL:文章绝对路径 + 评论ID锚点 \ No newline at end of file diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.es.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.es.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.es.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.es.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.yml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.yml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.yml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/docker-compose/docker-compose.yml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/entrypoint.sh b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/entrypoint.sh similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/entrypoint.sh rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/entrypoint.sh diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/configmap.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/configmap.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/configmap.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/configmap.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/deployment.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/deployment.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/deployment.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/deployment.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/gateway.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/gateway.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/gateway.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/gateway.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pv.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pv.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pv.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pv.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pvc.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pvc.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pvc.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/pvc.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/service.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/service.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/service.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/service.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/storageclass.yaml b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/storageclass.yaml similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/storageclass.yaml rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/k8s/storageclass.yaml diff --git a/src/DjangoBlog-master/DjangoBlog-master/deploy/nginx.conf b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/nginx.conf similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/deploy/nginx.conf rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/deploy/nginx.conf diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/admin_site.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/admin_site.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/admin_site.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/admin_site.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/blog_signals.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/blog_signals.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/blog_signals.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/blog_signals.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/elasticsearch_backend.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/elasticsearch_backend.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/elasticsearch_backend.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/elasticsearch_backend.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/feeds.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/feeds.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/feeds.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/feeds.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/logentryadmin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/logentryadmin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/logentryadmin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/logentryadmin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/base_plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/base_plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/base_plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/base_plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hook_constants.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hook_constants.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hook_constants.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hook_constants.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hooks.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hooks.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hooks.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/hooks.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/loader.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/loader.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/loader.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/plugin_manage/loader.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/settings.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/settings.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/settings.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/settings.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/sitemap.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/sitemap.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/sitemap.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/sitemap.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/spider_notify.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/spider_notify.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/spider_notify.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/spider_notify.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/utils.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/utils.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/utils.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/utils.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/whoosh_cn_backend.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/whoosh_cn_backend.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/whoosh_cn_backend.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/whoosh_cn_backend.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/djangoblog/wsgi.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/wsgi.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/djangoblog/wsgi.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/djangoblog/wsgi.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/README-en.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/README-en.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/README-en.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/README-en.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/config-en.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/config-en.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/config-en.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/config-en.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/config.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/config.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/config.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/config.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/docker-en.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/docker-en.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/docker-en.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/docker-en.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/docker.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/docker.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/docker.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/docker.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/es.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/es.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/es.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/es.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/alipay.jpg b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/alipay.jpg similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/imgs/alipay.jpg rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/alipay.jpg diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/pycharm_logo.png b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/pycharm_logo.png similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/imgs/pycharm_logo.png rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/pycharm_logo.png diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/wechat.jpg b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/wechat.jpg similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/imgs/wechat.jpg rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/imgs/wechat.jpg diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/k8s-en.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/k8s-en.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/k8s-en.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/k8s-en.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/docs/k8s.md b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/k8s.md similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/docs/k8s.md rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/docs/k8s.md diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.mo b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.mo similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.mo rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.mo diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.po b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.po similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.po rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/en/LC_MESSAGES/django.po diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.mo b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.mo similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.mo rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.mo diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.po b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.po similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.po rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hans/LC_MESSAGES/django.po diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.mo b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.mo similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.mo rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.mo diff --git a/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.po b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.po similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.po rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/locale/zh_Hant/LC_MESSAGES/django.po diff --git a/src/DjangoBlog-master/DjangoBlog-master/manage.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/manage.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/manage.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/manage.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/admin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/admin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/admin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/forms.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/forms.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/forms.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/forms.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0001_initial.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0001_initial.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0001_initial.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0003_alter_oauthuser_nickname.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0003_alter_oauthuser_nickname.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0003_alter_oauthuser_nickname.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/0003_alter_oauthuser_nickname.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/migrations/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/models.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/models.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/models.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/oauthmanager.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/oauthmanager.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/oauthmanager.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/oauthmanager.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/oauth_tags.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/oauth_tags.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/oauth_tags.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/templatetags/oauth_tags.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/oauth/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/views.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/oauth/views.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/oauth/views.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/admin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/admin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/admin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0001_initial.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0001_initial.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0001_initial.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0002_alter_owntracklog_options_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0002_alter_owntracklog_options_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0002_alter_owntracklog_options_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/0002_alter_owntracklog_options_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/migrations/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/models.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/models.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/models.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/owntracks/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/views.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/owntracks/views.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/owntracks/views.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/article_copyright/plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/external_links/plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/reading_time/plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/seo_optimizer/plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/plugin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/plugin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/plugin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/plugins/view_count/plugin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/requirements.txt b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/requirements.txt similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/requirements.txt rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/requirements.txt diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/MemcacheStorage.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/MemcacheStorage.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/MemcacheStorage.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/MemcacheStorage.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/admin.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/admin.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/admin.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/admin.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/api/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/blogapi.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/blogapi.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/api/blogapi.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/blogapi.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/commonapi.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/commonapi.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/api/commonapi.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/api/commonapi.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/apps.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/apps.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/apps.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/apps.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0001_initial.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0001_initial.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0001_initial.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0001_initial.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/__init__.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/__init__.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/__init__.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/migrations/__init__.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/models.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/models.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/models.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/models.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/robot.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/robot.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/robot.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/robot.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/tests.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/tests.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/tests.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/tests.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/urls.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/urls.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/urls.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/urls.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/servermanager/views.py b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/views.py similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/servermanager/views.py rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/servermanager/views.py diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/account/forget_password.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/forget_password.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/account/forget_password.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/forget_password.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/account/login.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/login.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/account/login.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/login.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/account/registration_form.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/registration_form.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/account/registration_form.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/registration_form.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/account/result.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/result.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/account/result.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/account/result.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_archives.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_archives.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_archives.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_archives.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_detail.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_detail.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_detail.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_detail.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_index.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_index.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_index.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/article_index.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/error_page.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/error_page.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/error_page.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/error_page.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/links_list.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/links_list.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/links_list.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/links_list.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_info.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_info.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_info.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_info.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_meta_info.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_meta_info.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_meta_info.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_meta_info.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_pagination.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_pagination.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_pagination.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_pagination.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_tag_list.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_tag_list.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_tag_list.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/article_tag_list.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/breadcrumb.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/breadcrumb.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/breadcrumb.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/breadcrumb.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/sidebar.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/sidebar.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/sidebar.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/blog/tags/sidebar.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item_tree.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item_tree.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item_tree.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_item_tree.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_list.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_list.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_list.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/comment_list.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/post_comment.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/post_comment.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/post_comment.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/comments/tags/post_comment.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/bindsuccess.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/bindsuccess.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/oauth/bindsuccess.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/bindsuccess.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/oauth_applications.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/oauth_applications.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/oauth/oauth_applications.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/oauth_applications.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/require_email.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/require_email.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/oauth/require_email.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/oauth/require_email.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_log_dates.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_log_dates.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_log_dates.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_log_dates.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_maps.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_maps.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_maps.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/owntracks/show_maps.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/search/indexes/blog/article_text.txt b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/search/indexes/blog/article_text.txt similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/search/indexes/blog/article_text.txt rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/search/indexes/blog/article_text.txt diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/search/search.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/search/search.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/search/search.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/search/search.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/adsense.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/adsense.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/adsense.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/adsense.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base_account.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base_account.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base_account.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/base_account.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/footer.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/footer.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/footer.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/footer.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav_node.html b/djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav_node.html similarity index 100% rename from src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav_node.html rename to djangoblog/src/DjangoBlog-master/DjangoBlog-master/templates/share_layout/nav_node.html diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py b/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py deleted file mode 100644 index a814f3fd..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/admin.py +++ /dev/null @@ -1,47 +0,0 @@ -from django.contrib import admin -from django.urls import reverse -from django.utils.html import format_html -from django.utils.translation import gettext_lazy as _ - - -def disable_commentstatus(modeladmin, request, queryset): - queryset.update(is_enable=False) - - -def enable_commentstatus(modeladmin, request, queryset): - queryset.update(is_enable=True) - - -disable_commentstatus.short_description = _('Disable comments') -enable_commentstatus.short_description = _('Enable comments') - - -class CommentAdmin(admin.ModelAdmin): - list_per_page = 20 - list_display = ( - 'id', - 'body', - 'link_to_userinfo', - 'link_to_article', - 'is_enable', - 'creation_time') - list_display_links = ('id', 'body', 'is_enable') - list_filter = ('is_enable',) - exclude = ('creation_time', 'last_modify_time') - actions = [disable_commentstatus, enable_commentstatus] - - def link_to_userinfo(self, obj): - info = (obj.author._meta.app_label, obj.author._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,)) - return format_html( - u'%s' % - (link, obj.author.nickname if obj.author.nickname else obj.author.email)) - - def link_to_article(self, obj): - info = (obj.article._meta.app_label, obj.article._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.article.id,)) - return format_html( - u'%s' % (link, obj.article.title)) - - link_to_userinfo.short_description = _('User') - link_to_article.short_description = _('Article') diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py b/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py deleted file mode 100644 index ff01b775..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class CommentsConfig(AppConfig): - name = 'comments' diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py b/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py deleted file mode 100644 index e83737db..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/forms.py +++ /dev/null @@ -1,13 +0,0 @@ -from django import forms -from django.forms import ModelForm - -from .models import Comment - - -class CommentForm(ModelForm): - parent_comment_id = forms.IntegerField( - widget=forms.HiddenInput, required=False) - - class Meta: - model = Comment - fields = ['body'] diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py b/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py deleted file mode 100644 index 61d1e539..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0001_initial.py +++ /dev/null @@ -1,38 +0,0 @@ -# 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', - }, - ), - ] diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py b/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py deleted file mode 100644 index 17c44db8..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0002_alter_comment_is_enable.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-04-24 13:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('comments', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='is_enable', - field=models.BooleanField(default=False, verbose_name='是否显示'), - ), - ] diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py b/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py deleted file mode 100644 index a1ca9708..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:13 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('blog', '0005_alter_article_options_alter_category_options_and_more'), - ('comments', '0002_alter_comment_is_enable'), - ] - - operations = [ - migrations.AlterModelOptions( - name='comment', - options={'get_latest_by': 'id', 'ordering': ['-id'], 'verbose_name': 'comment', 'verbose_name_plural': 'comment'}, - ), - migrations.RemoveField( - model_name='comment', - name='created_time', - ), - migrations.RemoveField( - model_name='comment', - name='last_mod_time', - ), - migrations.AddField( - model_name='comment', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='comment', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), - ), - migrations.AlterField( - model_name='comment', - name='article', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='article'), - ), - migrations.AlterField( - model_name='comment', - name='author', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'), - ), - migrations.AlterField( - model_name='comment', - name='is_enable', - field=models.BooleanField(default=False, verbose_name='enable'), - ), - migrations.AlterField( - model_name='comment', - name='parent_comment', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='parent comment'), - ), - ] diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/models.py b/src/DjangoBlog-master/DjangoBlog-master/comments/models.py deleted file mode 100644 index 7c3bbc8d..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/models.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.conf import settings -from django.db import models -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ - -from blog.models import Article - - -# Create your models here. - -class Comment(models.Model): - body = models.TextField('正文', max_length=300) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) - author = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_('author'), - on_delete=models.CASCADE) - article = models.ForeignKey( - Article, - verbose_name=_('article'), - on_delete=models.CASCADE) - parent_comment = models.ForeignKey( - 'self', - verbose_name=_('parent comment'), - blank=True, - null=True, - on_delete=models.CASCADE) - is_enable = models.BooleanField(_('enable'), - default=False, blank=False, null=False) - - class Meta: - ordering = ['-id'] - verbose_name = _('comment') - verbose_name_plural = verbose_name - get_latest_by = 'id' - - def __str__(self): - return self.body diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py b/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py deleted file mode 100644 index fde02b47..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/templatetags/comments_tags.py +++ /dev/null @@ -1,30 +0,0 @@ -from django import template - -register = template.Library() - - -@register.simple_tag -def parse_commenttree(commentlist, comment): - """获得当前评论子评论的列表 - 用法: {% parse_commenttree article_comments comment as childcomments %} - """ - datas = [] - - def parse(c): - childs = commentlist.filter(parent_comment=c, is_enable=True) - for child in childs: - datas.append(child) - parse(child) - - parse(comment) - return datas - - -@register.inclusion_tag('comments/tags/comment_item.html') -def show_comment_item(comment, ischild): - """评论""" - depth = 1 if ischild else 2 - return { - 'comment_item': comment, - 'depth': depth - } diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py b/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py deleted file mode 100644 index 2a7f55f1..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/tests.py +++ /dev/null @@ -1,109 +0,0 @@ -from django.test import Client, RequestFactory, TransactionTestCase -from django.urls import reverse - -from accounts.models import BlogUser -from blog.models import Category, Article -from comments.models import Comment -from comments.templatetags.comments_tags import * -from djangoblog.utils import get_max_articleid_commentid - - -# Create your tests here. - -class CommentsTest(TransactionTestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - from blog.models import BlogSettings - value = BlogSettings() - value.comment_need_review = True - value.save() - - self.user = BlogUser.objects.create_superuser( - email="liangliangyy1@gmail.com", - username="liangliangyy1", - password="liangliangyy1") - - def update_article_comment_status(self, article): - comments = article.comment_set.all() - for comment in comments: - comment.is_enable = True - comment.save() - - def test_validate_comment(self): - self.client.login(username='liangliangyy1', password='liangliangyy1') - - category = Category() - category.name = "categoryccc" - category.save() - - article = Article() - article.title = "nicetitleccc" - article.body = "nicecontentccc" - article.author = self.user - article.category = category - article.type = 'a' - article.status = 'p' - article.save() - - comment_url = reverse( - 'comments:postcomment', kwargs={ - 'article_id': article.id}) - - response = self.client.post(comment_url, - { - 'body': '123ffffffffff' - }) - - self.assertEqual(response.status_code, 302) - - article = Article.objects.get(pk=article.pk) - self.assertEqual(len(article.comment_list()), 0) - self.update_article_comment_status(article) - - self.assertEqual(len(article.comment_list()), 1) - - response = self.client.post(comment_url, - { - 'body': '123ffffffffff', - }) - - self.assertEqual(response.status_code, 302) - - article = Article.objects.get(pk=article.pk) - self.update_article_comment_status(article) - self.assertEqual(len(article.comment_list()), 2) - parent_comment_id = article.comment_list()[0].id - - response = self.client.post(comment_url, - { - 'body': ''' - # Title1 - - ```python - import os - ``` - - [url](https://www.lylinux.net/) - - [ddd](http://www.baidu.com) - - - ''', - 'parent_comment_id': parent_comment_id - }) - - self.assertEqual(response.status_code, 302) - self.update_article_comment_status(article) - article = Article.objects.get(pk=article.pk) - self.assertEqual(len(article.comment_list()), 3) - comment = Comment.objects.get(id=parent_comment_id) - tree = parse_commenttree(article.comment_list(), comment) - self.assertEqual(len(tree), 1) - data = show_comment_item(comment, True) - self.assertIsNotNone(data) - s = get_max_articleid_commentid() - self.assertIsNotNone(s) - - from comments.utils import send_comment_email - send_comment_email(comment) diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py b/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py deleted file mode 100644 index 7df3fab4..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "comments" -urlpatterns = [ - path( - 'article//postcomment', - views.CommentPostView.as_view(), - name='postcomment'), -] diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py b/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py deleted file mode 100644 index f01dba7e..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -import logging - -from django.utils.translation import gettext_lazy as _ - -from djangoblog.utils import get_current_site -from djangoblog.utils import send_email - -logger = logging.getLogger(__name__) - - -def send_comment_email(comment): - site = get_current_site().domain - subject = _('Thanks for your comment') - article_url = f"https://{site}{comment.article.get_absolute_url()}" - html_content = _("""

Thank you very much for your comments on this site

- You can visit %(article_title)s - to review your comments, - Thank you again! -
- If the link above cannot be opened, please copy this link to your browser. - %(article_url)s""") % {'article_url': article_url, 'article_title': comment.article.title} - tomail = comment.author.email - send_email([tomail], subject, html_content) - try: - if comment.parent_comment: - html_content = _("""Your comment on %(article_title)s
has - received a reply.
%(comment_body)s -
- go check it out! -
- If the link above cannot be opened, please copy this link to your browser. - %(article_url)s - """) % {'article_url': article_url, 'article_title': comment.article.title, - 'comment_body': comment.parent_comment.body} - tomail = comment.parent_comment.author.email - send_email([tomail], subject, html_content) - except Exception as e: - logger.error(e) diff --git a/src/DjangoBlog-master/DjangoBlog-master/comments/views.py b/src/DjangoBlog-master/DjangoBlog-master/comments/views.py deleted file mode 100644 index ad9b2b94..00000000 --- a/src/DjangoBlog-master/DjangoBlog-master/comments/views.py +++ /dev/null @@ -1,63 +0,0 @@ -# Create your views here. -from django.core.exceptions import ValidationError -from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404 -from django.utils.decorators import method_decorator -from django.views.decorators.csrf import csrf_protect -from django.views.generic.edit import FormView - -from accounts.models import BlogUser -from blog.models import Article -from .forms import CommentForm -from .models import Comment - - -class CommentPostView(FormView): - form_class = CommentForm - template_name = 'blog/article_detail.html' - - @method_decorator(csrf_protect) - def dispatch(self, *args, **kwargs): - return super(CommentPostView, self).dispatch(*args, **kwargs) - - def get(self, request, *args, **kwargs): - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - url = article.get_absolute_url() - return HttpResponseRedirect(url + "#comments") - - def form_invalid(self, form): - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - - return self.render_to_response({ - 'form': form, - 'article': article - }) - - def form_valid(self, form): - """提交的数据验证合法后的逻辑""" - user = self.request.user - author = BlogUser.objects.get(pk=user.pk) - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - - if article.comment_status == 'c' or article.status == 'c': - raise ValidationError("该文章评论已关闭.") - comment = form.save(False) - comment.article = article - from djangoblog.utils import get_blog_setting - settings = get_blog_setting() - if not settings.comment_need_review: - comment.is_enable = True - comment.author = author - - if form.cleaned_data['parent_comment_id']: - parent_comment = Comment.objects.get( - pk=form.cleaned_data['parent_comment_id']) - comment.parent_comment = parent_comment - - comment.save(True) - return HttpResponseRedirect( - "%s#div-comment-%d" % - (article.get_absolute_url(), comment.pk))