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)
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)
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)
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
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."})
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)
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)
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)
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)
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
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)