Changeset 1088 in main


Ignore:
Timestamp:
05/10/12 08:19:33 (7 years ago)
Author:
zali
Message:

Handle et get progress when uploading a file

Location:
trunk/openPLM
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/manage.py

    r448 r1088  
    1212    sys.exit(1) 
    1313 
     14import SocketServer 
     15import django.core.servers.basehttp 
     16django.core.servers.basehttp.WSGIServer = \ 
     17    type('WSGIServer', 
     18         (SocketServer.ThreadingMixIn, 
     19          django.core.servers.basehttp.WSGIServer, 
     20          object), 
     21         {}) 
    1422 
    1523if __name__ == "__main__": 
  • trunk/openPLM/plmapp/controllers/__init__.py

    r864 r1088  
    172172from openPLM.plmapp.controllers.group import GroupController 
    173173 
     174 
  • trunk/openPLM/plmapp/controllers/document.py

    r994 r1088  
    135135                         "%s unlocked by %s" % (doc_file.filename, self._user)) 
    136136 
     137        
    137138    def add_file(self, f, update_attributes=True, thumbnail=True): 
    138139        """ 
     
    150151                 :attr:`settings.MAX_FILE_SIZE` 
    151152        :raises: :exc:`ValueError` if we try to add a native file while a relate standar file locked is present in the Document 
    152         """ 
    153         self.check_permission("owner") 
    154         self.check_editable() 
     153        """    
     154        self.check_permission("owner") 
     155        self.check_editable() 
     156 
    155157        if settings.MAX_FILE_SIZE != -1 and f.size > settings.MAX_FILE_SIZE: 
    156158            raise ValueError("File too big, max size : %d bytes" % settings.MAX_FILE_SIZE) 
    157159         
    158         f.name = f.name.encode("utf-8")      
     160        f.name = f.name.encode("utf-8") 
     161 
    159162        if self.has_standard_related_locked(f.name): 
    160             raise ValueError("Native file has a standard related locked file.")         
    161        
    162         doc_file = models.DocumentFile.objects.create(filename=f.name, size=f.size, 
    163                         file=models.docfs.save(f.name, f), document=self.object)                                      
     163            raise ValueError("Native file has a standard related locked file.") 
     164 
     165        f.seek(0, os.SEEK_END) 
     166        doc_file = models.DocumentFile.objects.create(filename=f.name, size=f.tell(), 
     167                        file=models.docfs.save(f.name,f), document=self.object)                                      
    164168        self.save(False) 
    165169        # set read only file 
  • trunk/openPLM/plmapp/views/main.py

    r1039 r1088  
    6060from django.contrib.auth.models import User 
    6161from django.forms import HiddenInput 
    62 from django.http import HttpResponseRedirect, HttpResponse,\ 
     62from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError, \ 
    6363                        HttpResponsePermanentRedirect, HttpResponseForbidden 
    6464from django.shortcuts import render_to_response 
     
    6969from django.utils import simplejson 
    7070from django.views.i18n import set_language as dj_set_language 
     71from django.views.decorators.csrf import * 
    7172 
    7273from haystack.views import SearchView 
     
    961962########################################################################################## 
    962963@handle_errors(undo="..") 
     964@csrf_protect 
    963965def add_file(request, obj_type, obj_ref, obj_revi): 
    964966    """ 
     
    969971    """ 
    970972    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
    971      
    972973    if request.method == "POST": 
    973974        add_file_form = forms.AddFileForm(request.POST, request.FILES) 
     
    975976            obj.add_file(request.FILES["filename"]) 
    976977            ctx.update({'add_file_form': add_file_form, }) 
    977             return HttpResponseRedirect(obj.plmobject_url + "files/") 
     978            return HttpResponseRedirect(".") 
    978979    else: 
    979980        add_file_form = forms.AddFileForm() 
    980981    ctx.update({ 'add_file_form': add_file_form, }) 
    981982    return r2r('documents/files_add.html', ctx, request) 
     983 
     984########################################################################################## 
     985@handle_errors 
     986@csrf_protect 
     987def up_progress(request, obj_type, obj_ref, obj_revi): 
     988    """ 
     989    Show upload progress for a given path 
     990    """ 
     991    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
     992    ret = "" 
     993    #if 'f_path' in request.GET: 
     994    #f_path=request.GET['f_path'] 
     995    f = glob.glob("/tmp/*upload") 
     996    ret = str(os.path.getsize(f[0])) 
     997    if ret==request.GET['f_size']: 
     998        ret += ":linking" 
     999    else: 
     1000        ret += ":writing" 
     1001    return HttpResponse(ret) 
     1002 
     1003 
    9821004 
    9831005############################################################################################# 
  • trunk/openPLM/templates/documents/files_add.html

    r808 r1088  
    33 
    44<!-- Manage html display in the Content div which correspond to the "doc-cad" menu + "add new"--> 
     5 
     6{% block scripts %} 
     7<script> 
     8/*var nbr_files=0; 
     9function new_input_file(){ 
     10    var table = $("#fileupload > table.Content"); 
     11    var num = nbr_files+1; 
     12    var input = "<tr><th><label for='id_filename"+num+"'>Filename:</label></th><td><input type='file' name='filename"+num+"' id='id_filename"+num+"'/ ></td></tr>"; 
     13    table.prepend(input); 
     14} 
     15 
     16function add_file(input){ 
     17    if (nbr_files==0) 
     18        $("#div_files").removeChild($("#div_files").firstChild()); 
     19    //create where the progress of the upload will be display for this input 
     20    var check_id="check"; 
     21    if (nbr_files>0) 
     22        check_id+=nbr_files; 
     23    var file_line = $("<p><input type='checkbox' id='"+check_id+"'/"+"></p>"); 
     24    var file_name = this.value; 
     25    file_line.append(file_name); 
     26 
     27    //create link to delete this file from the queue for upload 
     28    var link = $("<a href='#'></a>"); 
     29    var del_img = "<img src='/media/img 
     30} 
     31 
     32function del_file(input){ 
     33}*/ 
     34 
     35//generate random id to get the upload progress 
     36function gen_uuid() { 
     37    var uuid = ""; 
     38    for (var i=0; i < 32; i++) { 
     39        uuid += Math.floor(Math.random() * 16).toString(16);  
     40    } 
     41    return uuid; 
     42} 
     43 
     44//return percentage of the progress 
     45function progress_bar(uploaded, total){ 
     46    var progress_w = uploaded * 100/total; 
     47    return progress_w; 
     48} 
     49 
     50//return an XMLHttpRequest 
     51function getXHR(){ 
     52    var xhr=null; 
     53         
     54    if (window.XMLHttpRequest || window.ActiveXObject) { 
     55        if (window.ActiveXObject) { 
     56            try { 
     57                xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
     58            } catch(e) { 
     59                xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
     60            } 
     61        } else { 
     62                xhr = new XMLHttpRequest();  
     63        } 
     64    } else { 
     65        alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest..."); 
     66        return null; 
     67    } 
     68 
     69    return xhr; 
     70} 
     71 
     72//get a unique and available path name for the selected file 
     73function get_path_name(){ 
     74    var file_form = $('form#fileupload')[0]; 
     75    var file_liste=file_form.elements["filename"].files; 
     76    var file=file_liste[0]; 
     77    totalsize=file.size; 
     78    f_name=file.name; 
     79    var xhr1=getXHR(); 
     80    var action = location.href; 
     81    action = action.split("?")[0]; 
     82    action +="?f_name="+f_name+"&f_size="+totalsize; 
     83    xhr1.open("GET",action,false); 
     84    xhr1.onreadystatechange = function() { 
     85        if(xhr1.readyState == 4) { 
     86            /*paths[f_name]={ 
     87                'path': xhr1.responseText, 
     88                'size': totalsize 
     89            };*/ 
     90            path = xhr1.responseText; 
     91        } 
     92    } 
     93    xhr1.send(null); 
     94} 
     95 
     96 
     97var t; 
     98//id generated for the uploaded file not use any more 
     99var id ; 
     100//size of the selected file 
     101var totalsize=0; 
     102//name of the selected file 
     103var f_name =""; 
     104var uploaded=0; 
     105var path=""; 
     106//Array that contains path and size of eache files selected for upload 
     107//var files_info=new Array(); 
     108var go_to =""; 
     109 
     110$(function(){ 
     111    var xhr = getXHR(); 
     112    $("input[type='file']").change(function (){ 
     113        //add_file(this); 
     114        //id=gen_uuid(); 
     115    }); 
     116    $("input[name='_undo']").click(function(){ 
     117        xhr.abort(); 
     118    }); 
     119    $("#_up").click(function(){ 
     120        //get_path_name(); 
     121        var go_to=""; 
     122        //var xhr=getXHR(); 
     123        var file_form = $('form#fileupload')[0]; 
     124        var new_action = file_form.action; 
     125        /*new_action = new_action.replace("/files/add","/files/up"); 
     126        new_action +="?X-Progress-ID="+id;*/ 
     127        function update_progress_info() { 
     128            if(($("#progress_div").text()!=="")&&(totalsize!=0)){ 
     129                var xhr2=getXHR(); 
     130                var action = location.href; 
     131                action = action.split("?")[0]; 
     132                action=action.replace("/files/add","/files/_up"); 
     133                //action+="?f_path="+path; 
     134                //action+="?X-Progress-ID="+id; 
     135                action+="?f_size="+totalsize; 
     136                xhr2.open("GET",action,true); 
     137                xhr2.onreadystatechange = function() { 
     138                    /*if(xhr2.readyState == 2){ 
     139                        $("#test_req").append(" demande pour up du progrès reçue<br/"+">"); 
     140                    }*/ 
     141                    if((xhr2.readyState == 4)&&(xhr2.status!=500)) { 
     142                        var response=xhr2.responseText; 
     143                        uploaded = parseInt(response.split(":")[0]); 
     144                        var f_status = response.split(":")[1]; 
     145                        var percent =progress_bar(uploaded,totalsize); 
     146                        if(isNaN(percent)==false){ 
     147                            var aux_per=""+percent; 
     148                            if (aux_per.split(".").length>1) 
     149                                aux_per=aux_per.split(".")[0]+"."+aux_per.split(".")[1].substr(0,2); 
     150                            $("#up_progress").text(aux_per+"%"); 
     151                            //$("#up_progress").text(percent+"%"); 
     152                        } 
     153                        if(f_status=="linking"){ 
     154                            var text=$("#up_progress").text(); 
     155                            var evol = text.split("%")[0]; 
     156                            if(isNaN(percent)) 
     157                                $("#up_progress").text("100%"+"(link in creation)"); 
     158                            else 
     159                                $("#up_progress").text(evol+"%(link in creation)"); 
     160                        } 
     161                    } 
     162                } 
     163                xhr2.send(null); 
     164                //if(uploaded!=totalsize) 
     165                window.setTimeout(update_progress_info, 1000); 
     166                if(go_to!="") 
     167                    location.href=go_to; 
     168            } 
     169        }; 
     170        window.setTimeout(update_progress_info, 1000); 
     171        xhr.onreadystatechange = function() { 
     172            if(xhr.readyState == 4) { 
     173                go_to = location.href; 
     174                go_to = go_to.replace("/files/add","/files"); 
     175            } 
     176        } 
     177        xhr.open("POST", new_action,true); 
     178        data = new FormData(file_form); 
     179        data.append("path",path); 
     180        xhr.send(data); 
     181        var file_liste=file_form.elements["filename"].files; 
     182        var file=file_liste[0]; 
     183        f_name=file.name; 
     184        var file_name = $("<span id='file_name'></span>"); 
     185        var file_progress=$("<span id='up_progress'>0%</span>"); 
     186        file_name.text(f_name+":"); 
     187        $("#progress_div").append(file_name); 
     188        $("#progress_div").append(file_progress); 
     189        $("#progress_div").append("<img src='/media/img/loading.gif' alt='loading' style='float:left;'>"); 
     190        totalsize=file.size; 
     191    }); 
     192}); 
     193</script> 
     194{% endblock %} 
     195 
     196{% block css %} 
     197<style type="text/css"> 
     198</style> 
     199{% endblock %} 
    5200 
    6201{% block content %} 
     
    9204        {% include "snippets/undo_form.html" %} 
    10205    {% endwith %} 
     206<!--</form>--> 
     207<form id="link" method="post" action=".">{% csrf_token %} 
    11208</form> 
     209 
     210<div id="progress_div"> 
     211</div> 
     212<div id="test_req"></div> 
    12213{% endblock %} 
    13214 
  • trunk/openPLM/templates/parts/bom.html

    r997 r1088  
    5454                        {% with forloop.counter as next %} 
    5555                        {% with children|indice:next as ci%} 
    56                         {% if ci.level > c.level %} 
     56                                {% if ci.level > c.level %} 
    5757                    <span class="expander">{{c.level}}</span> 
    58                         {% else %} 
     58                                {% else %} 
    5959                    <span class="not_expander">{{c.level}}</span> 
    60                         {% endif %} 
     60                                {% endif %} 
    6161                        {% endwith %} 
    6262                        {% endwith %} 
  • trunk/openPLM/templates/snippets/undo_form.html

    r808 r1088  
    11{% load i18n plmapp_tags %} 
    22{% if form.is_multipart %} 
    3 <form enctype="multipart/form-data" method="post" action="{{action|default:"."}}" {{ form_attributes }}> 
     3 
     4<form id="fileupload" enctype="multipart/form-data" method="post" action="{{action|default:"."}}" {{ form_attributes }}> 
    45{% else %} 
    56    <form method="post" action="{{action|default:"."}}"  {{ form_attributes }}> 
     
    1112            </td> 
    1213            <td> 
     14                {% if form.is_multipart %} 
     15                <input type="button" class="{{"Button"|button}}" value="{% trans "Upload" %}" id="_up"/> 
     16                <!--<input type="button" class="{{"Button"|button}}" value="{% trans "Delete" %}" id="_delete"/>--> 
     17                {% else %} 
    1318                <input type="submit" class="{{"Button"|button}}" value="{% trans "Validate" %}" name="_validate"/> 
     19                {% endif %} 
    1420                <input type="submit" class="{{"Button"|button}}" value="{% trans "Undo" %}" name="_undo"/> 
    1521            </td> 
  • trunk/openPLM/urls.py

    r999 r1088  
    117117    (r'files/$', display_files), 
    118118    (r'files/add/$', add_file), 
     119    #(r'files/up/$', up_file), 
     120    (r'files/_up/$', up_progress), 
    119121    (r'files/checkin/(?P<file_id_value>[^/]+)/$', checkin_file), 
    120122    (r'files/checkout/(?P<docfile_id>[^/]+)/$', checkout_file), 
Note: See TracChangeset for help on using the changeset viewer.