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, |