Ejemplo n.º 1
0
def deleteTier(request):
    if request.method == "GET" and "id" in request.GET:
        apicall = requests.get('http://127.0.0.1:8080/tier', params={"id": request.GET.get('id')}).json()
        if apicall['length']:
            form = DeleteTierForm({
                'id': request.GET.get('id'),
            })
            return render(request, 'staff/deletetier.html', {
                'form': form,
                'item': apicall['items'][0],
            })
        else:
            messages(request, f"Transaction Tier with id = {request.GET.get('id')} is not found")
            return redirect(reverse('staff:tier'))
    elif request.method == "POST":
        form = DeleteTierForm(request.POST)
        if form.is_valid():
            s = f"{form.cleaned_data.get('id')}{12345}"
            apicall = requests.delete(f"http://127.0.0.1:8080/tier?id={form.cleaned_data.get('id')}&signature={hashlib.sha256(s.encode()).hexdigest()}")
            if apicall.json():
                messages.success(request, f"Successfully deleted Tier with id = {form.cleaned_data.get('id')}")
                return redirect(reverse("staff:tier"))
            else:
                messages.error(request, f"Delete unsuccessful, Tier with id = {form.cleaned_data.get('id')}")
                return redirect(reverse("staff:tier"))
        else:
            messages.error(request, "There's an unknown error, please contact Dev")
            return redirect(reverse("staff:tier"))
    else:
        return redirect(reverse("user:redirect"))
Ejemplo n.º 2
0
def register(request):
    if request.method == 'POST':
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        email = request.POST['email']
        if password1 == password2:
            if User.objects.filter(username=username).exists():
                messages.info(request, 'username taken')
                return redirect('register')
            elif User.objects.filter(email=email).exists():
                messages.info(request, "Email has been taken")
                return redirect('register')
            else:
                user = User.objects.create_user(username=username,
                                                password=password1,
                                                email=email,
                                                first_name=first_name,
                                                last_name=last_name)
                user.save()
                messages(request, 'user created')
                return redirect('login')
        else:
            print('user not created sry Bhai :(')
            return redirect('/')
    else:
        return render(request, 'register.html')
Ejemplo n.º 3
0
def new_chapter(request):
    if request.method == 'POST':
        class_name = request.POST.get('class_id_for_new_chapter')
        new_chapter = request.POST.get('new_chapter')
        new_chapter_desc = request.POST.get('new_chapter_desc')
        try:
            class_name = Class.objects.get(id=class_name)
        except Class.DoesNotExist:
            messages.error(request, "Class Does not exist")
            print('Class Does not exist')
            return redirect('class:index')
        print(class_name.classmaterialschapter_set.filter(name=new_chapter))
        if class_name.classmaterialschapter_set.filter(name=new_chapter):
            messages.warning(request, "Chapter name: \'" + str(new_chapter) + "\' already exists in this class")
            return redirect('class:add_new_mat')
        else:
            if class_name.teacher.user == request.user:
                new_chap = ClassMaterialsChapter(name=new_chapter, className=class_name, description=new_chapter_desc)
                new_chap.save()
                class_name = class_name.name
                messages.success(request, str(new_chapter) + " Added successfully to " + str(class_name))
                return redirect('class:add_new_mat')
            else:
                messages(request, 'You do not have access to this class')
                return redirect('class:add_new_mat')
    else:
        return redirect('class:add_new_mat')
Ejemplo n.º 4
0
def updateTier(request):
    if request.method == "GET" and "id" in request.GET:
        apicall = requests.get('http://127.0.0.1:8080/tier', params={"id": request.GET.get('id')}).json()
        if apicall['length']:
            form = UpdateTierForm(apicall['items'][0])
            return render(request, 'staff/updatetier.html', {'form': form})
        else:
            messages(request, f"Transaction Tier with id = {request.GET.get('id')} is not found")
            return redirect(reverse('staff:tier'))
    elif request.method == "POST":
        form = UpdateTierForm(request.POST)
        if form.is_valid():
            data = {**form.cleaned_data,}
            s = f"{data.get('id')}{data.get('minimumTransaction')}{data.get('maximumTransaction')}{data.get('probability')}{data.get('discount')}{12345}"
            data = {
                **form.cleaned_data,
                'signature': hashlib.sha256(s.encode()).hexdigest()
            }
            apicall = requests.put('http://127.0.0.1:8080/tier', json=data)
            
            if apicall.status_code == 201:
                messages.success(request, f"Transaction Tier with id = {form.cleaned_data.get('id')} successfully updated")
                return redirect(reverse('staff:tier'))
            else:
                messages.error(request, "There's an error on the Server")
                return render(request, 'staff/updatetier.html', {'form': form})
        else:
            messages.error(request, "Please correct the field below")
            return render(request, 'staff/updatetier.html', {'form': form})
    else:
        return redirect(reverse('staff:tier'))
Ejemplo n.º 5
0
 def cancel_withdrawal(modelAdmin, request, queryset):
     if request.path == "/admin/main/withdrawal/":
         queryset.update(status="cancelled")
     else:
         messages(
             request, messages.ERROR,
             "Oga, no dey try deadly things. go to the withdrawal model and do this stuff"
         )
Ejemplo n.º 6
0
def comment_delete_question(request, comment_id):
    """
   질문 댓글 삭제
   """
    comment = get_object_or_404(Comment, pk=comment_id)
    if request.user != comment.author:
        messages(request, '삭제권한이 없습니다.')
    else:
        comment.delete()
    return redirect('pybo:detail', question_id=comment.question.id)
Ejemplo n.º 7
0
def activate(request, key):
    user = models.User.objects.filter(label=key)
    if not user:
        messages(request, _("User not found!"))
        return redirect("home")
    else:
        if user[0].active:
            raise Http404
        user.update(active=True)
        return redirect("user_page")
Ejemplo n.º 8
0
def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect('login')
        else:
            messages(request, 'User not found')
            return redirect('login')
    return render(request, 'login.html')
Ejemplo n.º 9
0
Archivo: views.py Proyecto: kataev/bkz
 def form_valid(self, form):
     self.object = form.save(commit=False)
     width = self.object.width
     if width == 0.8:
         width = 1.0
     self.object.seonr = SEONR.objects.filter(color=self.object.color).latest('date')
     self.object.efflorescence = Efflorescence.objects.filter().latest('date')
     self.object.heatconduction = HeatConduction.objects.filter(width=width).latest('date')
     self.object.frost_resistance = FrostResistance.objects.filter(color=self.object.color).latest('date')
     self.object.water_absorption = WaterAbsorption.objects.filter().latest('date')
     self.object.save()
     messages(self.request, u'Партия созданна')
     return redirect(self.get_success_url())
Ejemplo n.º 10
0
def register_customer_view(request):
    form = register_customer_form(request.POST)
    if form.is_valid():
        u_name = form.cleaned_data.get('username')
        email = form.cleaned_data.get('email')
        print(form.cleaned_data)
        profile_object = Profile.objects.filter(email__exact=email)
        print(profile_object)
        flag = False
        for i in profile_object:
            if (i[email] == email):
                flag = True
        flag2 = False
        for i in User.objects.filter(username__iexact=u_name):
            if (i.username == u_name):
                flag2 = True
        if flag:
            print('Email taken already.')
            messages.info(request, 'Email taken already.')
            form = register_restaurant_form()

        elif flag2:
            print('User Name Aready Taken')
            messages(request, 'User Name Aready Taken')
            form = register_restaurant_form()

        elif form.cleaned_data.get('password1') != form.cleaned_data.get(
                'password2'):
            print('Password did not match.')
            messages(request, 'Password did not match.')
            form = register_restaurant_form()

        else:
            user = form.save()
            user.refresh_from_db()
            user.profile.name = form.cleaned_data.get('name')
            user.profile.email = form.cleaned_data.get('email')
            user.profile.contact_no = form.cleaned_data.get('contact_no')
            user.profile.is_customer = True
            user.save()
            # username = form.cleaned_data.get('username')
            # password = form.cleaned_data.get('password1')
            # user = authenticate(username=username, password=password)
            # login(request, user)
            return redirect('index')
    else:
        form = register_restaurant_form()
    return render(request, 'users/restaurant_registration.html',
                  {'form': form})
Ejemplo n.º 11
0
def addquestion(request):
    if request.user.is_authenticated:
        obj=question()
        obj.writer=request.user
        obj.content=request.GET['content']
        obj.date=datetime.date.today()
        obj.save()
        tag=request.GET['hashtag']
        tag=tag.replace(" ","")
        print(tag)
        tag=re.split("#",tag)
        
        taglist=tag[1:-1]
        taglist+=[tag[-1]]
        print(taglist)
        for k in taglist:
            if len(k)<50:
                try:
                    temp=hashtag.objects.get(name=k)
                    temp.used_count+=1
                    temp.save()
                except hashtag.DoesNotExist:
                    temp=hashtag()
                    temp.name=k
                    temp.creator=request.user
                    temp.save()
                try:
                    newtag=usershashtag()
                    newtag.user=request.user
                    newtag.hashtag=temp
                    newtag.save()
                    temp.followers+=1
                    temp.save()
                except IntegrityError:
                    print("already added")
                
                objtemp=tag_in_question()
                objtemp.hashtag=temp
                objtemp.question=obj
                objtemp.save()
            else:
                e="one hash(#) tag length should not exceed 50"
                messages.add_message(request,messages.ERROR,e)
        e="Article posted "
        messages.add_message(request,messages.SUCCESS,e)
        return HttpResponseRedirect("/community")
    else:
        messages(request,messages.INFO,"please login to post a question")
        return render(request,'account/notauthorised.html')
Ejemplo n.º 12
0
def reset_password(request):
    try:
        if request.method == 'POST':
            User = get_user_model()
            old_password = request.POST['old_password']
            new_password = request.POST['new_password1']
            confirm_new_password = request.POST['new_password2']

            if new_password == confirm_new_password:
                if new_password.strip() == '':
                    return messages.success(request, 'La contraseña no puede estar vacia')
                else:
                    if len(new_password) < 6:
                        return JsonResponse({'error': 'La contraseña debe contener mínimo 6 caracteres'})
                    else:
                        usr = User.objects.get(id = request.session['_auth_user_id'])
                        if(usr.check_password(old_password)):
                            usr.set_password(new_password)
                            usr.save()
                            return JsonResponse({'message': 'Las contraseñas ha sido cambiada exitosamente'})

                        return JsonResponse({'message': 'Contraseña antigua incorrecta'})
            else:
                return messages(request, 'Las contraseñas no coinciden')

        return redirect('dashboard')
    except EOFError as identifier:
        return JsonResponse({'error': 'Ha ocurrido un error en el servidor, intentelo nuevamente.'})
Ejemplo n.º 13
0
def returnBook(request, pk):

    issue = Issue.objects.get(id=pk)

    penalty = calculate_penalty(issue)

    book = issue.book
    book.available_copies = book.available_copies + 1
    book.save()

    student = Student.objects.get(first_name=issue.student_name.first_name)
    student.no_of_issued_books = student.no_of_issued_books - 1
    student.save()

    messages(request, 'You have returned the book')
    return redirect('lms-library')
Ejemplo n.º 14
0
def deletenewsolution(request, pk):
    if request.method == 'POST':
        solution = Solution.objects.get(pk=pk)
        if solution:
            problem = CodingProblem.objects.get(pk=solution.problem_id.pk)
            solutions = Solution.objects.filter(problem_id=problem)
            if len(solutions) == 1:
                problem.status = False
                problem.save()
            solution.delete()
            messages.success(request, 'Solution deletion successful')
            path = '/'.join(['', 'codingproblems', 'problem', str(problem.pk)])
            return redirect(path)
        messages(request, 'Solution not found')
        return redirect('/')
    return redirect('/')
Ejemplo n.º 15
0
def change_admin_pw(request):
    if request.method == 'POST':
        name = request.user.username
        user = get_object_or_404(User, username=name)
        form = UserForm(request.POST or None)
        if form.is_valid():
            user.password = make_password(form.cleaned_data['password'])
            user.save()
            messages.success(request, 'Password has been updated!')
            return redirect('admin_login')
        else:
            messages(request, 'Failed to change password!')
            return redirect('change_admin_pw')

        return redirect('dashboard')
    elif request.method == 'GET':
        return render(request, 'auth/change_password.html')
Ejemplo n.º 16
0
def userlogin(request):
    if not request.user.is_authenticated:
        if request.method == 'POST':
            fm = AuthenticationForm(request=request, data=request.Post)
            if fm.is_valid():
                uname = fm.cleaned_data['username']
                upass = fm.cleaned_data['password']
                user = authenticate(username=uname, password=upass)
                if user is not None:
                    login(request, user)
                    messages(request, "login successfully!!")
                    return HttpResponseRedirect('/profile/')
        else:
            fm = AuthenticationForm()
            return render(request, 'userlogin.html', {'form': fm})
    else:
        return HttpResponseRedirect('/profile/')
Ejemplo n.º 17
0
 def confirm_withdrawal(modelAdmin, request, queryset):
     if request.path == "/admin/main/withdrawal/":
         queryset.update(status="completed")
         for obj in queryset:
             if obj.amount <= obj.user.account_balance:
                 obj.user.account_balance -= obj.amount
                 obj.user.save()
             else:
                 messages(
                     request, messages.ERROR,
                     "Withdrawal amount is_less than the user's account balance"
                 )
     else:
         messages(
             request, messages.ERROR,
             "Oga, no dey try deadly things. go to the withdrawal model and do this stuff"
         )
Ejemplo n.º 18
0
def contactpage(request):
    if request.method == 'POST':
        name = request.POST['name']
        email = request.POST['email']
        message = request.POST['message']
        context = messages(name=name, number=number)
        context.save()
    return redirect('home/Apply.html')
Ejemplo n.º 19
0
def add_group(request):
    message = None
    if request.POST:
        group, message = handle_add_group_form(request, request.POST)
        if group:
            addition(request, group)
            return redirect('todo:conversation', group.pk)
    return messages(request, error=message)
Ejemplo n.º 20
0
def submit_password_reset(request, email):
    try:
        user = User.objects.get(email=email)
    except Exception:
        messages(request, 'Invalid access.', extra_tags='login')
        return HttpResponseRedirect(reverse('c3:index'))
    else:
        errors = {}
        User.objects.check_pwd_confirm(request.POST, errors)
        if errors:
            for key, value in errors.items():
                messages.error(request, value, extra_tags='reset')
            return HttpResponseRedirect(reverse('c3:passwordreset', args=[email]))
        else:
            user.password = request.POST.get('password').encode()
            user.save()
            messages.error(request, 'Password Reset!', extra_tags='login')
            return HttpResponseRedirect(reverse('c3:index'))
Ejemplo n.º 21
0
def profile(request):
    if request.method == 'POST':

        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages(request, f'Yout account has been updated!')
            return redirect('profile')

    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {'u_form': u_form, 'p_form': p_form}

    return render(request, 'users/profile.html', context)
Ejemplo n.º 22
0
def send_message(request, key):
    try:
        user = models.User.objects.get(label=key)
    except models.User.DoesNotExist:
        messages(request, _("User not found!"))
        return redirect("home")
    else:
        if user.active:
            raise Http404
        message = "http://http://airdrop.tt/user/activate/{}/".format(user.label)
        email = mp.Process(target=libs.send_email, args=[user.login, "Email activation", message])
        email.start()
        messages.info(
            request,
            _("An email has been sent to the specified email address."),
        )
        messages.info(
            request,
            _("To complete the registration, click on the link in the email.")
        )
        return redirect("user_signin")
Ejemplo n.º 23
0
def signup(request):
    context = {}
    next = request.GET.get('next')
    if request.method == 'POST':
        form = SignupForm(request.POST, request.FILES)
        if form.is_valid():
            username = form.cleaned_data['username']
            password1 = form.cleaned_data['password1']
            password2 = form.cleaned_data['password2']
            full_name = form.cleaned_data['full_name']
            nickname = form.cleaned_data['nickname']
            phonenumber = form.cleaned_data['phonenumber']
            image = form.cleaned_data['image']

            phonenumber = re.sub(r'(\d{3})-(\d{4})-(\d{4})', r'\1\2\3',
                                 phonenumber)

            # 검증 1. 비밀번호
            if password1 != password2:
                context['form'] = form
                messages.error(request, '비밀번호가 다릅니다.')
            else:  # 적절함 == 인스턴스를 만듬
                user = CustomUser.objects.create_user(
                    username=username,
                    password=password1,
                    full_name=full_name,
                    nickname=nickname,
                    phonenumber=phonenumber,
                    image=image,
                )
                auth_login(request, user)
                return redirect(next)
        else:
            messages(request, form.errors)
            context['form'] = form

    else:
        context['form'] = SignupForm()
    return render(request, 'member/signup.html', context)
Ejemplo n.º 24
0
def new_module(request):
    if request.method == 'POST':
        chapter_id = request.POST.get('chapter_id_for_new_module')
        new_module = request.POST.get('new_module')
        new_module_desc = request.POST.get('new_module_desc')
        chapter = ClassMaterialsChapter.objects.get(id=chapter_id)
        print(chapter.classmaterialsmodule_set.filter(name=new_module))
        if chapter.classmaterialsmodule_set.filter(name=new_module):
            messages.warning(request, "Module name: \'" + str(new_module) + "\' already exists in this chapter")
            return redirect('class:add_new_mat')
        else:
            teacher = chapter.className.teacher
            if teacher.user == request.user:
                new_mod = ClassMaterialsModule(name=new_module, chapter=chapter, description=new_module_desc)
                new_mod.save()
                messages.success(request, str(new_module) + " Added successfully to " + str(chapter.name))
                return redirect('class:add_new_mat')
            else:
                messages(request, 'You do not have access to this chapter')
                return redirect('class:add_new_mat')
    else:
        return redirect('class:add_new_mat')
Ejemplo n.º 25
0
def species(request):
    template_name = 'panel/add.html'

    form = SpecieForm(auto_id=False)

    title = 'Cadastro de espécie'

    if request.method == 'POST':
        errors = form.errors.as_data()

        if form.is_valid is False:
            for error, val in errors.items():
                messages.error(request, ''.join(
                    val[0]))  # Join the ValidationError value

        else:
            form.save()
            title = form.instance.name
            messages(request, 'Cadastrado com sucesso!')

    context = {'title': title, 'form': form}

    return render(request, template_name, context)
Ejemplo n.º 26
0
def help_clear(request, msg_id):

    #help_day = request.GET.get('help_day', None)
    help_day = 1
    helped_user = request.user
    if ((datetime.now() - helped_user.recent_help).days < 1):
        return redirect('message')
    if (msg_id is None):
        return redirect('message')
    check_help = messages_Container.objects.get(
        Q(id=msg_id) & Q(userone=helped_user))
    if not check_help:
        return redirect('message')

    #도움 준 사람 도움 준 횟수 +1
    helping_user = check_help.usertwo
    tmp_helping = helping_user.helping
    helping_user.helping = tmp_helping + help_day
    helping_user.save()

    #도움 받은 사람 도움 받은 횟수 +1
    tmp_helped = helped_user.helped
    helped_user.helped = tmp_helped + help_day
    helped_user.recent_help = datetime.now()
    helped_user.save()

    #도움 지역 +1
    help_region = check_help.message_region
    check_region = region.objects.get(Q(region_name=help_region))
    tmp_count = check_region.region_help
    check_region.region_help = tmp_count + help_day
    check_region.save()

    #msg에 추가
    thanks_message = messages()
    thanks_message.message_id = msg_id
    thanks_message.content = "도움을 주셔서 감사합니다. 도움 횟수 + 1"
    thanks_message.user_send = 1
    thanks_message.save()
    return HttpResponseRedirect('/%s?msg=%s' % ('message', msg_id))
Ejemplo n.º 27
0
def calculate(request):
    if request.method == "POST":
        # sgpa
        s1 = request.POST.get('s1')
        s2 = request.POST.get('s2')
        s3 = request.POST.get('s3')
        s4 = request.POST.get('s4')
        s5 = request.POST.get('s5')
        s6 = request.POST.get('s6')
        s7 = request.POST.get('s7')
        s8 = request.POST.get('s8')
        s9 = request.POST.get('s9')
        s10 = request.POST.get('s10')
        s11 = request.POST.get('s11')
        s12 = request.POST.get('s12')

        s1 = float(s1)
        s2 = float(s2)
        s3 = float(s3)
        s4 = float(s4)
        s5 = float(s5)
        s6 = float(s6)
        s7 = float(s7)
        s8 = float(s8)
        s9 = float(s9)
        s10 = float(s10)
        s11 = float(s11)
        s12 = float(s12)

        # credits
        c1 = request.POST.get('c1')
        c2 = request.POST.get('c2')
        c3 = request.POST.get('c3')
        c4 = request.POST.get('c4')
        c5 = request.POST.get('c5')
        c6 = request.POST.get('c6')
        c7 = request.POST.get('c7')
        c8 = request.POST.get('c8')
        c9 = request.POST.get('c9')
        c10 = request.POST.get('c10')
        c11 = request.POST.get('c11')
        c12 = request.POST.get('c12')

        c1 = float(c1)
        c2 = float(c2)
        c3 = float(c3)
        c4 = float(c4)
        c5 = float(c5)
        c6 = float(c6)
        c7 = float(c7)
        c8 = float(c8)
        c9 = float(c9)
        c10 = float(c10)
        c11 = float(c11)
        c12 = float(c12)

        totalCredit = c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11 + c12
        totalSGPA = ((s1 * c1) + (s2 * c2) + (s3 * c3) + (s4 * c4) +
                     (s5 * c5) + (s6 * c6) + (s7 * c7) + (s8 * c8) +
                     (s9 * c9) + (s10 * c10) + (s11 * c11) + (s12 * c12))

        cgpa = totalSGPA / totalCredit
        if cgpa <= 4:
            print(cgpa)
            return render(request, 'calculate.html', {'cgpa': cgpa})
        else:
            return redirect('/')
            return messages(request, "Please enter correct sgpa again")

        return redirect('/')

    return render(request, 'calculate.html')
Ejemplo n.º 28
0
def get_user_vars(request):

    try:
        # User programs
        ownedPrograms = request.user.program_set.filter(active=True)
        sharedPrograms = Program.objects.filter(
            shared__matched_user=request.user,
            shared__active=True,
            active=True)
        programs = ownedPrograms | sharedPrograms
        # user_programs is not being used. Can a shared program actually show up twice?
        #user_programs = programs.distinct()

        # This detailed construction of user data variables WAS happening in the template. Now it is here:

        user_vars = {}
        if programs:
            for program in programs:
                for project in program.project_set.all():
                    if project.active:
                        per_proj = {
                            'progName': program.name,
                            'projName': project.name,
                            'progID': program.id,
                            'projID': project.id
                        }
                        user_vars[project.id] = per_proj
                        per_proj_vars = []
                        per_proj['vars'] = per_proj_vars

                        for variable in project.user_feature_definitions_set.all(
                        ):
                            if variable.shared_map_id:
                                value = variable.shared_map_id
                            else:
                                value = 'v2:USER:{0}:{1}'.format(
                                    str(project.id), str(variable.id))
                            per_proj_var = {
                                'var_type':
                                'N' if variable.is_numeric else 'C',
                                'value':
                                value,
                                'data_code':
                                value,
                                'data_text_label':
                                '{0}: {1}'.format(
                                    project.name,
                                    get_readable_name(variable.feature_name)),
                                'data_feature_id':
                                variable.id,
                                'data_feature_name':
                                get_readable_name(variable.feature_name)
                            }
                            per_proj_vars.append(per_proj_var)
    except Exception as e:
        logger.error(
            "[ERROR] While trying to load user variables for variable selection page:"
        )
        logger.exception(e)
        messages(
            request,
            "There was an error while trying to load your user variables - please contact the administrator."
        )
        return redirect(reverse('variables'))

    return render(request, 'variables/variable_edit_user_data.html',
                  {'user_vars': user_vars})
def user_login_via_otp_form_otp(request):
    ## CLEARING ALL THE MESSAGES
    system_messages = messages.get_messages(request)
    for message in system_messages:
        # This iteration is necessary
        pass
    system_messages.used = True


    # CHECKING whether the session variable exists or not
    if 'jwt_token' in request.session:
        jwt_token = request.session['jwt_token']
    else:
        messages.error(request, 'jwt_token in session not found')
        return redirect('login_register_password_namespace:user_login_via_otp_form_email')

    # CHECKING jwt token and getting the payload
    try:
        # options = {
        #     'verify_exp': True,
        # }
        payload = jwt.decode(
            jwt_token,
            settings.SECRET_KEY,
            True,
            #options=options,
        )
        #logger_custom_string.debug(settings.pp_dict(payload))
    except Exception as e:  # NoQA
        #logger_custom_string.debug(str(e))
        pass

    # FORM
    from .forms import UserLoginViaOtpFormOTP
    if request.method == 'POST':

        form = UserLoginViaOtpFormOTP(request.POST)
        if form.is_valid():
            otp_loginconfirm = form.cleaned_data.get('otp_loginconfirm')

            #COMPARE TIME LIMIT FOR OTP

            #convert payload creation time to datetime
            creation_time = datetime.datetime.fromisoformat(payload['creation_time'])
            #datetime.timedelta(minutes=1, seconds=1)
            timelimit = datetime.timedelta(seconds=10)
            current_time = datetime.datetime.now(tz=pytz.timezone('UTC'))
            timecheck = current_time - creation_time < timelimit
            timedelta = current_time - creation_time
            import traceback
            logger_custom_string.debug(settings_basic_django.pp_odir(locals(),traceback.format_stack(limit=5)))

            if current_time - creation_time > timelimit:
                form.add_error(None,"OTP expired, Click on resend OTP")
                return render(request, 'login_register_password/login_via_otp/user_login_via_otp_form_otp.html',{'form': form})

            if payload['OTP'] == otp_loginconfirm:

                # CHECK for an existing user
                try:

                    match = User.objects.get(email=payload['email'])
                    time_now = timezone.now()
                    # if we do timezone.now(), (with a comma then it will save as tuple and will give error)
                    match.last_login2=time_now
                    match.recentdate_login_via_otp=time_now
                    match.save()

                    if match.is_active:
                        login(request,match,backend='django.contrib.auth.backends.ModelBackend')
                    else:
                        messages(email, ' :not active')
                        return redirect('login_register_password_namespace:user_login_via_otp_form_email')

                    #Get ip address
                    ip = settings.get_client_ip(request)

                    # get the action type
                    action_type = ActionTypeForUserSessionLog.objects.get(action='login_by_otp')

                    # Save in the session
                    match_UserSessionLog = UserSessionLog(
                        user_email=match.email,
                        ip_address = ip,
                        user = match,
                        otp_used_for_otplogin=payload['OTP'],
                        action_type=action_type,
                        device_type=request.META['HTTP_USER_AGENT'],
                        created_time=time_now
                    )

                    match_UserSessionLog.save()
                    
                except User.DoesNotExist:
                    #we create a new user

                        ###   total length of Model_meta.get_fields(include_hidden=True):  31
                        ###   
                        ###   
                        ###   [
                        ###       "<ManyToOneRel: admin.logentry>",
                        ###       "<ManyToOneRel: custom_user.user_groups>",
                        ###       "<ManyToOneRel: custom_user.user_user_permissions>",
                        ###       "<ManyToOneRel: custom_user.usersessionlog>",
                        ###       [
                        ###           "<django.db.models.fields.AutoField: id>",
                        ###           "STR: custom_user.User.id"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: last_login>",
                        ###           "STR: custom_user.User.last_login"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.BooleanField: is_superuser>",
                        ###           "STR: custom_user.User.is_superuser"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.BooleanField: is_staff>",
                        ###           "STR: custom_user.User.is_staff"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: date_joined>",
                        ###           "STR: custom_user.User.date_joined"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: password>",
                        ###           "STR: custom_user.User.password"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: recentdate_login_via_passwd>",
                        ###           "STR: custom_user.User.recentdate_login_via_passwd"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: recentdate_login_via_otp>",
                        ###           "STR: custom_user.User.recentdate_login_via_otp"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: recentdate_password_change>",
                        ###           "STR: custom_user.User.recentdate_password_change"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: first_name>",
                        ###           "STR: custom_user.User.first_name"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: last_name>",
                        ###           "STR: custom_user.User.last_name"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.EmailField: email>",
                        ###           "STR: custom_user.User.email"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.BooleanField: is_active>",
                        ###           "STR: custom_user.User.is_active"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: recent_otp_used_for_pass_change>",
                        ###           "STR: custom_user.User.recent_otp_used_for_pass_change"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: date_of_recent_otp_used_for_pass_change>",
                        ###           "STR: custom_user.User.date_of_recent_otp_used_for_pass_change"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: otp_used_while_passlogin_create>",
                        ###           "STR: custom_user.User.otp_used_while_passlogin_create"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: date_of_otp_used_while_passlogin_create>",
                        ###           "STR: custom_user.User.date_of_otp_used_while_passlogin_create"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: first_otp_used_for_otplogin>",
                        ###           "STR: custom_user.User.first_otp_used_for_otplogin"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: date_of_first_otp_used_for_otplogin>",
                        ###           "STR: custom_user.User.date_of_first_otp_used_for_otplogin"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.TextField: about>",
                        ###           "STR: custom_user.User.about"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.CharField: location>",
                        ###           "STR: custom_user.User.location"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateField: birth_date>",
                        ###           "STR: custom_user.User.birth_date"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: modified_date>",
                        ###           "STR: custom_user.User.modified_date"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: creation_date>",
                        ###           "STR: custom_user.User.creation_date"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.DateTimeField: last_login2>",
                        ###           "STR: custom_user.User.last_login2"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.related.ManyToManyField: groups>",
                        ###           "STR: custom_user.User.groups"
                        ###       ],
                        ###       [
                        ###           "<django.db.models.fields.related.ManyToManyField: user_permissions>",
                        ###           "STR: custom_user.User.user_permissions"
                        ###       ]
                        ###   ]
                        ###   
                        ###   
                        ###   
                        ###   Lenght of c_dict[000_null_true***********************************************************************]  8
                        ###   Lenght of c_dict[001_remaining***********************************************************************]  1
                        ###   Lenght of c_dict[002_null_false_and_empty_strings****************************************************]  10
                        ###   Lenght of c_dict[003_auto_now_add__OR__auto_now******************************************************]  2
                        ###   Lenght of c_dict[004_auto_created********************************************************************]  5
                        ###   Lenght of c_dict[005_default_not_empty_string********************************************************]  5
                        ###   Total lenght of c_dict:  31
                        ###   {
                        ###       "000_null_true***********************************************************************": {
                        ###           "birth_date": {
                        ###               "000_class": "<class 'django.db.models.fields.DateField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           },
                        ###@@@@       "date_of_first_otp_used_for_otplogin": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "date_of_otp_used_while_passlogin_create": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "date_of_recent_otp_used_for_pass_change": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "last_login": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           },
                        ###@@@@       "recentdate_login_via_otp": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           },
                        ###           "recentdate_login_via_passwd": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           },
                        ###           "recentdate_password_change": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": true,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           }
                        ###       },
                        ###       "001_remaining***********************************************************************": {
                        ###@@@@       "last_login2": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true
                        ###           }
                        ###       },
                        ###       "002_null_false_and_empty_strings****************************************************": {
                        ###           "about": {
                        ###               "000_class": "<class 'django.db.models.fields.TextField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "max_length": 500
                        ###           },
                        ###@@@@       "email": {
                        ###               "000_class": "<class 'django.db.models.fields.EmailField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": false,
                        ###               "max_length": 254,
                        ###               "unique": true
                        ###           },
                        ###           "first_name": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "max_length": 30
                        ###           },
                        ###@@@@       "first_otp_used_for_otplogin": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": false,
                        ###               "max_length": 6
                        ###           },
                        ###           "groups": {
                        ###               "000_class": "<class 'django.db.models.fields.related.ManyToManyField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "many_to_many": true,
                        ###               "one_to_many": false,
                        ###               "one_to_one": false,
                        ###               "remote_field": "<ManyToManyRel: custom_user.user>"
                        ###           },
                        ###           "last_name": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "max_length": 150
                        ###           },
                        ###           "location": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "max_length": 30
                        ###           },
                        ###           "otp_used_while_passlogin_create": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": false,
                        ###               "max_length": 6
                        ###           },
                        ###           "recent_otp_used_for_pass_change": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": false,
                        ###               "max_length": 6
                        ###           },
                        ###           "user_permissions": {
                        ###               "000_class": "<class 'django.db.models.fields.related.ManyToManyField'>",
                        ###               "001_default": "",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": true,
                        ###               "many_to_many": true,
                        ###               "one_to_many": false,
                        ###               "one_to_one": false,
                        ###               "remote_field": "<ManyToManyRel: custom_user.user>"
                        ###           }
                        ###       },
                        ###       "003_auto_now_add__OR__auto_now******************************************************": {
                        ###           "creation_date": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "003_auto_now_add": true,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true,
                        ###               "editable": false
                        ###           },
                        ###           "modified_date": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "004_auto_now": true,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true,
                        ###               "editable": false
                        ###           }
                        ###       },
                        ###       "004_auto_created********************************************************************": {
                        ###           "User_groups+": {
                        ###               "000_class": "<class 'django.db.models.fields.reverse_related.ManyToOneRel'>",
                        ###               "002_auto_created": true,
                        ###               "005_null": true,
                        ###               "editable": false,
                        ###               "hidden": true,
                        ###               "many_to_many": false,
                        ###               "one_to_many": true,
                        ###               "one_to_one": false,
                        ###               "remote_field": [
                        ###                   "<django.db.models.fields.related.ForeignKey: user>",
                        ###                   "STR: custom_user.User_groups.user"
                        ###               ]
                        ###           },
                        ###           "User_user_permissions+": {
                        ###               "000_class": "<class 'django.db.models.fields.reverse_related.ManyToOneRel'>",
                        ###               "002_auto_created": true,
                        ###               "005_null": true,
                        ###               "editable": false,
                        ###               "hidden": true,
                        ###               "many_to_many": false,
                        ###               "one_to_many": true,
                        ###               "one_to_one": false,
                        ###               "remote_field": [
                        ###                   "<django.db.models.fields.related.ForeignKey: user>",
                        ###                   "STR: custom_user.User_user_permissions.user"
                        ###               ]
                        ###           },
                        ###           "id": {
                        ###               "000_class": "<class 'django.db.models.fields.AutoField'>",
                        ###               "002_auto_created": true,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": true,
                        ###               "primary_key": true,
                        ###               "unique": true
                        ###           },
                        ###           "logentry": {
                        ###               "000_class": "<class 'django.db.models.fields.reverse_related.ManyToOneRel'>",
                        ###               "002_auto_created": true,
                        ###               "005_null": true,
                        ###               "editable": false,
                        ###               "many_to_many": false,
                        ###               "one_to_many": true,
                        ###               "one_to_one": false,
                        ###               "remote_field": [
                        ###                   "<django.db.models.fields.related.ForeignKey: user>",
                        ###                   "STR: admin.LogEntry.user"
                        ###               ]
                        ###           },
                        ###           "usersessionlog": {
                        ###               "000_class": "<class 'django.db.models.fields.reverse_related.ManyToOneRel'>",
                        ###               "002_auto_created": true,
                        ###               "005_null": true,
                        ###               "editable": false,
                        ###               "many_to_many": false,
                        ###               "one_to_many": true,
                        ###               "one_to_one": false,
                        ###               "remote_field": [
                        ###                   "<django.db.models.fields.related.ForeignKey: user>",
                        ###                   "STR: custom_user.UserSessionLog.user"
                        ###               ]
                        ###           }
                        ###       },
                        ###       "005_default_not_empty_string********************************************************": {
                        ###@@@@       "date_joined": {
                        ###               "000_class": "<class 'django.db.models.fields.DateTimeField'>",
                        ###               "001_default": [
                        ###                   "datetime.datetime(2019, 10, 12, 1, 16, 2, 339774, tzinfo=<UTC>)",
                        ###                   "STR: 2019-10-12 01:16:02.339774+00:00"
                        ###               ],
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###@@@@       "is_active": {
                        ###               "000_class": "<class 'django.db.models.fields.BooleanField'>",
                        ###               "001_default": false,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "is_staff": {
                        ###               "000_class": "<class 'django.db.models.fields.BooleanField'>",
                        ###               "001_default": false,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "is_superuser": {
                        ###               "000_class": "<class 'django.db.models.fields.BooleanField'>",
                        ###               "001_default": false,
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": false,
                        ###               "007_blank": false
                        ###           },
                        ###           "password": {
                        ###               "000_class": "<class 'django.db.models.fields.CharField'>",
                        ###               "001_default": "pbkdf2_sha256$150000$zV7im78Gkp9T$zv2vl1sYuqtAaoWhjn7jpdHIoY2mzFKrtsN9MiR37SQ=",
                        ###               "005_null": false,
                        ###               "006_empty_strings_allowed": true,
                        ###               "007_blank": false,
                        ###               "max_length": 128
                        ###           }
                        ###       }
                        ###   }

                    time_now = timezone.now()
                    # if we do timezone.now(), (with a comma then it will save as tuple and will give error)
                    newuser = User(
                        email=payload['email'],
                        first_otp_used_for_otplogin=payload['OTP'],
                        date_of_first_otp_used_for_otplogin=time_now,
                        last_login2=time_now,
                        recentdate_login_via_otp=time_now,
                        is_active=True,
                        # we use timezone.now without brackets in default, so if dont convert to string it throws error
                        # expected string or bytes-like object @ dateparse.py in parse_datetime, line 106
                        date_joined=time_now
                        )
                    newuser.save()

                    if newuser.is_active:
                        login(request,newuser,backend='django.contrib.auth.backends.ModelBackend')
                    else:
                        messages(email, ' :not active')
                        return redirect('login_register_password_namespace:user_login_via_otp_form_email')


                    # Get the client ip:
                    ip = settings.get_client_ip(request)

                    action_type = ActionTypeForUserSessionLog.objects.get(action='login_by_otp')



                    # Save in the session
                    new_UserSessionLog = UserSessionLog(
                        user_email=newuser.email,
                        ip_address = ip,
                        user = newuser,
                        otp_used_for_otplogin=payload['OTP'],
                        action_type=action_type,
                        device_type=request.META['HTTP_USER_AGENT'],
                        created_time=time_now
                    )

                    new_UserSessionLog.save()

                messages.success(request, 'Login successful')
                return redirect('articles_namespace:articles')

            form.add_error(None,"Form Error: Wrong OTP entered")
            return render(request, 'login_register_password/login_via_otp/user_login_via_otp_form_otp.html',{'form': form})
    else:
        #logger_custom_string.debug(request.GET.get('resendotp'))
        #logger_custom_string.debug(settings.pp_dict(request.GET))
        #logger_custom_string.debug('resendotp' in request.GET)

        if 'resendotp' in request.GET:

            email = payload['email']
            # generate a random pin using crpto functions
            pin = get_random_string(length=6, allowed_chars='1234567890')
            
            # EMAIL subject and BODY
            # for BODY we use a template and render it with parameters
            subject = pin + ': To Login via OTP'
            # We to create the email body. So we create a template and pass the required arguments.
            # render_to_string will render the template with the context values
            message = render_to_string('login_register_password/login_via_otp/email/login_otp_sendemail.html', {
                'email': email,
                'pin': pin
            })

            # USING CELERY TASK for sending email Asynchronously
            #match.email_user(subject, message). This will delay the response 
            # So will do this task asynchronously using celery
            # We have created a celery task. Using it we will send the email.
            # The code does not have to wait till the email is sent
            send_email_task.delay(email,subject,message)

            #USING MESSAGES to inform the user in the next page about email is being sent
            #we want to inform the user on the next page that email is being sent for OTP
            #For this we use messages
            messages.success(request, 'Email is being sent please check')

            payload = {
                'email': email,
                'OTP': pin,
                'creation_time': str(datetime.datetime.now(tz=pytz.timezone('UTC')).isoformat())
            }

            jwt_token = jwt.encode(payload, settings.SECRET_KEY, algorithm='HS256').decode('utf-8')
            # USING SESSION to make data available to next view.
            #For the next page we want to send some data which we dont want to display.
            request.session['jwt_token'] = jwt_token
            #logger_custom_string.debug(jwt_token)

        else:
            # Want to check no one access this page directy. But only through the user_login_via_otp_form_email pages
            try:
                prev_url = request.META['HTTP_REFERER']

                # we want to get the url from namespace . We use reverse. But this give relative url not the full url with domain
                login_form_email_url_reverse = reverse("login_register_password_namespace:user_login_via_otp_form_email")
                # to get the full url we have to use do the below
                login_form_email_url_reverse_full = request.build_absolute_uri(login_form_email_url_reverse)

                #logger_custom_string.debug(prev_url)
                #logger_custom_string.debug(login_form_email_url_reverse_full)
                if prev_url != login_form_email_url_reverse_full:
                    #logger_custom_string.debug(prev_url != login_form_email_url_reverse_full)
                    return redirect('login_register_password_namespace:user_login_via_otp_form_email')
            except Exception as e:
                messages.error(request, str(e))
                #logger_custom_string.debug(str(e))
                return redirect('login_register_password_namespace:user_login_via_otp_form_email')

        form = UserLoginViaOtpFormOTP(initial={'otp_loginconfirm': payload['OTP']})
    return render(request, 'login_register_password/login_via_otp/user_login_via_otp_form_otp.html',{'form': form})
Ejemplo n.º 30
0
def update_data(country_model, request):

    # Retrieve data_set from the given country
    try:
       data_set = country_model.data
    
    except ObjectDoesNotExist:
        data_set = Data(
            key = country_model,
            response_code=0,    
            raw_data={}, 
            derived_data={},
            update_date=timezone.now()
        )

    # Create the query from the saved information
    query = {
        "resource": country_model.resource_url,
        "section":  1,
        "format":   "json",
    }

    # Run the query
    try:
        r =  requests.get(
                    country_model.api_endpoint,
                    params={
                        "q": json.dumps(query),
                    }
        )

    # If the query didn't succeed, return with an error 
    except:
        messages.error(request, "Data retrieval failed! Please check API status.")
        return

    # If the status code isn't 200, return with errors.
    if r.status_code != 200:
        
        data_set.response_code = r.status_code
        data_set.save()
        messages.error(request, "Non-standard response from API! Please check API status.")
        return 

    # Otherwise instatiate and populate the necessary variables 
    # to save the raw and derived data
    try:
        # Calculate all the needed data
        response = r.json()
        average_cases = 0
        average_fatalities = 0
        cases = 0
        deaths = 0
        for i in range(7):
            cases = int(response[-i-1].get("Number of confirmed cases")) - int(response[-i-2].get("Number of confirmed cases"))
            deaths = int(response[-i-1].get("Number of death cases")) - int(response[-i-2].get("Number of death cases"))
            average_cases += cases   
            average_fatalities += deaths

        # Create the needed JSON objects
        raw = { 
            "date":{
                "label": "Data last updated", 
                "data":response[-1].get("As of date")},
            "total_cases": {
                "label": "Total Cases", 
                "data":response[-1].get("Number of confirmed cases")
            },
            "total_deaths":{
                "label": "Total Deaths", 
                "data":response[-1].get("Number of death cases")
            },
        }

        derived = { 
            "new_cases": {  
                "label": "Cases as of last update", 
                "data": int(response[-1].get("Number of confirmed cases")) - int(response[-2].get("Number of confirmed cases")),
            },
            "average_cases": { 
                "label": "7-Day rolling average of cases", 
                "data": int(average_cases/7),
            },
            "cases_per_mil": {  
                "label": "Cases per million people", 
                "data": int(response[-1].get("Number of confirmed cases")/(country_model.est_population/1000000)),
            },
            "new_deaths": {
                "label": "Deaths as of last update", 
                "data": deaths,
            },
            "average_fatalities": { 
                "label": "7-Day rolling average of deaths", 
                "data": int(average_fatalities/7),
            },
            "deaths_per_mil": {
                "label": "Deaths per million people", 
                "data": int(response[-1].get("Number of death cases")/(country_model.est_population/1000000)),
            },
        }

        # Save updates in dataset 
        try:
            data_set.response_code=r.status_code
            data_set.raw_data=raw
            data_set.derived_data=derived
            data_set.update_date=timezone.now()

            data_set.save()

        #If this fails the database is not accessible 
        except:
            messages(request, "Unable to store data in database. Please reload page.")

    # If the derived data can't be computed, the API must have sent bad
    # data. 
    except:
        messages.error(request, 'Data sent by API is not parseable. Please check location API.')
        return

    messages.success(request, "Data successfully updated.")
    return
Ejemplo n.º 31
0
def search(request):
    """Return search results"""
    # Authentication
    if not request.user.is_authenticated:
        return HttpResponse(status=401)
    # GET
    if request.method == 'GET':
        return render(request, 'rides/search.html')
    # POST
    if request.method == 'POST':
        search_as = request.POST.get('search_as')
        if search_as not in ['driver', 'sharer']:
            return HttpResponse(status=404)
        if search_as == 'driver':
            user = get_object_or_404(User, id=request.user.id)
            # search as driver, but doesn't have a driver account
            if not user.driverProfile.is_driver:
                messages(request, 'You are not a driver.')
                return redirect('dashboard')

            driver_vehicle_type = user.driverProfile.vehicle_type
            driver_special_vehicle_info = user.driverProfile.special_vehicle_info
            driver_maximum_passengers = user.driverProfile.maximum_passengers

            print('What is driver\'s vehicle:', driver_vehicle_type)

            rides = Ride.objects.order_by('-id').filter(
                Q(ride_status='open'),
                Q(requested_vehicle_type='')
                | Q(requested_vehicle_type=driver_vehicle_type),
                Q(special_request='')
                | Q(special_request=driver_special_vehicle_info),
                Q(passenger_number_in_total__lte=driver_maximum_passengers),
                ~Q(owner_id=user.id) & ~Q(sharers__id=user.id))

            for ride in rides:
                print(ride.requested_vehicle_type == driver_vehicle_type)

            print('How many rides:', len(rides))
            context = {
                'rides': rides,
                'search_as_driver': True,
            }
            return render(request, 'rides/search_results.html', context)
        # search as a sharer
        else:
            user = get_object_or_404(User, id=request.user.id)

            destination = request.POST['destination']
            number_of_passengers = int(request.POST['number_of_passengers'])
            earliest_arrival_time = str_to_datetime(
                request.POST['earliest_arrival_time'])
            latest_arrival_time = str_to_datetime(
                request.POST['latest_arrival_time'])

            rides = Ride.objects.order_by('-id').filter(
                Q(ride_status='open'),
                Q(can_be_shared=True),
                Q(passenger_number_in_total__lte=number_of_passengers),
                Q(destination=destination),
                Q(required_arrival_time__gte=earliest_arrival_time)
                & Q(required_arrival_time__lte=latest_arrival_time),
                ~Q(owner_id=user.id) & ~Q(sharers__id=user.id)
                & ~Q(driver_id=user.id),
            )

            context = {
                'rides': rides,
                'search_as_sharer': True,
            }
            return render(request, 'rides/search_results.html', context)