web/views/primary.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Wed, 04 Aug 2010 11:16:38 +0200
changeset 6067 efca814587e2
parent 5896 67683b7e591a
child 6077 62011f82c386
permissions -rw-r--r--
[primary] refactor primary view handling of relation's label to properly handle label optionaly specified in dispctrl (no more default set) and use contextual translation by default. Also, consistent handling in attributes, relations and sideboxes section. Introduce new support_args function to use when possible instead of try/except TypeError.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     1
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5896
67683b7e591a cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5614
diff changeset
    18
"""The default primary view"""
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    19
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    20
__docformat__ = "restructuredtext en"
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    21
_ = unicode
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    22
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    23
from warnings import warn
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    24
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2237
diff changeset
    25
from logilab.mtconverter import xml_escape
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    26
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    27
from cubicweb import Unauthorized
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
    28
from cubicweb.utils import support_args
3971
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
    29
from cubicweb.selectors import match_kwargs
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    30
from cubicweb.view import EntityView
5065
01d85f3a3d9e [primary view] skip virtual rtypes anyway
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4742
diff changeset
    31
from cubicweb.schema import VIRTUAL_RTYPES, display_name
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    32
from cubicweb.web import uicfg
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    33
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    34
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    35
class PrimaryView(EntityView):
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    36
    """the full view of an non final entity"""
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3072
diff changeset
    37
    __regid__ = 'primary'
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    38
    title = _('primary')
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    39
    show_attr_label = True
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    40
    show_rel_label = True
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    41
    skip_none = True
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    42
    rsection = uicfg.primaryview_section
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
    43
    display_ctrl = uicfg.primaryview_display_ctrl
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    44
    main_related_section = True
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    45
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    46
    def html_headers(self):
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    47
        """return a list of html headers (eg something to be inserted between
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    48
        <head> and </head> of the returned page
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    49
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    50
        by default primary views are indexed
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    51
        """
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    52
        return []
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    53
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    54
    def cell_call(self, row, col):
2889
5b42222d3b88 should affect cw_row/cw_col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2813
diff changeset
    55
        self.cw_row = row
5b42222d3b88 should affect cw_row/cw_col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2813
diff changeset
    56
        self.cw_col = col
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    57
        self.maxrelated = self._cw.property_value('navigation.related-limit')
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    58
        entity = self.cw_rset.complete_entity(row, col)
2400
17b1f0b80fe8 [primary] restore render_entity, as it is a bit too much work to update everything accordingly
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2384
diff changeset
    59
        self.render_entity(entity)
17b1f0b80fe8 [primary] restore render_entity, as it is a bit too much work to update everything accordingly
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2384
diff changeset
    60
17b1f0b80fe8 [primary] restore render_entity, as it is a bit too much work to update everything accordingly
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2384
diff changeset
    61
    def render_entity(self, entity):
4566
c49dba55c0a6 [views] toolbox must be rendered before the title to appear at top right
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 4467
diff changeset
    62
        self.render_entity_toolbox(entity)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    63
        self.render_entity_title(entity)
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    64
        # entity's attributes and relations, excluding meta data
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    65
        # if the entity isn't meta itself
3974
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
    66
        if self.is_primary():
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
    67
            boxes = self._prepare_side_boxes(entity)
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
    68
        else:
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
    69
            boxes = None
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    70
        if boxes or hasattr(self, 'render_side_related'):
1558
f63d090eb34a some primary view fixes, need more (eg reledit doesn't work for non final relation
sylvain.thenault@logilab.fr
parents: 1554
diff changeset
    71
            self.w(u'<table width="100%"><tr><td style="width: 75%">')
3064
3fbcdf220ce9 fix so that entity's summary appears in main content cell to avoid layout pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2655
diff changeset
    72
        self.render_entity_summary(entity)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    73
        self.w(u'<div class="mainInfo">')
2132
d7ae060cd746 move navcontenttop on the top
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 1977
diff changeset
    74
        self.content_navigation_components('navcontenttop')
2384
6220783caa4b [primary] cleanup, render_entity -> cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2381
diff changeset
    75
        self.render_entity_attributes(entity)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    76
        if self.main_related_section:
2384
6220783caa4b [primary] cleanup, render_entity -> cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2381
diff changeset
    77
            self.render_entity_relations(entity)
4742
fac80328a6a3 [primary] navcontentbottom sections should be in the content table as navcontenttop
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4572
diff changeset
    78
        self.content_navigation_components('navcontentbottom')
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    79
        self.w(u'</div>')
2237
7e546c3d6ea5 [primary] fix #344249
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2217
diff changeset
    80
        # side boxes
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    81
        if boxes or hasattr(self, 'render_side_related'):
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    82
            self.w(u'</td><td>')
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    83
            self.w(u'<div class="primaryRight">')
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    84
            if hasattr(self, 'render_side_related'):
5614
37b31a7b8e74 [primary] add missing version number to deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5560
diff changeset
    85
                warn('[3.2] render_side_related is deprecated')
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    86
                self.render_side_related(entity, [])
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
    87
            self.render_side_boxes(boxes)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    88
            self.w(u'</div>')
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    89
            self.w(u'</td></tr></table>')
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    90
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    91
    def content_navigation_components(self, context):
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    92
        self.w(u'<div class="%s">' % context)
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    93
        for comp in self._cw.vreg['contentnavigation'].poss_visible_objects(
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    94
            self._cw, rset=self.cw_rset, row=self.cw_row, view=self, context=context):
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    95
            try:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
    96
                comp.render(w=self.w, row=self.cw_row, view=self)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    97
            except NotImplementedError:
5614
37b31a7b8e74 [primary] add missing version number to deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5560
diff changeset
    98
                warn('[3.2] component %s doesnt implement cell_call, please update'
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
    99
                     % comp.__class__, DeprecationWarning)
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1721
diff changeset
   100
                comp.render(w=self.w, view=self)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   101
        self.w(u'</div>')
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   102
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   103
    def render_entity_title(self, entity):
1720
14c9a0a1aca1 drop content_title
sylvain.thenault@logilab.fr
parents: 1632
diff changeset
   104
        """default implementation return dc_title"""
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2237
diff changeset
   105
        title = xml_escape(entity.dc_title())
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   106
        if title:
3974
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
   107
            if self.is_primary():
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
   108
                self.w(u'<h1>%s</h1>' % title)
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
   109
            else:
4104
7e478d7caf20 [mq]: small_api_changes_for_3.6
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 4074
diff changeset
   110
                atitle = self._cw._('follow this link for more information on this %s') % entity.dc_type()
3974
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
   111
                self.w(u'<h4><a href="%s" title="%s">%s</a></h4>'
1d36d9904c41 slightly adapt title and hide boxes when view is called as a non primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3972
diff changeset
   112
                       % (entity.absolute_url(), atitle, title))
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   113
3845
596044fb7bc5 introduce render_entity_toolbox on default primary view to display components in the ctxtoolbar context, such as pdf icon, notification registration (nosylist)...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3844
diff changeset
   114
    def render_entity_toolbox(self, entity):
596044fb7bc5 introduce render_entity_toolbox on default primary view to display components in the ctxtoolbar context, such as pdf icon, notification registration (nosylist)...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3844
diff changeset
   115
        self.content_navigation_components('ctxtoolbar')
596044fb7bc5 introduce render_entity_toolbox on default primary view to display components in the ctxtoolbar context, such as pdf icon, notification registration (nosylist)...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3844
diff changeset
   116
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   117
    def render_entity_metadata(self, entity):
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   118
        entity.view('metadata', w=self.w)
3064
3fbcdf220ce9 fix so that entity's summary appears in main content cell to avoid layout pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2655
diff changeset
   119
3fbcdf220ce9 fix so that entity's summary appears in main content cell to avoid layout pb
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2655
diff changeset
   120
    def render_entity_summary(self, entity):
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   121
        summary = self.summary(entity) # deprecate summary?
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   122
        if summary:
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   123
            self.w(u'<div class="summary">%s</div>' % summary)
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   124
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   125
    def summary(self, entity):
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   126
        """default implementation return an empty string"""
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   127
        return u''
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   128
5239
471554b842d2 [schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
   129
    def render_entity_attributes(self, entity):
5180
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   130
        display_attributes = []
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   131
        for rschema, _, role, dispctrl in self._section_def(entity, 'attributes'):
2361
8f00836580f1 [reledit] do NOT propose to edit composite-related entities (unlinking would destroy the other side)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 2312
diff changeset
   132
            vid = dispctrl.get('vid', 'reledit')
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3681
diff changeset
   133
            if rschema.final or vid == 'reledit':
1558
f63d090eb34a some primary view fixes, need more (eg reledit doesn't work for non final relation
sylvain.thenault@logilab.fr
parents: 1554
diff changeset
   134
                value = entity.view(vid, rtype=rschema.type, role=role)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   135
            else:
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   136
                rset = self._relation_rset(entity, rschema, role, dispctrl)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   137
                if rset:
4382
6fb02edd05da 3.6 api update, cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   138
                    value = self._cw.view(vid, rset)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   139
                else:
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   140
                    value = None
5180
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   141
            if not self.skip_none or (value is not None and value != ''):
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   142
                display_attributes.append( (rschema, role, dispctrl, value) )
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   143
        if display_attributes:
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   144
            self.w(u'<table>')
5182
3bc8250731fe [primary] fix name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5180
diff changeset
   145
            for rschema, role, dispctrl, value in display_attributes:
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   146
                if support_args(self._render_attribute, 'label'):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   147
                    label = self._rel_label(entity, rschema, role, dispctrl)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   148
                    self._render_attribute(label, value, table=True)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   149
                elif support_args(self._render_attribute, 'dispctrl'):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   150
                    warn('[3.10] _render_attribute prototype has changed, please'
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   151
                         ' update %s' % self.__class___, DeprecationWarning)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   152
                    self._render_attribute(dispctrl, rschema, value, role=role,
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   153
                                           table=True)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   154
                else:
5180
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   155
                    warn('[3.6] _render_attribute prototype has changed, please'
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   156
                         ' update %s' % self.__class___, DeprecationWarning)
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   157
                    self._render_attribute(rschema, value, role=role, table=True)
25c3269b2232 [xthml] fix #696079, potential empty table cause xhtml validation error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5065
diff changeset
   158
            self.w(u'</table>')
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   159
5239
471554b842d2 [schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
   160
    def render_entity_relations(self, entity):
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   161
        for rschema, tschemas, role, dispctrl in self._section_def(entity, 'relations'):
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   162
            rset = self._relation_rset(entity, rschema, role, dispctrl)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   163
            if rset:
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   164
                if support_args(self._render_relation, 'label'):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   165
                    label = self._rel_label(entity, rschema, role, dispctrl)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   166
                    self._render_relation(label, dispctrl, rset, 'autolimited')
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   167
                elif not support_args(self._render_relation, 'showlabel'):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   168
                    warn('[3.10] _render_relation prototype has changed, '
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   169
                         'please update %s' % self.__class__, DeprecationWarning)
3970
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   170
                    self._render_relation(dispctrl, rset, 'autolimited')
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   171
                else:
3970
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   172
                    warn('[3.6] _render_relation prototype has changed, '
3972
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3971
diff changeset
   173
                         'please update %s' % self.__class__, DeprecationWarning)
3970
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   174
                    self._render_relation(rset, dispctrl, 'autolimited',
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   175
                                          self.show_rel_label)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   176
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   177
    def render_side_boxes(self, boxes):
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   178
        """display side related relations:
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   179
        non-meta in a first step, meta in a second step
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   180
        """
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   181
        for box in boxes:
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   182
            if isinstance(box, tuple):
3975
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   183
                try:
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   184
                    label, rset, vid, dispctrl  = box
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   185
                except ValueError:
4572
9e0a86d3ba62 add version info to deprecation warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4566
diff changeset
   186
                    warn('[3.5] box views should now be defined as a 4-uple (label, rset, vid, dispctrl), '
3975
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   187
                         'please update %s' % self.__class__.__name__,
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   188
                         DeprecationWarning)
5560
b9a8e7109370 [primary view] fix name error on dispctrl w/ pre 3.5 box definition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5520
diff changeset
   189
                    label, rset, vid = box
b9a8e7109370 [primary view] fix name error on dispctrl w/ pre 3.5 box definition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5520
diff changeset
   190
                    dispctrl = {}
1885
c2011d238e98 replace sideRelated with sideBox
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1752
diff changeset
   191
                self.w(u'<div class="sideBox">')
5519
bdc6a7e724f3 [primary view] give dispctrl to side box views as for relations section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   192
                self.wview(vid, rset, title=label, initargs={'dispctrl': dispctrl})
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   193
                self.w(u'</div>')
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   194
            else:
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   195
                try:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   196
                    box.render(w=self.w, row=self.cw_row)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   197
                except NotImplementedError:
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   198
                    # much probably a context insensitive box, which only implements
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   199
                    # .call() and not cell_call()
1723
30c3a713ab61 View.dispatch -> View.render
sylvain.thenault@logilab.fr
parents: 1721
diff changeset
   200
                    box.render(w=self.w)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   201
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   202
    def _prepare_side_boxes(self, entity):
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   203
        sideboxes = []
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   204
        for rschema, tschemas, role, dispctrl in self._section_def(entity, 'sideboxes'):
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   205
            rset = self._relation_rset(entity, rschema, role, dispctrl)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   206
            if not rset:
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   207
                continue
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   208
            label = self._rel_label(entity, rschema, role, dispctrl)
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   209
            vid = dispctrl.get('vid', 'sidebox')
3975
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   210
            sideboxes.append( (label, rset, vid, dispctrl) )
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   211
        sideboxes += self._cw.vreg['boxes'].poss_visible_objects(
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   212
            self._cw, rset=self.cw_rset, row=self.cw_row, view=self,
2650
18aec79ec3a3 R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2402
diff changeset
   213
            context='incontext')
3975
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   214
        # XXX since we've two sorted list, it may be worth using bisect
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   215
        def get_order(x):
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   216
            if isinstance(x, tuple):
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   217
                # x is a view box (label, rset, vid, dispctrl)
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   218
                # default to 1000 so view boxes occurs after component boxes
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   219
                return x[-1].get('order', 1000)
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   220
            # x is a component box
4073
03681ba6da0b cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 4004
diff changeset
   221
            return x.cw_propval('order')
3975
569771016abb add a fourth item to 'view box' defintion, dispctrl, so that
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3974
diff changeset
   222
        return sorted(sideboxes, key=get_order)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   223
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   224
    def _section_def(self, entity, where):
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   225
        rdefs = []
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   226
        eschema = entity.e_schema
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   227
        for rschema, tschemas, role in eschema.relation_definitions(True):
5065
01d85f3a3d9e [primary view] skip virtual rtypes anyway
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4742
diff changeset
   228
            if rschema in VIRTUAL_RTYPES:
01d85f3a3d9e [primary view] skip virtual rtypes anyway
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4742
diff changeset
   229
                continue
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   230
            matchtschemas = []
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   231
            for tschema in tschemas:
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   232
                section = self.rsection.etype_get(eschema, rschema, role,
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   233
                                                  tschema)
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   234
                if section == where:
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   235
                    matchtschemas.append(tschema)
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   236
            if matchtschemas:
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   237
                # XXX pick the latest dispctrl
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   238
                dispctrl = self.display_ctrl.etype_get(eschema, rschema, role,
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   239
                                                       matchtschemas[-1])
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   240
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   241
                rdefs.append( (rschema, matchtschemas, role, dispctrl) )
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   242
        return sorted(rdefs, key=lambda x: x[-1]['order'])
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   243
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   244
    def _relation_rset(self, entity, rschema, role, dispctrl):
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   245
        try:
3681
cdbe4aac1198 fix max-related of related entities handling in primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3071
diff changeset
   246
            dispctrl.setdefault('limit', self.maxrelated)
cdbe4aac1198 fix max-related of related entities handling in primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3071
diff changeset
   247
            rset = entity.related(rschema.type, role, limit=dispctrl['limit']+1)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   248
        except Unauthorized:
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   249
            return
1739
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   250
        if 'filter' in dispctrl:
78b0819162a8 final rtag api
sylvain.thenault@logilab.fr
parents: 1726
diff changeset
   251
            rset = dispctrl['filter'](rset)
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   252
        return rset
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   253
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   254
    def _render_relation(self, label, dispctrl, rset, defaultvid):
1583
1d6d0ea1cda1 needs unicode string
sylvain.thenault@logilab.fr
parents: 1558
diff changeset
   255
        self.w(u'<div class="section">')
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   256
        if label:
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   257
            self.w(u'<h4>%s</h4>' % label)
3705
5cd35123866b get dispctrl through extra_kwargs to avoid error when a custom view is specified (potentially not taking any argument)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   258
        self.wview(dispctrl.get('vid', defaultvid), rset,
5cd35123866b get dispctrl through extra_kwargs to avoid error when a custom view is specified (potentially not taking any argument)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   259
                   initargs={'dispctrl': dispctrl})
1583
1d6d0ea1cda1 needs unicode string
sylvain.thenault@logilab.fr
parents: 1558
diff changeset
   260
        self.w(u'</div>')
1554
3a3263df6cdd new primary view using uicfg.rdisplay (major api cleanup)
sylvain.thenault@logilab.fr
parents: 1516
diff changeset
   261
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   262
    def _render_attribute(self, label, value, table=False):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   263
        self.field(label, value, tr=False, table=table)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   264
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   265
    def _rel_label(self, entity, rschema, role, dispctrl):
3689
deb13e88e037 follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3681
diff changeset
   266
        if rschema.final:
3970
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   267
            showlabel = dispctrl.get('showlabel', self.show_attr_label)
1491
742aff97dbf7 move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff changeset
   268
        else:
3970
e4ad7663610b update _render_attribute / _render_relation prototype to gain more control on label through uicfg (for attributes and relations). Keep bw compat for crm/iliane
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3875
diff changeset
   269
            showlabel = dispctrl.get('showlabel', self.show_rel_label)
6067
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   270
        if showlabel:
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   271
            if dispctrl.get('label'):
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   272
                label = self._cw._(dispctrl['label'])
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   273
            else:
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   274
                label = display_name(self._cw, rschema.type, role,
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   275
                                     context=entity.__regid__)
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   276
            return label
efca814587e2 [primary] refactor primary view handling of relation's label
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5896
diff changeset
   277
        return u''
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   278
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   279
class RelatedView(EntityView):
3377
dd9d292b6a6d use __regid__ instead of id on appobject classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3072
diff changeset
   280
    __regid__ = 'autolimited'
3681
cdbe4aac1198 fix max-related of related entities handling in primary view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3071
diff changeset
   281
3705
5cd35123866b get dispctrl through extra_kwargs to avoid error when a custom view is specified (potentially not taking any argument)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   282
    def call(self, **kwargs):
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   283
        # nb: rset is retreived using entity.related with limit + 1 if any.
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   284
        # Because of that, we know that rset.printable_rql() will return rql
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   285
        # with no limit set anyway (since it's handled manually)
4072
ead446e70c28 some api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4004
diff changeset
   286
        if 'dispctrl' in self.cw_extra_kwargs:
ead446e70c28 some api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4004
diff changeset
   287
            limit = self.cw_extra_kwargs['dispctrl'].get('limit')
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   288
            subvid = self.cw_extra_kwargs['dispctrl'].get('subvid', 'incontext')
3705
5cd35123866b get dispctrl through extra_kwargs to avoid error when a custom view is specified (potentially not taking any argument)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   289
        else:
5cd35123866b get dispctrl through extra_kwargs to avoid error when a custom view is specified (potentially not taking any argument)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3689
diff changeset
   290
            limit = None
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   291
            subvid = 'incontext'
3720
5376aaadd16b backport stable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3451 3705
diff changeset
   292
        if limit is None or self.cw_rset.rowcount <= limit:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   293
            if self.cw_rset.rowcount == 1:
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   294
                self.wview(subvid, self.cw_rset, row=0)
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   295
            elif 1 < self.cw_rset.rowcount <= 5:
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   296
                self.wview('csv', self.cw_rset, subvid=subvid)
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   297
            else:
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   298
                self.w(u'<div>')
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   299
                self.wview('simplelist', self.cw_rset, subvid=subvid)
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   300
                self.w(u'</div>')
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   301
        # else show links to display related entities
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   302
        else:
3451
6b46d73823f5 [api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3377
diff changeset
   303
            rql = self.cw_rset.printable_rql()
3890
d7a270f50f54 backport stable branch (one more time painfully)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3725 3875
diff changeset
   304
            self.cw_rset.limit(limit) # remove extra entity
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   305
            self.w(u'<div>')
5520
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   306
            self.wview('simplelist', self.cw_rset, subvid=subvid)
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   307
            self.w(u'[<a href="%s">%s</a>]' % (
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   308
                xml_escape(self._cw.build_url(rql=rql, vid=subvid)),
2d7f135846ee [primary view] allow new 'subvid' parameter in primaryview_display_ctrl
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5519
diff changeset
   309
                self._cw._('see them all')))
1516
288d55a7c5e2 refactor side boxes handling of primary view
sylvain.thenault@logilab.fr
parents: 1491
diff changeset
   310
            self.w(u'</div>')
2652
3753f3a07ca1 [refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2402
diff changeset
   311
3971
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   312
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   313
class URLAttributeView(EntityView):
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   314
    """use this view for attributes whose value is an url and that you want
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   315
    to display as clickable link
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   316
    """
4004
c52619c738a5 api renaming update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 3998
diff changeset
   317
    __regid__ = 'urlattr'
3971
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   318
    __select__ = EntityView.__select__ & match_kwargs('rtype')
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   319
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   320
    def cell_call(self, row, col, rtype, **kwargs):
4232
d9d031d68be2 more 3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4104
diff changeset
   321
        entity = self.cw_rset.get_entity(row, col)
3971
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   322
        url = entity.printable_value(rtype)
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   323
        if url:
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   324
            self.w(u'<a href="%s">%s</a>' % (url, url))
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   325
7cfbc35dce7e new generic urlattr view
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3970
diff changeset
   326
2652
3753f3a07ca1 [refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2402
diff changeset
   327
## default primary ui configuration ###########################################
3753f3a07ca1 [refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2402
diff changeset
   328
3875
c2bd7922cdaf use shorter notation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3849
diff changeset
   329
_pvs = uicfg.primaryview_section
2652
3753f3a07ca1 [refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2402
diff changeset
   330
for rtype in ('eid', 'creation_date', 'modification_date', 'cwuri',
5239
471554b842d2 [schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
   331
              'is', 'is_instance_of', 'identity', 'owned_by', 'created_by',
471554b842d2 [schema view] the final touch. Things are getting nicely displayed, and code clean
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5222
diff changeset
   332
              'require_permission', 'see_also'):
3875
c2bd7922cdaf use shorter notation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3849
diff changeset
   333
    _pvs.tag_subject_of(('*', rtype, '*'), 'hidden')
c2bd7922cdaf use shorter notation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3849
diff changeset
   334
    _pvs.tag_object_of(('*', rtype, '*'), 'hidden')