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}))
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)
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)
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
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
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)
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}, )
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)
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)
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}))
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 })