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()}
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}
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()}
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)}
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)}
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)}
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)}
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)}
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)}
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)}
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)}
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()}
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}
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}
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}
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()}
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()}
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}