src/cm/api/handlers.py
changeset 293 2c52e4453bf7
parent 288 c6fe4822a243
child 297 173710f4b6d1
equal deleted inserted replaced
292:3442202aff1a 293:2c52e4453bf7
     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"
   241     def create(self, request):
   296     def create(self, request):
   242         return client_exchange(request)
   297         return client_exchange(request)
   243 
   298 
   244 ## embed methods
   299 ## embed methods
   245 from django.views.i18n import javascript_catalog
   300 from django.views.i18n import javascript_catalog
       
   301 from cm.urls import js_info_dict
   246 
   302 
   247 class JSI18NHandler(AnonymousBaseHandler):
   303 class JSI18NHandler(AnonymousBaseHandler):
   248     allowed_methods = ('GET',)    
   304     allowed_methods = ('GET',)    
   249     type = "Embed methods"
   305     type = "Embed methods"
   250     title = "Get js i18n dicts"
   306     title = "Get js i18n dicts"
   254     @staticmethod
   310     @staticmethod
   255     def endpoint():
   311     def endpoint():
   256         return URL_PREFIX + '/jsi18n/'
   312         return URL_PREFIX + '/jsi18n/'
   257     
   313     
   258     def read(self, request):
   314     def read(self, request):
   259         return javascript_catalog(request)
   315         return javascript_catalog(request, **js_info_dict)
   260 
   316 
   261 
   317 
   262 class AnonymousCommentFrameHandler(AnonymousBaseHandler):
   318 class AnonymousCommentFrameHandler(AnonymousBaseHandler):
   263     allowed_methods = ('GET',)    
   319     allowed_methods = ('GET',)    
   264     type = "Embed methods"
   320     type = "Embed 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