Changeset 1098 in main


Ignore:
Timestamp:
05/11/12 09:28:16 (7 years ago)
Author:
pcosquer
Message:
  • add a browse page (still in developpment)
  • file upload: clean up
Location:
trunk/openPLM
Files:
6 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM

  • trunk/openPLM/media/css/openplm.css

    r1015 r1098  
    9595    background-image: url("../img/dark/h2_bg_2.png"); 
    9696} 
     97h3.alternate { 
     98    background-image: url("../img/dark/h2_bg_1.png"); 
     99} 
    97100 
    98101 
     
    10931096    margin: 1em; 
    10941097 } 
     1098 
     1099div.identity_card { 
     1100    display: inline-block; 
     1101    background-color: white; 
     1102    border: 1px solid #777; 
     1103    border-radius: 0.4em; 
     1104    box-shadow: 1px 1px 3px #888; 
     1105    width: 20em; 
     1106    height: 130px; 
     1107    padding: 5px; 
     1108    margin: 0.5em; 
     1109    position: relative; 
     1110} 
     1111 
     1112div.identity_card > div.id_thumbnail, 
     1113div.identity_card > div.id_details { 
     1114    display: block; 
     1115} 
     1116div.identity_card > div.id_thumbnail { 
     1117    width: 100px; 
     1118    height: 100px; 
     1119    float: left; 
     1120    background-color: #343434; 
     1121    border: 1px solid #343434; 
     1122    margin-top: 15px; 
     1123    display: table-cell; 
     1124} 
     1125div.identity_card div.id_thumbnail_inner { 
     1126    vertical-align: middle; 
     1127    display: table-cell; 
     1128    height: 100px; 
     1129    width: 100px; 
     1130} 
     1131 
     1132div.identity_card > div.id_thumbnail img { 
     1133    max-width: 100px; 
     1134    max-height: 100px; 
     1135    margin:auto; 
     1136    float: none; 
     1137    display: block; 
     1138} 
     1139div.identity_card > div.id_details { 
     1140    height: 120px; 
     1141    border-left: 1px solid #ccc; 
     1142    padding: 0 1em; 
     1143    position: absolute; 
     1144    left: 120px; 
     1145    width: 150px; 
     1146    font-size: 90%; 
     1147} 
     1148div.id_details span.type { 
     1149    font-weight: bold; 
     1150} 
     1151div.id_details p { 
     1152    margin-top: 0.5em; 
     1153    word-wrap: break-word; 
     1154} 
     1155div.id_details p:not(:last-child) { 
     1156    border-bottom: 1px dotted #ccc; 
     1157} 
     1158 
     1159div#type-panel { 
     1160    float: left; 
     1161    width: 15em; 
     1162    background-color: #fcfcfc; 
     1163    height: 100%; 
     1164    position: absolute; 
     1165} 
     1166div#type-panel h3 { 
     1167    margin: 0; 
     1168} 
     1169div#type-panel li { 
     1170    list-style: none; 
     1171    margin-left: 0; 
     1172    padding-left: 1em; 
     1173} 
     1174div#type-panel li a { 
     1175    line-height: 2em; 
     1176    width: 100%; 
     1177} 
     1178div#type-panel li a span { 
     1179    display: block; 
     1180    width: 100%; 
     1181} 
     1182div#type-panel li a, 
     1183div.id_details a { 
     1184    text-decoration: none; 
     1185} 
     1186div#type-panel li.selected { 
     1187    border-right: 6px solid #343434; 
     1188    border-left: 0.8em solid #343434; 
     1189    margin-right: -3px; 
     1190    margin-left: -0.4em; 
     1191    padding-left: 0.6em; 
     1192} 
     1193div#type-panel li:hover { 
     1194    color: white; 
     1195    background-color: #343434; 
     1196} 
     1197div#type-panel li:hover * { 
     1198    color: white; 
     1199} 
     1200 
     1201.ic-group span.description { 
     1202    overflow: hidden; 
     1203    max-height: 5em; 
     1204    display: block; 
     1205} 
     1206 
     1207div#browse-results { 
     1208    margin-left: 15em; 
     1209    padding-left: 1em; 
     1210} 
     1211 
     1212div#browser { 
     1213    position: relative; 
     1214    min-height: 500px; 
     1215} 
  • trunk/openPLM/plmapp/filehandlers/progressbarhandler.py

    r1096 r1098  
    22from django.core.files.uploadhandler import FileUploadHandler 
    33from django.core.files.uploadedfile import * 
    4 from django.core.cache import cache 
    5 from django.utils import simplejson 
    64 
    75#import string 
     
    2624    def __init__(self, *args, **kwargs): 
    2725        super(ProgressBarUploadHandler, self).__init__(*args, **kwargs) 
    28         self.progress_id = None 
     26        self.progress_id = None 
    2927 
    3028    def new_file(self,file_name, *args, **kwargs): 
     
    3230        Create the file object to append to as data is coming in. 
    3331        """ 
    34         self.progress_id = self.request.GET['X-Progress-ID'] 
     32        self.progress_id = self.request.GET['X-Progress-ID'] 
    3533        super(ProgressBarUploadHandler, self).new_file(file_name, *args, **kwargs) 
    3634        self.file = ProgressUploadedFile(self.progress_id,self.file_name, self.content_type, 0, self.charset) 
     
    4038     
    4139    def file_complete(self, file_size): 
    42        self.file.seek(0) 
    43        self.file.size = file_size 
    44        return self.file 
     40        self.file.seek(0) 
     41        self.file.size = file_size 
     42        return self.file 
    4543 
    4644    def upload_complete(self): 
    47         pass 
     45        pass 
    4846 
    4947    def get_file_path(self): 
    50         return self.file.temporary_file_path() 
     48        return self.file.temporary_file_path() 
    5149 
    5250 
     
    5755    """ 
    5856    def __init__(self, suf, name, content_type, size, charset): 
    59         suf_id = "%s" % (suf) 
     57        suf_id = "%s" % (suf) 
    6058        if settings.FILE_UPLOAD_TEMP_DIR: 
    6159            file = tempfile.NamedTemporaryFile(suffix='.%s_upload' % (suf_id), 
    62                 dir=settings.FILE_UPLOAD_TEMP_DIR) 
     60                                               dir=settings.FILE_UPLOAD_TEMP_DIR) 
    6361        else: 
    64             file = tempfile.NamedTemporaryFile(suffix='%s_upload' % (suf_id)) 
     62            file = tempfile.NamedTemporaryFile(suffix='.%s_upload' % (suf_id)) 
    6563        super(ProgressUploadedFile, self).__init__(file, name, content_type, size, charset) 
    6664 
  • trunk/openPLM/plmapp/templatetags/plmapp_tags.py

    r1068 r1098  
    33from django import template 
    44from django.contrib.auth.models import User 
     5from django.template import Node, resolve_variable 
    56from openPLM.plmapp.controllers.user import UserController 
    67from openPLM.plmapp import models 
     8 
    79 
    810register = template.Library() 
     
    134136    return text 
    135137 
     138# from http://djangosnippets.org/snippets/2428/ by naktinis 
     139 
     140""" 
     141The tag generates a parameter string in form '?param1=val1&param2=val2'. 
     142The parameter list is generated by taking all parameters from current 
     143request.GET and optionally overriding them by providing parameters to the tag. 
     144 
     145This is a cleaned up version of http://djangosnippets.org/snippets/2105/. It 
     146solves a couple of issues, namely: 
     147 * parameters are optional 
     148 * parameters can have values from request, e.g. request.GET.foo 
     149 * native parsing methods are used for better compatibility and readability 
     150 * shorter tag name 
     151 
     152Usage: place this code in your appdir/templatetags/add_get_parameter.py 
     153In template: 
     154{% load add_get_parameter %} 
     155<a href="{% add_get param1='const' param2=variable_in_context %}"> 
     156Link with modified params 
     157</a> 
     158 
     159It's required that you have 'django.core.context_processors.request' in 
     160TEMPLATE_CONTEXT_PROCESSORS 
     161 
     162Original version's URL: http://django.mar.lt/2010/07/add-get-parameter-tag.html 
     163""" 
     164 
     165class AddGetParameter(Node): 
     166    def __init__(self, values): 
     167        self.values = values 
     168         
     169    def render(self, context): 
     170        req = resolve_variable('request', context) 
     171        params = req.GET.copy() 
     172        for key, value in self.values.items(): 
     173            params[key] = value.resolve(context) 
     174        return '?%s' %  params.urlencode() 
     175 
     176 
     177@register.tag 
     178def add_get(parser, token): 
     179    pairs = token.split_contents()[1:] 
     180    values = {} 
     181    for pair in pairs: 
     182        s = pair.split('=', 1) 
     183        values[s[0]] = parser.compile_filter(s[1]) 
     184    return AddGetParameter(values) 
  • trunk/openPLM/plmapp/views/main.py

    r1096 r1098  
    5959from django.contrib.auth.forms import PasswordChangeForm 
    6060from django.contrib.auth.models import User 
     61from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
     62from django.db.models import F 
    6163from django.forms import HiddenInput 
    6264from django.http import HttpResponseRedirect, HttpResponse, HttpResponseServerError, \ 
     
    964966########################################################################################## 
    965967@handle_errors(undo="..") 
    966 #@csrf_protect 
    967968def add_file(request, obj_type, obj_ref, obj_revi): 
    968969    """ 
     
    977978        if add_file_form.is_valid(): 
    978979            obj.add_file(request.FILES["filename"]) 
    979             ctx.update({'add_file_form': add_file_form, }) 
    980980            return HttpResponseRedirect(".") 
    981981    else: 
     
    998998        add_file_form = forms.AddFileForm(request.POST, request.FILES) 
    999999        if add_file_form.is_valid(): 
    1000             obj.add_file(request.FILES["filename"]) 
    1001             ctx.update({'add_file_form': add_file_form, }) 
     1000            obj.add_file(request.FILES["filename"]) 
    10021001            return HttpResponse(".") 
    10031002 
     
    10111010    ret = "" 
    10121011    p_id = request.GET['X-Progress-ID'] 
    1013     f = glob.glob("/tmp/*%s_upload" % p_id) 
     1012    tempdir = settings.FILE_UPLOAD_TEMP_DIR or tempfile.gettempdir() 
     1013    f = glob.glob(os.path.join(tempdir, "*%s_upload" % p_id)) 
    10141014    if len(f) > 0: 
    1015         ret = str(os.path.getsize(f[0])) 
     1015        ret = str(os.path.getsize(f[0])) 
    10161016    if ret==request.GET['f_size']: 
    1017         ret += ":linking" 
    1018     else: 
    1019         ret += ":writing" 
     1017        ret += ":linking" 
     1018    else: 
     1019        ret += ":writing" 
    10201020    return HttpResponse(ret) 
    10211021 
     
    18171817        return super(OpenPLMSearchView, self).__call__(request) 
    18181818 
     1819@handle_errors 
     1820def browse(request, type="object"): 
     1821    obj, ctx = get_generic_data(request, search=False) 
     1822    cls = { 
     1823        "object" : models.PLMObject,  
     1824        "part" : models.Part, 
     1825        "document" : models.Document, 
     1826        "group" : models.GroupInfo, 
     1827        "user" : User, 
     1828    }[type] 
     1829             
     1830    object_list = cls.objects.all() 
     1831    ctx["state"] = state = request.GET.get("state", "all") 
     1832    if type in ("object", "part", "document"): 
     1833        ctx["plmobjects"] = True 
     1834        if state == "official": 
     1835            object_list = object_list.\ 
     1836                    exclude(lifecycle=models.get_cancelled_lifecycle()).\ 
     1837                    filter(state=F("lifecycle__official_state")) 
     1838    else: 
     1839        ctx["plmobjects"] = False 
     1840         
     1841     
     1842    sort = request.GET.get("sort", "recently-added") 
     1843    if sort == "name": 
     1844        sort_critera = "username" if type == "user" else "name" 
     1845    else: 
     1846        sort_critera = "-date_joined" if type == "user" else "-ctime" 
     1847    object_list = object_list.order_by(sort_critera) 
     1848 
     1849    paginator = Paginator(object_list, 24) # Show 24 objects per page 
     1850 
     1851    page = request.GET.get('page', 1) 
     1852    try: 
     1853        objects = paginator.page(page) 
     1854    except PageNotAnInteger: 
     1855        # If page is not an integer, deliver first page. 
     1856        objects = paginator.page(1) 
     1857    except EmptyPage: 
     1858        # If page is out of range (e.g. 9999), deliver last page of results. 
     1859        objects = paginator.page(paginator.num_pages) 
     1860    ctx["thumbnails"] = {} 
     1861    ctx["num_files"] = {} 
     1862 
     1863    if type in ("object", "document"): 
     1864        ids = objects.object_list.values_list("id", flat=True) 
     1865        thumbnails = models.DocumentFile.objects.filter(deprecated=False, 
     1866                document__in=ids, thumbnail__isnull=False) 
     1867        ctx["thumbnails"].update(dict(thumbnails.values_list("document", "thumbnail"))) 
     1868        num_files = dict.fromkeys(ids, 0) 
     1869        for doc_id in models.DocumentFile.objects.filter(deprecated=False, 
     1870                document__in=ids).values_list("document", flat=True): 
     1871            num_files[doc_id] += 1 
     1872        ctx["num_files"] = num_files 
     1873    ctx.update({ 
     1874        "objects" : objects, 
     1875        "object_type" : _("Browse"), 
     1876        "type" : type, 
     1877        "sort" : sort, 
     1878    }) 
     1879    return r2r("browse.html", ctx, request) 
     1880 
  • trunk/openPLM/urls.py

    r1096 r1098  
    8888        import_csv_apply), 
    8989    ('^import/done/$', import_csv_done), 
     90    # browse 
     91    (r'^browse/(?P<type>object|part|document|user|group)?/', 'openPLM.plmapp.views.main.browse'), 
    9092    ) 
    9193 
Note: See TracChangeset for help on using the changeset viewer.