def ScannerAuthentication(request): (email, token) = get_scanner_cred(request) if not email or not token: return False if not email: return False query = get_query(request) try: user = User.objects.get(email=email) except User.DoesNotExist: return False if query and "poste" in query and\ (isinstance(query["poste"], int) or query["poste"].isnumeric())\ and user.is_valid_scanner_token(int(query["poste"]), token): return True return False
def create(self, request): """Create one or multiple program at once """ # if the request is from the scanner we have to get # the user again here if request.user.is_anonymous(): (email, _) = get_scanner_cred(request) request.user = User.objects.get(email=email) result = set() query = get_query(request) if not query: return Response(status=status.HTTP_400_BAD_REQUEST) if 'poste' not in query: return Response({"poste": ["This field is required"]}, status=status.HTTP_400_BAD_REQUEST) if not Station.objects.filter(user=request.user, id=int(query['poste'])).exists(): return Response({"poste": ["This station does not exist"]}, status=status.HTTP_400_BAD_REQUEST) station = Station.objects.get(id=int(query['poste'])) only_one_program = False extra_field = {} if not "programs_list" in query: err = {} for x in ['program_version', 'program_name', 'minimum_score']: if x not in query: err[x] = ["This field is required"] if err: return Response(err, status=status.HTTP_400_BAD_REQUEST) if (not 'alert_type_default' in query or not query['alert_type_default']) and\ 'sms_enabled' in query and query['sms_enabled'] and not request.user.phone: return Response({'sms_enabled' : ['Cannot enable sms alert for an user without a phone number registered']}, status=status.HTTP_400_BAD_REQUEST) only_one_program = True elem = {} elem['program_version'] = query['program_version'] elem['program_name'] = query['program_name'] elem['program_score'] = query['minimum_score'] for k in ['sms_score', 'sms_enabled', 'email_score', 'email_enabled', 'web_score', 'web_enabled', 'alert_type_default']: if k in query: extra_field[k] = query[k] query['programs_list'] = [elem] for elem in query['programs_list']: if not all(x in elem for x in ['program_version', 'program_name']): return Response(status=status.HTTP_400_BAD_REQUEST) up_to_date = True if TESTING: up_to_date = True for elem in query['programs_list']: progs = UserPrograms.objects.filter(user=request.user.id, program_name=elem['program_name'], poste=station) # if prog, user is already monitoring the given program, update is needed if progs: if len(progs) == len(elem['program_version']): maj_progs(progs, elem, elem['program_version'], request.user, up_to_date) elif len(progs) > len(elem['program_version']): # maj as much progs as tehy are in the data from the scanner maj_progs(progs[:len(elem['program_version'])], elem, elem['program_version'], request.user, up_to_date) # delete other progs with same name for prog in progs[len(elem['program_version']):]: prog.delete() else: # maj as much progs as tehy are in db maj_progs(progs, elem, elem['program_version'][:len(progs)], request.user, up_to_date) # create the other ones add_progs(elem, elem['program_version'][len(progs):], request.user, station, extra_field, up_to_date) else: #else: add new programs add_progs(elem, elem['program_version'], request.user, station, extra_field, up_to_date) if only_one_program: # this sould happen only when the request came from the frontend obj = UserPrograms.objects.get(user=request.user.id, program_name=elem['program_name'], poste=station, program_version=elem['program_version'][0]) serializer = self.get_serializer(obj) return Response(serializer.data, status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)