예제 #1
0
파일: views.py 프로젝트: uyenuong/YACS
def sections(request, id=None, version=None, ext=None):
    queryset = models.SectionPeriod.objects.optional_filter(
        semester__id__in=int_list(request.REQUEST.getlist('semester_id'))
        or None,
        section__course_id__in=int_list(request.REQUEST.getlist('course_id'))
        or None,
        section__id__in=int_list(request.REQUEST.getlist('id')) or None,
        section__crn__in=int_list(request.REQUEST.getlist('crn')) or None,
        section__id=id,
    ).select_related('section', 'period')
    section_periods = encoders.default_encoder.encode(queryset)
    sections = {}
    for section_period in section_periods:
        section = section_period['section']
        section = sections.get(section['id'], section)

        section.setdefault('section_times', []).append(section_period)
        # to prevent infinite recursion
        del section_period['section']

        period = section_period['period']
        del section_period['period']
        section_period.update(period)

        sections[section['id']] = section

    if id is not None:
        return {'context': sections.values()[0]}
    return {'context': sections.values()}
예제 #2
0
파일: views.py 프로젝트: uyenuong/YACS
def section_conflicts(request, id=None, version=None, ext=None):
    conflicts = SectionConflict.objects.by_unless_none(
        id=id,
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        crn__in=int_list(request.REQUEST.getlist('crn')) or None,
    )
    if request.REQUEST.get('as_crns'):
        conflicts = conflicts.values_list('section1__crn', 'section2__crn')
    else:
        conflicts = conflicts.values_list('section1__id', 'section2__id')

    mapping = {}
    for s1, s2 in conflicts:
        mapping.setdefault(s1, set()).add(s2)
        mapping.setdefault(s2, set()).add(s1)
    if id is not None:
        return {
            'context': {
                'id': int(id),
                'conflicts': list(mapping[int(id)])
            }
        }

    collection = []
    ids = set(int_list(request.REQUEST.getlist('id')))
    for section_id, conflicts in mapping.items():
        if len(ids) > 0 and section_id not in ids:
            continue
        collection.append({
            'id': section_id,
            'conflicts': list(conflicts),
        })
    return {'context': collection}
예제 #3
0
파일: views.py 프로젝트: thewanderer41/YACS
def sections(request, id=None, version=None, ext=None):
    queryset = models.SectionPeriod.objects.optional_filter(
        semester__id__in=int_list(request.GET.getlist("semester_id")) or None,
        section__course__id__in=int_list(request.GET.getlist("course_id")) or None,
        section__id__in=int_list(request.GET.getlist("id")) or None,
        section__crn__in=int_list(request.GET.getlist("crn")) or None,
        section__id=id,
    ).select_related("section", "period")
    section_periods = encoders.default_encoder.encode(queryset)
    sections = {}
    for section_period in section_periods:
        section = section_period["section"]
        section = sections.get(section["id"], section)

        section.setdefault("section_times", []).append(section_period)
        # to prevent infinite recursion
        del section_period["section"]

        period = section_period["period"]
        del section_period["period"]
        section_period.update(period)

        sections[section["id"]] = section

    if id is not None:
        return {"context": sections.values()[0]}
    return {"context": sections.values()}
예제 #4
0
파일: views.py 프로젝트: dougm91/YACP
def sections(request, id=None, version=None, ext=None):
    queryset = models.SectionPeriod.objects.optional_filter(
        semester__id__in=int_list(request.REQUEST.getlist('semester_id')) or None,
        section__course_id__in=int_list(request.REQUEST.getlist('course_id')) or None,
        section__id__in=int_list(request.REQUEST.getlist('id')) or None,
        section__crn__in=int_list(request.REQUEST.getlist('crn')) or None,
        section__id=id,
    ).select_related('section', 'period')
    section_periods = encoders.default_encoder.encode(queryset)
    sections = {}
    for section_period in section_periods:
        section = section_period['section']
        section = sections.get(section['id'], section)

        section.setdefault('section_times', []).append(section_period)
        # to prevent infinite recursion
        del section_period['section']

        period = section_period['period']
        del section_period['period']
        section_period.update(period)

        sections[section['id']] = section

    if id is not None:
        return {'context': sections.values()[0]}
    return {'context': sections.values()}
예제 #5
0
파일: views.py 프로젝트: dougm91/YACP
def section_conflicts(request, id=None, version=None, ext=None):
    conflicts = SectionConflict.objects.by_unless_none(
        id=id,
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        crn__in=int_list(request.REQUEST.getlist('crn')) or None,
    )
    if request.REQUEST.get('as_crns'):
        conflicts = conflicts.values_list('section1__crn', 'section2__crn')
    else:
        conflicts = conflicts.values_list('section1__id', 'section2__id')

    mapping = {}
    for s1, s2 in conflicts:
        mapping.setdefault(s1, set()).add(s2)
        mapping.setdefault(s2, set()).add(s1)
    if id is not None:
        return {
            'context': {
                'id': int(id),
                'conflicts': list(mapping[int(id)])
            }
        }

    collection = []
    ids = set(int_list(request.REQUEST.getlist('id')))
    for section_id, conflicts in mapping.items():
        if len(ids) > 0 and section_id not in ids:
            continue
        collection.append({
            'id': section_id,
            'conflicts': list(conflicts),
        })
    return {'context': collection}
예제 #6
0
def semesters(request, id=None, version=None, ext=None):
    queryset = models.Semester.visible_objects.optional_filter(
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        courses__id__in=int_list(request.REQUEST.getlist('course_id')) or None,
        departments__id__in=int_list(request.REQUEST.getlist('department_id')) or None,
        year=request.REQUEST.get('year'), month=request.REQUEST.get('month'),
        id=id,
    ).distinct()
    return {'context': get_if_id_present(queryset, id)}
예제 #7
0
파일: views.py 프로젝트: dougm91/YACP
def departments(request, id=None, version=None, ext=None):
    queryset = models.Department.objects.optional_filter(
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        semesters__id__in=int_list(request.REQUEST.getlist('semester_id')) or None,
        courses__id__in=int_list(request.REQUEST.getlist('course_id')) or None,
        code__in=request.REQUEST.getlist('code') or None,
        id=id,
    ).distinct()
    return {'context': get_if_id_present(queryset, id)}
예제 #8
0
def departments(request, id=None, version=None, ext=None):
    queryset = models.Department.objects.optional_filter(
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        semesters__id__in=int_list(request.REQUEST.getlist('semester_id')) or None,
        courses__id__in=int_list(request.REQUEST.getlist('course_id')) or None,
        code__in=request.REQUEST.getlist('code') or None,
        id=id,
    ).distinct()
    return {'context': get_if_id_present(queryset, id)}
예제 #9
0
파일: views.py 프로젝트: dougm91/YACP
def semesters(request, id=None, version=None, ext=None):
    queryset = models.Semester.visible_objects.optional_filter(
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        courses__id__in=int_list(request.REQUEST.getlist('course_id')) or None,
        departments__id__in=int_list(request.REQUEST.getlist('department_id')) or None,
        year=request.REQUEST.get('year'), month=request.REQUEST.get('month'),
        id=id,
    ).distinct()
    return {'context': get_if_id_present(queryset, id)}
예제 #10
0
파일: views.py 프로젝트: thewanderer41/YACS
def departments(request, id=None, version=None, ext=None):
    queryset = models.Department.objects.optional_filter(
        id__in=int_list(request.GET.getlist("id")) or None,
        semesters__id__in=int_list(request.GET.getlist("semester_id")) or None,
        courses__id__in=int_list(request.GET.getlist("course_id")) or None,
        code__in=request.GET.getlist("code") or None,
        id=id,
    ).distinct()
    return {"context": get_if_id_present(queryset, id)}
예제 #11
0
파일: views.py 프로젝트: thewanderer41/YACS
def semesters(request, id=None, version=None, ext=None):
    queryset = models.Semester.objects.optional_filter(
        id__in=int_list(request.GET.getlist("id")) or None,
        courses__id__in=int_list(request.GET.getlist("course_id")) or None,
        departments__id__in=int_list(request.GET.getlist("department_id")) or None,
        year=request.GET.get("year"),
        month=request.GET.get("month"),
        id=id,
    ).distinct()
    return {"context": get_if_id_present(queryset, id)}
예제 #12
0
파일: views.py 프로젝트: jinz/YACS
def courses(request, id=None, version=None, ext=None):
    queryset = models.Course.objects.optional_filter(
        semesters__id__in=int_list(request.GET.getlist('semester_id')) or None,
        department__code__in=request.GET.getlist('department_code') or None,
        department__id__in=int_list(request.GET.getlist('department_id')) or None,
        number__in=int_list(request.GET.getlist('number')) or None,
        id__in=int_list(request.GET.getlist('id')) or None,
        id=id,
    ).distinct()
    search_query = request.GET.get('search')
    queryset = queryset.search(search_query)
    return {'context': get_if_id_present(queryset, id)}
예제 #13
0
def courses(request, id=None, version=None, ext=None):
    queryset = models.Course.objects.optional_filter(
        semesters__id__in=int_list(request.REQUEST.getlist('semester_id')) or None,
        department__code__in=request.REQUEST.getlist('department_code') or None,
        department__id__in=int_list(request.REQUEST.getlist('department_id')) or None,
        number__in=int_list(request.REQUEST.getlist('number')) or None,
        id__in=int_list(request.REQUEST.getlist('id')) or None,
        is_comm_intense=try_int(request.REQUEST.get('is_comm_intense'), default=None),
        id=id,
    ).distinct()
    search_query = request.REQUEST.get('search')
    queryset = queryset.search(search_query)
    return {'context': get_if_id_present(queryset, id)}
예제 #14
0
파일: views.py 프로젝트: thewanderer41/YACS
def courses(request, id=None, version=None, ext=None):
    queryset = models.Course.objects.optional_filter(
        semesters__id__in=int_list(request.GET.getlist("semester_id")) or None,
        department__code__in=request.GET.getlist("department_code") or None,
        department__id__in=int_list(request.GET.getlist("department_id")) or None,
        number__in=int_list(request.GET.getlist("number")) or None,
        id__in=int_list(request.GET.getlist("id")) or None,
        is_comm_intense=try_int(request.GET.get("is_comm_intense"), default=None),
        id=id,
    ).distinct()
    search_query = request.GET.get("search")
    queryset = queryset.search(search_query)
    return {"context": get_if_id_present(queryset, id)}
예제 #15
0
파일: views.py 프로젝트: jeffh/YACS
def courses(request, id=None, version=None, ext=None):
    params = RequestParams(request)
    queryset = models.Course.objects.optional_filter(
        semesters__id__in=int_list(params.getlist('semester_id')) or None,
        department__code__in=params.getlist('department_code') or None,
        department__id__in=int_list(params.getlist('department_id')) or None,
        number__in=int_list(params.getlist('number')) or None,
        id__in=int_list(params.getlist('id')) or None,
        is_comm_intense=try_int(params.get('is_comm_intense'), default=None),
        id=id,
    ).distinct()
    search_query = params.get('search')
    queryset = queryset.search(search_query)
    return {'context': get_if_id_present(queryset, id)}
예제 #16
0
파일: views.py 프로젝트: alexkau/YACP
def selections(request, id=None, version=None, ext=None):
    #print request.POST
    if request.method == 'GET' and request.user \
                                and request.user.is_authenticated() \
                                and request.user.planuser.selections:
        selection = request.user.planuser.selections
        return {'context': selection.toJSON()}
    elif request.method == 'GET' and id:
        selection = SavedSelection.objects.get(id=id)
        return {'context': selection.toJSON()}

    if request.method != 'POST':
        raise decorators.AlternativeResponse(
            HttpResponseBadRequest('{}')
        )

    section_ids = int_list(request.POST.get('section_ids', '').split(','))
    blocked_times = request.POST.get('blocked_times', '').split(',')
    serialized = request.POST.get('serialized', '')

    internal_section_ids = serialize_numbers(section_ids)
    internal_blocked_times = request.POST.get('blocked_times')

    selection, created = SavedSelection.objects.get_or_create(
        internal_section_ids=internal_section_ids,
        internal_blocked_times=internal_blocked_times,
        internal_serialized=serialized,
    )

    if request.user and request.user.is_authenticated():
        request.user.planuser.selections = selection
        request.user.planuser.save()
    return {'context': selection.toJSON()}
예제 #17
0
파일: views.py 프로젝트: uyenuong/YACS
def schedules(request, id=None, version=None):
    selection = None
    if id:
        selection = Selection.objects.get(id=id)
        section_ids = selection.section_ids
    else:
        section_ids = int_list(request.REQUEST.getlist('section_id'))

    created = False
    if not selection:
        selection, created = Selection.objects.get_or_create(
            section_ids=section_ids)

    sections = SectionProxy.objects.filter(id__in=section_ids) \
        .select_related('course').prefetch_periods()
    selected_courses = dict_by_attr(sections, 'course')
    conflict_cache = ConflictCache(
        SectionConflict.objects.as_dictionary([s.id for s in sections]))

    # if check flag given, return only if we have a schedule or not.
    if request.REQUEST.get('check'):
        return {'context': has_schedule(selected_courses, conflict_cache)}

    # check the cache
    if not created and selection.api_cache:
        return {'context': json.loads(selection.api_cache)}

    schedules = compute_schedules(selected_courses, conflict_cache)

    periods = set(p for s in sections for p in s.get_periods())
    timerange, dow_used = period_stats(periods)

    # note: if you change this, caches will have to be updated somehow
    context = {
        'time_range':
        timerange,
        'schedules':
        schedules,
        'course_ids':
        list(set(c.id for c in selected_courses.keys())),
        'section_ids':
        list(
            set(s.id for sections in selected_courses.values()
                for s in sections)),
        'days_of_the_week':
        list(DAYS),
        'id':
        selection.id,
    }

    selection.api_cache = json.dumps(context)
    selection.save()

    return {'context': context}
예제 #18
0
파일: views.py 프로젝트: jinz/YACS
def schedules(request, slug=None, version=None):
    selection = None
    if slug:
        selection = Selection.objects.get(slug=slug)
        section_ids = selection.section_ids
    else:
        section_ids = int_list(request.GET.getlist('section_id'))

    created = False
    if not selection:
        selection, created = Selection.objects.get_or_create(
            section_ids=section_ids)

    sections = SectionProxy.objects.filter(id__in=section_ids) \
        .select_related('course').prefetch_periods()
    selected_courses = dict_by_attr(sections, 'course')
    conflict_cache = ConflictCache(
        SectionConflict.objects.as_dictionary([s.id for s in sections]))

    # if check flag given, return only if we have a schedule or not.
    if request.GET.get('check'):
        return {'context': has_schedule(selected_courses, conflict_cache)}

    # check the cache
    if not created and selection.api_cache:
        print selection.api_cache
        return {'context': json.loads(selection.api_cache)}

    schedules = compute_schedules(selected_courses, conflict_cache)
    print schedules

    periods = set(p for s in sections for p in s.get_periods())
    timerange, dow_used = period_stats(periods)

    # note: if you change this, caches will have to be updated somehow
    context = {
        'time_range': timerange,
        'schedules': schedules,
        'course_ids': list(set(
            c.id for c in selected_courses.keys())),
        'section_ids': list(set(
            s.id
                for sections in selected_courses.values()
                for s in sections
        )),
        'days_of_the_week': list(DAYS),
        'id': selection.slug
    }

    selection.api_cache = json.dumps(context)
    selection.save()

    return {'context': context}
예제 #19
0
파일: views.py 프로젝트: thewanderer41/YACS
def section_conflicts(request, id=None, version=None, ext=None):
    conflicts = SectionConflict.objects.by_unless_none(
        id=id, id__in=int_list(request.GET.getlist("id")) or None, crn__in=int_list(request.GET.getlist("crn")) or None
    )
    if request.GET.get("as_crns"):
        conflicts = conflicts.values_list("section1__crn", "section2__crn")
    else:
        conflicts = conflicts.values_list("section1__id", "section2__id")

    mapping = {}
    for s1, s2 in conflicts:
        mapping.setdefault(s1, set()).add(s2)
        mapping.setdefault(s2, set()).add(s1)
    if id is not None:
        return {"context": {"id": int(id), "conflicts": list(mapping[int(id)])}}

    collection = []
    ids = set(int_list(request.GET.getlist("id")))
    for section_id, conflicts in mapping.items():
        if len(ids) > 0 and section_id not in ids:
            continue
        collection.append({"id": section_id, "conflicts": list(conflicts)})
    return {"context": collection}
예제 #20
0
파일: views.py 프로젝트: uyenuong/YACS
def selections(request, id=None, version=None, ext=None):
    if id:
        selection = SavedSelection.objects.get(id=id)
        return {'context': selection.toJSON()}

    if request.method != 'POST':
        raise decorators.AlternativeResponse(HttpResponseBadRequest('{}'))

    section_ids = int_list(request.POST.get('section_ids', '').split(','))
    blocked_times = request.POST.get('blocked_times', '').split(',')

    selection, created = SavedSelection.objects.get_or_create_by_data(
        section_ids=section_ids,
        blocked_times=blocked_times,
    )
    return {'context': selection.toJSON()}
예제 #21
0
파일: views.py 프로젝트: dougm91/YACP
def selections(request, id=None, version=None, ext=None):
    if request.method == 'GET' and id:
        selection = SavedSelection.objects.get(id=id)
        return {'context': selection.toJSON()}

    if request.method != 'POST':
        raise decorators.AlternativeResponse(
            HttpResponseBadRequest('{}')
        )

    section_ids = int_list(request.POST.get('section_ids', '').split(','))
    blocked_times = request.POST.get('blocked_times', '').split(',')

    selection, created = SavedSelection.objects.get_or_create_by_data(
        section_ids=section_ids,
        blocked_times=blocked_times,
    )
    return {'context': selection.toJSON()}
예제 #22
0
파일: views.py 프로젝트: thewanderer41/YACS
def schedules(request, id=None, version=None):
    selection = None
    if id:
        selection = Selection.objects.get(id=id)
        section_ids = selection.section_ids
    else:
        section_ids = int_list(request.GET.getlist("section_id"))

    created = False
    if not selection:
        selection, created = Selection.objects.get_or_create(section_ids=section_ids)

    sections = SectionProxy.objects.filter(id__in=section_ids).select_related("course").prefetch_periods()
    selected_courses = dict_by_attr(sections, "course")
    conflict_cache = ConflictCache(SectionConflict.objects.as_dictionary([s.id for s in sections]))

    # if check flag given, return only if we have a schedule or not.
    if request.GET.get("check"):
        return {"context": has_schedule(selected_courses, conflict_cache)}

    # check the cache
    if not created and selection.api_cache:
        return {"context": json.loads(selection.api_cache)}

    schedules = compute_schedules(selected_courses, conflict_cache)

    periods = set(p for s in sections for p in s.get_periods())
    timerange, dow_used = period_stats(periods)

    # note: if you change this, caches will have to be updated somehow
    context = {
        "time_range": timerange,
        "schedules": schedules,
        "course_ids": list(set(c.id for c in selected_courses.keys())),
        "section_ids": list(set(s.id for sections in selected_courses.values() for s in sections)),
        "days_of_the_week": list(DAYS),
        "id": selection.id,
    }

    selection.api_cache = json.dumps(context)
    selection.save()

    return {"context": context}