- Comments: Comment moderation and the pending comments queue with related Admin.

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4045638
This commit is contained in:
suhacan
2010-01-18 20:55:58 +00:00
parent 52793d5860
commit 0011f70e9a
9 changed files with 85 additions and 17 deletions

View File

@@ -50,6 +50,9 @@ namespace Orchard.Comments.Controllers {
case CommentIndexFilter.Approved: case CommentIndexFilter.Approved:
comments = _commentService.GetComments(CommentStatus.Approved); comments = _commentService.GetComments(CommentStatus.Approved);
break; break;
case CommentIndexFilter.Pending:
comments = _commentService.GetComments(CommentStatus.Pending);
break;
case CommentIndexFilter.Spam: case CommentIndexFilter.Spam:
comments = _commentService.GetComments(CommentStatus.Spam); comments = _commentService.GetComments(CommentStatus.Spam);
break; break;
@@ -70,7 +73,7 @@ namespace Orchard.Comments.Controllers {
[FormValueRequired("submit.BulkEdit")] [FormValueRequired("submit.BulkEdit")]
public ActionResult Index(FormCollection input) { public ActionResult Index(FormCollection input) {
var viewModel = new CommentsIndexViewModel { Comments = new List<CommentEntry>(), Options = new CommentIndexOptions() }; var viewModel = new CommentsIndexViewModel { Comments = new List<CommentEntry>(), Options = new CommentIndexOptions() };
UpdateModel(viewModel, input.ToValueProvider()); UpdateModel(viewModel);
try { try {
IEnumerable<CommentEntry> checkedEntries = viewModel.Comments.Where(c => c.IsChecked); IEnumerable<CommentEntry> checkedEntries = viewModel.Comments.Where(c => c.IsChecked);
@@ -85,6 +88,22 @@ namespace Orchard.Comments.Controllers {
_commentService.MarkCommentAsSpam(entry.Comment.Id); _commentService.MarkCommentAsSpam(entry.Comment.Id);
} }
break; break;
case CommentIndexBulkAction.Pend:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't moderate comment")))
return new HttpUnauthorizedResult();
//TODO: Transaction
foreach (CommentEntry entry in checkedEntries) {
_commentService.PendComment(entry.Comment.Id);
}
break;
case CommentIndexBulkAction.Approve:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't moderate comment")))
return new HttpUnauthorizedResult();
//TODO: Transaction
foreach (CommentEntry entry in checkedEntries) {
_commentService.ApproveComment(entry.Comment.Id);
}
break;
case CommentIndexBulkAction.Delete: case CommentIndexBulkAction.Delete:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't delete comment"))) if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't delete comment")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();
@@ -155,6 +174,9 @@ namespace Orchard.Comments.Controllers {
case CommentDetailsFilter.Approved: case CommentDetailsFilter.Approved:
comments = _commentService.GetCommentsForCommentedContent(id, CommentStatus.Approved); comments = _commentService.GetCommentsForCommentedContent(id, CommentStatus.Approved);
break; break;
case CommentDetailsFilter.Pending:
comments = _commentService.GetCommentsForCommentedContent(id, CommentStatus.Pending);
break;
case CommentDetailsFilter.Spam: case CommentDetailsFilter.Spam:
comments = _commentService.GetCommentsForCommentedContent(id, CommentStatus.Spam); comments = _commentService.GetCommentsForCommentedContent(id, CommentStatus.Spam);
break; break;
@@ -181,7 +203,7 @@ namespace Orchard.Comments.Controllers {
[FormValueRequired("submit.BulkEdit")] [FormValueRequired("submit.BulkEdit")]
public ActionResult Details(FormCollection input) { public ActionResult Details(FormCollection input) {
var viewModel = new CommentsDetailsViewModel { Comments = new List<CommentEntry>(), Options = new CommentDetailsOptions() }; var viewModel = new CommentsDetailsViewModel { Comments = new List<CommentEntry>(), Options = new CommentDetailsOptions() };
UpdateModel(viewModel, input.ToValueProvider()); UpdateModel(viewModel);
try { try {
IEnumerable<CommentEntry> checkedEntries = viewModel.Comments.Where(c => c.IsChecked); IEnumerable<CommentEntry> checkedEntries = viewModel.Comments.Where(c => c.IsChecked);
@@ -196,6 +218,22 @@ namespace Orchard.Comments.Controllers {
_commentService.MarkCommentAsSpam(entry.Comment.Id); _commentService.MarkCommentAsSpam(entry.Comment.Id);
} }
break; break;
case CommentDetailsBulkAction.Pend:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't moderate comment")))
return new HttpUnauthorizedResult();
foreach (CommentEntry entry in checkedEntries) {
_commentService.PendComment(entry.Comment.Id);
}
break;
case CommentDetailsBulkAction.Approve:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't moderate comment")))
return new HttpUnauthorizedResult();
foreach (CommentEntry entry in checkedEntries) {
_commentService.ApproveComment(entry.Comment.Id);
}
break;
case CommentDetailsBulkAction.Delete: case CommentDetailsBulkAction.Delete:
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't delete comment"))) if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't delete comment")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();
@@ -214,7 +252,7 @@ namespace Orchard.Comments.Controllers {
return Details(viewModel.CommentedItemId, viewModel.Options); return Details(viewModel.CommentedItemId, viewModel.Options);
} }
return RedirectToAction("Details", new { viewModel.CommentedItemId, viewModel.Options }); return RedirectToAction("Index");
} }
public ActionResult Close(int commentedItemId, string returnUrl) { public ActionResult Close(int commentedItemId, string returnUrl) {
@@ -279,7 +317,7 @@ namespace Orchard.Comments.Controllers {
public ActionResult Edit(FormCollection input) { public ActionResult Edit(FormCollection input) {
var viewModel = new CommentsEditViewModel(); var viewModel = new CommentsEditViewModel();
try { try {
UpdateModel(viewModel, input.ToValueProvider()); UpdateModel(viewModel);
if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't edit comment"))) if (!_authorizer.Authorize(Permissions.ModerateComment, T("Couldn't edit comment")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();

View File

@@ -19,6 +19,7 @@ namespace Orchard.Comments.Models {
} }
public enum CommentStatus { public enum CommentStatus {
Pending,
Approved, Approved,
Spam Spam
} }

View File

@@ -19,6 +19,8 @@ namespace Orchard.Comments.Services {
ContentItemMetadata GetDisplayForCommentedContent(int id); ContentItemMetadata GetDisplayForCommentedContent(int id);
void CreateComment(Comment comment); void CreateComment(Comment comment);
void UpdateComment(int id, string name, string email, string siteName, string commentText, CommentStatus status); void UpdateComment(int id, string name, string email, string siteName, string commentText, CommentStatus status);
void ApproveComment(int commentId);
void PendComment(int commentId);
void MarkCommentAsSpam(int commentId); void MarkCommentAsSpam(int commentId);
void DeleteComment(int commentId); void DeleteComment(int commentId);
bool CommentsClosedForCommentedContent(int id); bool CommentsClosedForCommentedContent(int id);
@@ -86,7 +88,7 @@ namespace Orchard.Comments.Services {
} }
public void CreateComment(Comment comment) { public void CreateComment(Comment comment) {
comment.Status = _commentValidator.ValidateComment(comment) ? CommentStatus.Approved : CommentStatus.Spam; comment.Status = _commentValidator.ValidateComment(comment) ? CommentStatus.Pending : CommentStatus.Spam;
_commentRepository.Create(comment); _commentRepository.Create(comment);
} }
@@ -99,6 +101,16 @@ namespace Orchard.Comments.Services {
comment.Status = status; comment.Status = status;
} }
public void ApproveComment(int commentId) {
Comment comment = GetComment(commentId);
comment.Status = CommentStatus.Approved;
}
public void PendComment(int commentId) {
Comment comment = GetComment(commentId);
comment.Status = CommentStatus.Pending;
}
public void MarkCommentAsSpam(int commentId) { public void MarkCommentAsSpam(int commentId) {
Comment comment = GetComment(commentId); Comment comment = GetComment(commentId);
comment.Status = CommentStatus.Spam; comment.Status = CommentStatus.Spam;

View File

@@ -17,12 +17,15 @@ namespace Orchard.Comments.ViewModels {
public enum CommentDetailsBulkAction { public enum CommentDetailsBulkAction {
None, None,
Delete, Pend,
Approve,
MarkAsSpam, MarkAsSpam,
Delete,
} }
public enum CommentDetailsFilter { public enum CommentDetailsFilter {
All, All,
Pending,
Approved, Approved,
Spam, Spam,
} }

View File

@@ -21,12 +21,15 @@ namespace Orchard.Comments.ViewModels {
public enum CommentIndexBulkAction { public enum CommentIndexBulkAction {
None, None,
Delete, Pend,
Approve,
MarkAsSpam, MarkAsSpam,
Delete
} }
public enum CommentIndexFilter { public enum CommentIndexFilter {
All, All,
Pending,
Approved, Approved,
Spam, Spam,
} }

View File

@@ -1,9 +1,4 @@
using System; namespace Orchard.Comments.ViewModels {
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Orchard.Comments.ViewModels {
public class EditCommentsViewModel { public class EditCommentsViewModel {
} }
} }

View File

@@ -8,8 +8,10 @@
<label for="publishActions"><%=_Encoded("Actions:") %></label> <label for="publishActions"><%=_Encoded("Actions:") %></label>
<select id="publishActions" name="<%=Html.NameOf(m => m.Options.BulkAction)%>"> <select id="publishActions" name="<%=Html.NameOf(m => m.Options.BulkAction)%>">
<%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.None, _Encoded("Choose action...").ToString())%> <%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.None, _Encoded("Choose action...").ToString())%>
<%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.Delete, _Encoded("Delete").ToString())%> <%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.Approve, _Encoded("Approve").ToString())%>
<%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.Pend, _Encoded("Pend").ToString())%>
<%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.MarkAsSpam, _Encoded("Mark as Spam").ToString())%> <%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.MarkAsSpam, _Encoded("Mark as Spam").ToString())%>
<%=Html.SelectOption(Model.Options.BulkAction, CommentDetailsBulkAction.Delete, _Encoded("Delete").ToString())%>
</select> </select>
<input class="button" type="submit" name="submit.BulkEdit" value="<%=_Encoded("Apply") %>" /> <input class="button" type="submit" name="submit.BulkEdit" value="<%=_Encoded("Apply") %>" />
</fieldset> </fieldset>
@@ -18,6 +20,7 @@
<select id="filterResults" name="<%=Html.NameOf(m => m.Options.Filter)%>"> <select id="filterResults" name="<%=Html.NameOf(m => m.Options.Filter)%>">
<%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.All, _Encoded("All Comments").ToString())%> <%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.All, _Encoded("All Comments").ToString())%>
<%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.Approved, _Encoded("Approved Comments").ToString())%> <%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.Approved, _Encoded("Approved Comments").ToString())%>
<%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.Pending, _Encoded("Pending Comments").ToString())%>
<%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.Spam, _Encoded("Spam").ToString())%> <%=Html.SelectOption(Model.Options.Filter, CommentDetailsFilter.Spam, _Encoded("Spam").ToString())%>
</select> </select>
<input class="button" type="submit" name="submit.Filter" value="<%=_Encoded("Apply") %>"/> <input class="button" type="submit" name="submit.Filter" value="<%=_Encoded("Apply") %>"/>
@@ -61,7 +64,11 @@
<input type="hidden" value="<%=Model.DisplayNameForCommentedItem %>" name="DisplayNameForCommentedtem" /> <input type="hidden" value="<%=Model.DisplayNameForCommentedItem %>" name="DisplayNameForCommentedtem" />
<input type="hidden" value="<%=Model.CommentedItemId %>" name="CommentedItemId" /> <input type="hidden" value="<%=Model.CommentedItemId %>" name="CommentedItemId" />
</td> </td>
<td><% if (commentEntry.Comment.Status == CommentStatus.Spam) { %><%=_Encoded("Spam") %><% } else { %><%=_Encoded("Approved") %><% } %></td> <td>
<% if (commentEntry.Comment.Status == CommentStatus.Spam) { %><%=_Encoded("Spam") %><% }
else if (commentEntry.Comment.Status == CommentStatus.Pending) { %><%=_Encoded("Pending") %><% }
else { %><%=_Encoded("Approved") %><% } %>
</td>
<td><%=Html.Encode(commentEntry.Comment.UserName) %></td> <td><%=Html.Encode(commentEntry.Comment.UserName) %></td>
<td> <td>
<% if (commentEntry.Comment.CommentText != null) {%> <% if (commentEntry.Comment.CommentText != null) {%>

View File

@@ -26,6 +26,10 @@
</div> </div>
</fieldset> </fieldset>
<fieldset> <fieldset>
<div>
<%=Html.RadioButton("Status", "Pending", (Model.Status == CommentStatus.Pending), new { id = "Status_Pending" }) %>
<label class="forcheckbox" for="Status_Pending"><%=_Encoded("Pending") %></label>
</div>
<div> <div>
<%=Html.RadioButton("Status", "Approved", (Model.Status == CommentStatus.Approved), new { id = "Status_Approved" }) %> <%=Html.RadioButton("Status", "Approved", (Model.Status == CommentStatus.Approved), new { id = "Status_Approved" }) %>
<label class="forcheckbox" for="Status_Approved"><%=_Encoded("Approved") %></label> <label class="forcheckbox" for="Status_Approved"><%=_Encoded("Approved") %></label>

View File

@@ -8,8 +8,10 @@
<label for="publishActions"><%=_Encoded("Actions:") %></label> <label for="publishActions"><%=_Encoded("Actions:") %></label>
<select id="publishActions" name="<%=Html.NameOf(m => m.Options.BulkAction)%>"> <select id="publishActions" name="<%=Html.NameOf(m => m.Options.BulkAction)%>">
<%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.None, _Encoded("Choose action...").ToString()) %> <%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.None, _Encoded("Choose action...").ToString()) %>
<%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.Delete, _Encoded("Delete").ToString())%> <%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.Approve, _Encoded("Approve").ToString()) %>
<%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.Pend, _Encoded("Pend").ToString()) %>
<%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.MarkAsSpam, _Encoded("Mark as Spam").ToString()) %> <%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.MarkAsSpam, _Encoded("Mark as Spam").ToString()) %>
<%=Html.SelectOption(Model.Options.BulkAction, CommentIndexBulkAction.Delete, _Encoded("Delete").ToString())%>
</select> </select>
<input class="button" type="submit" name="submit.BulkEdit" value="<%=_Encoded("Apply") %>" /> <input class="button" type="submit" name="submit.BulkEdit" value="<%=_Encoded("Apply") %>" />
</fieldset> </fieldset>
@@ -18,6 +20,7 @@
<select id="filterResults" name="<%=Html.NameOf(m => m.Options.Filter)%>"> <select id="filterResults" name="<%=Html.NameOf(m => m.Options.Filter)%>">
<%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.All, _Encoded("All Comments").ToString()) %> <%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.All, _Encoded("All Comments").ToString()) %>
<%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.Approved, _Encoded("Approved Comments").ToString()) %> <%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.Approved, _Encoded("Approved Comments").ToString()) %>
<%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.Pending, _Encoded("Pending Comments").ToString()) %>
<%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.Spam, _Encoded("Spam").ToString())%> <%=Html.SelectOption(Model.Options.Filter, CommentIndexFilter.Spam, _Encoded("Spam").ToString())%>
</select> </select>
<input class="button" type="submit" name="submit.Filter" value="<%=_Encoded("Apply") %>"/> <input class="button" type="submit" name="submit.Filter" value="<%=_Encoded("Apply") %>"/>
@@ -54,7 +57,9 @@
<input type="hidden" value="<%=Model.Comments[commentIndex].Comment.Id %>" name="<%=Html.NameOf(m => m.Comments[ci].Comment.Id) %>"/> <input type="hidden" value="<%=Model.Comments[commentIndex].Comment.Id %>" name="<%=Html.NameOf(m => m.Comments[ci].Comment.Id) %>"/>
<input type="checkbox" value="true" name="<%=Html.NameOf(m => m.Comments[ci].IsChecked) %>"/> <input type="checkbox" value="true" name="<%=Html.NameOf(m => m.Comments[ci].IsChecked) %>"/>
</td> </td>
<td><% if (commentEntry.Comment.Status == CommentStatus.Spam) { %><%=_Encoded("Spam") %><% } else { %><%=_Encoded("Approved") %><% } %></td> <td><% if (commentEntry.Comment.Status == CommentStatus.Spam) { %><%=_Encoded("Spam") %><% }
else if (commentEntry.Comment.Status == CommentStatus.Pending) { %><%=_Encoded("Pending") %><% }
else { %><%=_Encoded("Approved") %><% } %></td>
<td><%=Html.Encode(commentEntry.Comment.UserName) %></td> <td><%=Html.Encode(commentEntry.Comment.UserName) %></td>
<td> <td>
<% if (commentEntry.Comment.CommentText != null) {%> <% if (commentEntry.Comment.CommentText != null) {%>