Skip to content

Commit

Permalink
init ajax image upload
Browse files Browse the repository at this point in the history
  • Loading branch information
gustavox4ids committed Jun 16, 2013
1 parent 111d815 commit f8d0c22
Show file tree
Hide file tree
Showing 15 changed files with 396 additions and 65 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -20,4 +20,5 @@ sessions/*
static/uploads/*.png
static/uploads/*.jpg
static/uploads/*.gif
static/uploads/*.txt

27 changes: 27 additions & 0 deletions controllers/default.py
Expand Up @@ -955,6 +955,33 @@ def user_online_now():
# BACKLOG FUNCTIONS
# ===================

@service.json
@auth.requires_login()
def ajax_upload():
if request.vars.image64 and request.vars.project_id:
import subprocess
from convertImage import convertBase64String

project_id = request.vars.project_id
base64Img = request.vars.image64
uploadfolder = '%sstatic/uploads/' % request.folder

image_name = convertBase64String(base64Img,uploadfolder)

if image_name:

project_update = db(Project.id == project_id).select().first()
subprocess.call('rm %s/%s' % (uploadfolder, project_update.thumbnail), shell=True)
db(Project.id == project_id).update(thumbnail=image_name)

return True

else:
return False

else:
return False


@auth.requires_login()
def launch_or_end_sprint():
Expand Down
1 change: 1 addition & 0 deletions languages/pt-br.py
Expand Up @@ -66,6 +66,7 @@
'Can not be empty': 'Não pode ser vazio',
'Cancel': 'Cancelar',
'Cannot be empty': 'Não pode ser vazio',
'Change image': 'Alterar imagem',
'Change password': 'Modificar senha',
'chat here': 'escreva aqui',
'Check to delete': 'Marque para apagar',
Expand Down
4 changes: 4 additions & 0 deletions models/00_db.py
Expand Up @@ -87,6 +87,10 @@
except ImportError:
from gluon.contrib.gravatar import Gravatar

# multiples languages
if 'siteLanguage' in request.cookies and not (request.cookies['siteLanguage'] is None):
T.force(request.cookies['siteLanguage'].value)

## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc.
## register with janrain.com, write your domain:api_key in private/janrain.key
from gluon.contrib.login_methods.rpx_account import use_janrain
Expand Down
39 changes: 4 additions & 35 deletions models/20_global_objects.py
Expand Up @@ -97,13 +97,13 @@ class G_projects(object):
def newProject(self):
from datetime import datetime

folder = 'static/uploads/'
uploadfolder = '%sstatic/uploads/' % request.folder
form = SQLFORM.factory(
Field('name', label=T('Name'), requires=IS_NOT_EMPTY(error_message=T('The field name can not be empty!'))),
Field('description', label= T('Description')),
Field('url', label= 'Url'),
Field('thumbnail', type='upload',
uploadfolder='%s%s' % (request.folder,folder)),
uploadfolder=uploadfolder),
table_name='projects',
submit_button=T('CREATE')
)
Expand All @@ -113,7 +113,7 @@ def newProject(self):
person_id = person["person_id"]

if form.vars.thumbnail:
image_name = self.convertImage(form.vars.thumbnail,folder)
image_name = self.convertImage(form.vars.thumbnail,uploadfolder)
else:
image_name = None

Expand All @@ -136,44 +136,13 @@ def newProject(self):

return form

def updateThumbnail(self):
project_id = request.args(0)
folder = 'static/uploads/'
form_thumbnail = SQLFORM.factory(
Field('thumbnail', type='upload',
uploadfolder='%s%s' % (request.folder,folder)),
table_name='update',
)
if form_thumbnail.process().accepted:
import subprocess

folder = 'static/uploads/'
upload_folder = '%s%s' % (request.folder,folder)
if form_thumbnail.vars.thumbnail:
image_name = self.convertImage(form_thumbnail.vars.thumbnail,folder)
else:
redirect(URL(f='product_backlog', args=[project_id]))

project_update = db(Project.id == project_id).select().first()
subprocess.call('rm %s/%s' % (upload_folder, project_update.thumbnail), shell=True)


db(Project.id == project_id).update(thumbnail=image_name)
redirect(URL(f='product_backlog', args=[project_id]))

elif form_thumbnail.errors:
response.flash = T('form has errors')

return form_thumbnail


def convertImage(self,base64txt,folder):
def convertImage(self,base64txt,uploadfolder):
import os
import base64

arglen = len(base64txt)
if arglen > 1:
uploadfolder=os.path.join(request.folder,folder)
b64file = open(uploadfolder+base64txt, 'rb').read()
if b64file.startswith("data:image/png;base64,"):
b64file = b64file[22:]
Expand Down
19 changes: 19 additions & 0 deletions modules/convertImage.py
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-

## Convert string Base64 Images

def convertBase64String(base64Img,uploadfolder):
if base64Img.startswith("data:image/png;base64,"):
import base64
import random
base64Img = base64Img[22:]
image = base64.b64decode(base64Img)
filename = "projects_thumbnail_%s%s.png" %(random.random(), random.random())

with open(uploadfolder+filename, 'wb') as imgFile:
imgFile.write(image)

return filename

else:
return False
26 changes: 21 additions & 5 deletions static/css/base.css
Expand Up @@ -1696,11 +1696,6 @@ html, body, .container, .content {
box-shadow: 0 1px 3px rgb(141, 141, 141);
}

#change_thumbnail, #project_info .preview {
cursor: pointer;

}

#change_thumbnail {
background-color: #fff;
padding: 4px;
Expand All @@ -1715,12 +1710,33 @@ html, body, .container, .content {

}

#change_image_label {
background-color: rgba(3, 3, 3, 0.69);
position: relative;
bottom: 40px;
padding: 2px 0;
color: #fff;
font-size: 13px;
display: block;
text-align: center;
cursor: pointer;
}

#change_image_label:hover {
background-color: rgba(58, 58, 58, 0.69);
}

#logo {
position: absolute;
left: 0;
z-index: 99;
}

#multilanguage {
top: 5px;
margin-right: 20px!important;
}

.sidebar-fixed {
background-color: #444444;
position: fixed!important;
Expand Down
17 changes: 14 additions & 3 deletions static/js/base.js
Expand Up @@ -37,17 +37,28 @@ $(document).ready(function(){
// event.preventDefault();
});

// create or update thumbnail
$('#projects_thumbnail, #update_thumbnail').awesomeCropper(
// create thumbnail
$('#projects_thumbnail').awesomeCropper(
{ width: 150, height: 150 }
);

// update thumbnail
try {
$('#update_thumbnail').ajaxAwesomeCropper(
{ width: 150, height: 150 }
);
}
catch (e) {
// statements to handle any exceptions
// console.log(e); // pass exception object to error handler
}

$(".btn_file").on('click', function() {
$('#update_thumbnail').val("");
$(this).parent().find('.input_file').click();
});

$(".preview, #change_thumbnail").on('click', function() {
$(".preview, #change_image_label").on('click', function() {
$('#update_thumbnail').val("");
$('.preview').removeAttr("src");
$(this).parent().find('.input_file').click();
Expand Down

0 comments on commit f8d0c22

Please sign in to comment.