Revision 9b32e2fb snf-astakos-app/astakos/im/tables.py
b/snf-astakos-app/astakos/im/tables.py | ||
---|---|---|
37 | 37 |
from django.utils.safestring import mark_safe |
38 | 38 |
from django.template import Context, Template |
39 | 39 |
from django.template.loader import render_to_string |
40 |
from django.core.exceptions import PermissionDenied |
|
40 | 41 |
|
41 | 42 |
from django_tables2 import A |
42 | 43 |
import django_tables2 as tables |
43 | 44 |
|
44 | 45 |
from astakos.im.models import * |
45 | 46 |
from astakos.im.templatetags.filters import truncatename |
47 |
from astakos.im.functions import do_join_project_checks |
|
46 | 48 |
|
47 | 49 |
DEFAULT_DATE_FORMAT = "d/m/Y" |
48 | 50 |
|
49 | 51 |
|
50 |
MEMBER_STATUS_DISPLAY = { |
|
51 |
100: _('Owner'), |
|
52 |
0: _('Requested'), |
|
53 |
1: _('Pending'), |
|
54 |
2: _('Accepted'), |
|
55 |
3: _('Removing'), |
|
56 |
4: _('Removed'), |
|
57 |
-1: _('Unregistered'), |
|
58 |
} |
|
59 |
|
|
60 |
class TruncatedLinkColumn(tables.LinkColumn): |
|
52 |
class LinkColumn(tables.LinkColumn): |
|
61 | 53 |
|
62 | 54 |
def __init__(self, *args, **kwargs): |
63 |
self.truncate_chars = kwargs.pop('truncate_chars', 10) |
|
64 |
super(TruncatedLinkColumn, self).__init__(*args, **kwargs) |
|
65 |
|
|
55 |
self.coerce = kwargs.pop('coerce', None) |
|
56 |
self.append = kwargs.pop('append', None) |
|
57 |
super(LinkColumn, self).__init__(*args, **kwargs) |
|
58 |
|
|
59 |
def render(self, value, record, bound_column): |
|
60 |
link = super(LinkColumn, self).render(value, record, bound_column) |
|
61 |
extra = '' |
|
62 |
if self.append: |
|
63 |
if callable(self.append): |
|
64 |
extra = self.append(record, bound_column) |
|
65 |
else: |
|
66 |
extra = self.append |
|
67 |
return mark_safe(link + extra) |
|
66 | 68 |
|
67 | 69 |
def render_link(self, uri, text, attrs=None): |
68 |
text = truncatename(text, self.truncate_chars) |
|
69 |
return super(TruncatedLinkColumn, self).render_link(uri, text, attrs) |
|
70 |
if self.coerce: |
|
71 |
text = self.coerce(text) |
|
72 |
return super(LinkColumn, self).render_link(uri, text, attrs) |
|
70 | 73 |
|
71 | 74 |
|
72 | 75 |
# Helper columns |
... | ... | |
226 | 229 |
super(UserTable, self).__init__(*args, **kwargs) |
227 | 230 |
|
228 | 231 |
|
232 |
def project_name_append(record, column): |
|
233 |
try: |
|
234 |
if record.projectapplication and column.table.user.owns_project(record): |
|
235 |
if record.state == ProjectApplication.APPROVED: |
|
236 |
return mark_safe("<br /><i class='tiny'>%s</i>" % _('modifications pending')) |
|
237 |
else: |
|
238 |
return u'' |
|
239 |
else: |
|
240 |
return u'' |
|
241 |
except: |
|
242 |
return u'' |
|
243 |
|
|
229 | 244 |
# Table classes |
230 | 245 |
class UserProjectApplicationsTable(UserTable): |
231 | 246 |
caption = _('My projects') |
232 | 247 |
|
233 |
name = TruncatedLinkColumn('astakos.im.views.project_detail', |
|
234 |
truncate_chars=25, |
|
235 |
args=(A('pk'),)) |
|
236 |
issue_date = tables.DateColumn(format=DEFAULT_DATE_FORMAT) |
|
248 |
name = LinkColumn('astakos.im.views.project_detail', |
|
249 |
coerce=lambda x: truncatename(x, 25), |
|
250 |
append=project_name_append, |
|
251 |
args=(A('pk'),)) |
|
252 |
issue_date = tables.DateColumn(verbose_name=_('Applied at'), format=DEFAULT_DATE_FORMAT) |
|
237 | 253 |
start_date = tables.DateColumn(format=DEFAULT_DATE_FORMAT) |
238 |
end_date = tables.DateColumn(format=DEFAULT_DATE_FORMAT) |
|
239 |
members_count = tables.Column(verbose_name=_("Enrolled"), default=0,
|
|
254 |
end_date = tables.DateColumn(verbose_name=_('Expires at'), format=DEFAULT_DATE_FORMAT)
|
|
255 |
members_count = tables.Column(verbose_name=_("Members"), default=0,
|
|
240 | 256 |
sortable=False) |
241 | 257 |
membership_status = tables.Column(verbose_name=_("Status"), empty_values=(), |
242 | 258 |
sortable=False) |
... | ... | |
246 | 262 |
|
247 | 263 |
|
248 | 264 |
def render_membership_status(self, record, *args, **kwargs): |
249 |
status = record.user_status(self.user) |
|
250 |
if status == 100: |
|
251 |
return record.state |
|
265 |
if self.user.owns_project(record): |
|
266 |
return record.state_display() |
|
252 | 267 |
else: |
253 |
return MEMBER_STATUS_DISPLAY.get(status, 'Unknown') |
|
268 |
status = record.user_status(self.user) |
|
269 |
return record.user_status_display(self.user) |
|
254 | 270 |
|
255 | 271 |
class Meta: |
256 | 272 |
model = ProjectApplication |
257 |
fields = ('name', 'membership_status', 'issue_date', 'start_date','end_date', 'members_count')
|
|
273 |
fields = ('name', 'membership_status', 'issue_date', 'end_date', 'members_count') |
|
258 | 274 |
attrs = {'id': 'projects-list', 'class': 'my-projects alt-style'} |
259 | 275 |
template = "im/table_render.html" |
260 | 276 |
empty_text = _('No projects') |
261 | 277 |
|
278 |
class ProjectModificationApplicationsTable(UserProjectApplicationsTable): |
|
279 |
name = LinkColumn('astakos.im.views.project_detail', |
|
280 |
verbose_name=_('Action'), |
|
281 |
coerce= lambda x: 'review', |
|
282 |
args=(A('pk'),)) |
|
283 |
class Meta: |
|
284 |
attrs = {'id': 'projects-list', 'class': 'my-projects alt-style'} |
|
285 |
fields = ('issue_date', 'membership_status') |
|
286 |
exclude = ('start_date', 'end_date', 'members_count', 'project_action') |
|
262 | 287 |
|
263 | 288 |
def member_action_extra_context(membership, table, col): |
264 | 289 |
|
Also available in: Unified diff