Esempio n. 1
0
def count_challenges(requested_user: User,
                     candidate_semester: Semester) -> dict:
    challenges = OffChallenge.objects.filter(requester__exact=requested_user)
    r = (candidate_semester and RequirementHangout.objects.filter(
        eventType=EVENT_NAMES.CHALLENGE,
        candidateSemesterActive=candidate_semester,
        enable=True,
    ).first())

    start_time, end_time = get_semester_bounds(timezone.now())
    if r is not None:
        challenges = challenges.filter(
            request_date__gt=r.hangoutsDateStart or start_time,
            request_date__lt=r.hangoutsDateEnd or end_time,
        )

    confirmed = challenges.filter(
        Q(officer_confirmed=True) & Q(csec_confirmed=True)).count()
    rejected = challenges.filter(
        Q(officer_confirmed=False) | Q(csec_confirmed=False)).count()
    pending = challenges.count() - confirmed - rejected

    return {
        ATTR.NUM_PENDING: pending,
        ATTR.NUM_REJECTED: rejected,
        ATTR.NUM_CONFIRMED: confirmed,
    }
Esempio n. 2
0
    def get_context_data(self):
        view_option = self.request.GET.get('option')
        semester_start, semester_end = get_semester_bounds(timezone.now())
        all_events = Event.objects \
                .filter(start_time__gte=semester_start) \
                .filter(start_time__lte=semester_end) \
                .order_by('start_time')
        if view_option == "upcoming":
            all_events = all_events.filter(start_time__gte=timezone.now())
        rsvpd_event_ids = Rsvp.objects \
                .filter(user__exact=self.request.user) \
                .values_list('event', flat=True)
        rsvpd_events = all_events \
                .filter(pk__in=rsvpd_event_ids)
        not_rsvpd_events = all_events \
                .exclude(pk__in=rsvpd_event_ids)

        for event in rsvpd_events:
            event.waitlisted = event.on_waitlist(
                self.request.user)  # Is this bad practice? idk

        event_types = EventType.objects.order_by('type')
        context = {
            'rsvpd_events': rsvpd_events,
            'not_rsvpd_events': not_rsvpd_events,
            'event_types': event_types,
        }
        return context
Esempio n. 3
0
    def get_context_data(self):
        # Get the start and end time for event filtering
        start_time, end_time = get_semester_bounds(timezone.now())
        if self.request.GET.get("option") == "upcoming":
            start_time = timezone.now()

        # Get the current event type
        event_types = EventType.objects.order_by("type").all()
        event_types = sorted(event_types,
                             key=lambda e: not (e.type == ATTR.MANDATORY))

        event_type = self.request.GET.get("event_type", event_types[0].type)
        event_type = EventType.objects.filter(type=event_type).first()

        # Get all events
        all_events = Event.objects.filter(
            start_time__gte=start_time,
            start_time__lte=end_time,
            access_level__gte=get_access_level(self.request.user),
            event_type=event_type,
        ).order_by("start_time")

        rsvpd_data, not_rsvpd_data = [], []
        for event in all_events:
            if event.rsvp_set.filter(user=self.request.user):
                data, url = rsvpd_data, "events:unrsvp"
                waitlisted = event.on_waitlist(self.request.user)
            else:
                data, url = not_rsvpd_data, "events:rsvp"
                waitlisted = False

            data.append({
                "event": event,
                "action": reverse(url, args=[event.id]),
                "location": format_url(event.location),
                "waitlisted": waitlisted,
            })

        data = [
            {
                ATTR.CLASS: "right-half",
                ATTR.TITLE: "RSVP'd / Waitlist",
                ATTR.EVENTS: rsvpd_data,
                ATTR.DISPLAY_VALUE: "un-RSVP",
            },
            {
                ATTR.CLASS: "left-half",
                ATTR.TITLE: "Not RSVP'd",
                ATTR.EVENTS: not_rsvpd_data,
                ATTR.DISPLAY_VALUE: "RSVP",
            },
        ]

        context = {
            "data": data,
            "event_types": event_types,
            "event_type": event_type,
        }
        return context
Esempio n. 4
0
def count_num_bitbytes(
    requested_user: User,
    candidate_semester: Semester,
) -> int:
    r = (candidate_semester and RequirementBitByteActivity.objects.filter(
        candidateSemesterActive=candidate_semester, enable=True).first())

    start_time, end_time = get_semester_bounds(timezone.now())
    return BitByteActivity.objects.filter(
        participants__exact=requested_user,
        confirmed=True,
        request_date__gt=(r and r.bitByteDateStart) or start_time,
        request_date__lt=(r and r.bitByteDateEnd) or end_time,
    ).count()
Esempio n. 5
0
def get_required_events(candidate_semester: Semester,
                        required_events_merger: set) -> dict:
    required_events = {}
    if candidate_semester is None:
        return required_events

    semester_start, semester_end = get_semester_bounds(timezone.now())
    requirement_events = RequriementEvent.objects.filter(
        Q(enable=True) | Q(eventType__type__in=required_events_merger),
        candidateSemesterActive=candidate_semester.id,
    )
    for r in requirement_events:
        required_events[r.eventType.type] = {
            "eventsDateStart": r.eventsDateStart or semester_start,
            "eventsDateEnd": r.eventsDateEnd or semester_end,
            "title": r.title if r.enableTitle else None,
        }

    return required_events
Esempio n. 6
0
def get_events(rsvps, date, required_events, candidateSemester,
               requirement_mandatory, confirmed):
    event_models = rsvps.filter(confirmed=confirmed)
    events = sort_rsvps_into_events(event_models, required_events)

    # We want to show all mandatory events, not just the events the candidate has RSVP'd to
    # Get all mandatory events i.e. events with event type "Mandatory"
    if candidateSemester and requirement_mandatory:
        mandatory_events = requirement_mandatory.events.all()
        if requirement_mandatory.eventsDateStart and requirement_mandatory.eventsDateEnd:
            mandatory_events = itertools.chain(mandatory_events, \
                Event.objects.filter(
                    event_type__type=MANDATORY,
                    start_time__gt=requirement_mandatory.eventsDateStart,
                    end_time__lt=requirement_mandatory.eventsDateEnd,
                )
            )
    else:
        curr_sem_start, curr_sem_end = get_semester_bounds(date)
        mandatory_events = Event.objects.filter(
            event_type__type=MANDATORY,
            start_time__gt=curr_sem_start,
            end_time__lt=curr_sem_end,
        )

    # Initialize events[MANDATORY] if hasn't
    if MANDATORY not in events:
        events[MANDATORY] = []

    # Can assume Mandatory Events where user RSVPed to is SEPARATE from those that they don't RSVP to
    if not confirmed:
        # Only add the non-rsvped Mandatory events to the Not Confirmed list
        mandatorySet = {}
        for mandatory_event in mandatory_events:
            # If no rsvps are found, add this mandatory event to the list of unconfirmed events
            if rsvps.filter(event__id=mandatory_event.id).count() == 0:
                mandatorySet[mandatory_event.id] = mandatory_event
        events[MANDATORY].extend(mandatorySet.values())

    events[MANDATORY].sort(key=lambda x: x.start_time)

    return events
Esempio n. 7
0
def get_unconfirmed_events(rsvps, date):
    unconfirmed_events = sort_rsvps_into_events(rsvps.filter(confirmed=False))
    curr_sem_start, curr_sem_end = get_semester_bounds(date)

    # We want to show all mandatory events, not just the events the candidate has RSVP'd to
    # Get all mandatory events i.e. events with event type "Mandatory"
    mandatory_events = Event.objects.filter(
        event_type__type=map_event_vars[settings.MANDATORY_EVENT],
        start_time__gt=curr_sem_start,
        end_time__lt=curr_sem_end,
    )

    # Initialize unconfirmed_events[settings.MANDATORY_EVENT]
    if settings.MANDATORY_EVENT not in unconfirmed_events:
        unconfirmed_events[settings.MANDATORY_EVENT] = []

    for mandatory_event in mandatory_events:
        # If no rsvps are found, add this mandatory event to the list of unconfirmed events
        if rsvps.filter(event__id=mandatory_event.id).count() == 0:
            unconfirmed_events[settings.MANDATORY_EVENT].append(mandatory_event)

    return unconfirmed_events
Esempio n. 8
0
def get_required_hangouts(candidate_semester: Semester) -> dict:
    required_hangout_events = {}
    if EventType.objects.filter(type="Hangout").count() == 0:
        return required_hangout_events

    time_start, time_end = get_semester_bounds(timezone.now())
    if candidate_semester is not None:
        requirement_hangout = RequirementHangout.objects.filter(
            candidateSemesterActive=candidate_semester.id,
            eventType=EVENT_NAMES.HANGOUT,
            enable=True,
        ).first()
        if requirement_hangout:
            time_start = requirement_hangout.hangoutsDateStart or time_start
            time_end = requirement_hangout.hangoutsDateEnd or time_end

    # TODO: Hardcoded-ish for now, allow for choice of Hangout events
    required_hangout_events["Hangout"] = {
        "eventsDateStart": time_start,
        "eventsDateEnd": time_end,
        "title": "Hangout",
    }

    return required_hangout_events
Esempio n. 9
0
def get_mandatory_events(candidate_semester: Semester, confirmed_rsvps: bool):
    # We want to show all mandatory events, not just the events the candidate has RSVP'd to

    r = (candidate_semester and RequirementMandatory.objects.filter(
        candidateSemesterActive=candidate_semester.id, enable=True).first())
    mandatory_events = Event.objects.none()
    start_time, end_time = get_semester_bounds(timezone.now())
    if r:
        mandatory_events = r.events.all()
        if r.eventsDateStart and r.eventsDateEnd:
            start_time, end_time = r.eventsDateStart, r.eventsDateEnd

    mandatory_events |= Event.objects.filter(
        event_type__type=EVENT_NAMES.MANDATORY,
        start_time__gt=start_time,
        end_time__lt=end_time,
    )
    mandatory_events = mandatory_events.distinct().order_by("start_time")

    confirmed_events = [r.event.id for r in confirmed_rsvps]
    confirmed = mandatory_events.filter(id__in=confirmed_events)
    unconfirmed = mandatory_events.exclude(id__in=confirmed_events)

    return confirmed, unconfirmed
Esempio n. 10
0
    def get_context_data(self):
        view_option = self.request.GET.get('option')
        semester_start, semester_end = get_semester_bounds(timezone.now())
        all_events = Event.objects \
                .filter(start_time__gte=semester_start) \
                .filter(start_time__lte=semester_end) \
                .filter(access_level__gte=get_access_level(self.request.user)) \
                .order_by('start_time')
        if view_option == "upcoming":
            all_events = all_events.filter(start_time__gte=timezone.now())
        rsvpd_event_ids = Rsvp.objects \
                .filter(user__exact=self.request.user) \
                .values_list('event', flat=True)
        rsvpd_events = all_events \
                .filter(pk__in=rsvpd_event_ids)
        not_rsvpd_events = all_events \
                .exclude(pk__in=rsvpd_event_ids)

        for event in rsvpd_events:
            event.waitlisted = event.on_waitlist(self.request.user) # Is this bad practice? idk

        event_types = EventType.objects.order_by('type').all()
        event_types = sorted(event_types, key=lambda e: not (e.type == ATTR.MANDATORY))

        rsvpd_data, not_rsvpd_data = [], []
        for event_type in event_types:
            typed_rsvpd_events = rsvpd_events.filter(event_type=event_type)
            typed_not_rsvpd_events = not_rsvpd_events.filter(event_type=event_type)

            rsvpd_padding, not_rsvpd_padding = get_padding(len(typed_not_rsvpd_events), len(typed_rsvpd_events))

            rsvpd_data.append({
                ATTR.EVENT_TYPE: event_type,
                ATTR.EVENTS: [
                    [event, reverse("events:unrsvp", args=[event.id])]
                    for event in typed_rsvpd_events
                ],
                ATTR.PADDING: rsvpd_padding,
            })
            not_rsvpd_data.append({
                ATTR.EVENT_TYPE: event_type,
                ATTR.EVENTS: [
                    [event, reverse("events:rsvp", args=[event.id])]
                    for event in typed_not_rsvpd_events
                ],
                ATTR.PADDING: not_rsvpd_padding,
            })

        data = [
            {
                ATTR.CLASS: "right-half",
                ATTR.TITLE: "RSVP'd / Waitlist",
                ATTR.EVENTS_DATA: rsvpd_data,
                ATTR.DISPLAY_VALUE: "un-RSVP",
            },
            {
                ATTR.CLASS: "left-half",
                ATTR.TITLE: "Not RSVP'd",
                ATTR.EVENTS_DATA: not_rsvpd_data,
                ATTR.DISPLAY_VALUE: "RSVP",
            },
        ]

        context = {
            ATTR.DATA: data,
        }
        return context