src/cm/api/handlers.py
changeset 288 c6fe4822a243
parent 287 fc5ed157ebfe
child 293 2c52e4453bf7
equal deleted inserted replaced
287:fc5ed157ebfe 288:c6fe4822a243
     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
    10 from cm.views.create import CreateTextContentForm, create_text
    10 from cm.views.create import CreateTextContentForm, create_text
       
    11 from cm.views.texts import client_exchange, text_view_frame, text_view_comments, text_export
       
    12 from cm.views.feeds import text_feed
    11 from piston.utils import validate
    13 from piston.utils import validate
    12 from settings import SITE_URL
    14 from settings import SITE_URL
    13 
    15 
    14 URL_PREFIX = SITE_URL + '/api'
    16 URL_PREFIX = SITE_URL + '/api'
    15  
    17  
    88         return texts
    90         return texts
    89 
    91 
    90 class TextListHandler(BaseHandler):
    92 class TextListHandler(BaseHandler):
    91     title = "Create text"    
    93     title = "Create text"    
    92     type = "Text methods"    
    94     type = "Text methods"    
    93     allowed_methods = ('POST', )    
    95     allowed_methods = ('GET', 'POST')    
    94     anonymous = AnonymousTextListHandler
    96     anonymous = AnonymousTextListHandler
    95     desc = "Create a text with the provided parameters."
    97     desc = "Create a text with the provided parameters."
    96     args = """<br/>
    98     args = """<br/>
    97 `title`: title of the text<br/>
    99 `title`: title of the text<br/>
    98 `format`: format content ('markdown', 'html')<br/>
   100 `format`: format content ('markdown', 'html')<br/>
   101         """
   103         """
   102      
   104      
   103     @staticmethod
   105     @staticmethod
   104     def endpoint():
   106     def endpoint():
   105         return URL_PREFIX + '/text/'
   107         return URL_PREFIX + '/text/'
       
   108 
       
   109     def read(self, request):
       
   110         order_by = '-id'
       
   111         texts = get_texts_with_perm(request, 'can_view_text').order_by(order_by)        
       
   112         return texts
   106 
   113 
   107     def create(self, request):
   114     def create(self, request):
   108         form = CreateTextContentForm(request.POST)
   115         form = CreateTextContentForm(request.POST)
   109         if form.is_valid():
   116         if form.is_valid():
   110             text = create_text(request.user, form.cleaned_data)
   117             text = create_text(request.user, form.cleaned_data)
   127 
   134 
   128     @staticmethod
   135     @staticmethod
   129     def endpoint():
   136     def endpoint():
   130         return URL_PREFIX + '/text/{key}/delete/'
   137         return URL_PREFIX + '/text/{key}/delete/'
   131 
   138 
   132     def create(self, request):
   139     def create(self, request, key):
   133         """
   140         """
   134         Delete text identified by `key`.
   141         Delete text identified by `key`.
   135         """
   142         """
   136         try:
   143         try:
   137             key = request.POST.get('key')
       
   138             text_delete(request, key=key)
   144             text_delete(request, key=key)
   139         except UnauthorizedException:
   145         except UnauthorizedException:
   140             return rc.FORBIDDEN
   146             return rc.FORBIDDEN
   141         except KeyError:
   147         except KeyError:
   142             return rc.BAD_REQUEST
   148             return rc.BAD_REQUEST
   186         res = text_edit(request, key=key)
   192         res = text_edit(request, key=key)
   187         text = get_text_by_keys_or_404(key)
   193         text = get_text_by_keys_or_404(key)
   188         text_version = text.last_text_version
   194         text_version = text.last_text_version
   189         return {'version_key' : text_version.key , 'created': text_version.created}
   195         return {'version_key' : text_version.key , 'created': text_version.created}
   190 
   196 
   191 from django.contrib.auth import authenticate
   197 
       
   198 class AnonymousTextFeedHandler(AnonymousBaseHandler):
       
   199     allowed_methods = ('GET',)    
       
   200     type = "Text methods"
       
   201     title = "Text feed"
       
   202     desc = "Returns text RSS feed."
       
   203     args = None
       
   204     
       
   205     @staticmethod
       
   206     def endpoint():
       
   207         return URL_PREFIX + '/text/{key}/feed/?'
       
   208     
       
   209     def read(self, request, key):
       
   210         return text_feed(request, key=key)
       
   211 
       
   212 class TextFeedHandler(BaseHandler):    
       
   213     type = "Text methods"
       
   214     anonymous = AnonymousTextFeedHandler
       
   215     allowed_methods = ('GET',)  
       
   216     no_display = True 
       
   217 ## client methods
       
   218 
       
   219 class AnonymousClientHandler(AnonymousBaseHandler):
       
   220     allowed_methods = ('POST',)    
       
   221     type = "Client methods"
       
   222     title = "Handles client methods"
       
   223     desc = "Handles client (ajax text view) methods."
       
   224     args = """<br />
       
   225 post arguments
       
   226     """ 
       
   227     
       
   228     @staticmethod
       
   229     def endpoint():
       
   230         return URL_PREFIX + '/client/'
       
   231     
       
   232     def create(self, request):
       
   233         return client_exchange(request)
       
   234 
       
   235 class ClientHandler(BaseHandler):    
       
   236     type = "Client methods"
       
   237     anonymous = AnonymousClientHandler
       
   238     allowed_methods = ('POST',)  
       
   239     no_display = True 
       
   240 
       
   241     def create(self, request):
       
   242         return client_exchange(request)
       
   243 
       
   244 ## embed methods
       
   245 from django.views.i18n import javascript_catalog
       
   246 
       
   247 class JSI18NHandler(AnonymousBaseHandler):
       
   248     allowed_methods = ('GET',)    
       
   249     type = "Embed methods"
       
   250     title = "Get js i18n dicts"
       
   251     desc = ""
       
   252     args = None
       
   253     
       
   254     @staticmethod
       
   255     def endpoint():
       
   256         return URL_PREFIX + '/jsi18n/'
       
   257     
       
   258     def read(self, request):
       
   259         return javascript_catalog(request)
       
   260 
       
   261 
       
   262 class AnonymousCommentFrameHandler(AnonymousBaseHandler):
       
   263     allowed_methods = ('GET',)    
       
   264     type = "Embed methods"
       
   265     title = "Displays embedable frame"
       
   266     desc = ""
       
   267     args = None
       
   268     
       
   269     @staticmethod
       
   270     def endpoint():
       
   271         return URL_PREFIX + '/text/{key}/comments_frame/?prefix=/api'
       
   272     
       
   273     def read(self, request, key):
       
   274         return text_view_frame(request, key=key)
       
   275 
       
   276 class CommentFrameHandler(BaseHandler):    
       
   277     type = "Embed methods"
       
   278     anonymous = AnonymousCommentFrameHandler
       
   279     allowed_methods = ('GET',)  
       
   280     no_display = True 
       
   281 
       
   282     def read(self, request, key):
       
   283         return text_view_frame(request, key=key)
       
   284 
       
   285 class AnonymousCommentHandler(AnonymousBaseHandler):
       
   286     allowed_methods = ('GET',)    
       
   287     type = "Embed methods"
       
   288     title = "Displays embedable frame"
       
   289     no_display = True 
       
   290     desc = ""
       
   291     args = None
       
   292     
       
   293     @staticmethod
       
   294     def endpoint():
       
   295         return URL_PREFIX + '/text/{key}/comments/{version_key}/?'
       
   296     
       
   297     def read(self, request, key, version_key):
       
   298         return text_view_comments(request, key=key, version_key=version_key)
       
   299 
       
   300 class CommentHandler(BaseHandler):    
       
   301     type = "Embed methods"
       
   302     anonymous = AnonymousCommentHandler
       
   303     allowed_methods = ('GET',)  
       
   304     no_display = True 
       
   305 
       
   306     def read(self, request, key, version_key):
       
   307         return text_view_comments(request, key=key, version_key=version_key)
       
   308 
       
   309 
       
   310 class AnonymousTextExportHandler(AnonymousBaseHandler):
       
   311     allowed_methods = ('POST',)    
       
   312     type = "Embed methods"
       
   313     title = "undocumented"
       
   314     no_display = True 
       
   315     desc = ""
       
   316     args = None
       
   317     
       
   318     @staticmethod
       
   319     def endpoint():
       
   320         return URL_PREFIX + ' undocumented'
       
   321     
       
   322     def create(self, request, key, format, download, whichcomments, withcolor):
       
   323         return text_export(request, key, format, download, whichcomments, withcolor, adminkey=None)
       
   324 
       
   325 class TextExportHandler(BaseHandler):    
       
   326     type = "Embed methods"
       
   327     anonymous = AnonymousTextExportHandler
       
   328     allowed_methods = ('POST',)  
       
   329     no_display = True 
       
   330 
       
   331     def create(self, request, key, format, download, whichcomments, withcolor):
       
   332         return text_export(request, key, format, download, whichcomments, withcolor, adminkey=None)
       
   333 
       
   334 ## user methods 
   192     
   335     
   193 class SetUserHandler(AnonymousBaseHandler):
   336 class SetUserHandler(AnonymousBaseHandler):
   194     allowed_methods = ('POST',)    
   337     allowed_methods = ('POST',)    
   195     type = "User methods"
   338     type = "User methods"
   196     title = "Set username and email"    
   339     title = "Set username and email"    
   215         else:
   358         else:
   216             return rc.BAD_REQUEST    
   359             return rc.BAD_REQUEST    
   217                          
   360                          
   218 
   361 
   219 
   362 
       
   363 
   220 from piston.doc import documentation_view
   364 from piston.doc import documentation_view
   221 
   365 
   222 from piston.handler import handler_tracker
   366 from piston.handler import handler_tracker
   223 from django.template import RequestContext
   367 from django.template import RequestContext
   224 from piston.doc import generate_doc
   368 from piston.doc import generate_doc