- Timestamp:
- 10 Sep 2012, 11:05:07 (12 years ago)
- Location:
- main/waeup.kofa/branches/uli-async-update
- Files:
-
- 17 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/branches/uli-async-update
- Property svn:mergeinfo changed
-
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/batchprocessing.txt
r8472 r9169 75 75 76 76 >>> import cStringIO 77 >>> browser.getLink('Upload CSV file').click()77 >>> browser.getLink('Upload data').click() 78 78 >>> filecontents = cStringIO.StringIO( 79 79 ... open('faculties.csv', 'rb').read()) … … 84 84 Step 1: start batch processing: 85 85 86 >>> browser.getLink(' Batch processing').click()86 >>> browser.getLink('Process data').click() 87 87 >>> button = lookup_submit_value( 88 88 ... 'select', 'faculties_zope.mgr.csv', browser) … … 97 97 'Course Processor', 'CourseTicket Processor', 98 98 'Department Processor', 'Faculty Processor', 99 ' Payment Processor', 'Student Processor',99 'Student Payment Processor', 'Student Processor', 100 100 'StudentStudyCourse Processor (update only)', 101 'StudentStudyLevel Processor', 'Verdict Processor (update only)'] 101 'StudentStudyLevel Processor', 102 'User Processor', 103 'Verdict Processor (update only)'] 102 104 103 105 >>> importerselect.getControl('Faculty Processor').selected = True … … 175 177 176 178 >>> import cStringIO 177 >>> browser.getLink('Upload CSV file').click()179 >>> browser.getLink('Upload data').click() 178 180 >>> filecontents = cStringIO.StringIO( 179 181 ... open('departments.csv', 'rb').read()) … … 184 186 Step 1: start batch processing: 185 187 186 >>> browser.getLink(' Batch processing').click()188 >>> browser.getLink('Process data').click() 187 189 >>> button = lookup_submit_value( 188 190 ... 'select', 'departments_zope.mgr.csv', browser) … … 240 242 241 243 >>> import cStringIO 242 >>> browser.getLink('Upload CSV file').click()244 >>> browser.getLink('Upload data').click() 243 245 >>> filecontents = cStringIO.StringIO( 244 246 ... open('courses.csv', 'rb').read()) … … 249 251 Step 1: start batch processing: 250 252 251 >>> browser.getLink(' Batch processing').click()253 >>> browser.getLink('Process data').click() 252 254 >>> button = lookup_submit_value( 253 255 ... 'select', 'courses_zope.mgr.csv', browser) … … 305 307 306 308 >>> import cStringIO 307 >>> browser.getLink('Upload CSV file').click()309 >>> browser.getLink('Upload data').click() 308 310 >>> filecontents = cStringIO.StringIO( 309 311 ... open('certificates.csv', 'rb').read()) … … 314 316 Step 1: start batch processing: 315 317 316 >>> browser.getLink(' Batch processing').click()318 >>> browser.getLink('Process data').click() 317 319 >>> button = lookup_submit_value( 318 320 ... 'select', 'certificates_zope.mgr.csv', browser) … … 371 373 372 374 >>> import cStringIO 373 >>> browser.getLink('Upload CSV file').click()375 >>> browser.getLink('Upload data').click() 374 376 >>> filecontents = cStringIO.StringIO( 375 377 ... open('mycertcourses.csv', 'rb').read()) … … 380 382 Step 1: start batch processing: 381 383 382 >>> browser.getLink(' Batch processing').click()384 >>> browser.getLink('Process data').click() 383 385 >>> button = lookup_submit_value( 384 386 ... 'select', 'mycertcourses_zope.mgr.csv', browser) … … 420 422 ...File:...mycertcourses_zope.mgr.csv... 421 423 424 Batch processing users 425 ====================== 426 427 >>> browser.open('http://localhost/app/datacenter') 428 429 Prepare a CSV file for certificate courses: 430 431 >>> open('users.csv', 'wb').write( 432 ... """name,title,public_name,email,phone,roles 433 ... uli,Uli Fouquet,Chief Developer,uli@abc.de,+49-234-567 434 ... henrik, Henrik Bettermann,Admin,henrik@abc.de,+49-234-567,['waeup.PortalManager'] 435 ... """) 436 437 Upload the file: 438 439 >>> import cStringIO 440 >>> browser.getLink('Upload data').click() 441 >>> filecontents = cStringIO.StringIO( 442 ... open('users.csv', 'rb').read()) 443 >>> filewidget = browser.getControl(name='uploadfile:file') 444 >>> filewidget.add_file(filecontents, 'text/plain', 'users.csv') 445 >>> browser.getControl(name='SUBMIT').click() 446 447 Step 1: start batch processing: 448 449 >>> browser.getLink('Process data').click() 450 >>> button = lookup_submit_value( 451 ... 'select', 'users_zope.mgr.csv', browser) 452 >>> button.click() 453 454 Step 2: select a processor and mode: 455 456 >>> importerselect = browser.getControl(name='importer') 457 >>> importerselect.getControl('User Processor').selected = True 458 >>> modeselect = browser.getControl(name='mode') 459 >>> modeselect.getControl(value='create').selected = True 460 >>> browser.getControl('Proceed to step 3').click() 461 462 Step 3: Fix headerlines 463 464 We get informed that there are no problems with the current header: 465 466 >>> print browser.contents 467 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 468 ... 469 Header fields OK 470 ... 471 472 The submit button is enabled: 473 474 >>> browser.getControl('Perform import').disabled 475 False 476 477 >>> browser.getControl('Perform import').click() 478 479 Step 4: See import results 480 481 The import was successful: 482 483 >>> print browser.contents 484 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 485 ...Successfully processed 2 rows... 486 ...Batch processing finished... 487 ...File:...users_zope.mgr.csv... 422 488 423 489 Pending files … … 444 510 445 511 >>> import cStringIO 446 >>> browser.getLink('Upload CSV file').click()512 >>> browser.getLink('Upload data').click() 447 513 >>> filecontents = cStringIO.StringIO( 448 514 ... open('newfaculties.csv', 'rb').read()) … … 453 519 Step 1: start batch processing: 454 520 455 >>> browser.getLink(' Batch processing').click()521 >>> browser.getLink('Process data').click() 456 522 >>> button = lookup_submit_value( 457 523 ... 'select', 'newfaculties_zope.mgr.csv', browser) … … 515 581 516 582 >>> browser.open('http://localhost/app/datacenter') 517 >>> browser.getLink(' Batch processing').click()583 >>> browser.getLink('Process data').click() 518 584 >>> button = lookup_submit_value( 519 585 ... 'select', 'newfaculties_zope.mgr.create.pending.csv', browser) … … 551 617 >>> sorted(os.listdir(dc_path + '/finished')) 552 618 ['certificates_zope.mgr.create.finished.csv', ..., 553 'newfaculties_zope.mgr.create.finished.csv', 554 'newfaculties_zope.mgr.csv'] 555 619 'users_zope.mgr.create.finished.csv', 'users_zope.mgr.csv'] 620 621 Processed (finished) Files 622 ========================== 623 624 >>> browser.open('http://localhost/app/datacenter/processed') 625 >>> '<a href="download?filename=finished/certificates_zope.mgr.csv">' in browser.contents 626 True 556 627 557 628 Log Files -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/browser.txt
r8777 r9169 1000 1000 with their code as key. 1001 1001 1002 Each certificate provides a ``Add c ourse referrer`` action button near top.1002 Each certificate provides a ``Add certificate course`` action button near top. 1003 1003 1004 1004 Certificates provide an add-form to add new certcourses: … … 1006 1006 >>> cert_url = dept_url + '/certificates/CERT1' 1007 1007 >>> browser.open(cert_url + '/manage') 1008 >>> browser.getControl('Add c ourse referrer').click()1008 >>> browser.getControl('Add certificate course').click() 1009 1009 >>> print browser.contents 1010 1010 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"... … … 1025 1025 >>> ctrl.getControl('COURSE1').selected = True 1026 1026 >>> browser.getControl(name='form.level').value = ['100'] 1027 >>> browser.getControl('Add c ourse referrer').click()1027 >>> browser.getControl('Add certificate course').click() 1028 1028 1029 1029 Our certificatecourse will be linked on the parent certificate page: … … 1038 1038 >>> cert_url = dept_url + '/certificates/CERT1' 1039 1039 >>> browser.open(cert_url + '/manage') 1040 >>> browser.getControl('Add c ourse referrer').click()1040 >>> browser.getControl('Add certificate course').click() 1041 1041 >>> ctrl = browser.getControl(name='form.course') 1042 1042 >>> ctrl.getControl('COURSE1').selected = True 1043 1043 >>> browser.getControl(name='form.level').value = ['100'] 1044 >>> browser.getControl('Add c ourse referrer').click()1045 >>> 'The chosen c ourse referreris already' in browser.contents1044 >>> browser.getControl('Add certificate course').click() 1045 >>> 'The chosen certificate course is already' in browser.contents 1046 1046 True 1047 1047 … … 1063 1063 1064 1064 >>> browser.open(cert_url + '/COURSE1_100') 1065 >>> browser.getLink('Edit c ourse referrer').click()1065 >>> browser.getLink('Edit certificate course').click() 1066 1066 1067 1067 If we just click 'Save and return' nothing will change: … … 1088 1088 changed: 1089 1089 1090 >>> browser.getLink('Edit c ourse referrer').click()1090 >>> browser.getLink('Edit certificate course').click() 1091 1091 >>> browser.getControl(name='form.level').value = ['400'] 1092 1092 >>> browser.getControl('Cancel').click() … … 1125 1125 >>> 'COURSE1_200</a>' in browser.contents 1126 1126 True 1127 >>> browser.getControl('Remove selected c ourse referrers').click()1127 >>> browser.getControl('Remove selected certificate courses').click() 1128 1128 >>> 'No item selected' in browser.contents 1129 1129 True 1130 1130 >>> browser.getControl(name='val_id').getControl( 1131 1131 ... value='COURSE1_200').selected = True 1132 >>> browser.getControl('Remove selected c ourse referrers').click()1132 >>> browser.getControl('Remove selected certificate courses').click() 1133 1133 >>> 'Successfully removed: COURSE1_200' in browser.contents 1134 1134 True … … 1218 1218 page: 1219 1219 1220 >>> browser.getLink('Upload CSV file').click()1220 >>> browser.getLink('Upload data').click() 1221 1221 1222 1222 and enter the appropriate data in the form: -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/layout.py
r9003 r9169 191 191 grok.baseclass() 192 192 template = default_waeup_display_template 193 hide_hint = True 193 194 194 195 class KofaEditFormPage(UtilityView,EditForm): … … 215 216 if self.widgets.get('perm_address'): 216 217 self.widgets['perm_address'].cssClass = 'span8' 217 self.widgets['perm_address'].height = 10 218 self.widgets['perm_address'].height = 6 219 if self.widgets.get('next_kin_address'): 220 self.widgets['next_kin_address'].cssClass = 'span8' 221 self.widgets['next_kin_address'].height = 6 222 if self.widgets.get('notice'): 223 self.widgets['notice'].cssClass = 'span8' 224 self.widgets['notice'].height = 6 218 225 if self.widgets.get('description'): 219 226 self.widgets['description'].cssClass = 'span12' … … 306 313 else: 307 314 return None 315 316 def formatTZDate(self,datetimeobj): 317 if isinstance(datetimeobj, datetime): 318 tz = getUtility(IKofaUtils).tzinfo 319 date = to_timezone( 320 datetimeobj, tz).strftime("%d/%m/%Y") 321 return date 322 else: 323 return None 308 324 309 325 def update(self): -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/pages.py
r9166 r9169 26 26 import time 27 27 import re 28 from urllib import urlencode 28 29 from zope import schema 29 30 from zope.authentication.interfaces import ( … … 39 40 IPrincipalRoleManager, IPrincipalRoleMap) 40 41 from zope.session.interfaces import ISession 42 from zope.password.interfaces import IPasswordManager 41 43 from waeup.kofa.browser.layout import ( 42 44 KofaPage, KofaForm, KofaEditFormPage, KofaAddFormPage, … … 67 69 from waeup.kofa.widgets.htmlwidget import HTMLDisplayWidget 68 70 from waeup.kofa.authentication import get_principal_role_manager 69 from waeup.kofa.utils.helpers import get_user_account, msave 71 from waeup.kofa.utils.helpers import get_user_account 72 from waeup.kofa.mandates.mandate import PasswordMandate 70 73 71 74 grok.context(IKofaObject) … … 156 159 return 157 160 161 # Save function used for save methods in pages 162 def msave(view, **data): 163 changed_fields = view.applyData(view.context, **data) 164 # Turn list of lists into single list 165 if changed_fields: 166 changed_fields = reduce(lambda x,y: x+y, changed_fields.values()) 167 fields_string = ' + '.join(changed_fields) 168 view.flash(_('Form has been saved.')) 169 ob_class = view.__implemented__.__name__.replace('waeup.kofa.','') 170 if fields_string: 171 grok.getSite().logger.info('%s - %s - saved: %s' % (ob_class, view.context.__name__, fields_string)) 172 return 173 158 174 # 159 175 # Login/logout and language switch pages... … … 192 208 self.redirect(self.camefrom) 193 209 return 194 self.flash(_('You entered wrong credentials.')) 210 # Display appropriate flash message if credentials are correct 211 # but student has been deactivated. 212 login = self.request.form['form.login'] 213 if len(login) == 8 and grok.getSite()['students'].has_key(login): 214 student = grok.getSite()['students'][ 215 self.request.form['form.login']] 216 password = self.request.form['form.password'] 217 passwordmanager = getUtility(IPasswordManager, 'SSHA') 218 if passwordmanager.checkPassword(student.password, password): 219 self.flash(_('Your account has been deactivated.')) 220 return 221 self.flash(_('You entered invalid credentials.')) 195 222 196 223 … … 372 399 def entries(self): 373 400 return () 374 375 class ReindexPage(UtilityView, grok.View):376 """ Reindex view.377 378 Reindexes a catalog. For managers only.379 """380 grok.context(IUniversity)381 grok.name('reindex')382 grok.require('waeup.managePortal')383 384 def update(self,ctlg=None):385 if ctlg is None:386 self.flash('No catalog name provided.')387 return388 cat = queryUtility(ICatalog, name='%s_catalog' % ctlg)389 if cat is None:390 self.flash('%s_catalog does not exist' % ctlg)391 return392 self.context.logger.info(393 'Catalog `%s_catalog` re-indexing started.' % ctlg)394 cat.updateIndexes()395 no_of_entries = cat.values()[0].documentCount()396 self.flash('%d %s re-indexed.' % (no_of_entries,ctlg))397 self.context.logger.info(398 'Re-indexing of %d objects finished.' % no_of_entries)399 return400 401 def render(self):402 self.redirect(self.url(self.context, '@@index'))403 return404 401 405 402 # … … 826 823 return 827 824 825 class DatacenterFinishedPage(KofaEditFormPage): 826 grok.context(IDataCenter) 827 grok.name('processed') 828 grok.require('waeup.manageDataCenter') 829 label = _(u'Processed Files') 830 pnav = 0 831 832 def update(self): 833 datatable.need() 834 return super(DatacenterFinishedPage, self).update() 835 828 836 class DatacenterUploadPage(KofaPage): 829 837 grok.context(IDataCenter) 830 838 grok.name('upload') 831 839 grok.require('waeup.manageDataCenter') 832 label = _(u'Upload file')840 label = _(u'Upload portal data as CSV file') 833 841 pnav = 0 834 842 upload_button =_(u'Upload') … … 849 857 self.flash(_("Only csv files are allowed.")) 850 858 return 851 target = os.path.join(self.context.storage, 852 self.getNormalizedFileName(filename)) 859 normalized_filename = self.getNormalizedFileName(filename) 860 finished_file = os.path.join( 861 self.context.storage, 'finished', normalized_filename) 862 unfinished_file = os.path.join( 863 self.context.storage, 'unfinished', normalized_filename) 864 if os.path.exists(finished_file) or os.path.exists(unfinished_file): 865 self.flash(_("File with same name was uploaded earlier.")) 866 return 867 target = os.path.join(self.context.storage, normalized_filename) 853 868 open(target, 'wb').write(uploadfile.read()) 854 869 os.chmod(target, 0664) … … 881 896 return '%s_%s%s' % (base, filtered_username, ext.lower()) 882 897 898 def getImporters(self): 899 importers = getAllUtilitiesRegisteredFor(IBatchProcessor) 900 importer_props = [] 901 for x in importers: 902 iface_fields = schema.getFields(x.iface) 903 available_fields = [] 904 for key in iface_fields.keys(): 905 iface_fields[key] = (iface_fields[key].__class__.__name__, 906 iface_fields[key].required) 907 for value in x.available_fields: 908 available_fields.append( 909 dict(f_name=value, 910 f_type=iface_fields.get(value, (None, False))[0], 911 f_required=iface_fields.get(value, (None, False))[1] 912 ) 913 ) 914 available_fields = sorted(available_fields, key=lambda k: k['f_name']) 915 importer_props.append( 916 dict(title=x.name, name=x.util_name, fields=available_fields)) 917 return sorted(importer_props, key=lambda k: k['title']) 918 883 919 class FileDownloadView(UtilityView, grok.View): 884 920 grok.context(IDataCenter) … … 897 933 'Content-Type', 'text/csv; charset=UTF-8') 898 934 self.response.setHeader( 899 'Content-Disposition:', 'attachment; filename="%s .csv' %900 self.filename.replace(' .csv',''))935 'Content-Disposition:', 'attachment; filename="%s' % 936 self.filename.replace('finished/','')) 901 937 fullpath = os.path.join(self.context.storage, self.filename) 902 938 return open(fullpath, 'rb').read() 939 940 class SkeletonDownloadView(UtilityView, grok.View): 941 grok.context(IDataCenter) 942 grok.name('skeleton') 943 grok.require('waeup.manageDataCenter') 944 945 def update(self, processorname=None): 946 self.processorname = self.request.form['name'] 947 self.filename = ('%s_000.csv' % 948 self.processorname.replace('processor','import')) 949 return 950 951 def render(self): 952 #ob_class = self.__implemented__.__name__.replace('waeup.kofa.','') 953 #self.context.logger.info( 954 # '%s - skeleton downloaded: %s' % (ob_class, self.filename)) 955 self.response.setHeader( 956 'Content-Type', 'text/csv; charset=UTF-8') 957 self.response.setHeader( 958 'Content-Disposition:', 'attachment; filename="%s' % self.filename) 959 processor = getUtility(IBatchProcessor, name=self.processorname) 960 csv_data = processor.get_csv_skeleton() 961 return csv_data 903 962 904 963 class DatacenterImportStep1(KofaPage): … … 914 973 915 974 def getFiles(self): 916 files = self.context.get Files(sort='date')975 files = self.context.getPendingFiles(sort='date') 917 976 for file in files: 918 977 name = file.name … … 1426 1485 return 1427 1486 result = open(path, 'rb').read() 1487 acronym = grok.getSite()['configuration'].acronym.replace(' ','') 1488 filename = "%s%s.csv" % ( 1489 acronym, exporter.title.title().replace(' ','')) 1490 self.response.setHeader( 1491 'Content-Disposition:', 'attachment; filename="%s' % filename) 1428 1492 self.response.setHeader( 1429 1493 'Content-Type', 'text/csv; charset=UTF-8') … … 1987 2051 grok.template('certificatemanagepage') 1988 2052 taboneactions = [_('Save'),_('Cancel')] 1989 tabtwoactions = [_('Add c ourse referrer'),1990 _('Remove selected c ourse referrers'),_('Cancel')]2053 tabtwoactions = [_('Add certificate course'), 2054 _('Remove selected certificate courses'),_('Cancel')] 1991 2055 tabthreeactions1 = [_('Remove selected local roles')] 1992 2056 tabthreeactions2 = [_('Add local role')] … … 2011 2075 return msave(self, **data) 2012 2076 2013 @jsaction(_('Remove selected c ourse referrers'))2077 @jsaction(_('Remove selected certificate courses')) 2014 2078 def delCertificateCourses(self, **data): 2015 2079 delSubobjects(self, redirect='@@manage', tab='2') 2016 2080 return 2017 2081 2018 @action(_('Add c ourse referrer'), validator=NullValidator)2082 @action(_('Add certificate course'), validator=NullValidator) 2019 2083 def addCertificateCourse(self, **data): 2020 2084 self.redirect(self.url(self.context, 'addcertificatecourse')) … … 2053 2117 form_fields = grok.AutoFields(ICertificateCourseAdd) 2054 2118 pnav = 1 2055 label = _('Add c ourse referrer')2056 2057 @action(_('Add c ourse referrer'))2119 label = _('Add certificate course') 2120 2121 @action(_('Add certificate course')) 2058 2122 def addCertcourse(self, **data): 2059 2123 try: 2060 self.context.addC ourseRef(**data)2124 self.context.addCertCourse(**data) 2061 2125 except KeyError: 2062 self.status = self.flash(_('The chosen c ourse referreris already '2126 self.status = self.flash(_('The chosen certificate course is already ' 2063 2127 'part of this certificate.')) 2064 2128 return 2065 2129 self.status = self.flash( 2066 _(" Course referrer${a}_${b} added.",2130 _("certificate course ${a}_${b} added.", 2067 2131 mapping = {'a': data['course'].code, 'b': data['level']})) 2068 2132 code = "%s_%s" % (data['course'].code, data['level']) … … 2105 2169 grok.require('waeup.manageAcademics') 2106 2170 form_fields = grok.AutoFields(ICertificateCourse) 2107 label = _('Edit c ourse referrer')2171 label = _('Edit certificate course') 2108 2172 pnav = 1 2109 2173 … … 2118 2182 old_level = self.context.level 2119 2183 data['course'] = self.context.course 2120 parent.addC ourseRef(**data)2121 parent.delC ourseRef(data['course'].code, level=old_level)2184 parent.addCertCourse(**data) 2185 parent.delCertCourse(data['course'].code, level=old_level) 2122 2186 self.flash(_('Form has been saved.')) 2123 2187 old_code = "%s_%s" % (data['course'].code, old_level) … … 2193 2257 # Change password 2194 2258 kofa_utils = getUtility(IKofaUtils) 2195 pwd = kofa_utils.genPassword() 2196 IUserAccount(user).setPassword(pwd) 2197 # Send email with new redentials 2198 msg = _('You have successfully changed your password for the') 2199 login_url = self.url(grok.getSite(), 'login') 2259 password = kofa_utils.genPassword() 2260 mandate = PasswordMandate() 2261 mandate.params['password'] = password 2262 mandate.params['user'] = user 2263 site = grok.getSite() 2264 site['mandates'].addMandate(mandate) 2265 # Send email with credentials 2266 args = {'mandate_id':mandate.mandate_id} 2267 mandate_url = self.url(site) + '/mandate?%s' % urlencode(args) 2268 url_info = u'Confirmation link: %s' % mandate_url 2269 msg = _('You have successfully requested a password for the') 2200 2270 success = kofa_utils.sendCredentials( 2201 IUserAccount(user),p wd,login_url,msg)2271 IUserAccount(user),password,url_info,msg) 2202 2272 if success: 2203 2273 self.flash(_('An email with your user name and password ' + -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/pdf.py
r8257 r9169 83 83 84 84 Main things fixed here: 85 85 If html code: 86 86 - remove newlines (not visible in HTML but visible in PDF) 87 87 - add <br> tags after <div> (as divs break lines in HTML but not in PDF) 88 If not html code: 89 - just replace newlines by <br> tags 88 90 """ 89 # Add br tag if widgets contain div tags 90 # which are not supported by reportlab 91 html = html.replace('</div>', '</div><br />') 92 html = html.replace('\n', '') 91 if '</' in html: 92 # Add br tag if widgets contain div tags 93 # which are not supported by reportlab 94 html = html.replace('</div>', '</div><br />') 95 html = html.replace('\n', '') 96 else: 97 html = html.replace('\n', '<br />') 93 98 return html 94 99 … … 265 270 target_language=lang) 266 271 f_label = Paragraph(f_label, ENTRY1_STYLE) 267 f_text = format_html(widget()) 272 f_text = translate(widget(), domain, target_language=lang) 273 f_text = format_html(f_text) 274 if f_text: 275 hint = ' <font size=9>' + widget.hint + '</font>' 276 f_text = f_text + hint 268 277 f_text = Paragraph(f_text, ENTRY1_STYLE) 269 278 table_data.append([f_label,f_text]) -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/static/datatable.js
r7811 r9169 1 1 $(document).ready(function(){ 2 $('.dataTable').dataTable(); 2 $('.dataTable').dataTable(); 3 4 $('.dataTableFiles').dataTable( { 5 "aaSorting": [[ 2, "desc" ]], 6 } ); 7 3 8 $('.dataTableManage').dataTable( { 4 9 "aaSorting": [[ 1, "asc" ]], 5 10 "aoColumnDefs":[{ "bSortable": false, "aTargets": [ 0 ] }] 6 11 } ); 12 13 $('.dataTableManageFiles').dataTable( { 14 "aaSorting": [[ 3, "desc" ]], 15 "aoColumnDefs":[{ "bSortable": false, "aTargets": [ 0 ] }] 16 } ); 17 18 7 19 }); 8 20 -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/actionbutton.pt
r7459 r9169 1 1 <a class="btn actionbar" tal:condition="viewlet/target_url" 2 tal:attributes="href viewlet/target_url ">2 tal:attributes="href viewlet/target_url; onclick viewlet/onclick"> 3 3 <img src="" alt="edit" 4 4 tal:attributes="src viewlet/icon_url; -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/certificatemanagepage.pt
r7811 r9169 4 4 <ul class="tabs" data-tabs="tabs"> 5 5 <li tal:attributes="class view/tab1"><a href="#tab-1" i18n:translate="">Settings</a></li> 6 <li tal:attributes="class view/tab2"><a href="#tab-2" i18n:translate="">C ourse Referrers</a></li>6 <li tal:attributes="class view/tab2"><a href="#tab-2" i18n:translate="">Certificate Courses</a></li> 7 7 <li tal:attributes="class view/tab3"><a href="#tab-3" i18n:translate="">Local Roles</a></li> 8 8 </ul> … … 24 24 </div> 25 25 <div id="tab-2" tal:attributes="class view/tab2"> 26 <h3 i18n:translate="">Course Referrers</h3> 26 <h3> 27 <span tal:content="context/__name__">Code</span> 28 <span i18n:domain="waeup.kofa" i18n:translate="">Courses</span> 29 </h3> 27 30 <table class="display dataTableManage"> 28 31 <thead> 29 32 <tr> 30 <th> </th><th i18n:translate="">Level</th> 31 <th i18n:translate="">Semester</th><th i18n:translate="">Referrer</th> 32 <th i18n:translate="">Course</th><th i18n:translate="">Title</th> 33 <th> </th> 34 <th i18n:translate="">Level</th> 35 <th i18n:translate="">Semester</th> 36 <th i18n:translate="">Cert. Course</th> 37 <th i18n:translate="">Dep. Course</th> 38 <th i18n:translate="">Title</th> 33 39 <th i18n:translate="">Mandatory</th> 34 40 </tr> … … 37 43 <tr tal:repeat="cc context/values" class="gradeC"> 38 44 <td> 39 <input type="checkbox" 40 name="val_id" 45 <input type="checkbox" name="val_id" 41 46 tal:attributes="value cc/__name__" /> 42 47 </td> -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/certificatepage.pt
r7811 r9169 20 20 <h3> 21 21 <span tal:content="context/__name__">Code</span> 22 <span i18n:domain="waeup.kofa" i18n:translate="">Course Referrers</span>22 <span i18n:domain="waeup.kofa" i18n:translate="">Courses</span> 23 23 </h3> 24 24 <br /> … … 26 26 <thead> 27 27 <tr> 28 <th i18n:translate="">Level</th><th i18n:translate="">Semester</th> 29 <th i18n:translate="">Referrer</th><th i18n:translate="">Course</th> 30 <th i18n:translate="">Title</th><th i18n:translate="">Mandatory</th> 28 <th i18n:translate="">Level</th> 29 <th i18n:translate="">Semester</th> 30 <th i18n:translate="">Cert. Course</th> 31 <th i18n:translate="">Dep. Course</th> 32 <th i18n:translate="">Title</th> 33 <th i18n:translate="">Mandatory</th> 31 34 </tr> 32 35 </thead> -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/datacenterpage.pt
r8366 r9169 11 11 <form action="." tal:attributes="action request/URL" method="post" 12 12 i18n:domain="waeup.kofa" enctype="multipart/form-data"> 13 <table i18n:domain="waeup.kofa" class="display dataTableManage ">13 <table i18n:domain="waeup.kofa" class="display dataTableManageFiles"> 14 14 <thead> 15 15 <tr> … … 21 21 </thead> 22 22 <tbody> 23 <tr tal:repeat="file context/get Files" class="gradeC">23 <tr tal:repeat="file context/getPendingFiles" class="gradeC"> 24 24 <td> 25 25 <input type="checkbox" name="val_id" -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/datacenteruploadpage.pt
r7705 r9169 9 9 </div> 10 10 </form> 11 12 <br /><br /> 13 14 <h2 i18n:translate="">Available Processors (Importers)</h2> 15 16 <table i18n:domain="waeup.kofa"> 17 <thead> 18 <tr> 19 <th i18n:translate="">Processor</th> 20 <th i18n:translate="">Required Schema Fields</th> 21 <th i18n:translate="">Optional Schema Fields</th> 22 <th i18n:translate="">Non-Schema Fields</th> 23 <th i18n:translate="">CSV Skeleton File</th> 24 </tr> 25 </thead> 26 <tr tal:repeat="importer view/getImporters"> 27 <td tal:content="importer/title"></td> 28 <td nowrap> 29 <span tal:repeat="field importer/fields"> 30 <tal:schemafield condition="field/f_type"> 31 <tal:required condition="field/f_required"> 32 <span tal:replace="field/f_name"></span> 33 (<span tal:replace="field/f_type"></span>) 34 <br /> 35 </tal:required> 36 </tal:schemafield> 37 </span> 38 </td> 39 <td nowrap> 40 <span tal:repeat="field importer/fields"> 41 <tal:schemafield condition="field/f_type"> 42 <tal:notrequired condition="not:field/f_required"> 43 <span tal:replace="field/f_name"></span> 44 (<span tal:replace="field/f_type"></span>) 45 <br /> 46 </tal:notrequired> 47 </tal:schemafield> 48 </span> 49 </td> 50 <td> 51 <span tal:repeat="field importer/fields"> 52 <tal:extrafield condition="not:field/f_type"> 53 <span tal:replace="field/f_name"></span> 54 <br /> 55 </tal:extrafield> 56 </span> 57 </td> 58 59 <td> 60 <a i18n:translate="" 61 tal:attributes="href python: 'skeleton?name=' + importer['name']">Download</a> 62 </td> 63 </tr> 64 </table> -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/loginpage.pt
r8777 r9169 37 37 If you are having trouble logging in, make sure to enable cookies in your web browser. 38 38 </p> 39 <p i18n:translate="login_trouble2" >39 <p i18n:translate="login_trouble2" tal:condition="python:False"> 40 40 You don't have an account because you are a fresh student, or your student record has just been created? 41 Acquire a Password Access Code (PWD) and inititialize your student account 42 <strong><a href ="setpassword"> here</a></strong>. 41 Acquire a Password Activation Code (PWD) and inititialize your student account 42 <strong><a href ="setpassword"> here</a></strong>. 43 </p> 44 <p i18n:translate="login_trouble4"> 45 You don't have an account because you are a fresh student, or your student record has just been created? 46 Inititialize your student account <strong><a href="requestpw"> here</a></strong>. 43 47 </p> 44 48 <p i18n:translate="login_trouble3"> Or simply forgot your student id, application id or password? Then request a new password -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/templates/widgets.pt
r8045 r9169 18 18 <div tal:content="structure widget/error">ERROR</div> 19 19 </tal:error> 20 <tal:hint tal:condition="widget/hint"> 20 <tal:hint 21 tal:condition="python: widget.hint and not getattr(view,'hide_hint',False)"> 21 22 <div class="hint" tal:content="structure widget/hint">HINT</div> 22 23 </tal:hint> -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/tests/test_browser.py
r9166 r9169 90 90 self.app['faculties']['fac1']['dep1'].courses.addCourse( 91 91 self.course) 92 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addC ourseRef(92 self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCertCourse( 93 93 self.course, level=100) 94 94 … … 127 127 self.assertEqual(self.browser.headers['Status'], '200 Ok') 128 128 self.assertEqual(self.browser.url, self.datacenter_path) 129 self.browser.getLink("Upload CSV file").click()129 self.browser.getLink("Upload data").click() 130 130 file = open(SAMPLE_FILE) 131 131 ctrl = self.browser.getControl(name='uploadfile:file') … … 181 181 self.assertEqual(self.browser.headers['Status'], '200 Ok') 182 182 self.assertEqual(self.browser.url, self.datacenter_path) 183 self.browser.getLink("Export CSV file").click()183 self.browser.getLink("Export data").click() 184 184 self.browser.getControl(name="exporter").value = ['faculties'] 185 185 self.browser.getControl("Create CSV file").click() … … 206 206 self.assertEqual(self.browser.headers['Content-Type'], 207 207 'text/csv; charset=UTF-8') 208 self.assertTrue ('WAeUP.KofaFaculties.csv' in 209 self.browser.headers['content-disposition']) 208 210 self.assertEqual(self.browser.contents, 209 'code,title,title_prefix\r\nfac1,Unnamed Faculty,faculty\r\n') 211 'code,title,title_prefix,users_with_local_roles\r\n' 212 'fac1,Unnamed Faculty,faculty,[]\r\n') 210 213 211 214 # after download, the job and the result file are removed … … 229 232 self.assertTrue('Discarded export result' in self.browser.contents) 230 233 return 234 235 def test_skeleton_download(self): 236 self.browser.addHeader('Authorization', 'Basic mgr:mgrpw') 237 self.browser.open(self.datacenter_path) 238 self.browser.getLink("Upload data").click() 239 self.assertTrue( 240 '<a href="skeleton?name=facultyprocessor">Download</a>' 241 in self.browser.contents) 242 self.browser.getLink(url='skeleton?name=facultyprocessor').click() 243 self.assertEqual(self.browser.headers['Status'], '200 Ok') 244 self.assertEqual(self.browser.headers['Content-Type'], 245 'text/csv; charset=UTF-8') 246 self.assertEqual(self.browser.contents, 247 'code,local_roles,title,title_prefix\r\n') 248 return -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/tests/test_permissions.py
r7811 r9169 91 91 cert.code = 'cert1' 92 92 dept.certificates.addCertificate(cert) 93 cert.addC ourseRef(course)93 cert.addCertCourse(course) 94 94 95 95 self.browser = Browser() -
main/waeup.kofa/branches/uli-async-update/src/waeup/kofa/browser/viewlets.py
r8387 r9169 66 66 """A base for action buttons. 67 67 68 An action button provides an icon, some text and links to a 69 target. If you want to set a different text, icon or target name 68 An action button provides an icon, some text, links to a 69 target and optionally an onclick event handler. 70 If you want to set a different text, icon or target name 70 71 for some active button below, just override the approriate 71 72 attribute in the concerned viewlet. … … 82 83 * ``target_url`` 83 84 The URL of the link target. 85 86 * ``onclick`` 87 An onclick Javascript event handler. 84 88 85 89 """ … … 143 147 return self.view.url(self.view.context, self.target) 144 148 149 @property 150 def onclick(self): 151 """Onclick event... 152 """ 153 return 154 145 155 class PlainActionButton(ActionButton): 146 156 """A base for action buttons without image … … 386 396 grok.require('waeup.manageDataCenter') 387 397 text = _('Edit settings') 398 grok.order(1) 388 399 389 400 class ManageFacultiesContainerActionButton(ManageActionButton): … … 456 467 grok.context(ICertificateCourse) 457 468 grok.view(CertificateCoursePage) 458 text = _('Edit course referrer') 459 460 # 461 # Add actions... 462 # 469 text = _('Edit certificate course') 463 470 464 471 class AddUserActionButton(AddActionButton): … … 468 475 text = _('Add user') 469 476 470 # 471 # Actions with a 'browse' icon... 472 # 473 class BrowseActionButton(ActionButton): 474 grok.baseclass() 475 grok.context(IKofaObject) 476 grok.template('actionbutton') 477 grok.viewletmanager(ActionBar) 477 class BrowseDatacenterLogs(ActionButton): 478 grok.context(IDataCenter) 478 479 grok.require('waeup.manageDataCenter') 479 icon = 'actionicon_manage.png' # File must exist in static/480 target = '@@show' # link to this viewname.481 text = _('Show logs') # Text to display on the button482 483 class BrowseDatacenterLogs(BrowseActionButton):484 grok.context(IDataCenter)485 480 grok.view(DatacenterPage) 486 grok.order( 4)481 grok.order(2) 487 482 icon = 'actionicon_info.png' 488 483 target = '@@logs' 489 484 text = _('Show logs') 490 485 491 # 492 # Misc. buttons... 493 # 486 class UploadCSVButton(ActionButton): 487 grok.context(IDataCenter) 488 grok.view(DatacenterPage) 489 grok.require('waeup.manageDataCenter') 490 grok.order(3) 491 icon = 'actionicon_up.png' 492 target = '@@upload' 493 text = _('Upload data') 494 494 495 class BatchOpButton(ActionButton): 495 496 grok.context(IDataCenter) 496 497 grok.view(DatacenterPage) 497 498 grok.require('waeup.importData') 498 grok.order( 6)499 grok.order(4) 499 500 icon = 'actionicon_gear.png' 500 501 target = '@@import1' 501 text = _(' Batch processing')502 503 class UploadCSVButton(ActionButton):502 text = _('Process data') 503 504 class ExportCSVButton(ActionButton): 504 505 grok.context(IDataCenter) 505 506 grok.view(DatacenterPage) 506 507 grok.require('waeup.manageDataCenter') 507 508 grok.order(5) 508 icon = 'actionicon_up.png'509 target = '@@upload'510 text = _('Upload CSV file')511 512 class ExportCSVButton(ActionButton):513 grok.context(IDataCenter)514 grok.view(DatacenterPage)515 grok.require('waeup.manageDataCenter')516 grok.order(7)517 509 icon = 'actionicon_down.png' 518 510 target = '@@export' 519 text = _('Export CSV file') 511 text = _('Export data') 512 513 class BrowseFinishedFiles(ActionButton): 514 grok.context(IDataCenter) 515 grok.require('waeup.manageDataCenter') 516 grok.view(DatacenterPage) 517 grok.order(6) 518 icon = 'actionicon_finished.png' 519 target = '@@processed' 520 text = _('View processed files') 520 521 521 522 #
Note: See TracChangeset for help on using the changeset viewer.