Example #1
0
 def filter_queryset(self, request, queryset, view):
     rfidnum = request.query_params.get('rfidnum', None)
     if rfidnum is None:
         return queryset
     else:
         m = Member.get_by_card_str(rfidnum)
         if m is None:
             return queryset.none()
         else:
             return queryset.filter(
                 membership_card_md5=m.membership_card_md5)
Example #2
0
def kiosk_identify_subject(request, staff_card_str, next_url):

    member = Member.get_by_card_str(staff_card_str)
    if member is None or not member.is_domain_staff():
        return render(request, 'members/kiosk-invalid-card.html', {})  # TODO: use kiosk-domain-error template?

    params = {
        "staff_card_str" : staff_card_str,
        "next_url" : next_url
    }
    return render(request, 'members/kiosk-identify-subject.html', params)
Example #3
0
def kiosk_staff_menu(request, member_card_str):

    member = Member.get_by_card_str(member_card_str)
    if member is None or not member.is_domain_staff():
        return render(request, 'members/kiosk-invalid-card.html', {})  # TODO: use kiosk-domain-error template?

    params = {
        "memb_fname" : member.first_name,
        "memb_card_str" : member_card_str
    }
    return render(request, 'members/kiosk-staff-menu.html', params)
Example #4
0
def _log_visit_event(member_card_str, event_type):

    is_valid_evt = event_type in [x for (x, _) in VisitEvent.VISIT_EVENT_CHOICES]
    if not is_valid_evt:
        return False, "Invalid event type."

    member = Member.get_by_card_str(member_card_str)
    if member is None:
        return False, "No matching member found."
    else:
        VisitEvent.objects.create(who=member, event_type=event_type)
        _inform_other_systems_of_checkin(member, event_type)
        return True, member
Example #5
0
def rfid_entry_granted(request, rfid_cardnum):
    member = Member.get_by_card_str(rfid_cardnum)
    if member is not None:
        VisitEvent.objects.create(
            who=member,
            # RFID reads are not reliable indicators of arrival.
            # Cards are sometimes read when people walk past the reader on the way OUT.
            # Therefore, RFID reads will be considered as indicationg *presence*.
            event_type=VisitEvent.EVT_PRESENT,
            method=VisitEvent.METHOD_RFID,
        )
    else:
        logger.warning("No member found with RFID card# %s", rfid_cardnum)
    return JsonResponse({'success': "Information noted."})
Example #6
0
def api_member_details_pub(request, member_card_str):
    """ Respond with corresponding user/member tags given the membership card string. """

    subject = Member.get_by_card_str(member_card_str)

    if subject is None:
        return JsonResponse({'error': "Invalid member card string"})

    data = {
        'pk': subject.pk,
        'is_active': subject.is_active,
        'tags': [tag.name for tag in subject.tags.all()]
    }
    return JsonResponse(data)
Example #7
0
def api_member_details_pub(request, member_card_str):
    """ Respond with corresponding user/member tags given the membership card string. """

    subject = Member.get_by_card_str(member_card_str)

    if subject is None:
        return JsonResponse({'error':"Invalid member card string"})

    data = {
        'pk': subject.pk,
        'is_active': subject.is_active,
        'tags': [tag.name for tag in subject.tags.all()]
    }
    return JsonResponse(data)
Example #8
0
def kiosk_main_menu(request, member_card_str):
    member = Member.get_by_card_str(member_card_str)

    if member is None:
        return render(request, 'members/kiosk-invalid-card.html', {})  # TODO: use kiosk-domain-error template?

    params = {
        "memb_fname"    : member.first_name,
        "memb_card_str" : member_card_str,
        "memb_is_staff" : member.is_tagged_with("Staff"),
        "evt_arrival"   : VisitEvent.EVT_ARRIVAL,
        "evt_departure" : VisitEvent.EVT_DEPARTURE,
    }
    return render(request, 'members/kiosk-main-menu.html', params)
Example #9
0
def _log_visit_event(who_in: Union[str, Member, int],
                     event_type,
                     reason=None,
                     method=None) -> Tuple[bool, Union[str, Member]]:

    is_valid_evt = event_type in [
        x for (x, _) in VisitEvent.VISIT_EVENT_CHOICES
    ]
    if not is_valid_evt:
        return False, "Invalid event type value."

    if reason == "NUN":
        reason = None
        is_valid_reason = True
    else:
        is_valid_reason = reason in [
            x for (x, _) in VisitEvent.VISIT_REASON_CHOICES
        ]
    if not is_valid_reason:
        return False, "Invalid reason value."

    who = None  # type: Optional[Member]

    if type(who_in) is str:
        who = Member.get_by_card_str(who_in)
    elif type(who_in) is int:
        try:
            who = Member.objects.get(pk=who_in)
        except Member.DoesNotExist:
            who = None
    elif type(who_in) is Member:
        who = who_in
    else:
        return False, "Bad object type. 'Who' must be str, Member, or int."

    if who is None:
        return False, "No matching member found."

    VisitEvent.objects.create(who=who,
                              event_type=event_type,
                              reason=reason,
                              method=method)
    return True, who
def member_calendar(request, token):

    # See if token corresponds to a Worker's calendar_token:
    try:
        worker = Worker.objects.get(calendar_token=token)
        member = worker.member
    except Worker.DoesNotExist:
        member = None

    # If token didn't correspond to nag, see if it's a member card string:
    if member is None:
        member = Member.get_by_card_str(token)

    if member is None:
        raise Http404("No such calendar")

    cal = _new_calendar("My Xerocraft Tasks")
    for task in _gen_tasks_for(member):
        _add_event(cal, task, request)
        #TODO: Add ALARM
    return _ical_response(cal)
Example #11
0
def member_calendar(request, token):

    # See if token corresponds to a Worker's calendar_token:
    try:
        worker = Worker.objects.get(calendar_token=token)
        member = worker.member
    except Worker.DoesNotExist:
        member = None

    # If token didn't correspond to nag, see if it's a member card string:
    if member is None:
        member = Member.get_by_card_str(token)

    if member is None:
        raise Http404("No such calendar")

    cal = _new_calendar("My Xerocraft Tasks")
    for task in _gen_tasks_for(member):  # type: Task
        _add_event(cal, task, request)
        # TODO: Add ALARM
    return _ical_response(cal)
def _get_task_and_member(task_pk, member_card_str):

    try:
        task = Task.objects.get(pk=task_pk)
    except Task.DOES_NOT_EXIST:
        msg = "Info provided doesn't correspond to a task."
        _logger.error(msg)
        return None, None, JsonResponse({"error": msg})

    if task.work_start_time is None or task.work_duration is None:
        msg = "Expected a task with a specific time window."
        _logger.error(msg)
        return None, None, JsonResponse({"error": msg})

    member = Member.get_by_card_str(member_card_str)
    if member is None:
        # This might legitimately occur if an invalidated card is presented at the kiosk.
        msg = "Info provided doesn't correspond to a member."
        _logger.warning(msg)
        return None, None, JsonResponse({"error": msg})

    return task, member, None
Example #13
0
def _get_task_and_member(task_pk, member_card_str):

    try:
        task = Task.objects.get(pk=task_pk)
    except Task.DOES_NOT_EXIST:
        msg = "Info provided doesn't correspond to a task."
        _logger.error(msg)
        return None, None, JsonResponse({"error": msg})

    if task.work_start_time is None or task.work_duration is None:
        msg = "Expected a task with a specific time window."
        _logger.error(msg)
        return None, None, JsonResponse({"error": msg})

    member = Member.get_by_card_str(member_card_str)
    if member is None:
        # This might legitimately occur if an invalidated card is presented at the kiosk.
        msg = "Info provided doesn't correspond to a member."
        _logger.warning(msg)
        return None, None, JsonResponse({"error": msg})

    return task, member, None
Example #14
0
def rfid_entry_requested(request, rfid_cardnum):

    member = Member.get_by_card_str(rfid_cardnum)
    if member is None:
        json = {'card_registered': False}
    else:
        try:
            latest_pm = Membership.objects.filter(
                member=member).latest('start_date')
            json = {
                'card_registered': True,
                'membership_current': member.is_currently_paid(),
                'membership_start_date': latest_pm.start_date,
                'membership_end_date': latest_pm.end_date,
            }
        except Membership.DoesNotExist:
            json = {
                'card_registered': True,
                'membership_current': False,
                'membership_start_date': None,
                'membership_end_date': None,
            }
    return JsonResponse(json)