diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/middleware.py b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/middleware.py index be405cf..898afbc 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/middleware.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/middleware.py @@ -1,4 +1,4 @@ -iimport logging +import logging import time # 用于获取客户端IP地址的工具 diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/views.py b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/views.py index d5dc7ec..b359186 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/blog/views.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/blog/views.py @@ -86,7 +86,7 @@ class ArticleListView(ListView): def get_context_data(self, **kwargs): kwargs['linktype'] = self.link_type - return super(ArticleListView, self).get_context_data(**kwargs) + return super(ArticleListView, self).get_context_data(** kwargs) class IndexView(ArticleListView): @@ -150,7 +150,7 @@ class ArticleDetailView(DetailView): kwargs['next_article'] = self.object.next_article kwargs['prev_article'] = self.object.prev_article - context = super(ArticleDetailView, self).get_context_data(**kwargs) + context = super(ArticleDetailView, self).get_context_data(** kwargs) article = self.object # Action Hook, 通知插件"文章详情已获取" hooks.run_action('after_article_body_get', article=article, request=self.request) @@ -197,7 +197,7 @@ class CategoryDetailView(ArticleListView): pass kwargs['page_type'] = CategoryDetailView.page_type kwargs['tag_name'] = categoryname - return super(CategoryDetailView, self).get_context_data(**kwargs) + return super(CategoryDetailView, self).get_context_data(** kwargs) class AuthorDetailView(ArticleListView): @@ -223,7 +223,7 @@ class AuthorDetailView(ArticleListView): author_name = self.kwargs['author_name'] kwargs['page_type'] = AuthorDetailView.page_type kwargs['tag_name'] = author_name - return super(AuthorDetailView, self).get_context_data(**kwargs) + return super(AuthorDetailView, self).get_context_data(** kwargs) class TagDetailView(ArticleListView): @@ -255,7 +255,7 @@ class TagDetailView(ArticleListView): tag_name = self.name kwargs['page_type'] = TagDetailView.page_type kwargs['tag_name'] = tag_name - return super(TagDetailView, self).get_context_data(**kwargs) + return super(TagDetailView, self).get_context_data(** kwargs) class ArchivesView(ArticleListView): @@ -377,3 +377,59 @@ def permission_denied_view( def clean_cache_view(request): cache.clear() return HttpResponse('ok') + +# ============================================================== +# 以下为新增的 DjangoBlogFeed 类 +# ============================================================== +from django.contrib.syndication.views import Feed +from django.urls import reverse + +class DjangoBlogFeed(Feed): + """ + 自定义的 RSS Feed 类 + 用于生成网站的 RSS 订阅源 + """ + # 订阅源的标题 + title = _("Django Blog") + + # 订阅源的链接 + link = "/" + + # 订阅源的描述 + description = _("Latest articles from Django Blog") + + def items(self): + """ + 返回要在订阅中显示的项目列表。 + 这里我们返回最新的 10 篇已发布的文章。 + """ + return Article.objects.filter(status='p').order_by('-created_time')[:10] + + def item_title(self, item): + """ + 返回单个项目(文章)的标题。 + """ + return item.title + + def item_description(self, item): + """ + 返回单个项目(文章)的描述。 + 这里我们使用文章的摘要,如果没有摘要,则使用正文的前 200 个字符。 + """ + if item.summary: + return item.summary + # 为了安全,确保不返回 None + return item.body[:200] + "..." if item.body else "" + + def item_link(self, item): + """ + 返回单个项目(文章)的绝对链接。 + """ + return reverse('blog:article_detail', kwargs={'article_id': item.pk}) + + def item_pubdate(self, item): + """ + 返回单个项目(文章)的发布日期。 + 这是可选的,但推荐添加,以符合 RSS 规范。 + """ + return item.created_time \ No newline at end of file diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/codecov.yml b/src/DjangoBlog-master(1)/DjangoBlog-master/codecov.yml new file mode 100644 index 0000000..2298829 --- /dev/null +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/codecov.yml @@ -0,0 +1,87 @@ +codecov: + require_ci_to_pass: yes + +coverage: + precision: 2 + round: down + range: "70...100" + + status: + project: + default: + target: auto + threshold: 1% + informational: true + patch: + default: + target: auto + threshold: 1% + informational: true + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: + layout: "reach,diff,flags,tree" + behavior: default + require_changes: no + +ignore: + # Django 相关 + - "*/migrations/*" + - "manage.py" + - "*/settings.py" + - "*/wsgi.py" + - "*/asgi.py" + + # 测试相关 + - "*/tests/*" + - "*/test_*.py" + - "*/*test*.py" + + # 静态文件和模板 + - "*/static/*" + - "*/templates/*" + - "*/collectedstatic/*" + + # 国际化文件 + - "*/locale/*" + - "**/*.po" + - "**/*.mo" + + # 文档和部署 + - "*/docs/*" + - "*/deploy/*" + - "README*.md" + - "LICENSE" + - "Dockerfile" + - "docker-compose*.yml" + - "*.yaml" + - "*.yml" + + # 开发环境 + - "*/venv/*" + - "*/__pycache__/*" + - "*.pyc" + - ".coverage" + - "coverage.xml" + + # 日志文件 + - "*/logs/*" + - "*.log" + + # 特定文件 + - "*/whoosh_cn_backend.py" # 搜索后端 + - "*/elasticsearch_backend.py" # 搜索后端 + - "*/MemcacheStorage.py" # 缓存存储 + - "*/robot.py" # 机器人相关 + + # 配置文件 + - "codecov.yml" + - ".coveragerc" + - "requirements*.txt" diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py b/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py index c163d02..382e293 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/comments/models.py @@ -36,8 +36,8 @@ class Comment(models.Model): get_latest_by = 'id' def __str__(self): -<<<<<<< HEAD + return self.body -======= + return self.body ->>>>>>> ccy_branch + diff --git a/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py b/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py index e101637..1129375 100644 --- a/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py +++ b/src/DjangoBlog-master(1)/DjangoBlog-master/djangoblog/urls.py @@ -17,23 +17,35 @@ from django.conf import settings from django.conf.urls.i18n import i18n_patterns from django.conf.urls.static import static from django.contrib.sitemaps.views import sitemap -from django.urls import path, include -from django.urls import re_path -from haystack.views import search_view_factory +from django.urls import path, re_path, include +from django.contrib import admin + +# 从 blog.views 导入所需视图(包括我们之前添加的 DjangoBlogFeed) +from blog.views import ( + page_not_found_view, + server_error_view, + permission_denied_view, + DjangoBlogFeed, + EsSearchView # 假设你在 blog 应用中有一个 EsSearchView +) -from blog.views import EsSearchView +# 使用你自定义的 admin_site from djangoblog.admin_site import admin_site -from djangoblog.elasticsearch_backend import ElasticSearchModelSearchForm -from djangoblog.feeds import DjangoBlogFeed -from djangoblog.sitemap import ArticleSiteMap, CategorySiteMap, StaticViewSitemap, TagSiteMap, UserSiteMap -from django.contrib import admin -from django.urls import path, re_path, include -from django.conf.urls.i18n import i18n_patterns -from django.contrib.sitemaps.views import sitemap -from blog.views import page_not_found_view, server_error_view, permission_denied_view, DjangoBlogFeed -from search.views import search_view_factory -from es_search.views import EsSearchView -from es_search.forms import ElasticSearchForm + +# 导入站点地图 +from djangoblog.sitemap import ( + ArticleSiteMap, + CategorySiteMap, + StaticViewSitemap, + TagSiteMap, + UserSiteMap +) + +# --- 暂时注释掉需要 'es_search' 或 'search' 应用的导入 --- +# from haystack.views import search_view_factory +# from djangoblog.elasticsearch_backend import ElasticSearchModelSearchForm +# from es_search.forms import ElasticSearchForm +# from search.views import search_view_factory sitemaps = { 'blog': ArticleSiteMap, @@ -52,20 +64,28 @@ urlpatterns = [ ] urlpatterns += i18n_patterns( - re_path(r'^admin/', admin.site.urls), + # 使用自定义的 admin_site + re_path(r'^admin/', admin_site.urls), re_path(r'', include('blog.urls', namespace='blog')), re_path(r'mdeditor/', include('mdeditor.urls')), re_path(r'', include('comments.urls', namespace='comment')), re_path(r'', include('accounts.urls', namespace='account')), re_path(r'', include('oauth.urls', namespace='oauth')), - re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'), - re_path(r'^feed/$', DjangoBlogFeed()), - re_path(r'^rss/$', DjangoBlogFeed()), - re_path(r'^search', search_view_factory(view_class=EsSearchView, form_class=ElasticSearchForm), name='search'), + re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, name='sitemap'), + re_path(r'^feed/$', DjangoBlogFeed(), name='feed'), + re_path(r'^rss/$', DjangoBlogFeed(), name='rss'), + + # --- 暂时注释掉需要 'es_search' 应用的搜索路由 --- + # 如果你的搜索功能在 blog 应用中实现,可以这样配置: + # re_path(r'^search/', EsSearchView.as_view(), name='search'), + + # --- 以下是需要 'es_search' 或 'search' 应用的原始配置,现已注释 --- + # re_path(r'^search', search_view_factory(view_class=EsSearchView, form_class=ElasticSearchForm), name='search'), + re_path(r'', include('servermanager.urls', namespace='servermanager')), re_path(r'', include('owntracks.urls', namespace='owntracks')), prefix_default_language=False ) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file