Changeset 15416
- Timestamp:
- 21 May 2019, 08:02:51 (6 years ago)
- Location:
- main/waeup.kofa/trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/CHANGES.txt
r15333 r15416 5 5 ======================= 6 6 7 * Backup deleted graduated student data somewhere else to ease graduated 8 student data migration. 9 7 10 * Add `transcript_remark` field to study levels. Add page to allow 8 11 transcript officers editing the field during transcript processing. 9 12 10 13 * Increase password strength. Officers are now required 11 to set a password which has at least 8 characters ,contains14 to set a password which has at least 8 characters and which contains 12 15 at least one uppercase letter, one lowercase letter and one 13 digit. 16 digit. Stored insecure passwords are no longer accepted. 17 Officers with an insecure password can't login and are 18 redirected to the `ChangePasswordRequestPage` to request a 19 new password. 14 20 15 21 * Add `AccommodationPaymentsExporter` which can be used by -
main/waeup.kofa/trunk/docs/source/userdocs/students/browser.rst
r14684 r15416 310 310 pressing the 'Update scores from table' button below. Scores can be 311 311 cleared by removing the respective values. Lecturers have to be 312 online during this process. (2) Alternatively, lecturers can download312 online during this process. (2) Alternatively, lecturers can download 313 313 a csv file, edit scores in this csv file offline and upload the same 314 314 file when they are online again. This procedure is explained in -
main/waeup.kofa/trunk/src/waeup/kofa/datacenter.py
r14680 r15416 58 58 """Create standard subdirs. 59 59 """ 60 for name in ['finished', ' unfinished', 'logs', 'deleted']:60 for name in ['finished', 'graduated', 'unfinished', 'logs', 'deleted']: 61 61 path = os.path.join(self.storage, name) 62 62 if os.path.exists(path): … … 67 67 @property 68 68 def deleted_path(self): 69 """Get the path for deleted object data.69 """Get the path for deleted student data. 70 70 """ 71 71 return os.path.join(self.storage, 'deleted') 72 73 @property 74 def graduated_path(self): 75 """Get the path for deleted graduated student data. 76 """ 77 return os.path.join(self.storage, 'graduated') 72 78 73 79 def getPendingFiles(self, sort='name'): -
main/waeup.kofa/trunk/src/waeup/kofa/doctests/batchprocessing_browser.txt
r13872 r15416 644 644 645 645 >>> sorted(os.listdir(dc_path)) 646 ['deleted', 'finished', ' logs', 'unfinished', 'users_zope.mgr.create.pending.csv']646 ['deleted', 'finished', 'graduated', 'logs', 'unfinished', 'users_zope.mgr.create.pending.csv'] 647 647 648 648 >>> os.listdir(dc_path + '/unfinished') -
main/waeup.kofa/trunk/src/waeup/kofa/doctests/datacenter.txt
r12948 r15416 23 23 '/tmp/tmp...' 24 24 25 Beside other things it provides a locationto put data of deleted25 Beside other things it provides two locations to put data of deleted 26 26 items into: 27 27 … … 29 29 >>> del_path = mydatacenter.deleted_path 30 30 >>> os.path.isdir(del_path) 31 True 32 >>> grad_path = mydatacenter.graduated_path 33 >>> os.path.isdir(grad_path) 31 34 True 32 35 … … 163 166 ... pending_src, mode='create') 164 167 >>> sorted(os.listdir(dc_root)) 165 ['deleted', 'finished', ' logs', 'unfinished']168 ['deleted', 'finished', 'graduated', 'logs', 'unfinished'] 166 169 167 170 >>> sorted(os.listdir(fin_dir)) … … 188 191 ... pending_src, mode='create') 189 192 >>> sorted(os.listdir(dc_root)) 190 ['deleted', 'finished', ' logs', 'mysource.create.pending.csv', 'unfinished']193 ['deleted', 'finished', 'graduated', 'logs', 'mysource.create.pending.csv', 'unfinished'] 191 194 192 195 >>> sorted(os.listdir(fin_dir)) … … 209 212 210 213 >>> sorted(os.listdir(dc_root)) 211 ['deleted', 'finished', ' logs', 'unfinished']214 ['deleted', 'finished', 'graduated', 'logs', 'unfinished'] 212 215 213 216 >>> sorted(os.listdir(fin_dir)) … … 245 248 246 249 >>> sorted(os.listdir(dc_root)) 247 ['deleted', 'finished', ' logs', 'mysource.create.pending.csv', 'unfinished']250 ['deleted', 'finished', 'graduated', 'logs', 'mysource.create.pending.csv', 'unfinished'] 248 251 249 252 >>> sorted(os.listdir(fin_dir)) … … 261 264 262 265 >>> sorted(os.listdir(dc_root)) 263 ['deleted', 'finished', ' logs', 'unfinished']266 ['deleted', 'finished', 'graduated', 'logs', 'unfinished'] 264 267 265 268 >>> sorted(os.listdir(fin_dir)) -
main/waeup.kofa/trunk/src/waeup/kofa/doctests/pages.txt
r15286 r15416 1220 1220 1221 1221 >>> sorted(os.listdir(uploadpath)) 1222 ['deleted', 'finished', ' logs', 'unfinished']1222 ['deleted', 'finished', 'graduated', 'logs', 'unfinished'] 1223 1223 1224 1224 … … 1261 1261 1262 1262 >>> sorted(os.listdir(uploadpath)) 1263 ['deleted', 'finished', ' logs', 'myfaculties_zope.mgr.csv', 'unfinished']1263 ['deleted', 'finished', 'graduated', 'logs', 'myfaculties_zope.mgr.csv', 'unfinished'] 1264 1264 1265 1265 We create and upload also a CSV file containing departments: -
main/waeup.kofa/trunk/src/waeup/kofa/interfaces.py
r15287 r15416 929 929 930 930 deleted_path = schema.Bytes( 931 title = u'Path were data about deleted objects should be stored.' 931 title = u'Path for deleted student data.' 932 ) 933 934 graduated_path = schema.Bytes( 935 title = u'Path for deleted graduated student data.' 932 936 ) 933 937 -
main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
r15203 r15416 652 652 `ticket_session` is an additional attribute which can be used to store the 653 653 session of the course when it was taken. Usually this information is 654 redundant because the the parent study level object already contains this654 redundant because the the parent study level object already contains this 655 655 information except for the study level zero container which can be used to 656 656 store 'orphaned' course tickets. -
main/waeup.kofa/trunk/src/waeup/kofa/students/student.py
r15163 r15416 486 486 del_dir = site['datacenter'].deleted_path 487 487 488 if student.state == GRADUATED: 489 del_dir = site['datacenter'].graduated_path 490 488 491 # save files of the student 489 492 move_student_files(student, del_dir) -
main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_student.py
r13314 r15416 30 30 from zope.interface import verify 31 31 from zope.schema.interfaces import RequiredMissing 32 from hurry.workflow.interfaces import IWorkflowState 32 33 from waeup.kofa.interfaces import IExtFileStore, IFileStoreNameChooser 33 34 from waeup.kofa.students.student import ( … … 180 181 del_dir, 'media', 'students', '00110', 'A111111', 181 182 'passport_A111111.jpg') 182 183 183 # The image was copied over 184 184 self.assertTrue(os.path.isfile(del_img_path)) … … 186 186 open(del_img_path, 'rb').read(), 187 187 self.image_contents) 188 189 188 # The student data were put into CSV files 190 189 STUDENT_BACKUP_EXPORTER_NAMES = getUtility( 191 190 IStudentsUtils).STUDENT_BACKUP_EXPORTER_NAMES 192 191 for name in STUDENT_BACKUP_EXPORTER_NAMES: 192 csv_path = os.path.join(del_dir, '%s.csv' % name) 193 self.assertTrue(os.path.isfile(csv_path)) 194 contents = open(csv_path, 'rb').read().split('\r\n') 195 # We expect 3 lines output including a linebreak at end of file. 196 self.assertEqual(len(contents), 3) 197 return 198 199 def test_backup_single_graduated_data(self): 200 # when a single graduated student is removed, the data is backed up 201 # somewhere else 202 self.setup_student(self.student) 203 IWorkflowState(self.student).setState('graduated') 204 # Add a fake image 205 self.create_passport_img(self.student) 206 handle_student_removed(self.student, None) 207 del_dir = self.app['datacenter'].graduated_path 208 del_img_path = os.path.join( 209 del_dir, 'media', 'students', '00110', 'A111111', 210 'passport_A111111.jpg') 211 # The image was copied over 212 self.assertTrue(os.path.isfile(del_img_path)) 213 self.assertEqual( 214 open(del_img_path, 'rb').read(), 215 self.image_contents) 216 # The student data were put into CSV files 217 STUDENT_BACKUP_EXPORTER_NAMES = getUtility( 218 IStudentsUtils).STUDENT_BACKUP_EXPORTER_NAMES 193 219 for name in STUDENT_BACKUP_EXPORTER_NAMES: 194 220 csv_path = os.path.join(del_dir, '%s.csv' % name)
Note: See TracChangeset for help on using the changeset viewer.