Merge commit 'refs/merge-requests/55' of git://gitorious.org/mediagoblin/mediagoblin...
[mediagoblin.git] / mediagoblin / plugins / piwigo / views.py
index 837d8eca3a39a42fcb80030a65a9366cf3a0ea91..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, check_form
+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
 
 
@@ -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):
@@ -154,11 +237,13 @@ def ws_php(request):
                   request.args, request.form)
         raise NotImplemented()
 
-    result = func(request)
+    with PWGSession(request) as session:
+        result = func(request)
 
-    if isinstance(result, BaseResponse):
-        return result
+        if isinstance(result, BaseResponse):
+            return result
 
-    response = response_xml(result)
+        response = response_xml(result)
+        session.save_to_cookie(response)
 
-    return response
+        return response