[4431] | 1 | """Datatables and related components used in different contexts. |
---|
| 2 | """ |
---|
| 3 | import grok |
---|
[5005] | 4 | from waeup.sirp.interfaces import IUniversity |
---|
| 5 | from waeup.sirp.university.interfaces import ( |
---|
| 6 | IFacultyContainer, IFaculty, IDepartment, ICourseContainer) |
---|
[4920] | 7 | from waeup.sirp.widgets.interfaces import ITableProvider |
---|
| 8 | from waeup.sirp.widgets.table import YUITable as Table |
---|
| 9 | from waeup.sirp.widgets.table import Col |
---|
[4494] | 10 | from zope.security.management import checkPermission |
---|
[4431] | 11 | |
---|
[4432] | 12 | class CodeAndTitleTableProvider(grok.Adapter): |
---|
[4434] | 13 | """A table provider for objects that have a code, title and prefix. |
---|
| 14 | """ |
---|
[4432] | 15 | grok.baseclass() |
---|
[4431] | 16 | grok.provides(ITableProvider) |
---|
| 17 | |
---|
[4432] | 18 | title = None |
---|
[4431] | 19 | |
---|
[4434] | 20 | def __init__(self, context): |
---|
| 21 | self.context = context |
---|
| 22 | self.prepare() |
---|
| 23 | |
---|
| 24 | def prepare(self): |
---|
| 25 | self.data_source = self.context |
---|
| 26 | |
---|
| 27 | def getItemURL(self, view, value): |
---|
| 28 | context_url = '' |
---|
| 29 | if not view is None: |
---|
| 30 | context_url = view.url(self.data_source) + '/' |
---|
| 31 | result = '<a href="%s%s">%s</a>' % (context_url, value, value) |
---|
| 32 | return result |
---|
| 33 | |
---|
[4461] | 34 | def getTables(self, view=None): |
---|
[4434] | 35 | data = self.data_source |
---|
[4432] | 36 | context_url = '' |
---|
| 37 | if view: |
---|
| 38 | context_url = view.url(self.context) + '/' |
---|
[4431] | 39 | cols = ( |
---|
| 40 | Col( |
---|
| 41 | header='Code', sortable=True, |
---|
[4434] | 42 | data = tuple([self.getItemURL(view, data[x].code) |
---|
| 43 | for x in data])), |
---|
[4431] | 44 | Col( |
---|
| 45 | header='Title', sortable=True, |
---|
| 46 | data = tuple([data.getName(x) for x in data])), |
---|
| 47 | ) |
---|
| 48 | self.table = Table(self.title, cols=cols) |
---|
[4461] | 49 | return (self.table,) |
---|
[4432] | 50 | |
---|
| 51 | class DepartmentTableProvider(CodeAndTitleTableProvider): |
---|
| 52 | grok.context(IFaculty) |
---|
| 53 | grok.provides(ITableProvider) |
---|
| 54 | title = 'Departments' |
---|
| 55 | |
---|
[4433] | 56 | class FacultyTableProvider(CodeAndTitleTableProvider): |
---|
| 57 | grok.context(IFacultyContainer) |
---|
| 58 | grok.provides(ITableProvider) |
---|
| 59 | title = 'Faculties' |
---|
[4434] | 60 | |
---|
| 61 | class UniversityTableProvider(CodeAndTitleTableProvider): |
---|
| 62 | grok.context(IUniversity) |
---|
| 63 | grok.provides(ITableProvider) |
---|
| 64 | title = 'Faculties' |
---|
| 65 | |
---|
| 66 | def prepare(self): |
---|
| 67 | self.data_source = self.context.faculties |
---|
[4442] | 68 | |
---|
| 69 | class CourseTableProvider(CodeAndTitleTableProvider): |
---|
| 70 | grok.context(IDepartment) |
---|
| 71 | grok.provides(ITableProvider) |
---|
| 72 | title = 'Courses' |
---|
| 73 | |
---|
| 74 | def prepare(self): |
---|
| 75 | self.data_source = self.context.courses |
---|
| 76 | |
---|
[4461] | 77 | def getTables(self, view=None): |
---|
[4442] | 78 | data = self.data_source |
---|
| 79 | context_url = '' |
---|
| 80 | if view: |
---|
| 81 | context_url = view.url(self.context) + '/' |
---|
[4461] | 82 | |
---|
| 83 | # Create a courses table... |
---|
[4442] | 84 | cols = ( |
---|
| 85 | Col( |
---|
| 86 | header='Code', sortable=True, |
---|
| 87 | data = tuple([self.getItemURL(view, data[x].code) |
---|
| 88 | for x in data])), |
---|
| 89 | Col( |
---|
| 90 | header='Title', sortable=True, |
---|
| 91 | data = tuple([data[x].title for x in data])), |
---|
| 92 | ) |
---|
[4494] | 93 | delcol = Col(header='', sortable=False, |
---|
| 94 | data = [ |
---|
| 95 | '<form method="post">' |
---|
| 96 | '<input type="submit" name="delcourse" value="Delete" />' |
---|
| 97 | '<input type="hidden" name="code" value="%s" />' |
---|
| 98 | '</form>' % (data[x].code) |
---|
| 99 | for x in data]) |
---|
| 100 | |
---|
| 101 | if checkPermission('waeup.manageUniversity', self.context.courses): |
---|
| 102 | cols = list(cols) |
---|
| 103 | cols.append(delcol) |
---|
| 104 | cols = tuple(cols) |
---|
[4461] | 105 | self.coursetable = Table('Courses', cols=cols) |
---|
[4450] | 106 | |
---|
[4461] | 107 | # Create a certificates table... |
---|
| 108 | self.data_source = self.context.certificates |
---|
| 109 | data = self.data_source |
---|
| 110 | certcols =( |
---|
| 111 | Col( |
---|
| 112 | header='Code', sortable=True, |
---|
| 113 | data = tuple([self.getItemURL(view, data[x].code) |
---|
| 114 | for x in data])), |
---|
| 115 | Col( |
---|
| 116 | header='Title', sortable=True, |
---|
| 117 | data = tuple([data[x].title for x in data])), |
---|
| 118 | ) |
---|
[4496] | 119 | |
---|
| 120 | delcol = Col(header='', sortable=False, |
---|
| 121 | data = [ |
---|
| 122 | '<form method="post">' |
---|
| 123 | '<input type="submit" name="delcert" value="Delete" />' |
---|
| 124 | '<input type="hidden" name="code" value="%s" />' |
---|
| 125 | '</form>' % (data[x].code) |
---|
| 126 | for x in data]) |
---|
| 127 | |
---|
| 128 | if checkPermission('waeup.manageUniversity', self.context.certificates): |
---|
| 129 | certcols = list(certcols) |
---|
| 130 | certcols.append(delcol) |
---|
| 131 | certcols = tuple(certcols) |
---|
| 132 | |
---|
[4461] | 133 | self.certtable = Table('Certificates', cols=certcols) |
---|
| 134 | return (self.coursetable, self.certtable) |
---|
| 135 | |
---|
[4450] | 136 | class CourseContainerCourseTableProvider(CodeAndTitleTableProvider): |
---|
| 137 | grok.context(ICourseContainer) |
---|
| 138 | grok.provides(ITableProvider) |
---|
| 139 | title = 'Courses' |
---|
| 140 | |
---|
[4461] | 141 | def getTables(self, view=None): |
---|
[4450] | 142 | data = self.data_source |
---|
| 143 | context_url = '' |
---|
| 144 | if view: |
---|
| 145 | context_url = view.url(self.context) + '/' |
---|
| 146 | cols = ( |
---|
| 147 | Col( |
---|
| 148 | header='Code', sortable=True, |
---|
| 149 | data = tuple([self.getItemURL(view, data[x].code) |
---|
| 150 | for x in data])), |
---|
| 151 | Col( |
---|
| 152 | header='Title', sortable=True, |
---|
| 153 | data = tuple([data[x].title for x in data])), |
---|
| 154 | ) |
---|
| 155 | self.table = Table(self.title, cols=cols) |
---|
[4461] | 156 | return (self.table,) |
---|