web/views/iprogress.py
changeset 1808 aa09e20dd8c0
parent 1723 30c3a713ab61
child 1977 606923dff11b
equal deleted inserted replaced
1693:49075f57cf2c 1808:aa09e20dd8c0
     7 
     7 
     8 __docformat__ = "restructuredtext en"
     8 __docformat__ = "restructuredtext en"
     9 
     9 
    10 from logilab.mtconverter import html_escape
    10 from logilab.mtconverter import html_escape
    11 
    11 
       
    12 from cubicweb.selectors import implements
    12 from cubicweb.interfaces import IProgress, IMileStone
    13 from cubicweb.interfaces import IProgress, IMileStone
    13 from cubicweb.schema import display_name
    14 from cubicweb.schema import display_name
    14 from cubicweb.common.view import EntityView
    15 from cubicweb.view import EntityView
    15 from cubicweb.common.selectors import implement_interface, accept
       
    16 from cubicweb.web.htmlwidgets import ProgressBarWidget
    16 from cubicweb.web.htmlwidgets import ProgressBarWidget
    17 
    17 
    18 
    18 
    19 class ProgressTableView(EntityView):
    19 class ProgressTableView(EntityView):
    20     """The progress table view is able to display progress information
    20     """The progress table view is able to display progress information
    30     ``columns`` class attribute and implement corresponding
    30     ``columns`` class attribute and implement corresponding
    31     build_COLNAME_cell methods
    31     build_COLNAME_cell methods
    32 
    32 
    33     header_for_COLNAME methods allow to customize header's label
    33     header_for_COLNAME methods allow to customize header's label
    34     """
    34     """
    35     
    35 
    36     id = 'progress_table_view'
    36     id = 'progress_table_view'
    37     title = _('task progression')
    37     title = _('task progression')
    38     __selectors__ = (accept, implement_interface)
    38     __select__ = implements(IMileStone)
    39 
       
    40     accepts_interfaces = (IMileStone,)
       
    41 
    39 
    42     # default columns of the table
    40     # default columns of the table
    43     columns = (_('project'), _('milestone'), _('state'), _('eta_date'),
    41     columns = (_('project'), _('milestone'), _('state'), _('eta_date'),
    44                _('cost'), _('progress'), _('todo_by'))
    42                _('cost'), _('progress'), _('todo_by'))
    45 
    43 
    87         return display_name(self.req, ecls.parent_type)
    85         return display_name(self.req, ecls.parent_type)
    88 
    86 
    89     def header_for_milestone(self, ecls):
    87     def header_for_milestone(self, ecls):
    90         """use entity's type as label"""
    88         """use entity's type as label"""
    91         return display_name(self.req, ecls.id)
    89         return display_name(self.req, ecls.id)
    92     
    90 
    93     def table_header(self, ecls):
    91     def table_header(self, ecls):
    94         """builds the table's header"""
    92         """builds the table's header"""
    95         self.w(u'<thead><tr>')
    93         self.w(u'<thead><tr>')
    96         _ = self.req._
    94         _ = self.req._
    97         for column in self.columns:
    95         for column in self.columns:
   101             else:
    99             else:
   102                 colname = _(column)
   100                 colname = _(column)
   103             self.w(u'<th>%s</th>' % html_escape(colname))
   101             self.w(u'<th>%s</th>' % html_escape(colname))
   104         self.w(u'</tr></thead>\n')
   102         self.w(u'</tr></thead>\n')
   105 
   103 
   106     
   104 
   107     ## cell management ########################################################
   105     ## cell management ########################################################
   108     def build_project_cell(self, entity):
   106     def build_project_cell(self, entity):
   109         """``project`` column cell renderer"""
   107         """``project`` column cell renderer"""
   110         project = entity.get_main_task()
   108         project = entity.get_main_task()
   111         if project:
   109         if project:
   117         return entity.view('incontext')
   115         return entity.view('incontext')
   118 
   116 
   119     def build_state_cell(self, entity):
   117     def build_state_cell(self, entity):
   120         """``state`` column cell renderer"""
   118         """``state`` column cell renderer"""
   121         return html_escape(self.req._(entity.state))
   119         return html_escape(self.req._(entity.state))
   122     
   120 
   123     def build_eta_date_cell(self, entity):
   121     def build_eta_date_cell(self, entity):
   124         """``eta_date`` column cell renderer"""
   122         """``eta_date`` column cell renderer"""
   125         if entity.finished():
   123         if entity.finished():
   126             return self.format_date(entity.completion_date())
   124             return self.format_date(entity.completion_date())
   127         formated_date = self.format_date(entity.initial_prevision_date())
   125         formated_date = self.format_date(entity.initial_prevision_date())
   152         if estimated and estimated != totalcost:
   150         if estimated and estimated != totalcost:
   153             costdescr.append(_('initial estimation %s') % estimated)
   151             costdescr.append(_('initial estimation %s') % estimated)
   154         if costdescr:
   152         if costdescr:
   155             return u'%s (%s)' % (totalcost, ', '.join(costdescr))
   153             return u'%s (%s)' % (totalcost, ', '.join(costdescr))
   156         return unicode(totalcost)
   154         return unicode(totalcost)
   157     
   155 
   158     def build_progress_cell(self, entity):
   156     def build_progress_cell(self, entity):
   159         """``progress`` column cell renderer"""
   157         """``progress`` column cell renderer"""
   160         progress =  u'<div class="progress_data">%s (%.2f%%)</div>' % (
   158         progress =  u'<div class="progress_data">%s (%.2f%%)</div>' % (
   161             entity.done, entity.progress())
   159             entity.done, entity.progress())
   162         return progress + entity.view('progressbar')
   160         return progress + entity.view('progressbar')
   165 class InContextProgressTableView(ProgressTableView):
   163 class InContextProgressTableView(ProgressTableView):
   166     """this views redirects to ``progress_table_view`` but removes
   164     """this views redirects to ``progress_table_view`` but removes
   167     the ``project`` column
   165     the ``project`` column
   168     """
   166     """
   169     id = 'ic_progress_table_view'
   167     id = 'ic_progress_table_view'
   170     
   168 
   171     def call(self):
   169     def call(self):
   172         view = self.vreg.select_view('progress_table_view', self.req, self.rset)
   170         view = self.vreg.select_view('progress_table_view', self.req, self.rset)
   173         columns = list(view.columns)
   171         columns = list(view.columns)
   174         try:
   172         try:
   175             columns.remove('project')
   173             columns.remove('project')
   176         except ValueError:
   174         except ValueError:
   177             self.info('[ic_progress_table_view] could not remove project from columns')
   175             self.info('[ic_progress_table_view] could not remove project from columns')
   178         view.dispatch(w=self.w, columns=columns)
   176         view.render(w=self.w, columns=columns)
   179 
   177 
   180 
   178 
   181 class ProgressBarView(EntityView):
   179 class ProgressBarView(EntityView):
   182     """displays a progress bar"""
   180     """displays a progress bar"""
   183     id = 'progressbar'
   181     id = 'progressbar'
   184     title = _('progress bar')
   182     title = _('progress bar')
   185     __selectors__ = (accept, implement_interface)
   183     __select__ = implements(IProgress)
   186 
       
   187     accepts_interfaces = (IProgress,)
       
   188 
   184 
   189     def cell_call(self, row, col):
   185     def cell_call(self, row, col):
   190         self.req.add_css('cubicweb.iprogress.css')
   186         self.req.add_css('cubicweb.iprogress.css')
   191         entity = self.entity(row, col)
   187         entity = self.entity(row, col)
   192         widget = ProgressBarWidget(entity.done, entity.todo,
   188         widget = ProgressBarWidget(entity.done, entity.todo,