Esempio n. 1
0
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)
        })
Esempio n. 2
0
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')
        })
Esempio n. 3
0
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)
        })
Esempio n. 4
0
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)
        })
Esempio n. 5
0
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, ''
Esempio n. 6
0
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 })
    })