Merge commit 'refs/merge-requests/55' of git://gitorious.org/mediagoblin/mediagoblin...
[mediagoblin.git] / mediagoblin / plugins / piwigo / views.py
index bd3f9320371dcc23601a02acfb0edd42e01ca411..ca723189416f1f7cfc910d858409f85cdd437e32 100644 (file)
 
 import logging
 import re
+from os.path import splitext
+import shutil
 
 from werkzeug.exceptions import MethodNotAllowed, BadRequest, NotImplemented
 from werkzeug.wrappers import BaseResponse
 
-from mediagoblin import mg_globals
 from mediagoblin.meddleware.csrf import csrf_exempt
-from mediagoblin.submit.lib import check_file_field
-from .tools import CmdTable, PwgNamedArray, response_xml
-from .forms import AddSimpleForm
+from mediagoblin.auth.tools import check_login_simple
+from mediagoblin.media_types import sniff_media
+from mediagoblin.submit.lib import check_file_field, prepare_queue_task, \
+    run_process_media, new_upload_entry
+
+from mediagoblin.user_pages.lib import add_media_to_collection
+from mediagoblin.db.models import Collection
+
+from .tools import CmdTable, response_xml, check_form, \
+    PWGSession, PwgNamedArray, PwgError
+from .forms import AddSimpleForm, AddForm
 
 
 _log = logging.getLogger(__name__)
@@ -34,13 +43,18 @@ _log = logging.getLogger(__name__)
 def pwg_login(request):
     username = request.form.get("username")
     password = request.form.get("password")
-    _log.info("Login for %r/%r...", username, password)
+    user = check_login_simple(username, password)
+    if not user:
+        return PwgError(999, 'Invalid username/password')
+    request.session["user_id"] = user.id
+    request.session.save()
     return True
 
 
 @CmdTable("pwg.session.logout")
 def pwg_logout(request):
     _log.info("Logout")
+    request.session.delete()
     return True
 
 
@@ -51,14 +65,30 @@ def pwg_getversion(request):
 
 @CmdTable("pwg.session.getStatus")
 def pwg_session_getStatus(request):
-    return {'username': "fake_user"}
+    if request.user:
+        username = request.user.username
+    else:
+        username = "guest"
+    return {'username': username}
 
 
 @CmdTable("pwg.categories.getList")
 def pwg_categories_getList(request):
-    catlist = ({'id': -29711,
+    catlist = [{'id': -29711,
                 'uppercats': "-29711",
-                'name': "All my images"},)
+                'name': "All my images"}]
+
+    if request.user:
+        collections = Collection.query.filter_by(
+            get_creator=request.user).order_by(Collection.title)
+
+        for c in collections:
+            catlist.append({'id': c.id,
+                            'uppercats': str(c.id),
+                            'name': c.title,
+                            'comment': c.description
+                            })
+
     return {
           'categories': PwgNamedArray(
             catlist,
@@ -90,16 +120,69 @@ def pwg_images_addSimple(request):
     dump = []
     for f in form:
         dump.append("%s=%r" % (f.name, f.data))
-    _log.info("addimple: %r %s %r", request.form, " ".join(dump), request.files)
+    _log.info("addSimple: %r %s %r", request.form, " ".join(dump),
+              request.files)
 
     if not check_file_field(request, 'image'):
         raise BadRequest()
 
-    return {'image_id': 123456, 'url': ''}
+    filename = request.files['image'].filename
+
+    # Sniff the submitted media to determine which
+    # media plugin should handle processing
+    media_type, media_manager = sniff_media(
+        request.files['image'])
+
+    # create entry and save in database
+    entry = new_upload_entry(request.user)
+    entry.media_type = unicode(media_type)
+    entry.title = (
+        unicode(form.name.data)
+        or unicode(splitext(filename)[0]))
+
+    entry.description = unicode(form.comment.data)
+
+    '''
+    # Process the user's folksonomy "tags"
+    entry.tags = convert_to_tag_list_of_dicts(
+        form.tags.data)
+    '''
+
+    # Generate a slug from the title
+    entry.generate_slug()
+
+    queue_file = prepare_queue_task(request.app, entry, filename)
+
+    with queue_file:
+        shutil.copyfileobj(request.files['image'].stream,
+                           queue_file,
+                           length=4 * 1048576)
+
+    # Save now so we have this data before kicking off processing
+    entry.save()
+
+    # Pass off to processing
+    #
+    # (... don't change entry after this point to avoid race
+    # conditions with changes to the document via processing code)
+    feed_url = request.urlgen(
+        'mediagoblin.user_pages.atom_feed',
+        qualified=True, user=request.user.username)
+    run_process_media(entry, feed_url)
+
+    collection_id = form.category.data
+    if collection_id > 0:
+        collection = Collection.query.get(collection_id)
+        if collection is not None and collection.creator == request.user.id:
+            add_media_to_collection(collection, entry, "")
+
+    return {'image_id': entry.id, 'url': entry.url_for_self(request.urlgen,
+                                                            qualified=True)}
+
 
-                
 md5sum_matcher = re.compile(r"^[0-9a-fA-F]{32}$")
 
+
 def fetch_md5(request, parm_name, optional_parm=False):
     val = request.form.get(parm_name)
     if (val is None) and (not optional_parm):
@@ -133,17 +216,13 @@ def pwg_images_addChunk(request):
     return True
 
 
-def possibly_add_cookie(request, response):
-    # TODO: We should only add a *real* cookie, if
-    # authenticated. And if there is no cookie already.
-    if True:
-        response.set_cookie(
-            'pwg_id',
-            "some_fake_for_now",
-            path=request.environ['SCRIPT_NAME'],
-            domain=mg_globals.app_config.get('csrf_cookie_domain'),
-            secure=(request.scheme.lower() == 'https'),
-            httponly=True)
+@CmdTable("pwg.images.add", True)
+def pwg_images_add(request):
+    _log.info("add: %r", request.form)
+    form = AddForm(request.form)
+    check_form(form)
+
+    return {'image_id': 123456, 'url': ''}
 
 
 @csrf_exempt
@@ -158,13 +237,13 @@ def ws_php(request):
                   request.args, request.form)
         raise NotImplemented()
 
-    result = func(request)
-
-    if isinstance(result, BaseResponse):
-        return result
+    with PWGSession(request) as session:
+        result = func(request)
 
-    response = response_xml(result)
+        if isinstance(result, BaseResponse):
+            return result
 
-    possibly_add_cookie(request, response)
+        response = response_xml(result)
+        session.save_to_cookie(response)
 
-    return response
+        return response