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