Changeset 1151 in main


Ignore:
Timestamp:
06/01/12 08:00:39 (7 years ago)
Author:
pcosquer
Message:

BOM: adds a link to download a BOM as PDF

Location:
trunk/openPLM
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/pdfgen/templates/base.xhtml

    r714 r1151  
    1919                        margin-right: 1cm; 
    2020                        height: 1cm; 
    21                         width: 100%; 
     21                        width: 19cm; 
    2222                    } 
    2323                } 
     24                div.footerContent * { 
     25                        text-align: center; 
     26 
     27                } 
    2428                span.date { 
    25                     margin-left: auto; 
    26                     margin-right: auto; 
     29                    text-align: left; 
    2730                } 
    28                 span.pagenumber { 
    29                     right: 0cm; 
     31                a.openplm { 
     32                    margin-left: 5cm; 
     33                    margin-right: 5cm; 
     34                    text-align: center; 
     35                } 
     36                div.pagenumber { 
     37                    display: inline; 
     38                } 
     39                div.pagenumber * { 
     40                    text-align: right; 
    3041                } 
    3142                table.Content tr { 
     
    3647                    padding: 0.2em; 
    3748                } 
     49                a, a * { 
     50                    color: grey; 
     51                    text-decoration: none; 
     52                } 
     53 
    3854            {% endblock %}       
    3955        </style> 
     
    5369            {%block page_foot%} 
    5470                <span class="date">{% now "D j N Y, G:i" %}</span> 
     71                <a class="openplm" href="http://www.openplm.org">{% trans "Genererated by openPLM" %}</a> 
    5572                <div class="pagenumber"> 
    5673                    <pdf:pagenumber> 
    5774                </div> 
     75                 
    5876            {%endblock%} 
    5977        </div> 
  • trunk/openPLM/pdfgen/urls.py

    r864 r1151  
    4343urlpatterns = patterns('openPLM.pdfgen.views', 
    4444    (r'^pdf/object/' + object_pattern +'attributes/$', 'attributes'), 
     45    (r'^pdf/object/' + object_pattern +'BOM-child/$', 'bom_pdf'), 
    4546    (r'^pdf/user/(?P<obj_ref>[^/]+)/attributes/$', 'attributes', user_dict), 
    4647    (r'^pdf/group/(?P<obj_ref>[^/]+)/attributes/$', 'attributes', group_dict), 
  • trunk/openPLM/pdfgen/views.py

    r864 r1151  
    2525################################################################################ 
    2626 
     27import datetime 
    2728import warnings 
    2829from collections import namedtuple 
     
    4344import cStringIO as StringIO 
    4445 
    45 from openPLM.plmapp.models import ParentChildLink 
    4646from openPLM.plmapp.base_views import get_obj, handle_errors, get_generic_data 
    4747from openPLM.plmapp.controllers import get_controller 
    48 from openPLM.plmapp.views import r2r  
     48from openPLM.plmapp.views import r2r, get_children_data 
     49from openPLM.plmapp.forms import DisplayChildrenForm 
    4950from openPLM.pdfgen.forms import get_pdf_formset 
    5051 
     
    338339        raise ValueError() 
    339340 
     341@handle_errors 
     342def bom_pdf(request, obj_type, obj_ref, obj_revi): 
     343    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
     344    obj.check_readable(raise_=True) 
     345     
     346    if not hasattr(obj, "get_children"): 
     347        # TODO 
     348        raise TypeError() 
     349    date = None 
     350    level = "first" 
     351    state = "all" 
     352    if request.GET: 
     353        display_form = DisplayChildrenForm(request.GET) 
     354        if display_form.is_valid(): 
     355            date = display_form.cleaned_data["date"] 
     356            level = display_form.cleaned_data["level"] 
     357            state = display_form.cleaned_data["state"] 
     358    children, extra_columns, extension_data = get_children_data(obj, date, level, state) 
     359    ctx.update({ 
     360                'children' : children, 
     361                'extra_columns' : extra_columns, 
     362                'extension_data' : extension_data, 
     363                'level' : level, 
     364                'date' : date or datetime.datetime.utcnow(), 
     365                }) 
     366 
     367    filename = u"%s_%s_%s-bom.pdf" % (obj_type, obj_ref, obj_revi) 
     368    return render_to_pdf("bom.xhtml", ctx, filename) 
  • trunk/openPLM/plmapp/views/main.py

    r1149 r1151  
    7171from django.utils import simplejson 
    7272from django.views.i18n import set_language as dj_set_language 
    73 from django.views.decorators.csrf import * 
     73from django.views.decorators.csrf import csrf_exempt, csrf_protect 
    7474 
    7575from haystack.views import SearchView 
     
    689689###         All functions which manage the different html pages specific to part          ### 
    690690############################################################################################# 
    691 @handle_errors 
    692 def display_object_child(request, obj_type, obj_ref, obj_revi): 
    693     """ 
    694     BOM view. 
    695      
    696     That views displays the children of the selected object that must be a part. 
    697      
    698     :url: :samp:`/object/{obj_type}/{obj_ref}/{obj_revi}/bom-child/` 
    699      
    700     .. include:: views_params.txt 
    701  
    702     **Template:** 
    703      
    704     :file:`parts/bom.html` 
    705  
    706     **Context:** 
    707  
    708     ``RequestContext`` 
    709     
    710     ``children`` 
    711         a list of :class:`.Child` 
    712  
    713     ``display_form`` 
    714         a :class:`.DisplayChildrenForm` 
    715  
    716     ``extra_columns`` 
    717         a list of extra columns that are displayed 
    718      
    719     ``extension_data`` 
    720  
    721     ``decomposition_msg`` 
    722         a html message to decompose the part (may be empty) 
    723  
    724     ``decomposable_children`` 
    725         a set of child part ids that are decomposable 
    726     """ 
    727     obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
    728      
    729     if not hasattr(obj, "get_children"): 
    730         # TODO 
    731         raise TypeError() 
    732     date = None 
    733     level = "first" 
    734     state = "all" 
    735     if request.GET: 
    736         display_form = forms.DisplayChildrenForm(request.GET) 
    737         if display_form.is_valid(): 
    738             date = display_form.cleaned_data["date"] 
    739             level = display_form.cleaned_data["level"] 
    740             state = display_form.cleaned_data["state"] 
    741     else: 
    742         display_form = forms.DisplayChildrenForm(initial={"date" : datetime.datetime.now(), 
    743             "level" : "first", "state":"all"}) 
     691def get_children_data(obj, date, level, state): 
    744692    max_level = 1 if level == "first" else -1 
    745693    only_official = state == "official" 
     
    767715            for pcle in pcles: 
    768716                extension_data[pcle["link_id"]].update(pcle) 
     717    return children, extra_columns, extension_data 
     718 
     719 
     720@handle_errors 
     721def display_object_child(request, obj_type, obj_ref, obj_revi): 
     722    """ 
     723    BOM view. 
     724     
     725    That views displays the children of the selected object that must be a part. 
     726     
     727    :url: :samp:`/object/{obj_type}/{obj_ref}/{obj_revi}/bom-child/` 
     728     
     729    .. include:: views_params.txt 
     730 
     731    **Template:** 
     732     
     733    :file:`parts/bom.html` 
     734 
     735    **Context:** 
     736 
     737    ``RequestContext`` 
     738    
     739    ``children`` 
     740        a list of :class:`.Child` 
     741 
     742    ``display_form`` 
     743        a :class:`.DisplayChildrenForm` 
     744 
     745    ``extra_columns`` 
     746        a list of extra columns that are displayed 
     747     
     748    ``extension_data`` 
     749 
     750    ``decomposition_msg`` 
     751        a html message to decompose the part (may be empty) 
     752 
     753    ``decomposable_children`` 
     754        a set of child part ids that are decomposable 
     755    """ 
     756    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
     757     
     758    if not hasattr(obj, "get_children"): 
     759        # TODO 
     760        raise TypeError() 
     761    date = None 
     762    level = "first" 
     763    state = "all" 
     764    if request.GET: 
     765        display_form = forms.DisplayChildrenForm(request.GET) 
     766        if display_form.is_valid(): 
     767            date = display_form.cleaned_data["date"] 
     768            level = display_form.cleaned_data["level"] 
     769            state = display_form.cleaned_data["state"] 
     770    else: 
     771        display_form = forms.DisplayChildrenForm(initial={"date" : datetime.datetime.now(), 
     772            "level" : "first", "state":"all"}) 
     773    children, extra_columns, extension_data = get_children_data(obj, date, level, state) 
    769774    # decomposition 
    770775    if DecomposersManager.count() > 0: 
  • trunk/openPLM/templates/parts/bom.html

    r1105 r1151  
    3030        {{ decomposition_msg|safe }} 
    3131    </div> 
    32     <table class="Content"> 
    33         <tr class="Content"> 
    34             <th class="Content" style="width:50px"> {% trans "Level" %} </th> 
    35             <th class="Content" style="width:50px"> {% trans "Ord." %} </th> 
    36             <th class="Content" style="width:50px"> {% trans "Qty" %}</th> 
    37             <th class="Content" style="width:50px"> {% trans "Unit" %}</th> 
    38             <th class="Content"> {{ obj.reference }} </th> 
    39             <th class="Content"> {{ obj.revision }} </th> 
    40             <th class="Content"> {{ obj.type }} </th> 
    41             <th class="Content"> {{ obj.name }} </th> 
    42             {% for field, verbose_name in extra_columns %} 
    43                 <th class="Content"> {{ verbose_name|capfirst }} </th> 
     32    <div> 
     33        <table class="Content"> 
     34            <tr class="Content"> 
     35                <th class="Content" style="width:50px"> {% trans "Level" %} </th> 
     36                <th class="Content" style="width:50px"> {% trans "Ord." %} </th> 
     37                <th class="Content" style="width:50px"> {% trans "Qty" %}</th> 
     38                <th class="Content" style="width:50px"> {% trans "Unit" %}</th> 
     39                <th class="Content"> {{ obj.reference }} </th> 
     40                <th class="Content"> {{ obj.revision }} </th> 
     41                <th class="Content"> {{ obj.type }} </th> 
     42                <th class="Content"> {{ obj.name }} </th> 
     43                {% for field, verbose_name in extra_columns %} 
     44                    <th class="Content"> {{ verbose_name|capfirst }} </th> 
     45                {% endfor %} 
     46                <th class="Content"> {{ obj.state.name }} </th> 
     47            </tr> 
     48            {% for c in children %} 
     49 
     50                <tr class="Content">  
     51                    <td class="Content {% if level != "last" %} expander open{% endif%} level{{c.level}}" style="padding-left:{{c.level|add:"-1"}}0px;" > 
     52                        {% if forloop.last or level == "last" %} 
     53                            <span class="not_expander">{{c.level}}</span> 
     54                        {% else %} 
     55                            {% with forloop.counter as next %} 
     56                                {% with children|indice:next as ci%} 
     57                                    {% if ci.level > c.level %} 
     58                                        <span class="expander">{{c.level}}</span> 
     59                                    {% else %} 
     60                                        <span class="not_expander">{{c.level}}</span> 
     61                                    {% endif %} 
     62                                {% endwith %} 
     63                            {% endwith %} 
     64                        {% endif %} 
     65                    </td> 
     66                    {% with c.link as link %} 
     67                        <td class="Content"> {{ link.order }} </td> 
     68                        <td class="Content"> {{ link.quantity }} </td> 
     69                        <td class="Content"> {{ link.get_unit_display }} </td> 
     70                        {% with link.child as child %} 
     71                            <td class="Content">  
     72                                <a href="{{child.plmobject_url}}" 
     73                                    {% if child.id in decomposable_children %}class="decomposable"{% endif %}> 
     74                                    {{ child.reference }} 
     75                                </a> 
     76                            </td> 
     77                            <td class="Content"> {{ child.revision }} </td> 
     78                            <td class="Content"> {{ child.type }} </td> 
     79                            <td class="Content"> {{ child.name }} </td> 
     80                            {% for field, verbose_name in extra_columns %} 
     81                                <td class="Content"> {{ extension_data|key:link.id|key:field }} </td> 
     82                            {% endfor %} 
     83                            <td class="Content"> {{ child.state.name }} </td> 
     84                        {% endwith %} 
     85                    {% endwith %} 
     86                </tr> 
    4487            {% endfor %} 
    45             <th class="Content"> {{ obj.state.name }} </th> 
    46         </tr> 
    47         {% for c in children %} 
    48  
    49             <tr class="Content">  
    50                 <td class="Content {% if level != "last" %} expander open{% endif%} level{{c.level}}" style="padding-left:{{c.level|add:"-1"}}0px;" > 
    51                 {% if forloop.last or level == "last" %} 
    52                     <span class="not_expander">{{c.level}}</span> 
    53                 {% else %} 
    54                         {% with forloop.counter as next %} 
    55                         {% with children|indice:next as ci%} 
    56                                 {% if ci.level > c.level %} 
    57                     <span class="expander">{{c.level}}</span> 
    58                                 {% else %} 
    59                     <span class="not_expander">{{c.level}}</span> 
    60                                 {% endif %} 
    61                         {% endwith %} 
    62                         {% endwith %} 
    63                 {% endif %} 
    64                 </td> 
    65                 {% with c.link as link %} 
    66                     <td class="Content"> {{ link.order }} </td> 
    67                     <td class="Content"> {{ link.quantity }} </td> 
    68                     <td class="Content"> {{ link.get_unit_display }} </td> 
    69                     {% with link.child as child %} 
    70                         <td class="Content">  
    71                             <a href="{{child.plmobject_url}}" 
    72                                 {% if child.id in decomposable_children %}class="decomposable"{% endif %}> 
    73                                 {{ child.reference }} 
    74                             </a> 
    75                         </td> 
    76                         <td class="Content"> {{ child.revision }} </td> 
    77                         <td class="Content"> {{ child.type }} </td> 
    78                         <td class="Content"> {{ child.name }} </td> 
    79                         {% for field, verbose_name in extra_columns %} 
    80                             <td class="Content"> {{ extension_data|key:link.id|key:field }} </td> 
    81                         {% endfor %} 
    82                         <td class="Content"> {{ child.state.name }} </td> 
    83                     {% endwith %} 
    84                 {% endwith %} 
    85             </tr> 
    86         {% endfor %} 
    87     </table> 
     88        </table> 
     89    </div> 
     90    {% if can_generate_pdf %} 
     91        <div class="center"> 
     92            <a class="{{"Button"|button}}" href="/pdf{{obj.plmobject_url}}BOM-child/{% add_get %}"> 
     93                <span class="ui-button-text">{% trans "Download as PDF" %}</span> 
     94            </a> 
     95        </div> 
     96    {% endif %} 
    8897{% endblock %} 
    8998 
Note: See TracChangeset for help on using the changeset viewer.