from django.utils.html import strip_tags
from django.utils.translation import ugettext as _
from forum.models.action import ActionProxy
from forum.models import Comment, Question, Answer, NodeRevision
import logging
class NodeEditAction(ActionProxy):
def create_revision_data(self, initial=False, **data):
revision_data = dict(summary=data.get('summary', (initial and _('Initial revision') or '')), body=data['text'])
if data.get('title', None):
revision_data['title'] = strip_tags(data['title'].strip())
if data.get('tags', None):
revision_data['tagnames'] = data['tags'].strip()
return revision_data
class AskAction(NodeEditAction):
verb = _("asked")
def process_data(self, **data):
processed_data = self.create_revision_data(True, **data)
if 'added_at' in data:
processed_data['added_at'] = data['added_at']
question = Question(author=self.user, **processed_data)
question.save()
self.node = question
self.user.message_set.create(message=self.describe(self.user))
def describe(self, viewer=None):
return _("%(user)s asked %(question)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'question': self.hyperlink(self.node.get_absolute_url(), self.node.title)
}
class AnswerAction(NodeEditAction):
verb = _("answered")
def process_data(self, **data):
answer = Answer(author=self.user, parent=data['question'], **self.create_revision_data(True, **data))
answer.save()
self.node = answer
def process_action(self):
self.node.question.reset_answer_count_cache()
self.user.message_set.create(message=self.describe(self.user))
def describe(self, viewer=None):
question = self.node.parent
return _("%(user)s answered %(asker)s on %(question)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'asker': self.hyperlink(question.author.get_profile_url(), self.friendly_username(viewer, question.author)),
'question': self.hyperlink(self.node.get_absolute_url(), question.title)
}
class CommentAction(ActionProxy):
verb = _("commented")
def process_data(self, text='', parent=None):
comment = Comment(author=self.user, parent=parent, body=text)
comment.save()
self.node = comment
def describe(self, viewer=None):
return _("%(user)s commented on %(post_desc)s") % {
'user': self.hyperlink(self.node.author.get_profile_url(), self.friendly_username(viewer, self.node.author)),
'post_desc': self.describe_node(viewer, self.node.parent)
}
class ReviseAction(NodeEditAction):
verb = _("edited")
def process_data(self, **data):
revision_data = self.create_revision_data(**data)
revision = self.node.create_revision(self.user, **revision_data)
self.extra = revision.revision
def process_action(self):
self.node.last_edited = self
self.node.save()
def describe(self, viewer=None):
return _("%(user)s edited %(post_desc)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'post_desc': self.describe_node(viewer, self.node)
}
def get_absolute_url(self):
return self.node.get_revisions_url()
class RetagAction(ActionProxy):
verb = _("retagged")
def process_data(self, tagnames=''):
active = self.node.active_revision
revision_data = dict(summary=_('Retag'), title=active.title, tagnames=strip_tags(tagnames.strip()), body=active.body)
revision = self.node.create_revision(self.user, **revision_data)
self.extra = revision.revision
def process_action(self):
self.node.last_edited = self
self.node.save()
def describe(self, viewer=None):
return _("%(user)s retagged %(post_desc)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'post_desc': self.describe_node(viewer, self.node)
}
def get_absolute_url(self):
return self.node.get_revisions_url()
class RollbackAction(ActionProxy):
verb = _("reverted")
def process_data(self, activate=None):
previous = self.node.active_revision
self.node.activate_revision(self.user, activate)
self.extra = "%d:%d" % (previous.revision, activate.revision)
def process_action(self):
self.node.last_edited = self
self.node.save()
def describe(self, viewer=None):
revisions = [NodeRevision.objects.get(node=self.node, revision=int(n)) for n in self.extra.split(':')]
return _("%(user)s reverted %(post_desc)s from revision %(initial)d (%(initial_sum)s) to revision %(final)d (%(final_sum)s)") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'post_desc': self.describe_node(viewer, self.node),
'initial': revisions[0].revision, 'initial_sum': revisions[0].summary,
'final': revisions[1].revision, 'final_sum': revisions[1].summary,
}
def get_absolute_url(self):
return self.node.get_revisions_url()
class CloseAction(ActionProxy):
verb = _("closed")
def process_action(self):
self.node.marked = True
self.node.nstate.closed = self
self.node.last_edited = self
self.node.update_last_activity(self.user, save=True)
def cancel_action(self):
self.node.marked = False
self.node.nstate.closed = None
self.node.update_last_activity(self.user, save=True)
def describe(self, viewer=None):
return _("%(user)s closed %(post_desc)s: %(reason)s") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'post_desc': self.describe_node(viewer, self.node),
'reason': self.extra
}
class AnswerToCommentAction(ActionProxy):
verb = _("converted")
def process_data(self, new_parent=None):
self.node.parent = new_parent
self.node.node_type = "comment"
for comment in self.node.comments.all():
comment.parent = new_parent
comment.save()
self.node.last_edited = self
self.node.update_last_activity(self.user, save=True)
try:
self.node.abs_parent.reset_answer_count_cache()
except AttributeError:
pass
def describe(self, viewer=None):
return _("%(user)s converted an answer to %(question)s into a comment") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'question': self.describe_node(viewer, self.node.abs_parent),
}
class CommentToAnswerAction(ActionProxy):
verb = _("converted")
def process_data(self, question):
self.node.parent = question
self.node.node_type = "answer"
self.node.last_edited = self
self.node.update_last_activity(self.user, save=True)
# Now updated the cached data
question.reset_answer_count_cache()
def describe(self, viewer=None):
return _("%(user)s converted comment on %(question)s into an answer") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'question': self.describe_node(viewer, self.node.abs_parent),
}
class CommentToQuestionAction(NodeEditAction):
verb = _("converted")
def process_data(self, **data):
revision_data = self.create_revision_data(**data)
revision = self.node.create_revision(self.user, **revision_data)
self.extra = {
'covert_revision': revision.revision,
}
self.node.node_type = "question"
self.node.parent = None
self.node.abs_parent = None
def process_action(self):
self.node.last_edited = self
self.node.save()
def describe(self, viewer=None):
return _("%(user)s converted comment on %(question)s to a new question") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'question': self.describe_node(viewer, self.node.abs_parent),
}
class AnswerToQuestionAction(NodeEditAction):
verb = _("converted to question")
def process_data(self, **data):
revision_data = self.create_revision_data(**data)
revision = self.node.create_revision(self.user, **revision_data)
original_question = self.node.question
self.extra = {
'covert_revision': revision.revision,
'original_question': original_question
}
self.node.node_type = "question"
self.node.parent = None
self.node.abs_parent = None
original_question.reset_answer_count_cache()
def process_action(self):
self.node.last_edited = self
self.node.save()
def describe(self, viewer=None):
return _("%(user)s converted an answer to %(question)s into a separate question") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'question': self.describe_node(viewer, self.node.abs_parent),
}
class WikifyAction(ActionProxy):
verb = _("wikified")
def process_action(self):
self.node.nstate.wiki = self
self.node.last_edited = self
self.node.update_last_activity(self.user, save=True)
def cancel_action(self):
self.node.nstate.wiki = None
self.node.update_last_activity(self.user, save=True)
def describe(self, viewer=None):
return _("%(user)s marked %(node)s as community wiki.") % {
'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),
'node': self.describe_node(viewer, self.node),
}