Compare commits
No commits in common. 'gst_branch' and 'master' have entirely different histories.
gst_branch
...
master
@ -1,7 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="Black">
|
<component name="ProjectRootManager" version="2" project-jdk-name="Django" project-jdk-type="Python SDK" />
|
||||||
<option name="sdkName" value="Python 3.12 (DjangoBlog)" />
|
|
||||||
</component>
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (DjangoBlog)" project-jdk-type="Python SDK" />
|
|
||||||
</project>
|
</project>
|
||||||
@ -1,6 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="VcsDirectoryMappings">
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="357be86a-1284-4635-a32e-bf0ce39e4b81" name="更改" comment="" />
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="PUSH_TAGS">
|
||||||
|
<GitPushTagMode>
|
||||||
|
<option name="argument" value="--follow-tags" />
|
||||||
|
<option name="title" value="Current Branch" />
|
||||||
|
</GitPushTagMode>
|
||||||
|
</option>
|
||||||
|
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||||
|
<map>
|
||||||
|
<entry key="$PROJECT_DIR$" value="master" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectColorInfo">{
|
||||||
|
"associatedIndex": 3
|
||||||
|
}</component>
|
||||||
|
<component name="ProjectId" id="33xRndo8NxWInlIDa0Lp1mySOhn" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
|
"RunOnceActivity.OpenDjangoStructureViewOnStart": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
|
"git-widget-placeholder": "master",
|
||||||
|
"ignore.virus.scanning.warn.message": "true",
|
||||||
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.tslint": "true",
|
||||||
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
|
"nodejs_package_manager_path": "npm",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RunManager">
|
||||||
|
<configuration name="zyl_django" type="Python.DjangoServer" factoryName="Django server">
|
||||||
|
<module name="zyl_django" />
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<envs>
|
||||||
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
|
</envs>
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<option name="launchJavascriptDebuger" value="false" />
|
||||||
|
<option name="port" value="8000" />
|
||||||
|
<option name="host" value="" />
|
||||||
|
<option name="additionalOptions" value="" />
|
||||||
|
<option name="browserUrl" value="" />
|
||||||
|
<option name="runTestServer" value="false" />
|
||||||
|
<option name="runNoReload" value="false" />
|
||||||
|
<option name="useCustomRunCommand" value="false" />
|
||||||
|
<option name="customRunCommand" value="" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
|
<component name="SharedIndexes">
|
||||||
|
<attachedChunks>
|
||||||
|
<set>
|
||||||
|
<option value="bundled-js-predefined-d6986cc7102b-b598e85cdad2-JavaScript-PY-252.25557.178" />
|
||||||
|
<option value="bundled-python-sdk-ce6832f46686-7b97d883f26b-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.25557.178" />
|
||||||
|
</set>
|
||||||
|
</attachedChunks>
|
||||||
|
</component>
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="默认任务">
|
||||||
|
<changelist id="357be86a-1284-4635-a32e-bf0ce39e4b81" name="更改" comment="" />
|
||||||
|
<created>1760256904468</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1760256904468</updated>
|
||||||
|
<workItem from="1760256905584" duration="153000" />
|
||||||
|
<workItem from="1760257111491" duration="1866000" />
|
||||||
|
<workItem from="1763889357146" duration="268000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class CommentsConfig(AppConfig):
|
||||||
|
name = 'comments'
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
# Generated by Django 4.1.7 on 2023-03-02 07:14
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('blog', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Comment',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('body', models.TextField(max_length=300, verbose_name='正文')),
|
||||||
|
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')),
|
||||||
|
('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')),
|
||||||
|
('is_enable', models.BooleanField(default=True, verbose_name='是否显示')),
|
||||||
|
('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')),
|
||||||
|
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')),
|
||||||
|
('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '评论',
|
||||||
|
'verbose_name_plural': '评论',
|
||||||
|
'ordering': ['-id'],
|
||||||
|
'get_latest_by': 'id',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
# 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='是否显示'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
# 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
# Generated by Django 5.2.4 on 2025-11-23 23:26
|
||||||
|
|
||||||
|
import django.core.validators
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('blog', '0006_alter_blogsettings_options'),
|
||||||
|
('comments', '0003_alter_comment_options_remove_comment_created_time_and_more'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CommentLike',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created time')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'comment like',
|
||||||
|
'verbose_name_plural': 'comment like',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CommentReport',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('reason', models.CharField(choices=[('spam', 'Spam'), ('abuse', 'Abuse'), ('inappropriate', 'Inappropriate Content'), ('other', 'Other')], default='other', max_length=20, verbose_name='reason')),
|
||||||
|
('description', models.TextField(blank=True, max_length=500, verbose_name='description')),
|
||||||
|
('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created time')),
|
||||||
|
('is_handled', models.BooleanField(default=False, verbose_name='is handled')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'comment report',
|
||||||
|
'verbose_name_plural': 'comment report',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='like_count',
|
||||||
|
field=models.PositiveIntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='like count'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='comment',
|
||||||
|
name='report_count',
|
||||||
|
field=models.PositiveIntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='report count'),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='comment',
|
||||||
|
index=models.Index(fields=['-creation_time'], name='comments_co_creatio_444c12_idx'),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='comment',
|
||||||
|
index=models.Index(fields=['-like_count'], name='comments_co_like_co_572784_idx'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='commentlike',
|
||||||
|
name='comment',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='likes', to='comments.comment', verbose_name='comment'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='commentlike',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='commentreport',
|
||||||
|
name='comment',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reports', to='comments.comment', verbose_name='comment'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='commentreport',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user'),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='commentlike',
|
||||||
|
index=models.Index(fields=['comment', 'user'], name='comments_co_comment_e08f6a_idx'),
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='commentlike',
|
||||||
|
unique_together={('user', 'comment')},
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='commentreport',
|
||||||
|
index=models.Index(fields=['comment', 'user'], name='comments_co_comment_22fd70_idx'),
|
||||||
|
),
|
||||||
|
migrations.AddIndex(
|
||||||
|
model_name='commentreport',
|
||||||
|
index=models.Index(fields=['is_handled'], name='comments_co_is_hand_8df8dc_idx'),
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='commentreport',
|
||||||
|
unique_together={('user', 'comment')},
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
@ -0,0 +1,109 @@
|
|||||||
|
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)
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
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 = _("""<p>Thank you very much for your comments on this site</p>
|
||||||
|
You can visit <a href="%(article_url)s" rel="bookmark">%(article_title)s</a>
|
||||||
|
to review your comments,
|
||||||
|
Thank you again!
|
||||||
|
<br />
|
||||||
|
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 <a href="%(article_url)s" rel="bookmark">%(article_title)s</a><br/> has
|
||||||
|
received a reply. <br/> %(comment_body)s
|
||||||
|
<br/>
|
||||||
|
go check it out!
|
||||||
|
<br/>
|
||||||
|
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)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue