Changeset 298 in main


Ignore:
Timestamp:
09/16/11 16:12:58 (8 years ago)
Author:
pcosquer
Message:

navigate: add +/- icons to show/hide documents
todo: clean up code + ajax

Location:
trunk/openPLM
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/openPLM/media/css/openplm.css

    r294 r298  
    543543} 
    544544 
    545 img.node_thumbnails { 
     545img.node_thumbnails, img.node_show_docs { 
    546546    position:absolute; 
    547547    right: 0; 
  • trunk/openPLM/media/js/navigate.js

    r292 r298  
    3535    }); 
    3636} 
     37 
     38function display_docs(doc_parts){ 
     39    $("#id_doc_parts").attr("value", doc_parts); 
     40    $("#id_update").attr("value", "on"); 
     41    $("#FilterNav").find("form").submit(); 
     42} 
     43 
    3744 
    3845$(document).ready(function(){ 
     
    8794        function () { 
    8895            $(this).find(".node_thumbnails").show(); 
     96            $(this).find(".node_show_docs").show(); 
    8997        });  
    9098        $("div.node").mouseleave( 
    9199        function () { 
    92100            $(this).find(".node_thumbnails").hide(); 
     101            $(this).find(".node_show_docs").hide(); 
    93102        } 
    94103        ); 
  • trunk/openPLM/plmapp/forms.py

    r295 r298  
    3232 
    3333import openPLM.plmapp.models as m 
    34 from openPLM.plmapp.controllers import rx_bad_ref 
     34from openPLM.plmapp.controllers import rx_bad_ref, DocumentController 
     35from openPLM.plmapp.user_controller import UserController 
    3536from openPLM.plmapp.widgets import JQueryAutoComplete 
    3637 
     
    313314 
    314315 
    315 class FilterForm(forms.Form): 
     316class NavigateFilterForm(forms.Form): 
    316317    only_search_results = forms.BooleanField(initial=False, 
    317318                required=False, label=_("only search results")) 
    318     prog = forms.ChoiceField(choices=(("twopi", _("Radial")), 
    319                                       ("dot", _("Vertical"))), 
     319    prog = forms.ChoiceField(choices=(("twopi", _("Radial 1")), 
     320                                      ("neato", _("Radial 2")), 
     321                                      ("dot", _("Hierarchical"))), 
    320322                             required=False, initial="twopi", 
    321323                             label=_("layout")) 
    322  
    323 class FilterObjectForm4Part(FilterForm): 
     324    doc_parts = forms.CharField(initial="", required="", 
     325                                widget=forms.HiddenInput()) 
     326    update = forms.BooleanField(initial=False, required=False, 
     327           widget=forms.HiddenInput() ) 
     328 
     329class PartNavigateFilterForm(NavigateFilterForm): 
    324330    child = forms.BooleanField(initial=True, required=False, label=_("child")) 
    325331    parents = forms.BooleanField(required=False, label=_("parents")) 
     
    330336    notified = forms.BooleanField(required=False, label=_("notified")) 
    331337 
    332 class FilterObjectForm4Doc(FilterForm): 
     338class DocNavigateFilterForm(NavigateFilterForm): 
    333339    part = forms.BooleanField(initial=True, required=False, label=_("part")) 
    334340    owner = forms.BooleanField(initial=True, required=False, label=_("owner")) 
     
    336342    notified = forms.BooleanField(required=False, label=_("notified")) 
    337343 
    338 class FilterObjectForm4User(FilterForm): 
     344class UserNavigateFilterForm(NavigateFilterForm): 
    339345    owned = forms.BooleanField(initial=True, required=False, label=_("owned")) 
    340346    to_sign = forms.BooleanField(required=False, label=_("to sign")) 
    341347    request_notification_from = forms.BooleanField(required=False, label=_("request notification from")) 
    342348 
     349def get_navigate_form(obj): 
     350    if isinstance(obj, UserController): 
     351        cls = UserNavigateFilterForm 
     352    elif isinstance(obj, DocumentController): 
     353        cls = DocNavigateFilterForm 
     354    else: 
     355        cls = PartNavigateFilterForm 
     356    return cls 
     357 
     358 
    343359class OpenPLMUserChangeForm(forms.ModelForm): 
    344360    #username = forms.RegexField(widget=forms.HiddenInput()) 
  • trunk/openPLM/plmapp/navigate.py

    r295 r298  
    4343# just a shortcut 
    4444OSR = "only_search_results" 
     45 
     46def encode(s): 
     47    return s.encode("utf-8") 
     48 
     49def get_path(obj): 
     50    return "/".join(map(encode, (obj.type, obj.reference, obj.revision))) 
     51 
    4552 
    4653class FrozenAGraph(pgv.AGraph): 
     
    114121        self.options = dict.fromkeys(self.options_list, False) 
    115122        self.options["prog"] = "twopi" 
     123        self.options["doc_parts"] = [] 
    116124        self.graph = pgv.AGraph() 
    117125        self.graph.graph_attr.update(self.GRAPH_ATTRIBUTES) 
     
    177185            self.graph.add_edge(obj.id, child.id) 
    178186            self._set_node_attributes(child) 
    179             if self.options['doc']: 
     187            if self.options['doc'] or child.id in self.options["doc_parts"]: 
    180188               self._create_doc_edges(child) 
    181189            self._create_child_edges(child) 
     
    190198            self.graph.add_edge(parent.id, obj.id) 
    191199            self._set_node_attributes(parent) 
    192             if self.options['doc']: 
     200            if self.options['doc'] or parent.id in self.options["doc_parts"]: 
    193201                self._create_doc_edges(parent) 
    194202            self._create_parents_edges(parent) 
     
    265273                         'to_sign':(self._create_object_edges, 'sign'), 
    266274                         'request_notification_from':(self._create_object_edges, 'notified'), 
    267                          OSR : (lambda *args: None, None), 
    268                          "prog": (lambda *args: None, None)} 
     275                         } 
     276        self.options["doc"] = self.options["doc"] or self.object.id in self.options["doc_parts"] 
    269277        for field, value in self.options.items(): 
    270             if value: 
     278            if value and field in functions_dic: 
    271279                function, argument = functions_dic[field] 
    272280                function(self.object, argument) 
     
    281289        node.attr.update(self.TYPE_TO_ATTRIBUTES[type_]) 
    282290        node.attr["URL"] = obj.plmobject_url + "navigate/" 
     291        node.attr["tooltip"] = "None" 
    283292        if isinstance(obj, PLMObjectController): 
    284             node.attr['label'] = "%s\\n%s\\n%s" % (obj.type.encode('utf-8'), 
    285                                                    obj.reference.encode('utf-8'), 
    286                                                    obj.revision.encode('utf-8')) 
     293            node.attr['label'] = get_path(obj).replace("/", "\\n") 
     294            if type_ == DocumentController: 
     295                node.attr["tooltip"] = "/ajax/thumbnails/" + get_path(obj) 
     296            elif type_ == PartController and not self.options["doc"]: 
     297                s = "+" if  not obj.id in self.options["doc_parts"] else "-" 
     298                node.attr["tooltip"] = s + str(obj.id) 
    287299        else: 
    288             node.attr["label"] = obj.username.encode("utf-8") 
    289         node.attr["label"] += "\\n" + extra_label.encode("utf-8") 
    290         if type_ == DocumentController: 
    291             path = "/".join((obj.type.encode('utf-8'),                                                   obj.reference.encode('utf-8'), obj.revision.encode('utf-8'))) 
    292             node.attr["tooltip"] = "/ajax/thumbnails/" + path 
    293         else: 
    294             node.attr["tooltip"] = "None" 
     300            node.attr["label"] = encode(obj.username) 
     301        node.attr["label"] += "\\n" + encode(extra_label) 
    295302 
    296303    def convert_map(self, map_string): 
    297304        elements = [] 
     305        doc_parts = "#".join(str(o) for o in self.options["doc_parts"]) 
    298306        for area in ET.fromstring(map_string).findall("area"): 
    299307            left, top, x2, y2 = map(int, area.get("coords").split(",")) 
     
    305313            div.set("class", "node") 
    306314            url = area.get("title") 
    307             if url != "None": 
     315            if url.startswith("/ajax/thumbnails/"): 
    308316                thumbnails = ET.SubElement(div, "img", src="/media/img/search.png", 
    309317                        title="Display thumbnails") 
    310318                thumbnails.set("class", "node_thumbnails ui-button ui-widget ui-state-default ui-corner-all") 
    311319                thumbnails.set("onclick", "display_thumbnails('%s', '%s');" % (id_, url)) 
     320            elif url != "None": 
     321                if url[0] == "+": 
     322                    parts = doc_parts + "#" + url[1:] 
     323                    img = "/media/img/add.png" 
     324                else: 
     325                    s = set(self.options["doc_parts"]) 
     326                    img = "/media/img/remove.png" 
     327                    s.remove(int(url[1:])) 
     328                    parts = "#".join(str(o) for o in s) 
     329                show_doc = ET.SubElement(div, "img", src=img, 
     330                        title="Show related documents") 
     331                show_doc.set("class", "node_show_docs ui-button ui-widget ui-state-default ui-corner-all") 
     332                show_doc.set("onclick", "display_docs('%s');" % (parts)) 
     333                 
    312334            a = ET.SubElement(div, "a", href=area.get("href"))  
    313335            ET.SubElement(a, "span") 
  • trunk/openPLM/plmapp/views.py

    r297 r298  
    14011401###                     Manage html pages for navigate function                        ### 
    14021402##########################################################################################     
    1403 regex_pattern = re.compile(r'top:(\d+)px;left:(\d+)px;width:(\d+)px;height:(\d+)px;') 
     1403coords_rx = re.compile(r'top:(\d+)px;left:(\d+)px;width:(\d+)px;height:(\d+)px;') 
    14041404 
    14051405 
     
    14281428    obj, context_dict, request_dict = display_global_page(request, obj_type, obj_ref, obj_revi) 
    14291429    request.session.update(request_dict) 
    1430     if isinstance(obj, UserController): 
    1431         filterForm = FilterObjectForm4User 
    1432     elif isinstance(obj, DocumentController): 
    1433         filterForm = FilterObjectForm4Doc 
    1434     else: 
    1435         filterForm = FilterObjectForm4Part 
    1436     has_session = any(field in request.session for field in filterForm.base_fields) 
     1430    FilterForm = get_navigate_form(obj) 
     1431    has_session = any(field in request.session for field in FilterForm.base_fields) 
    14371432    if request.method == 'POST' and request.POST: 
    1438         form = filterForm(request.POST) 
     1433        form = FilterForm(request.POST) 
    14391434        if form.is_valid(): 
    14401435            request.session.update(form.cleaned_data) 
    14411436    elif has_session: 
    1442         form = filterForm(request.session) 
    1443     else: 
    1444         initial = dict((k, v.initial) for k, v in filterForm.base_fields.items()) 
    1445         form = filterForm(initial) 
     1437        request.session.update(dict(doc_parts = "")) 
     1438        form = FilterForm(request.session) 
     1439    else: 
     1440        initial = dict((k, v.initial) for k, v in FilterForm.base_fields.items()) 
     1441        form = FilterForm(initial) 
    14461442        request.session.update(initial) 
    14471443    if not form.is_valid(): 
    1448         return HttpResponse('mauvaise requete post') 
     1444        return HttpResponse('Bad post request') 
    14491445     
    14501446    graph = NavigationGraph(obj, context_dict["results"]) 
    1451     graph.set_options(form.cleaned_data) 
     1447    options = form.cleaned_data 
     1448    if options["update"]: 
     1449        options["doc_parts"] = [int(o) 
     1450                                for o in options["doc_parts"].split("#") 
     1451                                if o.isnumeric()] 
     1452    else: 
     1453        options["doc_parts"] = [] 
     1454        request.session.update(dict(doc_parts = "")) 
     1455    graph.set_options(options) 
    14521456    graph.create_edges() 
    14531457    map_string, picture_path = graph.render() 
    1454     top, left, w, h = map(int, 
    1455                     re.search(regex_pattern, map_string).groups()) 
     1458    top, left, w, h = map(int, re.search(coords_rx, map_string).groups()) 
    14561459    x_part_node_position = (2 * left + w) // 2 
    14571460    y_part_node_position = (2 * top + h) // 2 
  • trunk/openPLM/urls.py

    r291 r298  
    5454user_url = r'^user/(?P<obj_ref>[^/]+)/' 
    5555user_dict = {'obj_type':'User', 'obj_revi':'-'} 
    56 user_dict_nav = user_dict.copy() 
    57 user_dict_nav.update({'navigate_bool': True}) 
    5856urlpatterns += patterns('', 
    5957    (r'^admin/', include(admin.site.urls)), 
     
    6967    (r'ajax/complete/(?P<obj_type>\w+)/(?P<field>\w+)/$', ajax_autocomplete), 
    7068    (r'ajax/thumbnails/(?P<obj_type>\w+)/(?P<obj_ref>%(x)s)/(?P<obj_revi>%(x)s)/' % {'x' : r'[^/?#\t\r\v\f]+'}, ajax_thumbnails), 
     69    (r'ajax/show_docs/(?P<obj_type>\w+)/(?P<obj_ref>%(x)s)/(?P<obj_revi>%(x)s)/' % {'x' : r'[^/?#\t\r\v\f]+'}, ajax_show_docs), 
    7170 
    7271    (object_url + r'$', display_object), 
     
    9291    (object_url + r'management/replace/(?P<link_id>\d+)/$', replace_management), 
    9392    (object_url + r'management/delete/$', delete_management), 
    94     (object_url + r'navigate/$', navigate, {'navigate_bool' : True}), 
     93    (object_url + r'navigate/$', navigate), 
    9594 
    9695    (user_url + r'$', display_object, user_dict), 
     
    109108    (user_url + r'modify/$', modify_user, user_dict), 
    110109    (user_url + r'password/$', change_user_password, user_dict), 
    111     (user_url + r'navigate/$', navigate, user_dict_nav), 
     110    (user_url + r'navigate/$', navigate, user_dict), 
    112111     
    113112        # In order to take into account the css file 
Note: See TracChangeset for help on using the changeset viewer.