1 from piston.handler import AnonymousBaseHandler, BaseHandler |
1 from piston.handler import AnonymousBaseHandler, BaseHandler |
2 from piston.utils import rc |
2 from piston.utils import rc |
3 |
3 |
4 from cm.models import Text,TextVersion, Role, UserRole |
4 from cm.models import Text,TextVersion, Role, UserRole, Comment |
5 from cm.views import get_keys_from_dict, get_textversion_by_keys_or_404, get_text_by_keys_or_404, get_textversion_by_keys_or_404, redirect |
5 from cm.views import get_keys_from_dict, get_textversion_by_keys_or_404, get_text_by_keys_or_404, get_textversion_by_keys_or_404, redirect |
6 from cm.security import get_texts_with_perm, has_perm, get_viewable_comments, \ |
6 from cm.security import get_texts_with_perm, has_perm, get_viewable_comments, \ |
7 has_perm_on_text_api |
7 has_perm_on_text_api |
8 from cm.security import get_viewable_comments |
8 from cm.security import get_viewable_comments |
9 from cm.utils.embed import embed_html |
9 from cm.utils.embed import embed_html |
67 return text_version |
67 return text_version |
68 |
68 |
69 class TextVersionHandler(BaseHandler): |
69 class TextVersionHandler(BaseHandler): |
70 type = "Text methods" |
70 type = "Text methods" |
71 anonymous = AnonymousTextVersionHandler |
71 anonymous = AnonymousTextVersionHandler |
72 allowed_methods = ('GET',) |
72 fields = ('key', 'title', 'format', 'content', 'created', 'modified', 'nb_comments',) |
73 no_display = True |
73 allowed_methods = ('GET', ) |
|
74 model = Text |
|
75 no_display = True |
|
76 |
|
77 @has_perm_on_text_api('can_view_text') |
|
78 def read(self, request, key, version_key): |
|
79 text_version = get_textversion_by_keys_or_404(version_key, key=key) |
|
80 setattr(text_version,'nb_comments',len(get_viewable_comments(request, text_version.comment_set.all(), text_version.text))) |
|
81 |
|
82 return text_version |
74 |
83 |
75 class AnonymousTextListHandler(AnonymousBaseHandler): |
84 class AnonymousTextListHandler(AnonymousBaseHandler): |
76 title = "List texts" |
85 title = "List texts" |
77 type = "Text methods" |
86 type = "Text methods" |
78 fields = ('key', 'title', 'created', 'modified', 'nb_comments', 'nb_versions',) |
87 fields = ('key', 'title', 'created', 'modified', 'nb_comments', 'nb_versions',) |
91 |
100 |
92 class TextListHandler(BaseHandler): |
101 class TextListHandler(BaseHandler): |
93 title = "Create text" |
102 title = "Create text" |
94 type = "Text methods" |
103 type = "Text methods" |
95 allowed_methods = ('GET', 'POST') |
104 allowed_methods = ('GET', 'POST') |
|
105 fields = ('key', 'title', 'created', 'modified', 'nb_comments', 'nb_versions',) |
|
106 model = Text |
96 anonymous = AnonymousTextListHandler |
107 anonymous = AnonymousTextListHandler |
97 desc = "Create a text with the provided parameters." |
108 desc = "Create a text with the provided parameters." |
98 args = """<br/> |
109 args = """<br/> |
99 `title`: title of the text<br/> |
110 `title`: title of the text<br/> |
100 `format`: format content ('markdown', 'html')<br/> |
111 `format`: format content ('markdown', 'html')<br/> |
211 |
222 |
212 class TextFeedHandler(BaseHandler): |
223 class TextFeedHandler(BaseHandler): |
213 type = "Text methods" |
224 type = "Text methods" |
214 anonymous = AnonymousTextFeedHandler |
225 anonymous = AnonymousTextFeedHandler |
215 allowed_methods = ('GET',) |
226 allowed_methods = ('GET',) |
216 no_display = True |
227 no_display = True |
|
228 |
|
229 def read(self, request, key): |
|
230 return text_feed(request, key=key) |
|
231 |
|
232 class TextVersionRevertHandler(BaseHandler): |
|
233 allowed_methods = ('POST', ) |
|
234 type = "Text methods" |
|
235 title = "Revert to specific text version" |
|
236 desc = "Revert to a text version (i.e. copy this text_version which becomes the last text_version)." |
|
237 args = """<br /> |
|
238 `key`: text's key<br /> |
|
239 `version_key`: key of the version to revert to<br /> |
|
240 """ |
|
241 |
|
242 @staticmethod |
|
243 def endpoint(): |
|
244 return URL_PREFIX + '/text/{key}/{version_key}/revert/' |
|
245 |
|
246 |
|
247 def create(self, request, key, version_key): |
|
248 text_version = get_textversion_by_keys_or_404(version_key, key=key) |
|
249 new_text_version = text_version.text.revert_to_version(version_key) |
|
250 return {'version_key' : new_text_version.key , 'created': new_text_version.created} |
|
251 |
|
252 class TextVersionDeleteHandler(BaseHandler): |
|
253 allowed_methods = ('POST', ) |
|
254 type = "Text methods" |
|
255 title = "Delete a specific text version" |
|
256 desc = "Delete a text version." |
|
257 args = """<br /> |
|
258 `key`: text's key<br /> |
|
259 `version_key`: key of the version to delete<br /> |
|
260 """ |
|
261 |
|
262 @staticmethod |
|
263 def endpoint(): |
|
264 return URL_PREFIX + '/text/{key}/{version_key}/delete/' |
|
265 |
|
266 |
|
267 def create(self, request, key, version_key): |
|
268 text_version = get_textversion_by_keys_or_404(version_key, key=key) |
|
269 text_version.delete() |
|
270 return rc.ALL_OK |
|
271 |
217 ## client methods |
272 ## client methods |
218 |
273 |
219 class AnonymousClientHandler(AnonymousBaseHandler): |
274 class AnonymousClientHandler(AnonymousBaseHandler): |
220 allowed_methods = ('POST',) |
275 allowed_methods = ('POST',) |
221 type = "Client methods" |
276 type = "Client methods" |
329 no_display = True |
385 no_display = True |
330 |
386 |
331 def create(self, request, key, format, download, whichcomments, withcolor): |
387 def create(self, request, key, format, download, whichcomments, withcolor): |
332 return text_export(request, key, format, download, whichcomments, withcolor, adminkey=None) |
388 return text_export(request, key, format, download, whichcomments, withcolor, adminkey=None) |
333 |
389 |
334 ## user methods |
390 class AnonymousCommentsHandler(AnonymousBaseHandler): |
335 |
391 allowed_methods = ('GET',) |
336 class SetUserHandler(AnonymousBaseHandler): |
392 type = "Comment methods" |
337 allowed_methods = ('POST',) |
393 fields = ('id_key', 'title', 'format', 'content', 'created', 'name', ('text_version' , ('key', ('text', ('key',))) )) |
338 type = "User methods" |
394 model = Comment |
339 title = "Set username and email" |
395 title = "Get comments" |
340 desc = "Set username and email to use when commenting." |
396 desc = "Get comments from the workspace, most recent first." |
341 args = """<br /> |
397 args = """<br /> |
342 `user_name`: user's name<br /> |
398 `keys`: (optional) comma separated keys : limit comments from these texts only<br /> |
343 `user_email`: user's email<br /> |
399 `name`: (optional) limit comments from this user only |
344 """ |
400 `limit`: (optional) limit number of comments returned |
345 |
401 """ |
346 @staticmethod |
402 |
347 def endpoint(): |
403 @staticmethod |
348 return URL_PREFIX + '/setuser/' |
404 def endpoint(): |
349 |
405 return URL_PREFIX + '/comments/' |
350 def create(self, request): |
406 |
351 user_name = request.POST.get('user_name', None) |
407 def read(self, request): |
352 user_email = request.POST.get('user_email', None) |
408 name = request.GET.get('name', None) |
353 if user_name and user_email: |
409 limit = request.GET.get('limit', None) |
354 response = rc.ALL_OK |
410 keys = request.GET.get('keys', None) |
355 response.set_cookie('user_name', user_name) |
411 query = Comment.objects.all() |
356 response.set_cookie('user_email', user_email) |
412 if keys: |
357 return response |
413 query = query.filter(text_version__text__key__in=keys.split(',')) |
358 else: |
414 if name: |
359 return rc.BAD_REQUEST |
415 query = query.filter(name=name) |
360 |
416 query = query.order_by('-created') |
361 |
417 if limit: |
362 |
418 query = query[:int(limit)] |
363 |
419 return query |
|
420 |
|
421 class CommentsHandler(BaseHandler): |
|
422 type = "Comment methods" |
|
423 anonymous = AnonymousCommentsHandler |
|
424 allowed_methods = ('GET',) |
|
425 fields = ('id_key', 'title', 'format', 'content', 'created', 'name', ('text_version' , ('key', ('text', ('key',))) )) |
|
426 model = Comment |
|
427 no_display = True |
|
428 |
|
429 def read(self, request): |
|
430 name = request.GET.get('name', None) |
|
431 limit = request.GET.get('limit', None) |
|
432 keys = request.GET.get('keys', None) |
|
433 query = Comment.objects.all() |
|
434 if keys: |
|
435 query = query.filter(text_version__text__key__in=keys.split(',')) |
|
436 if name: |
|
437 query = query.filter(name=name) |
|
438 query = query.order_by('-created') |
|
439 if limit: |
|
440 query = query[:int(limit)] |
|
441 return query |
|
442 |
364 from piston.doc import documentation_view |
443 from piston.doc import documentation_view |
365 |
444 |
366 from piston.handler import handler_tracker |
445 from piston.handler import handler_tracker |
367 from django.template import RequestContext |
446 from django.template import RequestContext |
368 from piston.doc import generate_doc |
447 from piston.doc import generate_doc |