Changeset 369 in main


Ignore:
Timestamp:
10/04/11 12:10:37 (8 years ago)
Author:
pcosquer
Message:

do not allow the user to attach/add an invalid object

Location:
trunk/openPLM
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/plmapp/base_views.py

    r367 r369  
    324324                'attributes_form' : attributes_form, 
    325325                'link_creation' : False, 
     326                'attach' : (selected_object, False), 
    326327                'class4div' : class_for_div, 
    327328                'obj' : selected_object, 
  • trunk/openPLM/plmapp/controllers/document.py

    r367 r369  
    3636from openPLM.plmapp.exceptions import LockError, UnlockError, DeleteFileError 
    3737from openPLM.plmapp.controllers.plmobject import PLMObjectController 
     38from openPLM.plmapp.controllers.base import get_controller 
    3839 
    3940class DocumentController(PLMObjectController): 
     
    209210        """ 
    210211 
     212        self.check_attach_part(part)         
    211213        if isinstance(part, PLMObjectController): 
    212             part.check_readable() 
    213214            part = part.object 
    214         else: 
    215             if not (isinstance(part, models.PLMObject) and hasattr(part, "part")): 
    216                 raise ValueError("%s is not a part" % part) 
    217             type(self)(part, self._user).check_readable() 
    218215        self.documentpartlink_document.create(part=part) 
    219216        self._save_histo(models.DocumentPartLink.ACTION_NAME, 
     
    248245            part = part.object 
    249246        return bool(self.documentpartlink_document.filter(part=part)) 
     247 
     248    def check_attach_part(self, part): 
     249        self.check_permission("owner") 
     250        if isinstance(part, PLMObjectController): 
     251            part.check_readable() 
     252            part = part.object 
     253        else: 
     254            if not hasattr(part, "part"): 
     255                raise TypeError("%s is not a part" % part) 
     256            get_controller(part.type)(part, self._user).check_readable() 
     257        if self.is_part_attached(part): 
     258            raise ValueError("part is already attached.") 
     259     
     260    def can_attach_part(self, part): 
     261        """ 
     262        Returns True if *part* can be attached to the current document. 
     263        """ 
     264        can_attach = False 
     265        try: 
     266            self.check_attach_part(part) 
     267            can_attach = True 
     268        except StandardError: 
     269            pass 
     270        return can_attach 
    250271 
    251272    def revise(self, new_revision): 
  • trunk/openPLM/plmapp/controllers/part.py

    r367 r369  
    3232import openPLM.plmapp.models as models 
    3333from openPLM.plmapp.controllers.plmobject import PLMObjectController 
     34from openPLM.plmapp.controllers.base import get_controller 
    3435 
    3536Child = namedtuple("Child", "level link") 
     
    6465        if child.id == self.object.id: 
    6566            raise ValueError("Can not add child: child is current object") 
    66         type(self)(child, self._user).check_readable() 
     67        get_controller(child.type)(child, self._user).check_readable() 
    6768        parents = (p.link.parent.pk for p in self.get_parents(-1)) 
    6869        if child.pk in parents: 
     
    7475                                (child, self.object)) 
    7576 
     77    def can_add_child(self, child): 
     78        """ 
     79        Returns True if *child* can be added to *self*. 
     80        """ 
     81 
     82        can_add = False 
     83        try: 
     84            self.check_add_child(child) 
     85            can_add = True 
     86        except StandardError: 
     87            pass 
     88        return can_add 
    7689 
    7790    def add_child(self, child, quantity, order): 
     
    259272        """ 
    260273         
    261         self.check_permission("owner") 
     274        self.check_attach_document(document) 
    262275        if isinstance(document, PLMObjectController): 
    263             document.check_readable() 
    264276            document = document.object 
    265         else: 
    266             type(self)(document, self._user).check_readable() 
    267277        self.documentpartlink_part.create(document=document) 
    268278        self._save_histo(models.DocumentPartLink.ACTION_NAME, 
     
    301311            document = document.object 
    302312        return bool(self.documentpartlink_part.filter(document=document)) 
    303     
     313     
     314    def check_attach_document(self, document): 
     315        self.check_permission("owner") 
     316        if isinstance(document, PLMObjectController): 
     317            document.check_readable() 
     318            document = document.object 
     319        else: 
     320            if not hasattr(document, "document"): 
     321                raise TypeError("%s is not a document" % document) 
     322            get_controller(document.type)(document, self._user).check_readable() 
     323            type(self)(document, self._user).check_readable() 
     324        if self.is_document_attached(document): 
     325            raise ValueError("Document is already attached.") 
     326 
     327    def can_attach_document(self, document): 
     328        """ 
     329        Returns True if *document* can be attached to the current part. 
     330        """ 
     331        can_attach = False 
     332        try: 
     333            self.check_attach_document(document) 
     334            can_attach = True 
     335        except StandardError: 
     336            pass 
     337        return can_attach 
     338 
    304339    def update_doc_cad(self, formset): 
    305340        u""" 
  • trunk/openPLM/plmapp/templatetags/plmapp_tags.py

    r242 r369  
    11from django import template 
     2from django.contrib.auth.models import User 
    23 
    34register = template.Library() 
     
    1920    return string[:number]+dots 
    2021 
     22@register.filter 
     23def can_add(child, arg): 
     24    parent, action = arg 
    2125 
     26    if action == "attach_doc": 
     27        return parent.can_attach_document(child) 
     28    elif action == "attach_part": 
     29        return parent.can_attach_part(child) 
     30    elif action == "add_child": 
     31        return parent.can_add_child(child) 
     32    elif action == "delegate": 
     33        return isinstance(child, User) 
     34  
     35    return False 
  • trunk/openPLM/plmapp/views/ajax.py

    r367 r369  
    160160        if form.is_valid(): 
    161161            child = get_obj_from_form(form, request.user) 
    162             try: 
    163                 part.check_add_child(child) 
    164                 data["can_add"] = True 
    165             except StandardError: 
    166                 pass 
     162            data["can_add"] = part.can_add_child(child) 
    167163    return data 
    168164 
     
    209205            attached = get_obj_from_form(form, request.user) 
    210206            if attached.check_readable(False): 
    211                 if hasattr(plmobject, "is_document_attached"): 
    212                     data["can_attach"] = not (hasattr(attached, "part") or \ 
    213                                      plmobject.is_document_attached(attached)) 
    214                 elif hasattr(plmobject, "is_part_attached"): 
    215                     data["can_attach"] = not (hasattr(attached, "document") or \ 
    216                                      plmobject.is_part_attached(attached)) 
    217     return data 
    218  
     207                if hasattr(plmobject, "can_attach_document"): 
     208                    data["can_attach"] = plmobject.can_attach_document(attached) 
     209                elif hasattr(plmobject, "can_attach_part"): 
     210                    data["can_attach"] = plmobject.can_attach_part(attached) 
     211    return data 
     212 
  • trunk/openPLM/plmapp/views/main.py

    r368 r369  
    280280        add_child_form = AddChildForm() 
    281281        ctx.update({'current_page':'BOM-child'}) 
    282     ctx.update({'link_creation': True, 'add_child_form': add_child_form, }) 
     282    ctx.update({'link_creation': True, 
     283                'add_child_form': add_child_form, 
     284                'attach' : (obj, "add_child")}) 
    283285    return r2r('DisplayObjectChildAdd.htm', ctx, request) 
    284286     
     
    364366    else: 
    365367        add_doc_cad_form = AddDocCadForm() 
    366     ctx.update({'link_creation': True, 'add_doc_cad_form': add_doc_cad_form, }) 
     368    ctx.update({'link_creation': True, 
     369                'add_doc_cad_form': add_doc_cad_form, 
     370                'attach' : (obj, "attach_doc")}) 
    367371    return r2r('DisplayDocCadAdd.htm', ctx, request) 
    368372     
     
    416420        add_rel_part_form = AddRelPartForm() 
    417421    ctx.update({'link_creation': True, 
    418                 'add_rel_part_form': add_rel_part_form, }) 
     422                'add_rel_part_form': add_rel_part_form, 
     423                'attach' : (obj, "attach_part") }) 
    419424    return r2r('DisplayRelPartAdd.htm', ctx, request) 
    420425 
     
    465470    else: 
    466471        add_file_form = AddFileForm() 
    467     ctx.update({'link_creation': True, 'add_file_form': add_file_form, }) 
     472    ctx.update({ 'add_file_form': add_file_form, }) 
    468473    return r2r('DisplayFileAdd.htm', ctx, request) 
    469474 
     
    531536    ctx.update({'current_page':'management',  
    532537                'replace_management_form': replace_management_form, 
    533                 'link_creation': True,}) 
     538                'link_creation': True, 
     539                'attach' : (obj, "delegate")}) 
    534540    return r2r('DisplayObjectManagementReplace.htm', ctx, request) 
    535541 
     
    558564    ctx.update({'current_page':'management',  
    559565                'replace_management_form': add_management_form, 
    560                 'link_creation': True,}) 
     566                'link_creation': True, 
     567                "attach" : (obj, "delegate")}) 
    561568    return r2r('DisplayObjectManagementReplace.htm', ctx, request) 
    562569 
     
    847854                'replace_management_form': delegation_form, 
    848855                'link_creation': True, 
     856                'attach' : (obj, "delegate"), 
    849857                'role': role}) 
    850858    return r2r('DisplayObjectManagementReplace.htm', ctx, request) 
     
    889897    ctx.update({'current_page':'parts-doc-cad', 
    890898                'replace_management_form': delegation_form, 
    891                 'link_creation': True, 
    892899                'action_message': action_message_string}) 
    893900    return r2r('DisplayObjectManagementReplace.htm', ctx, request) 
     
    916923    else: 
    917924        checkin_file_form = AddFileForm() 
    918     ctx.update({'link_creation' : True, 
    919                 'add_file_form' : checkin_file_form, }) 
     925    ctx['add_file_form'] =  checkin_file_form 
    920926    return r2r('DisplayFileAdd.htm', ctx, request) 
    921927 
  • trunk/openPLM/templates/DisplayHomePage.htm

    r304 r369  
    1313            {% for lang in LANGUAGES %} 
    1414                <option value="{{ lang.0 }}" {% ifequal LANGUAGE_CODE lang.0 %} selected="selected"{% endifequal %} > 
    15                     {{ lang.1 }} 
     15                {{ lang.1 }} 
    1616                </option> 
    1717            {% endfor %} 
     
    2222 
    2323{% block SearchBlock %} 
    24         <form id="search_form" method="get" action="." enctype="text/plain"> 
     24    <form id="search_form" method="get" action="." enctype="text/plain"> 
    2525        <table class="Content" id="search_table"> 
    26                         {{type_form.as_table}} 
    27                         {{attributes_form.as_table}} 
    28                 </table> 
     26            {{type_form.as_table}} 
     27            {{attributes_form.as_table}} 
     28        </table> 
    2929        <div style="text-align:center"><input type="submit" value="{% trans "SEARCH !" %}"/></div> 
    30         </form> 
     30    </form> 
    3131{% endblock %} 
    3232 
    3333{% block ResultBlock %} 
    3434    {% if link_creation %} 
    35             Results for link creation : 
     35        Results for link creation : 
    3636    {% endif %} 
    37         <table class="Result"> 
    38             {% for object in results %} 
    39                 {% if forloop.first %} 
    40                     {% if not object.username %}                 
    41                         <col width="30%"/> 
    42                         <col width="30%"/> 
    43                         <col width="20%"/> 
    44                         <col width="20%"/> 
    45                     {% endif %} 
    46                                     <tr class="Content"> 
    47                         {% if object.username %} 
     37    <table class="Result"> 
     38        {% for object in results %} 
     39            {% if forloop.first %} 
     40                {% if not object.username %}                 
     41                    <col width="30%"/> 
     42                    <col width="30%"/> 
     43                    <col width="20%"/> 
     44                    <col width="20%"/> 
     45                {% endif %} 
     46                <tr class="Content"> 
     47                    {% if object.username %} 
    4848                        <th class="Content">{% trans "Username" %}</th> 
    4949                        <th class="Content">{% trans "Last name" %}</th> 
    50                         {% else %} 
     50                    {% else %} 
    5151                        <th class="Content">{% trans "Type" %}</th> 
    5252                        <th class="Content">{% trans "Reference" %}</th> 
    5353                        <th class="Content">{% trans "Rev." %}</th> 
    54                         {% endif %} 
    55                         {% if link_creation %} 
    56                             <th>{% trans "ADD" %}</th> 
    57                         {% else %} 
    58                             <th class="Content">{% trans "Name" %}</th> 
    59                         {% endif %} 
    60                     </tr> 
     54                    {% endif %} 
     55                    {% if link_creation %} 
     56                        <th>{% trans "ADD" %}</th> 
     57                    {% else %} 
     58                        <th class="Content">{% trans "Name" %}</th> 
     59                    {% endif %} 
     60                </tr> 
     61            {% endif %} 
     62 
     63            <tr class="{% cycle 'Content' 'Content2' as rowcolors %}"> 
     64                {% if object.username %} 
     65                    <td class="Content"> 
     66                        <a href="{{object.plmobject_url}}"> 
     67                            {{object.username|escape}} 
     68                        </a> 
     69                    </td> 
     70                    <td class="Content">{{object.last_name|escape}}</td> 
     71                {% else %} 
     72                    <td class="Content">{{object.type|escape}}</td> 
     73                    <td class="Content reference"> 
     74                        <a href="{{object.plmobject_url}}"> 
     75                            {{object.reference|escape}} 
     76                        </a> 
     77                    </td> 
     78                    <td class="Content">{{object.revision|escape}}</td> 
     79                    {% if not link_creation %} 
     80                        <td class="Content"> 
     81                            <span class="info"> 
     82                                <span class="small">{{object.name|trunc:10}}</span> 
     83                                <span class="long">{{object.name}}</span> 
     84                            </span> 
     85                        </td> 
     86                    {% endif %} 
    6187                {% endif %} 
    6288 
    63                             <tr class="{% cycle 'Content' 'Content2' as rowcolors %}"> 
    64                                         {% if object.username %} 
    65                                             <td class="Content"> 
    66                                                 <a href="{{object.plmobject_url}}"> 
    67                                                         {{object.username|escape}} 
    68                                         </a> 
    69                                 </td> 
    70                                             <td class="Content">{{object.last_name|escape}}</td> 
    71                                         {% else %} 
    72                                             <td class="Content">{{object.type|escape}}</td> 
    73                                             <td class="Content reference"> 
    74                                                 <a href="{{object.plmobject_url}}"> 
    75                                                         {{object.reference|escape}} 
    76                                         </a> 
    77                                 </td> 
    78                             <td class="Content">{{object.revision|escape}}</td> 
    79                             {% if not link_creation %} 
    80                             <td class="Content"> 
    81                                 <span class="info"> 
    82                                     <span class="small">{{object.name|trunc:10}}</span> 
    83                                     <span class="long">{{object.name}}</span> 
    84                                 </span> 
    85                             </td> 
    86                             {% endif %} 
    87                         {% endif %} 
    88  
    89                                         <form method="post" action="." enctype="multipart/form-data"> 
    90                                 {% if object.username %} 
     89                <form method="post" action="." enctype="multipart/form-data"> 
     90                    {% if object.username %} 
    9191                        <input type="hidden" name="type" value="User"/> 
    9292                        <input type="hidden" name="username" value="{{object.username|escape}}"/> 
    93                                  
    94                                 {% else %} 
    95                                 <input type="hidden" name="type" value="{{object.type|escape}}"/> 
     93 
     94                    {% else %} 
     95                        <input type="hidden" name="type" value="{{object.type|escape}}"/> 
    9696                        <input type="hidden" name="reference" value="{{object.reference|escape}}"/> 
    97                                 <input type="hidden" name="revision" value="{{object.revision|escape}}"/> 
     97                        <input type="hidden" name="revision" value="{{object.revision|escape}}"/> 
    9898 
    99                                 {% endif %} 
    100                             {% if link_creation %} 
    101  
    102                                 <td class="Content"> 
    103                             <input type="submit" value="{% trans "ADD" %}"/> 
    104                         </td> 
     99                    {% endif %} 
     100                    {% if link_creation %} 
     101                        {% if object|can_add:attach %} 
     102                            <td class="Content"> 
     103                                <input type="submit" value="{% trans "ADD" %}"/> 
     104                            </td> 
    105105                        {% endif %} 
    106                         </form> 
    107                     </tr> 
    108             {% empty %} 
     106                    {% endif %} 
     107                </form> 
     108            </tr> 
     109        {% empty %} 
    109110            <tr>{% trans "No result matching given query" %}</tr> 
    110                         {% endfor %} 
    111         </table> 
     111        {% endfor %} 
     112    </table> 
    112113{% endblock %} 
    113114 
    114115{% block CreationBlock %} 
    115         <form method="get" action="/object/create/" enctype="text/plain"> 
    116                 <ul> 
    117                     {{type_form4creation.as_ul}} 
     116    <form method="get" action="/object/create/" enctype="text/plain"> 
     117        <ul> 
     118            {{type_form4creation.as_ul}} 
    118119            <li> 
    119                 <input type="submit" value="{% trans "CREATE !" %}"/> 
     120            <input type="submit" value="{% trans "CREATE !" %}"/> 
    120121            </li> 
    121122        </ul> 
    122         </form> 
     123    </form> 
    123124{% endblock %} 
    124125 
Note: See TracChangeset for help on using the changeset viewer.