def write_note(request, app_slug): ''' Write a note to administraotors ''' request = userApi.has_user_access(request, Role.INSTRUCTOR) app = adminApi.get_application(app_slug, 'slug') if request.method == 'POST': form = ApplicationNoteForm(request.POST, instance=app) if form.is_valid(): appl = form.save(commit=False) appl.updated_at = datetime.now() appl.save() if appl: messages.success( request, 'Success! {0} {1} - {2} {3} {4}: Note for {5}(CWL: {6}) updated.' .format(appl.job.session.year, appl.job.session.term.code, appl.job.course.code.name, appl.job.course.number.name, appl.job.course.section.name, appl.applicant.get_full_name(), appl.applicant.username)) return HttpResponseRedirect(request.POST.get('next_second')) else: messages.error(request, 'An error occurred while writing a note.') else: errors = form.errors.get_json_data() messages.error( request, 'An error occurred. Form is invalid. {0}'.format( userApi.get_error_messages(errors))) return HttpResponseRedirect( reverse('instructors:write_note', args=[app_slug])) else: #adminApi.can_req_parameters_access(request, 'instructor-note', []) pass return render( request, 'instructors/jobs/write_note.html', { 'loggedin_user': request.user, 'app': adminApi.add_app_info_into_application(app, ['selected']), 'form': ApplicationNoteForm(data=None, instance=app), 'app_status': APP_STATUS, 'next_second': request.session.get('next_second', None) })
def edit_job(request, session_slug, job_slug): ''' Update job details of instructors ''' request = userApi.has_user_access(request, Role.INSTRUCTOR) job = adminApi.get_job_by_session_slug_job_slug(session_slug, job_slug) if request.method == 'POST': form = InstructorJobForm(request.POST, instance=job) if form.is_valid(): job = form.save(commit=False) job.updated_at = datetime.now() job.save() if job: messages.success( request, 'Success! {0} {1} - {2} {3} {4}: job details updated'. format(job.session.year, job.session.term.code, job.course.code.name, job.course.number.name, job.course.section.name)) return HttpResponseRedirect(request.POST.get('next_first')) else: messages.error( request, 'An error occurred while updating job details.') else: errors = form.errors.get_json_data() messages.error( request, 'An error occurred. Form is invalid. {0}'.format( userApi.get_error_messages(errors))) return HttpResponseRedirect(request.get_full_path()) return render( request, 'instructors/jobs/edit_job.html', { 'loggedin_user': request.user, 'job': job, 'form': InstructorJobForm(data=None, instance=job), 'jobs': adminApi.get_recent_ten_job_details(job.course, job.session.year), 'next_first': request.session.get('next_first') })
def edit_user(request): ''' Index page of an instructor's portal ''' request = userApi.has_user_access(request, Role.INSTRUCTOR) confidentiality = userApi.has_user_confidentiality_created(request.user) # Create a confiential information if it's None if confidentiality == None: confidentiality = userApi.create_confidentiality(request.user) if request.method == 'POST': validation = userApi.validate_post( request.POST, ['first_name', 'last_name', 'email']) if len(validation) > 0: messages.error( request, 'An error occurred while updating an User Edit Form. {0}: This field is required.' .format(', '.join(validation))) return redirect('instructors:edit_user') user_form = UserInstructorForm(request.POST, instance=request.user) employee_number_form = EmployeeNumberEditForm(request.POST, instance=confidentiality) if user_form.is_valid() and employee_number_form.is_valid(): updated_user = user_form.save() updated_employee_number = employee_number_form.save(commit=False) updated_employee_number.updated_at = datetime.now() updated_employee_number.employee_number = employee_number_form.cleaned_data[ 'employee_number'] updated_employee_number.save( update_fields=['employee_number', 'updated_at']) errors = [] if not updated_user: errors.append('USER') if not updated_employee_number: errors.append('EMPLOYEE NUMBER') if len(errors) > 0: messages.error( request, 'An error occurred while updating an User Edit Form. {0}'. format(' '.join(errors))) return redirect('instructors:edit_user') messages.success( request, 'Success! User information of {0} (CWL: {1}) updated'.format( request.user.get_full_name(), request.user.username)) return redirect('instructors:index') else: errors = [] user_errors = user_form.errors.get_json_data() confid_errors = employee_number_form.errors.get_json_data() if user_errors: errors.append(userApi.get_error_messages(user_errors)) if confid_errors: errors.append(userApi.get_error_messages(confid_errors)) messages.error( request, 'An error occurred while updating an User Form. {0}'.format( ' '.join(errors))) return redirect('instructors:edit_user') return render( request, 'instructors/users/edit_user.html', { 'loggedin_user': userApi.add_avatar(request.user), 'user_form': UserInstructorForm(data=None, instance=request.user), 'employee_number_form': EmployeeNumberEditForm(data=None, instance=confidentiality) })
def show_applications(request, session_slug, job_slug): ''' Display applications applied by students ''' request = userApi.has_user_access(request, Role.INSTRUCTOR) request.session['next_second'] = adminApi.build_new_next(request) job = adminApi.get_job_by_session_slug_job_slug(session_slug, job_slug) apps = Application.objects.filter( Q(job__session__slug=session_slug) & Q(job__course__slug=job_slug)) if request.method == 'POST': instructor_preference = request.POST.get('instructor_preference') assigned_hours = request.POST.get('assigned_hours') if adminApi.is_valid_float(assigned_hours) == False: messages.error( request, 'An error occurred. Please check assigned hours. Assign TA Hours must be numerival value only.' ) return HttpResponseRedirect(request.get_full_path()) if adminApi.is_valid_integer(assigned_hours) == False: messages.error( request, 'An error occurred. Please check assigned hours. Assign TA Hours must be non-negative integers.' ) return HttpResponseRedirect(request.get_full_path()) assigned_hours = int(float(assigned_hours)) if assigned_hours < 0: messages.error( request, 'An error occurred. Please check assigned hours. Assign TA Hours must be greater than 0.' ) return HttpResponseRedirect(request.get_full_path()) if instructor_preference == Application.NONE: messages.error( request, 'An error occurred. Please select your preference, then try again.' ) return HttpResponseRedirect(request.get_full_path()) if instructor_preference == Application.NO_PREFERENCE and assigned_hours > 0: messages.error( request, 'An error occurred. Please leave 0 for Assign TA Hours if you would like to select No Preference, then try again.' ) return HttpResponseRedirect(request.get_full_path()) if assigned_hours > int(job.assigned_ta_hours): messages.error( request, 'An error occurred. You cannot assign {0} hours because Total Assigned TA Hours is {1}. then try again.' .format(assigned_hours, int(job.assigned_ta_hours))) return HttpResponseRedirect(request.get_full_path()) if assigned_hours == 0 and instructor_preference != Application.NO_PREFERENCE: messages.error( request, 'An error occurred. Please assign TA hours, then try again.') return HttpResponseRedirect(request.get_full_path()) instructor_app_form = InstructorApplicationForm(request.POST) if instructor_app_form.is_valid(): app_status_form = ApplicationStatusForm(request.POST) if app_status_form.is_valid(): app_id = request.POST.get('application') updated_app = adminApi.update_application_instructor_preference( app_id, instructor_preference) if updated_app: if app_status_form.save(): messages.success( request, 'Success! {0} (CWL: {1}) is selected.'.format( updated_app.applicant.get_full_name(), updated_app.applicant.username)) else: messages.error( request, 'An error occurred while updating an application status.' ) else: messages.error( request, 'An error occurred while updating an instructor_preference.' ) else: errors = app_status_form.errors.get_json_data() messages.error( request, 'An error occurred. Form is invalid. {0}'.format( userApi.get_error_messages(errors))) else: errors = instructor_app_form.errors.get_json_data() messages.error( request, 'An error occurred. Form is invalid. {0}'.format( userApi.get_error_messages(errors))) return HttpResponseRedirect(request.get_full_path()) else: for app in apps: app.selected = None selected = app.applicationstatus_set.filter( assigned=ApplicationStatus.SELECTED) if selected.exists(): app.selected = selected.last() app.applicant = adminApi.get_applicant_status( app.job.session.year, app.job.session.term.code, app.applicant) return render( request, 'instructors/jobs/show_applications.html', { 'loggedin_user': request.user, 'job': job, 'apps': apps, 'full_job_name': job.course.code.name + '_' + job.course.number.name + '_' + job.course.section.name, 'instructor_preference_choices': Application.INSTRUCTOR_PREFERENCE_CHOICES, 'app_status': APP_STATUS, 'next_first': request.session.get('next_first', None) })
def bulk_update_admin_docs(data, user): ''' bulk update admin docs ''' csv_reader = csv.reader(data, quotechar='"', delimiter=',') apps = get_applications() apps = apps.filter( Q(applicationstatus__assigned=ApplicationStatus.ACCEPTED) & Q(is_terminated=False)).order_by('-id').distinct() accepted_ids = [app.id for app in apps] rows = [] c = 0 for row in csv_reader: # Check a number of rows if len(row) != 16: return False, 'An error occurred while reading table rows. Some columns are missing.' # header if c == 0: rows.append(row) else: if len(row[0]) == 0: for col in row: if len(col) > 0: msg = str(c) + 'th' if c == 1: msg = '1st' elif c == 2: msg = '2nd' elif c == 3: msg = '3rd' return False, 'An error occurred while reading table rows. Something went wrong in the {0} row. (e.g., ID is empty)'.format( msg) else: # check id if it's not in accepted apps id = int(row[0]) if id not in accepted_ids: return False, 'An error occurred while reading table rows. No application ID: {0} found in Accepted Applications.'.format( id) # check if it has an application try: Application.objects.get(id=id) except Application.DoesNotExist: return False, 'An error occurred while reading table rows. No application ID: {0} found.'.format( id) rows.append(row) c += 1 if len(rows) == 0: return False, 'An error occurred while iterating table rows. Please check your data. Note that 1st row is a header.' elif len(rows) == 1: return False, 'An error occurred while iterating table rows. Please check your header or data fields. Note that 1st row is a header.' docs = [] updates = set() for i in range(1, len(rows)): row = rows[i] id = trim(row[0]) pin = trim(row[10]) tasm = True if trim(row[11].lower()) == 'yes' else False processed = trim(row[12]) worktag = trim(row[13]) processing_note = trim(row[14]) admin_docs = get_admin_docs(id) form = AdminDocumentsForm( { 'application': id, 'pin': pin, 'tasm': tasm, 'processed': processed, 'worktag': worktag, 'processing_note': processing_note }, instance=admin_docs) if form.is_valid() == False: errors = form.errors.get_json_data() return False, 'ID: ' + id + ' - ' + userApi.get_error_messages( errors) can_save = False obj = AdminDocuments.objects.filter(application_id=id) if obj.exists(): admin_docs = obj.first() fields = [] if trim(admin_docs.pin) != pin: admin_docs.pin = pin updates.add('pin') fields.append('PIN') if admin_docs.tasm != tasm: admin_docs.tasm = tasm updates.add('tasm') fields.append('TASM') if trim(admin_docs.processed) != processed: admin_docs.processed = processed updates.add('processed') fields.append('Processed') if trim(admin_docs.worktag) != worktag: admin_docs.worktag = worktag updates.add('worktag') fields.append('Worktag') if trim(admin_docs.processing_note) != processing_note: admin_docs.processing_note = processing_note updates.add('processing_note') fields.append('Processing Note') if len(fields) > 0: docs.append({ 'id': id, 'fields': fields, 'username': admin_docs.application.applicant.username }) can_save = True else: fields = [] if bool(pin): updates.add('pin') fields.append('PIN') if tasm == True: updates.add('tasm') fields.append('TASM') if bool(processed): updates.add('processed') fields.append('Processed') if bool(worktag): updates.add('worktag') fields.append('Worktag') if bool(processing_note): updates.add('processing_note') fields.append('Processing Note') app = get_application(id) if len(fields) > 0: docs.append({ 'id': id, 'fields': fields, 'username': app.applicant.username }) can_save = True # Update if can_save: saved_admin_docs = form.save() if saved_admin_docs: saved_admin_docs_user = add_admin_docs_user( saved_admin_docs, user) if saved_admin_docs_user == False: return False, 'An error occurred while saving admin docs user.' else: return False, 'An error occurred while saving admin docs.' if len(docs) > 0: msg = '<ul>' for doc in docs: msg += '<li><strong>ID: ' + doc['id'] + ' (CWL: ' + doc[ 'username'] + ')</strong> - ' + ','.join( doc['fields']) + '</li>' msg += '</ul>' return True, msg return True, ''
def upload_avatar(request): ''' Upload an Avatar ''' next = urlparse(request.GET.get('next')) role = resolve(next.path).app_name request = userApi.has_users_view_access(request, role) if request.method == 'POST': if len(request.FILES) == 0: messages.error(request, 'An error occurred. Please select your profile photo, then try again.') return HttpResponseRedirect(request.get_full_path()) form = AvatarForm(request.POST, request.FILES) if form.is_valid(): avatar = form.save(commit=False) avatar.uploaded = request.FILES.get('uploaded') avatar.save() if avatar: messages.success(request, 'Success! Profile Photo uploaded.') else: messages.error(request, 'An error occurred while uploading an avatar.') else: errors = form.errors.get_json_data() messages.error(request, 'An error occurred. Form is invalid. {0}'.format( userApi.get_error_messages(errors) )) return HttpResponseRedirect(request.get_full_path()) return render(request, 'users/upload_avatar.html', { 'loggedin_user': userApi.add_avatar(request.user), 'role': role, 'form': AvatarForm(initial={ 'user': request.user }) })