예제 #1
0
def start_cisco_eox_api_sync_now(request):
    """View that starts an Cisco EoX synchronization and redirects to the given URL
    or the main settings page.

    :param request:
    :return:
    """
    current_id = cache.get("CISCO_EOX_API_SYN_IN_PROGRESS", None)
    if current_id:
        logger.info(
            "task already scheduled, redirect to in-progress dialog (%s)" %
            current_id)
        return redirect(
            reverse("task_in_progress", kwargs={"task_id": current_id}))

    task = tasks.execute_task_to_synchronize_cisco_eox_states.delay(
        ignore_periodic_sync_flag=True)
    set_meta_data_for_task(
        task_id=task.id,
        title="Synchronize local database with Cisco EoX API",
        auto_redirect=False,
        redirect_to=reverse("productdb_config:status"))
    cache.set("CISCO_EOX_API_SYN_IN_PROGRESS", task.id,
              60 * 60 * 3)  # timeout after 3 hours, should not take longer

    return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))
예제 #2
0
def import_product_migrations(request):
    context = {}
    if request.method == "POST":
        form = ImportProductMigrationFileUploadForm(request.POST,
                                                    request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES['excel_file'])
            job_file.save()

            eta = now() + timedelta(seconds=3)
            task = tasks.import_product_migrations.apply_async(
                eta=eta,
                kwargs={
                    "job_file_id": job_file.id,
                    "user_for_revision": request.user.username
                })

            set_meta_data_for_task(
                task_id=task.id,
                title="Import product migrations from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_product_migrations"))

            return redirect(
                reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductMigrationFileUploadForm()

    context["form"] = form

    return render(request,
                  "productdb/import/import_product_migrations.html",
                  context=context)
예제 #3
0
def import_product_migrations(request):
    context = {}
    if request.method == "POST":
        form = ImportProductMigrationFileUploadForm(request.POST, request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES["excel_file"])
            job_file.save()

            task = tasks.import_product_migrations.delay(
                job_file_id=job_file.id, user_for_revision=request.user.username
            )
            set_meta_data_for_task(
                task_id=task.id,
                title="Import product migrations from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_product_migrations"),
            )

            return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductMigrationFileUploadForm()

    context["form"] = form

    return render(request, "productdb/import/import_product_migrations.html", context=context)
예제 #4
0
def import_products(request):
    """import of products using Excel
    :param request:
    :return:
    """
    context = {}
    if request.method == "POST":
        form = ImportProductsFileUploadForm(request.user, request.POST, request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES["excel_file"])
            job_file.save()

            task = tasks.import_price_list.delay(
                job_file_id=job_file.id,
                create_notification_on_server=not form.cleaned_data["suppress_notification"],
                update_only=form.cleaned_data["update_existing_products_only"],
                user_for_revision=request.user.username,
            )
            set_meta_data_for_task(
                task_id=task.id,
                title="Import products from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_products"),
            )

            return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductsFileUploadForm(request.user)

    context["form"] = form

    return render(request, "productdb/import/import_products.html", context=context)
    def test_reaction_on_task_meta_data(self):
        # the redirect behavior is tested within the selenium test cases
        set_meta_data_for_task(task_id="mock_task_id",
                               title="My Test Task",
                               redirect_to=reverse("productdb:home"))
        url = reverse(self.URL_NAME, kwargs={"task_id": "mock_task_id"})
        request = RequestFactory().get(url)
        request.user = User.objects.create(username="******",
                                           is_superuser=False,
                                           is_staff=False)
        response = views.task_progress_view(request, "mock_task_id")

        assert response.status_code == 200, "Should be callable"
        assert "My Test Task" in response.content.decode()
    def test_custom_celery_task_meta_data(self):
        # custom meta data are used for the process watch view
        test_task_id = uuid.uuid4()
        test_title = "Custom Title"
        celery.set_meta_data_for_task(test_task_id, test_title)

        result = celery.get_meta_data_for_task(test_task_id)

        assert type(result) is dict
        assert "title" in result
        assert "auto_redirect" in result
        assert "redirect_to" not in result
        assert result["title"] == test_title
        assert result["auto_redirect"] is True
예제 #7
0
    def test_custom_celery_task_meta_data(self):
        # custom meta data are used for the process watch view
        test_task_id = uuid.uuid4()
        test_title = "Custom Title"
        celery.set_meta_data_for_task(test_task_id, test_title)

        result = celery.get_meta_data_for_task(test_task_id)

        assert type(result) is dict
        assert "title" in result
        assert "auto_redirect" in result
        assert "redirect_to" not in result
        assert result["title"] == test_title
        assert result["auto_redirect"] is True
    def test_reaction_on_task_meta_data(self):
        # the redirect behavior is tested within the selenium test cases
        set_meta_data_for_task(
            task_id="mock_task_id",
            title="My Test Task",
            redirect_to=reverse("productdb:home")
        )
        url = reverse(self.URL_NAME, kwargs={"task_id": "mock_task_id"})
        request = RequestFactory().get(url)
        request.user = mixer.blend("auth.User", is_superuser=False, is_staff=False)
        response = views.task_progress_view(request, "mock_task_id")

        assert response.status_code == 200, "Should be callable"
        assert "My Test Task" in response.content.decode()
    def test_custom_celery_task_meta_data_without_auto_redirect(self):
        # custom meta data are used for the process watch view
        test_task_id = uuid.uuid4()
        test_title = "Custom Title"
        test_redirect = "/productdb/"
        celery.set_meta_data_for_task(test_task_id, test_title, redirect_to=test_redirect, auto_redirect=False)

        result = celery.get_meta_data_for_task(test_task_id)

        assert type(result) is dict
        assert "title" in result
        assert "auto_redirect" in result
        assert "redirect_to" in result
        assert result["title"] == test_title
        assert result["auto_redirect"] is False
        assert result["redirect_to"] == test_redirect
예제 #10
0
def import_products(request):
    """
    import of products using Excel
    :param request:
    :return:
    """
    context = {}
    if request.method == "POST":
        form = ImportProductsFileUploadForm(request.POST, request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES['excel_file'])
            job_file.save()

            if request.user.is_superuser:
                # only the superuser is allowed to add a server notification message
                create_notification = not form.cleaned_data[
                    "suppress_notification"]

            else:
                # all other users are not allowed to add a server notification
                create_notification = False

            task = tasks.import_price_list.delay(
                job_file_id=job_file.id,
                create_notification_on_server=create_notification,
                user_for_revision=request.user.username)
            set_meta_data_for_task(
                task_id=task.id,
                title="Import products from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_products"))

            return redirect(
                reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductsFileUploadForm(
            initial={"suppress_notification": True})
        if not request.user.is_superuser:
            form.fields["suppress_notification"].disabled = True

    context['form'] = form

    return render(request,
                  "productdb/import/import_products.html",
                  context=context)
예제 #11
0
def create_product_check(request):
    """
    create a Product Check and schedule task
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    if request.method == "POST":
        form = ProductCheckForm(request.POST)

        if form.is_valid():
            if form.cleaned_data["public_product_check"]:
                form.instance.create_user = None

            form.save()

            # dispatch task
            task = tasks.perform_product_check.delay(form.instance.id)
            set_meta_data_for_task(
                task_id=task.id,
                title="Product check",
                auto_redirect=True,
                redirect_to=reverse("productdb:detail-product_check", kwargs={"product_check_id": form.instance.id}),
            )
            logger.info("create product check with ID %d on task %s" % (form.instance.id, task.id))

            return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ProductCheckForm(
            initial={"create_user": request.user.id, "public_product_check": False if request.user.id else True}
        )

        # if user is not logged in, create always a public check
        if not request.user.id:
            form.fields["public_product_check"].widget.attrs["disabled"] = True

    choose_migration_source = request.user.profile.choose_migration_source if request.user.is_authenticated() else False

    return render(
        request,
        "productdb/product_check/create-product_check.html",
        context={"form": form, "choose_migration_source": choose_migration_source},
    )
예제 #12
0
def import_products(request):
    """import of products using Excel
    :param request:
    :return:
    """
    context = {}
    if request.method == "POST":
        form = ImportProductsFileUploadForm(request.user, request.POST,
                                            request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES['excel_file'])
            job_file.save()

            eta = now() + timedelta(seconds=3)
            task = tasks.import_price_list.apply_async(
                eta=eta,
                kwargs={
                    "job_file_id":
                    job_file.id,
                    "create_notification_on_server":
                    not form.cleaned_data["suppress_notification"],
                    "update_only":
                    form.cleaned_data["update_existing_products_only"],
                    "user_for_revision":
                    request.user.username
                })

            set_meta_data_for_task(
                task_id=task.id,
                title="Import products from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_products"))

            return redirect(
                reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductsFileUploadForm(request.user)

    context['form'] = form

    return render(request,
                  "productdb/import/import_products.html",
                  context=context)
예제 #13
0
def import_products(request):
    """
    import of products using Excel
    :param request:
    :return:
    """
    context = {}
    if request.method == "POST":
        form = ImportProductsFileUploadForm(request.POST, request.FILES)
        if form.is_valid():
            # file is valid, save and execute the import job
            job_file = JobFile(file=request.FILES['excel_file'])
            job_file.save()

            if request.user.is_superuser:
                # only the superuser is allowed to add a server notification message
                create_notification = not form.cleaned_data["suppress_notification"]

            else:
                # all other users are not allowed to add a server notification
                create_notification = False

            task = tasks.import_price_list.delay(
                job_file_id=job_file.id,
                create_notification_on_server=create_notification,
                user_for_revision=request.user.username
            )
            set_meta_data_for_task(
                task_id=task.id,
                title="Import products from Excel sheet",
                auto_redirect=False,
                redirect_to=reverse("productdb:import_products")
            )

            return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ImportProductsFileUploadForm(initial={"suppress_notification": True})
        if not request.user.is_superuser:
            form.fields["suppress_notification"].disabled = True

    context['form'] = form

    return render(request, "productdb/import/import_products.html", context=context)
예제 #14
0
    def test_custom_celery_task_meta_data_without_auto_redirect(self):
        # custom meta data are used for the process watch view
        test_task_id = uuid.uuid4()
        test_title = "Custom Title"
        test_redirect = "/productdb/"
        celery.set_meta_data_for_task(test_task_id,
                                      test_title,
                                      redirect_to=test_redirect,
                                      auto_redirect=False)

        result = celery.get_meta_data_for_task(test_task_id)

        assert type(result) is dict
        assert "title" in result
        assert "auto_redirect" in result
        assert "redirect_to" in result
        assert result["title"] == test_title
        assert result["auto_redirect"] is False
        assert result["redirect_to"] == test_redirect
예제 #15
0
def start_cisco_eox_api_sync_now(request):
    """View that starts an Cisco EoX synchronization and redirects to the given URL
    or the main settings page.

    :param request:
    :return:
    """
    current_id = cache.get("CISCO_EOX_API_SYN_IN_PROGRESS", None)
    if current_id:
        logger.info("task already scheduled, redirect to in-progress dialog (%s)" % current_id)
        return redirect(reverse("task_in_progress", kwargs={"task_id": current_id}))

    task = tasks.execute_task_to_synchronize_cisco_eox_states.delay(ignore_periodic_sync_flag=True)
    set_meta_data_for_task(
        task_id=task.id,
        title="Synchronize local database with Cisco EoX API",
        auto_redirect=False,
        redirect_to=reverse("productdb_config:status")
    )
    cache.set("CISCO_EOX_API_SYN_IN_PROGRESS", task.id, 60*60*3)  # timeout after 3 hours, should not take longer

    return redirect(reverse("task_in_progress", kwargs={"task_id": task.id}))
예제 #16
0
def create_product_check(request):
    """
    create a Product Check and schedule task
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    if request.method == "POST":
        form = ProductCheckForm(request.POST)

        if form.is_valid():
            if form.cleaned_data["public_product_check"]:
                form.instance.create_user = None

            form.save()

            # dispatch task
            eta = now() + timedelta(seconds=3)
            task = tasks.perform_product_check.apply_async(
                eta=eta, args=(form.instance.id, ))

            set_meta_data_for_task(
                task_id=task.id,
                title="Product check",
                auto_redirect=True,
                redirect_to=reverse(
                    "productdb:detail-product_check",
                    kwargs={"product_check_id": form.instance.id}))

            logger.info("create product check with ID %d on task %s" %
                        (form.instance.id, task.id))

            return redirect(
                reverse("task_in_progress", kwargs={"task_id": task.id}))

    else:
        form = ProductCheckForm(
            initial={
                "create_user": request.user.id,
                "public_product_check": False if request.user.id else True
            })

        # if user is not logged in, create always a public check
        if not request.user.id:
            form.fields["public_product_check"].widget.attrs['disabled'] = True

    choose_migration_source = request.user.profile.choose_migration_source if request.user.is_authenticated(
    ) else False

    worker_is_active = is_worker_active()

    if getattr(settings, "CELERY_ALWAYS_EAGER", False):
        # if celery always eager is enabled, it works without worker
        worker_is_active = True

    return render(request,
                  "productdb/product_check/create-product_check.html",
                  context={
                      "form": form,
                      "choose_migration_source": choose_migration_source,
                      "worker_is_active": worker_is_active
                  })