20 from django.db import models |
20 from django.db import models |
21 from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop |
21 from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop |
22 from tagging.fields import TagField |
22 from tagging.fields import TagField |
23 import pickle |
23 import pickle |
24 from django.db import connection |
24 from django.db import connection |
25 |
25 from datetime import datetime |
26 |
|
27 |
26 |
28 class TextManager(Manager): |
27 class TextManager(Manager): |
29 def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs): |
28 def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs): |
30 text = self.create(name=name, email=email, user=user, state=state) |
29 text = self.create(name=name, email=email, user=user, state=state) |
31 text_version = TextVersion.objects.create(title=title, format=format, content=content, text=text, note=note, name=name, email=email, tags=tags, user=user) |
30 text_version = TextVersion.objects.create(title=title, format=format, content=content, text=text, note=note, name=name, email=email, tags=tags, user=user) |
161 old_id = c.id |
160 old_id = c.id |
162 old_comment_set.remove(c) |
161 old_comment_set.remove(c) |
163 reply_to = None |
162 reply_to = None |
164 if c.reply_to: |
163 if c.reply_to: |
165 reply_to = old_comment_map[c.reply_to.id] |
164 reply_to = old_comment_map[c.reply_to.id] |
166 c2 = Comment.objects.duplicate(c, duplicate_text_version, reply_to) |
165 c2 = Comment.objects.duplicate(c, duplicate_text_version, reply_to, keep_dates=True) |
167 old_comment_map[old_id] = c2 |
166 old_comment_map[old_id] = c2 |
168 break |
167 break |
169 |
168 |
170 return duplicate_text_version |
169 return duplicate_text_version |
171 |
170 |
235 elif self.content != new_content or new_format != self.format: |
234 elif self.content != new_content or new_format != self.format: |
236 comments = self.get_comments() ; |
235 comments = self.get_comments() ; |
237 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
236 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
238 #print "tomodify_comments",len(tomodify_comments) |
237 #print "tomodify_comments",len(tomodify_comments) |
239 #print "toremove_comments",len(toremove_comments) |
238 #print "toremove_comments",len(toremove_comments) |
240 [comment.save() for comment in tomodify_comments] |
239 [comment.save(keep_dates=True) for comment in tomodify_comments] |
241 [comment.delete() for comment in toremove_comments] |
240 [comment.delete() for comment in toremove_comments] |
242 self.title = new_title |
241 self.title = new_title |
243 if new_tags: |
242 if new_tags: |
244 self.tags = new_tags |
243 self.tags = new_tags |
245 if new_note: |
244 if new_note: |
248 self.format = new_format |
247 self.format = new_format |
249 self.save() |
248 self.save() |
250 |
249 |
251 class CommentManager(Manager): |
250 class CommentManager(Manager): |
252 |
251 |
253 def duplicate(self, comment, text_version, reply_to=None): |
252 def duplicate(self, comment, text_version, reply_to=None, keep_dates=False): |
254 comment.id = None |
253 comment.id = None |
255 comment.text_version = text_version |
254 comment.text_version = text_version |
256 if reply_to: |
255 if reply_to: |
257 comment.reply_to = reply_to |
256 comment.reply_to = reply_to |
258 self.update_keys(comment) |
257 self.update_keys(comment) |
259 comment.save() |
258 comment.save(keep_dates=keep_dates) |
260 return comment |
259 return comment |
261 |
260 |
262 class Comment(PermanentModel, AuthorModel): |
261 class Comment(PermanentModel, AuthorModel): |
263 modified = models.DateTimeField(auto_now=True) |
262 modified = models.DateTimeField() |
264 created = models.DateTimeField(auto_now_add=True) |
263 created = models.DateTimeField() |
265 |
264 |
266 text_version = models.ForeignKey("TextVersion") |
265 text_version = models.ForeignKey("TextVersion") |
267 |
266 |
268 # comment_set will be replies |
267 # comment_set will be replies |
269 reply_to = models.ForeignKey("Comment", null=True, blank=True) |
268 reply_to = models.ForeignKey("Comment", null=True, blank=True) |
281 start_offset = models.IntegerField(null=True, blank=True) |
280 start_offset = models.IntegerField(null=True, blank=True) |
282 end_offset = models.IntegerField(null=True, blank=True) |
281 end_offset = models.IntegerField(null=True, blank=True) |
283 |
282 |
284 objects = CommentManager() |
283 objects = CommentManager() |
285 |
284 |
|
285 def save(self, force_insert=False, force_update=False, keep_dates=False): |
|
286 if not keep_dates: |
|
287 now = datetime.now() |
|
288 if not self.id: |
|
289 self.created = now |
|
290 self.modified = now |
|
291 super(PermanentModel, self).save() |
|
292 |
286 def __unicode__(self): |
293 def __unicode__(self): |
287 return '<%d> %s' % (self.id, self.title) |
294 return '<%d> %s' % (self.id, self.title) |
288 |
295 |
289 def is_reply(self): |
296 def is_reply(self): |
290 return self.reply_to != None |
297 return self.reply_to != None |