121 def revert_to_version(self, v_id): |
121 def revert_to_version(self, v_id): |
122 text_version = self.get_version(int(v_id)) |
122 text_version = self.get_version(int(v_id)) |
123 new_text_version = TextVersion.objects.duplicate(text_version, True) |
123 new_text_version = TextVersion.objects.duplicate(text_version, True) |
124 return new_text_version |
124 return new_text_version |
125 |
125 |
126 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, new_version=True): |
126 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True, new_version=True): |
127 text_version = self.get_latest_version() |
127 text_version = self.get_latest_version() |
128 |
128 |
129 if new_version: |
129 if new_version: |
130 text_version = TextVersion.objects.duplicate(text_version, keep_comments) |
130 text_version = TextVersion.objects.duplicate(text_version, keep_comments) |
131 text_version.edit(new_title, new_format, new_content, new_tags, new_note, keep_comments) |
131 text_version.edit(new_title, new_format, new_content, new_tags, new_note, keep_comments, cancel_modified_scopes) |
132 return text_version |
132 return text_version |
133 |
133 |
134 def __unicode__(self): |
134 def __unicode__(self): |
135 return self.title |
135 return self.title |
136 |
136 |
184 text = models.ForeignKey("Text") |
184 text = models.ForeignKey("Text") |
185 |
185 |
186 objects = TextVersionManager() |
186 objects = TextVersionManager() |
187 |
187 |
188 def get_content(self, format='html'): |
188 def get_content(self, format='html'): |
189 converted_content = pandoc_convert(self.content, self.format, format) |
189 return pandoc_convert(self.content, self.format, format) |
190 return converted_content |
|
191 |
190 |
192 # def _get_comments(self, user = None, filter_reply = 0): |
191 # def _get_comments(self, user = None, filter_reply = 0): |
193 # """ |
192 # """ |
194 # get comments viewable by this user (user = None or user = AnonymousUser => everyone) |
193 # get comments viewable by this user (user = None or user = AnonymousUser => everyone) |
195 # filter_reply = 0: comments and replies |
194 # filter_reply = 0: comments and replies |
226 return self.comment_set.filter(~Q(reply_to == None), Q(deleted=False)) |
225 return self.comment_set.filter(~Q(reply_to == None), Q(deleted=False)) |
227 |
226 |
228 def __unicode__(self): |
227 def __unicode__(self): |
229 return '<%d> %s' % (self.id, self.title) |
228 return '<%d> %s' % (self.id, self.title) |
230 |
229 |
231 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True): # TODO : tags |
230 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True): |
232 if not keep_comments : |
231 if not keep_comments : |
233 self.comment_set.all().delete() |
232 self.comment_set.all().delete() |
234 elif self.content != new_content or new_format != self.format: |
233 elif self.content != new_content or new_format != self.format: |
235 comments = self.get_comments() ; |
234 comments = self.get_comments() ; |
236 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
235 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
237 #print "tomodify_comments",len(tomodify_comments) |
236 #print "tomodify_comments" |
|
237 #print tomodify_comments |
238 #print "toremove_comments",len(toremove_comments) |
238 #print "toremove_comments",len(toremove_comments) |
239 [comment.save(keep_dates=True) for comment in tomodify_comments] |
239 [comment.save(keep_dates=True) for comment in tomodify_comments] |
240 [comment.delete() for comment in toremove_comments] |
240 if cancel_modified_scopes : |
|
241 [comment.remove_scope() for comment in toremove_comments] |
|
242 else : |
|
243 [comment.delete() for comment in toremove_comments] |
|
244 |
|
245 #TODO: RBE: recompute same text comments links |
|
246 |
241 self.title = new_title |
247 self.title = new_title |
242 if new_tags: |
248 if new_tags: |
243 self.tags = new_tags |
249 self.tags = new_tags |
244 if new_note: |
250 if new_note: |
245 self.note = new_note |
251 self.note = new_note |
305 return True |
311 return True |
306 else: |
312 else: |
307 return self.reply_to.is_thread_full_visible(own_user) |
313 return self.reply_to.is_thread_full_visible(own_user) |
308 return False |
314 return False |
309 |
315 |
|
316 def is_scope_removed(self): |
|
317 #when scope is "removed" we will have |
|
318 #self.start_wrapper == self.end_wrapper == self.start_offset == self.end_offset == -1 |
|
319 return (self.start_wrapper == -1) |
|
320 |
310 def top_comment(self): |
321 def top_comment(self): |
311 if self.reply_to == None : |
322 if self.reply_to == None : |
312 return self |
323 return self |
313 else : |
324 else : |
314 return self.reply_to.top_comment() |
325 return self.reply_to.top_comment() |
321 |
332 |
322 def delete(self): |
333 def delete(self): |
323 PermanentModel.delete(self) |
334 PermanentModel.delete(self) |
324 # delete replies |
335 # delete replies |
325 [c.delete() for c in self.comment_set.all()] |
336 [c.delete() for c in self.comment_set.all()] |
326 |
337 |
|
338 def remove_scope(self): |
|
339 self.start_wrapper = self.end_wrapper = self.start_offset = self.end_offset = -1 |
|
340 self.save() |
|
341 |
327 # http://docs.djangoproject.com/en/dev/topics/files/#topics-files |
342 # http://docs.djangoproject.com/en/dev/topics/files/#topics-files |
328 |
343 |
329 # default conf values |
344 # default conf values |
330 DEFAULT_CONF = { |
345 DEFAULT_CONF = { |
331 'workspace_name' : 'Workspace', |
346 'workspace_name' : 'Workspace', |