]> git.openstreetmap.org Git - osqa.git/blob - forum/actions/node.py
53699e967d1e91f83673274d9e28502667bdb5d7
[osqa.git] / forum / actions / node.py
1 from django.utils.html import strip_tags\r
2 from django.utils.translation import ugettext as _\r
3 from forum.models.action import ActionProxy\r
4 from forum.models import Comment, Question, Answer, NodeRevision\r
5 import logging\r
6 \r
7 class NodeEditAction(ActionProxy):\r
8     def create_revision_data(self, initial=False, **data):\r
9         revision_data = dict(summary=data.get('summary', (initial and _('Initial revision') or '')), body=data['text'])\r
10 \r
11         if data.get('title', None):\r
12             revision_data['title'] = strip_tags(data['title'].strip())\r
13 \r
14         if data.get('tags', None):\r
15             revision_data['tagnames'] = data['tags'].strip()\r
16 \r
17         return revision_data\r
18 \r
19 class AskAction(NodeEditAction):\r
20     verb = _("asked")\r
21 \r
22     def process_data(self, **data):\r
23         processed_data = self.create_revision_data(True, **data)\r
24         if 'added_at' in data:\r
25             processed_data['added_at'] = data['added_at']\r
26 \r
27         question = Question(author=self.user, **processed_data)\r
28         question.save()\r
29         self.node = question\r
30 \r
31     def describe(self, viewer=None):\r
32         return _("%(user)s asked %(question)s") % {\r
33             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
34             'question': self.hyperlink(self.node.get_absolute_url(), self.node.title)\r
35         }\r
36 \r
37 class AnswerAction(NodeEditAction):\r
38     verb = _("answered")\r
39 \r
40     def process_data(self, **data):\r
41         answer = Answer(author=self.user, parent=data['question'], **self.create_revision_data(True, **data))\r
42         answer.save()\r
43         self.node = answer\r
44 \r
45     def process_action(self):\r
46         self.node.question.reset_answer_count_cache()\r
47 \r
48     def describe(self, viewer=None):\r
49         question = self.node.parent\r
50         return _("%(user)s answered %(asker)s on %(question)s") % {\r
51             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
52             'asker': self.hyperlink(question.author.get_profile_url(), self.friendly_username(viewer, question.author)),\r
53             'question': self.hyperlink(self.node.get_absolute_url(), question.title)\r
54         }\r
55 \r
56 class CommentAction(ActionProxy):\r
57     verb = _("commented")\r
58 \r
59     def process_data(self, text='', parent=None):\r
60         comment = Comment(author=self.user, parent=parent, body=text)\r
61         comment.save()\r
62         self.node = comment\r
63 \r
64     def describe(self, viewer=None):\r
65         return _("%(user)s commented on %(post_desc)s") % {\r
66             'user': self.hyperlink(self.node.author.get_profile_url(), self.friendly_username(viewer, self.node.author)),\r
67             'post_desc': self.describe_node(viewer, self.node.parent)\r
68         }\r
69 \r
70 class ReviseAction(NodeEditAction):\r
71     verb = _("edited")\r
72 \r
73     def process_data(self, **data):\r
74         revision_data = self.create_revision_data(**data)\r
75         revision = self.node.create_revision(self.user, **revision_data)\r
76         self.extra = revision.revision\r
77 \r
78     def process_action(self):\r
79         self.node.last_edited = self\r
80         self.node.save()\r
81 \r
82     def describe(self, viewer=None):\r
83         return _("%(user)s edited %(post_desc)s") % {\r
84             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
85             'post_desc': self.describe_node(viewer, self.node)\r
86         }\r
87 \r
88     def get_absolute_url(self):\r
89         return self.node.get_revisions_url()\r
90 \r
91 class RetagAction(ActionProxy):\r
92     verb = _("retagged")\r
93 \r
94     def process_data(self, tagnames=''):\r
95         active = self.node.active_revision\r
96         revision_data = dict(summary=_('Retag'), title=active.title, tagnames=strip_tags(tagnames.strip()), body=active.body)\r
97         revision = self.node.create_revision(self.user, **revision_data)\r
98         self.extra = revision.revision\r
99 \r
100     def process_action(self):\r
101         self.node.last_edited = self\r
102         self.node.save()\r
103 \r
104     def describe(self, viewer=None):\r
105         return _("%(user)s retagged %(post_desc)s") % {\r
106             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
107             'post_desc': self.describe_node(viewer, self.node)\r
108         }\r
109 \r
110     def get_absolute_url(self):\r
111         return self.node.get_revisions_url()\r
112 \r
113 class RollbackAction(ActionProxy):\r
114     verb = _("reverted")\r
115 \r
116     def process_data(self, activate=None):\r
117         previous = self.node.active_revision\r
118         self.node.activate_revision(self.user, activate)\r
119         self.extra = "%d:%d" % (previous.revision, activate.revision)\r
120 \r
121     def process_action(self):\r
122         self.node.last_edited = self\r
123         self.node.save()\r
124 \r
125     def describe(self, viewer=None):\r
126         revisions = [NodeRevision.objects.get(node=self.node, revision=int(n)) for n in self.extra.split(':')]\r
127 \r
128         return _("%(user)s reverted %(post_desc)s from revision %(initial)d (%(initial_sum)s) to revision %(final)d (%(final_sum)s)") % {\r
129             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
130             'post_desc': self.describe_node(viewer, self.node),\r
131             'initial': revisions[0].revision, 'initial_sum': revisions[0].summary,\r
132             'final': revisions[1].revision, 'final_sum': revisions[1].summary,\r
133         }\r
134 \r
135     def get_absolute_url(self):\r
136         return self.node.get_revisions_url()\r
137 \r
138 class CloseAction(ActionProxy):\r
139     verb = _("closed")\r
140 \r
141     def process_action(self):\r
142         self.node.marked = True\r
143         self.node.nstate.closed = self\r
144         self.node.last_edited = self\r
145         self.node.update_last_activity(self.user, save=True)\r
146 \r
147     def cancel_action(self):\r
148         self.node.marked = False\r
149         self.node.nstate.closed = None\r
150         self.node.update_last_activity(self.user, save=True)\r
151 \r
152     def describe(self, viewer=None):\r
153         return _("%(user)s closed %(post_desc)s: %(reason)s") % {\r
154             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
155             'post_desc': self.describe_node(viewer, self.node),\r
156             'reason': self.extra\r
157         }\r
158 \r
159 class AnswerToCommentAction(ActionProxy):\r
160     verb = _("converted")\r
161 \r
162     def process_data(self, new_parent=None):\r
163         self.node.parent = new_parent\r
164         self.node.node_type = "comment"\r
165 \r
166         for comment in self.node.comments.all():\r
167             comment.parent = new_parent\r
168             comment.save()\r
169 \r
170         self.node.last_edited = self\r
171         self.node.update_last_activity(self.user, save=True)\r
172         try:\r
173             self.node.abs_parent.reset_answer_count_cache()\r
174         except AttributeError:\r
175             pass\r
176 \r
177     def describe(self, viewer=None):\r
178         return _("%(user)s converted an answer to %(question)s into a comment") % {\r
179             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
180             'question': self.describe_node(viewer, self.node.abs_parent),\r
181         }\r
182 \r
183 class CommentToAnswerAction(ActionProxy):\r
184     verb = _("converted")\r
185 \r
186     def process_data(self, question):\r
187         self.node.parent = question\r
188         self.node.node_type = "answer"\r
189         self.node.last_edited = self\r
190         self.node.update_last_activity(self.user, save=True)\r
191 \r
192         # Now updated the cached data\r
193         question.reset_answer_count_cache()\r
194 \r
195     def describe(self, viewer=None):\r
196         return _("%(user)s converted comment on %(question)s into an answer") % {\r
197             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
198             'question': self.describe_node(viewer, self.node.abs_parent),\r
199         }\r
200 \r
201 class AnswerToQuestionAction(NodeEditAction):\r
202     verb = _("converted to question")\r
203 \r
204     def process_data(self,  **data):\r
205         revision_data = self.create_revision_data(**data)\r
206         revision = self.node.create_revision(self.user, **revision_data)\r
207 \r
208         original_question = self.node.question\r
209 \r
210         self.extra = {\r
211             'covert_revision': revision.revision,\r
212             'original_question': original_question\r
213         }\r
214 \r
215         self.node.node_type = "question"\r
216         self.node.parent = None\r
217         self.node.abs_parent = None\r
218 \r
219         original_question.reset_answer_count_cache()\r
220 \r
221     def process_action(self):\r
222         self.node.last_edited = self\r
223         self.node.save()\r
224 \r
225 \r
226     def describe(self, viewer=None):\r
227         return _("%(user)s converted an answer to %(question)s into a separate question") % {\r
228             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
229             'question': self.describe_node(viewer, self.node.abs_parent),\r
230         }\r
231 \r
232 class WikifyAction(ActionProxy):\r
233     verb = _("wikified")\r
234 \r
235     def process_action(self):\r
236         self.node.nstate.wiki = self\r
237         self.node.last_edited = self\r
238         self.node.update_last_activity(self.user, save=True)\r
239 \r
240     def cancel_action(self):\r
241         self.node.nstate.wiki = None\r
242         self.node.update_last_activity(self.user, save=True)\r
243 \r
244     def describe(self, viewer=None):\r
245         return _("%(user)s marked %(node)s as community wiki.") % {\r
246             'user': self.hyperlink(self.user.get_profile_url(), self.friendly_username(viewer, self.user)),\r
247             'node': self.describe_node(viewer, self.node),\r
248         }\r
249 \r