Esempio n. 1
0
def test_login_required_if_login_only_mode(monkeypatch):
    user = mixer.blend("auth.User")

    # enabled Login only mode
    monkeypatch.setattr(utils, "AppSettings", LoginOnlyModelSettingsMock)

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = AnonymousUser()
    assert login_required_if_login_only_mode(request) is True, \
        "Anonymous users must login and should be redirected"

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = user
    assert login_required_if_login_only_mode(request) is False, \
        "Authenticated users are logged in and should not be redirected"

    # value should be cached
    assert cache.get("LOGIN_ONLY_MODE_SETTING", None) is not None

    # disable Login only mode and clear cache value
    cache.delete("LOGIN_ONLY_MODE_SETTING")
    monkeypatch.setattr(utils, "AppSettings", NoLoginOnlyModelSettingsMock)

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = AnonymousUser()
    assert login_required_if_login_only_mode(request) is False, \
        "Anonymous users are logged in and should not be redirected"

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = user
    assert login_required_if_login_only_mode(request) is False, \
        "Authenticated users are logged in and should not be redirected"
def test_login_required_if_login_only_mode(monkeypatch):
    user = mixer.blend("auth.User")

    # enabled Login only mode
    monkeypatch.setattr(utils, "AppSettings", LoginOnlyModelSettingsMock)

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = AnonymousUser()
    assert login_required_if_login_only_mode(request) is True, \
        "Anonymous users must login and should be redirected"

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = user
    assert login_required_if_login_only_mode(request) is False, \
        "Authenticated users are logged in and should not be redirected"

    # value should be cached
    assert cache.get("LOGIN_ONLY_MODE_SETTING", None) is not None

    # disable Login only mode and clear cache value
    cache.delete("LOGIN_ONLY_MODE_SETTING")
    monkeypatch.setattr(utils, "AppSettings", NoLoginOnlyModelSettingsMock)

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = AnonymousUser()
    assert login_required_if_login_only_mode(request) is False, \
        "Anonymous users are logged in and should not be redirected"

    request = RequestFactory().get(reverse("productdb:home"))
    request.user = user
    assert login_required_if_login_only_mode(request) is False, \
        "Authenticated users are logged in and should not be redirected"
Esempio n. 3
0
def detail_product_check(request, product_check_id):
    """
    detail view of a Product Check
    :param request:
    :param product_check_id:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    product_check = ProductCheck.objects.filter(id=product_check_id).prefetch_related(
        "productcheckentry_set",
        "productcheckentry_set__product_in_database",
        "productcheckentry_set__migration_product",
    ).first()

    if product_check is None:
        raise Http404("Product check with ID %s not found in database" % product_check_id)

    # if the product check is in progress, redirect to task-watch page
    if product_check.in_progress:
        return redirect(reverse("task_in_progress", kwargs={"task_id": product_check.task_id}))

    return render(request, "productdb/product_check/detail-product_check.html", context={
        "product_check": product_check,
        "back_to": request.GET.get("back_to") if request.GET.get("back_to") else reverse("productdb:list-product_checks")
    })
Esempio n. 4
0
def browse_vendor_products(request):
    """Browse vendor specific products in the database
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    context = {"vendors": Vendor.objects.all()}
    selected_vendor = 1  # use ID 1 by default

    if request.method == "POST":
        vendor_id_str = [
            str(e) for e in context["vendors"].values_list("id", flat=True)
        ]
        if request.POST['vendor_selection'] in vendor_id_str:
            selected_vendor = request.POST['vendor_selection']

    else:
        if request.user.is_authenticated():
            selected_vendor = request.user.profile.preferred_vendor.id

    context['vendor_selection'] = selected_vendor

    return render(request,
                  "productdb/browse/view_products_by_vendor.html",
                  context=context)
Esempio n. 5
0
def detail_product_check(request, product_check_id):
    """
    detail view of a Product Check
    :param request:
    :param product_check_id:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    try:
        product_check = ProductCheck.objects.prefetch_related(
            "productcheckentry_set",
            "productcheckentry_set__product_in_database",
            "productcheckentry_set__migration_product",
        ).get(id=product_check_id)

    except ProductCheck.DoesNotExist:
        raise Http404("Product check with ID %s not found in database" % product_check_id)

    # if the product check is in progress, redirect to task-watch page
    if product_check.in_progress:
        return redirect(reverse("task_in_progress", kwargs={"task_id": product_check.task_id}))

    return render(
        request,
        "productdb/product_check/detail-product_check.html",
        context={
            "product_check": product_check,
            "back_to": request.GET.get("back_to")
            if request.GET.get("back_to")
            else reverse("productdb:list-product_checks"),
        },
    )
Esempio n. 6
0
def detail_product_group(request, product_group_id=None):
    """detail view for a product group"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    if not product_group_id:
        # if product_group_id is set to none, redirect to the all products groups view
        return redirect(reverse("productdb:list-product_groups"))

    else:
        try:
            pg = ProductGroup.objects.get(id=product_group_id)
        except:
            raise Http404("Product Group with ID %s not found in database" %
                          product_group_id)

    context = {
        "product_group":
        pg,
        "back_to":
        request.GET.get("back_to") if request.GET.get("back_to") else
        reverse("productdb:list-product_groups")
    }

    return render(request,
                  "productdb/product_group/detail-product_group.html",
                  context=context)
Esempio n. 7
0
def task_progress_view(request, task_id):
    """Progress view for an asynchronous task"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    default_title = "Please wait..."
    redirect_default = reverse("productdb:home")
    meta_data = get_meta_data_for_task(task_id)

    # title of the progress view
    if "title" in meta_data.keys():
        title = meta_data["title"]
    else:
        title = default_title

    # redirect after task is completed
    if "redirect_to" in meta_data.keys():
        redirect_to = meta_data["redirect_to"]
        auto_redirect = meta_data.get("auto_redirect", False)

    else:
        logger.warn(
            "Cannot find redirect link to task meta data, use homepage")
        redirect_to = redirect_default
        auto_redirect = False

    context = {
        "task_id": task_id,
        "title": title,
        "redirect_to": redirect_to,
        "auto_redirect": auto_redirect
    }
    return render(request,
                  "django_project/task_progress_view.html",
                  context=context)
Esempio n. 8
0
def task_progress_view(request, task_id):
    """Progress view for an asynchronous task"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    default_title = "Please wait..."
    redirect_default = reverse("productdb:home")
    meta_data = get_meta_data_for_task(task_id)

    # title of the progress view
    if "title" in meta_data.keys():
        title = meta_data["title"]
    else:
        title = default_title

    # redirect after task is completed
    if "redirect_to" in meta_data.keys():
        redirect_to = meta_data["redirect_to"]
        auto_redirect = meta_data.get("auto_redirect", False)

    else:
        logger.warn("Cannot find redirect link to task meta data, use homepage")
        redirect_to = redirect_default
        auto_redirect = False

    context = {
        "task_id": task_id,
        "title": title,
        "redirect_to": redirect_to,
        "auto_redirect": auto_redirect
    }
    return render(request, "django_project/task_progress_view.html", context=context)
Esempio n. 9
0
def list_product_groups(request):
    """browse all product groups in the database"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    return render(request,
                  "productdb/product_group/list-product_groups.html",
                  context={})
Esempio n. 10
0
def list_product_lists(request):
    """browse all product lists in the database"""
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    context = {"product_lists": ProductList.objects.all()}

    return render(request, "productdb/product_list/list-product_list.html", context=context)
Esempio n. 11
0
def about_view(request):
    """about view
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    return render(request, "productdb/about.html", context={})
Esempio n. 12
0
def browse_all_products(request):
    """Browse all products in the database
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    return render(request, "productdb/browse/view_products.html", context={})
Esempio n. 13
0
def about_view(request):
    """about view
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    return render(request, "productdb/about.html", context={})
Esempio n. 14
0
def browse_all_products(request):
    """Browse all products in the database
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    return render(request, "productdb/browse/view_products.html", context={})
Esempio n. 15
0
def home(request):
    """view for the homepage of the Product DB
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    # if the user is a super user, send a message if no backend worker process is running
    if request.user.is_authenticated and request.user.is_superuser:
        if not is_worker_active():
            messages.add_message(
                request,
                level=messages.ERROR,
                message="No backend worker process is running on the server. Please check the state of the application."
            )

    today_date = datetime.now().date()

    context = cache.get(HOMEPAGE_CONTEXT_CACHE_KEY)
    if not context:
        all_products_query = Product.objects.all()
        context = {
            "recent_events": NotificationMessage.objects.filter(
                created__gte=datetime.now(get_current_timezone()) - timedelta(days=30)
            ).order_by('-created')[:5],
            "vendors": [x.name for x in Vendor.objects.all() if x.name != "unassigned"],
            "product_count": all_products_query.count(),
            "product_lifecycle_count": all_products_query.filter(eox_update_time_stamp__isnull=False).count(),
            "product_no_eol_announcement_count": all_products_query.filter(
                eox_update_time_stamp__isnull=False,
                eol_ext_announcement_date__isnull=True
            ).count(),
            "product_eol_announcement_count": all_products_query.filter(
                eol_ext_announcement_date__isnull=False,
                end_of_sale_date__gt=today_date
            ).count(),
            "product_eos_count": all_products_query.filter(
                Q(end_of_sale_date__lte=today_date, end_of_support_date__gt=today_date)|
                Q(end_of_sale_date__lte=today_date, end_of_support_date__isnull=True)
            ).count(),
            "product_eol_count": all_products_query.filter(
                end_of_support_date__lte=today_date
            ).count(),
            "product_price_count": all_products_query.filter(list_price__isnull=False).count(),
        }
        cache.set(HOMEPAGE_CONTEXT_CACHE_KEY, context, timeout=60*10)

    context.update({
        "TB_HOMEPAGE_TEXT_BEFORE_FAVORITE_ACTIONS":
            TextBlock.objects.filter(name=TextBlock.TB_HOMEPAGE_TEXT_BEFORE_FAVORITE_ACTIONS).first(),
        "TB_HOMEPAGE_TEXT_AFTER_FAVORITE_ACTIONS":
            TextBlock.objects.filter(name=TextBlock.TB_HOMEPAGE_TEXT_AFTER_FAVORITE_ACTIONS).first(),
    })

    return render(request, "productdb/home.html", context=context)
Esempio n. 16
0
def list_product_lists(request):
    """browse all product lists in the database"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    context = {"product_lists": ProductList.objects.all()}

    return render(request,
                  "productdb/product_list/list-product_list.html",
                  context=context)
Esempio n. 17
0
def detail_product_list(request, product_list_id=None, share_link=False):
    """detail view for a product list
    :param request:
    :param product_list_id:
    :param share_link: will use a template that only shows the login link in the header
    :return:
    """
    if login_required_if_login_only_mode(request) and not share_link:
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    if not product_list_id:
        # if product_id is set to none, redirect to the all products view
        return redirect(reverse("productdb:list-product_lists"))

    else:
        try:
            pl = ProductList.objects.get(id=product_list_id)

        except:
            raise Http404("Product List with ID %s not found in database" % product_list_id)

    share_link_username = ""
    if request.user.is_authenticated():
        share_link_username = request.user.first_name

    # build share by email link content
    share_link_url = request.get_raw_uri().split("/productdb/")[0] + reverse(
        "productdb:share-product_list", kwargs={"product_list_id": product_list_id}
    )
    share_link_content = (
        "?Subject="
        + escape(pl.name + " - Product List")
        + "&body="
        + escape(
            "Hi,%%0D%%0Dplease take a look on the %s Product List:%%0D%%0D"
            "%s%%0D%%0DThank you.%%0D%%0DKind regards,%%0D%s" % (pl.name, share_link_url, share_link_username)
        )
    )

    context = {
        "product_list": pl,
        "share_link_content": share_link_content,
        "share_link": False if request.user.is_authenticated() else share_link,
        "share_link_url": share_link_url,
        "back_to": request.GET.get("back_to")
        if request.GET.get("back_to")
        else reverse("productdb:list-product_lists"),
    }

    if pl.description:
        context["export_description"] = pl.description.splitlines()[0] if len(pl.description.splitlines()) != 0 else ""

    return render(request, "productdb/product_list/detail-product_list.html", context=context)
Esempio n. 18
0
def server_messages_list(request):
    """
    show the server message log
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    context = {
        "recent_events": NotificationMessage.objects.all().order_by("-created")
    }

    return render(request, "config/notification-list.html", context=context)
Esempio n. 19
0
def server_messages_list(request):
    """
    show the server message log
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    context = {
        "recent_events": NotificationMessage.objects.all().order_by("-created")
    }

    return render(request, "config/notification-list.html", context=context)
Esempio n. 20
0
def detail_product_list(request, product_list_id=None, share_link=False):
    """detail view for a product list
    :param request:
    :param product_list_id:
    :param share_link: will use a template that only shows the login link in the header
    :return:
    """
    if login_required_if_login_only_mode(request) and not share_link:
        # redirect to the share link
        return redirect(reverse("productdb:share-product_list", kwargs={"product_list_id": product_list_id}))

    if not product_list_id:
        # if product_id is set to none, redirect to the all products view
        return redirect(reverse("productdb:list-product_lists"))

    else:
        try:
            pl = ProductList.objects.get(id=product_list_id)

        except:
            raise Http404("Product List with ID %s not found in database" % product_list_id)

    share_link_username = ""
    if request.user.is_authenticated:
        share_link_username = request.user.first_name

    # build share by email link content
    share_link_url = request.get_raw_uri().split("/productdb/")[0] + \
                     reverse("productdb:share-product_list", kwargs={"product_list_id": product_list_id})
    share_link_content = "?Subject=" + \
                         escape(pl.name + " - Product List") + \
                         "&body=" + \
                         escape("Hi,%%0D%%0Dplease take a look on the %s Product List:%%0D%%0D"
                                "%s%%0D%%0DThank you.%%0D%%0DKind regards,%%0D%s" % (pl.name,
                                                                                     share_link_url,
                                                                                     share_link_username))

    context = {
        "product_list": pl,
        "share_link_content": share_link_content,
        "share_link": False if request.user.is_authenticated else share_link,
        "share_link_url": share_link_url,
        "back_to": request.GET.get("back_to") if request.GET.get("back_to") else reverse("productdb:list-product_lists")
    }

    if pl.description:
        context["export_description"] = pl.description.splitlines()[0] if len(pl.description.splitlines()) != 0 else ""

    return render(request, "productdb/product_list/detail-product_list.html", context=context)
Esempio n. 21
0
def server_message_detail(request, message_id):
    """
    show a detailed server message
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    try:
        context = {
            "message": NotificationMessage.objects.get(id=message_id)
        }

        return render(request, "config/notification-detail.html", context=context)

    except:
        raise Http404()
Esempio n. 22
0
def server_message_detail(request, message_id):
    """
    show a detailed server message
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    try:
        context = {
            "message": NotificationMessage.objects.get(id=message_id)
        }

        return render(request, "config/notification-detail.html", context=context)

    except:
        raise Http404()
Esempio n. 23
0
def list_product_checks(request):
    """
    list all Product Checks that are available for the current user
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    product_checks = ProductCheck.objects.filter(
        Q(create_user__isnull=True) | Q(create_user__username=request.user.username)
    ).prefetch_related("productcheckentry_set", "productcheckentry_set__product_in_database")

    return render(
        request, "productdb/product_check/list-product_check.html", context={"product_checks": product_checks}
    )
Esempio n. 24
0
def home(request):
    """view for the homepage of the Product DB
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    today_date = datetime.now().date()

    context = cache.get(HOMEPAGE_CONTEXT_CACHE_KEY)
    if not context:
        all_products_query = Product.objects.all()
        context = {
            "recent_events": NotificationMessage.objects.filter(
                created__gte=datetime.now(get_current_timezone()) - timedelta(days=30)
            ).order_by("-created")[:5],
            "vendors": [x.name for x in Vendor.objects.all() if x.name != "unassigned"],
            "product_count": all_products_query.count(),
            "product_lifecycle_count": all_products_query.filter(eox_update_time_stamp__isnull=False).count(),
            "product_no_eol_announcement_count": all_products_query.filter(
                eox_update_time_stamp__isnull=False, eol_ext_announcement_date__isnull=True
            ).count(),
            "product_eol_announcement_count": all_products_query.filter(
                eol_ext_announcement_date__isnull=False, end_of_sale_date__gt=today_date
            ).count(),
            "product_eos_count": all_products_query.filter(
                Q(end_of_sale_date__lte=today_date, end_of_support_date__gt=today_date)
                | Q(end_of_sale_date__lte=today_date, end_of_support_date__isnull=True)
            ).count(),
            "product_eol_count": all_products_query.filter(end_of_support_date__lte=today_date).count(),
            "product_price_count": all_products_query.filter(list_price__isnull=False).count(),
        }
        cache.set(HOMEPAGE_CONTEXT_CACHE_KEY, context, timeout=60 * 10)

    context.update(
        {
            "TB_HOMEPAGE_TEXT_BEFORE_FAVORITE_ACTIONS": TextBlock.objects.filter(
                name=TextBlock.TB_HOMEPAGE_TEXT_BEFORE_FAVORITE_ACTIONS
            ).first(),
            "TB_HOMEPAGE_TEXT_AFTER_FAVORITE_ACTIONS": TextBlock.objects.filter(
                name=TextBlock.TB_HOMEPAGE_TEXT_AFTER_FAVORITE_ACTIONS
            ).first(),
        }
    )

    return render(request, "productdb/home.html", context=context)
Esempio n. 25
0
def list_product_checks(request):
    """
    list all Product Checks that are available for the current user
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    product_checks = ProductCheck.objects.filter(
        Q(create_user__isnull=True)|
        Q(create_user__username=request.user.username)
    ).prefetch_related("productcheckentry_set", "productcheckentry_set__product_in_database")

    return render(request, "productdb/product_check/list-product_check.html", context={
        "product_checks": product_checks
    })
Esempio n. 26
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},
    )
Esempio n. 27
0
def detail_product_group(request, product_group_id=None):
    """detail view for a product group"""
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    if not product_group_id:
        # if product_group_id is set to none, redirect to the all products groups view
        return redirect(reverse("productdb:list-product_groups"))

    else:
        try:
            pg = ProductGroup.objects.get(id=product_group_id)
        except:
            raise Http404("Product Group with ID %s not found in database" % product_group_id)

    context = {
        "product_group": pg,
        "back_to": request.GET.get("back_to")
        if request.GET.get("back_to")
        else reverse("productdb:list-product_groups"),
    }

    return render(request, "productdb/product_group/detail-product_group.html", context=context)
Esempio n. 28
0
def browse_vendor_products(request):
    """Browse vendor specific products in the database
    :param request:
    :return:
    """
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    context = {"vendors": Vendor.objects.all()}
    selected_vendor = 1  # use ID 1 by default

    if request.method == "POST":
        vendor_id_str = [str(e) for e in context["vendors"].values_list("id", flat=True)]
        if request.POST["vendor_selection"] in vendor_id_str:
            selected_vendor = request.POST["vendor_selection"]

    else:
        if request.user.is_authenticated():
            selected_vendor = request.user.profile.preferred_vendor.id

    context["vendor_selection"] = selected_vendor

    return render(request, "productdb/browse/view_products_by_vendor.html", context=context)
Esempio n. 29
0
def view_product_details(request, product_id=None):
    """view product details"""
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    if not product_id:
        # if product_id is set to none, redirect to the all products view
        return redirect(reverse("productdb:all_products"))

    else:
        try:
            view_product = Product.objects.prefetch_related("productmigrationoption_set", "vendor").get(id=product_id)
        except:
            raise Http404("Product with ID %s not found in database" % product_id)

    # identify migration options and render to dictionary for template
    dict_preferred_replacement_option = None
    dict_migration_paths = {}

    if view_product.has_migration_options():
        db_preferred_replacement_option = view_product.get_preferred_replacement_option()
        valid_replacement_product = db_preferred_replacement_option.get_valid_replacement_product()
        dict_preferred_replacement_option = {
            "migration_source": db_preferred_replacement_option.migration_source.name,
            "migration_product_info_url": db_preferred_replacement_option.migration_product_info_url,
            "comment": db_preferred_replacement_option.comment,
            "replacement_product_id": db_preferred_replacement_option.replacement_product_id,
            "is_valid_replacement": db_preferred_replacement_option.is_valid_replacement(),
            "is_replacement_in_db": db_preferred_replacement_option.is_replacement_in_db(),
            "get_valid_replacement_product": valid_replacement_product.id if valid_replacement_product else None,
            "link_to_preferred_option": None,
        }
        if (
            dict_preferred_replacement_option["is_valid_replacement"]
            and dict_preferred_replacement_option["is_replacement_in_db"]
        ):
            dict_preferred_replacement_option["link_to_preferred_option"] = reverse(
                "productdb:product-detail",
                kwargs={"product_id": dict_preferred_replacement_option["get_valid_replacement_product"]},
            )

    for migration_source_name in view_product.get_product_migration_source_names_set():
        db_migration_path = view_product.get_migration_path(migration_source_name)
        dict_migration_paths[migration_source_name] = []
        for pmo in db_migration_path:
            dict_migration_paths[migration_source_name].append(
                {
                    "replacement_product_id": pmo.replacement_product_id,
                    "is_replacement_in_db": pmo.is_replacement_in_db(),
                    "get_product_replacement_id": pmo.get_product_replacement_id(),
                    "comment": pmo.comment,
                    "migration_product_info_url": pmo.migration_product_info_url,
                    "is_valid_replacement": pmo.is_valid_replacement(),
                }
            )

    dict_migration_source_details = {}
    for e in ProductMigrationSource.objects.all():
        dict_migration_source_details[e.name] = {"description": e.description, "preference": e.preference}

    # process migration paths for the template
    context = {
        "product": view_product,
        "preferred_replacement_option": dict_preferred_replacement_option,
        "migration_paths": dict_migration_paths,
        "migration_source_details": dict_migration_source_details,
        "back_to": request.GET.get("back_to") if request.GET.get("back_to") else reverse("productdb:all_products"),
    }

    return render(request, "productdb/browse/product_detail.html", context=context)
Esempio n. 30
0
def list_product_groups(request):
    """browse all product groups in the database"""
    if login_required_if_login_only_mode(request):
        return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))

    return render(request, "productdb/product_group/list-product_groups.html", context={})
Esempio n. 31
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
                  })
Esempio n. 32
0
def view_product_details(request, product_id=None):
    """view product details"""
    if login_required_if_login_only_mode(request):
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

    if not product_id:
        # if product_id is set to none, redirect to the all products view
        return redirect(reverse("productdb:all_products"))

    else:
        try:
            view_product = Product.objects.prefetch_related(
                "productmigrationoption_set", "vendor").get(id=product_id)
        except:
            raise Http404("Product with ID %s not found in database" %
                          product_id)

    # identify migration options and render to dictionary for template
    dict_preferred_replacement_option = None
    dict_migration_paths = {}

    if view_product.has_migration_options():
        db_preferred_replacement_option = view_product.get_preferred_replacement_option(
        )
        valid_replacement_product = db_preferred_replacement_option.get_valid_replacement_product(
        )
        dict_preferred_replacement_option = {
            "migration_source":
            db_preferred_replacement_option.migration_source.name,
            "migration_product_info_url":
            db_preferred_replacement_option.migration_product_info_url,
            "comment":
            db_preferred_replacement_option.comment,
            "replacement_product_id":
            db_preferred_replacement_option.replacement_product_id,
            "is_valid_replacement":
            db_preferred_replacement_option.is_valid_replacement(),
            "is_replacement_in_db":
            db_preferred_replacement_option.is_replacement_in_db(),
            "get_valid_replacement_product":
            valid_replacement_product.id
            if valid_replacement_product else None,
            "link_to_preferred_option":
            None,
        }
        if dict_preferred_replacement_option["is_valid_replacement"] and \
                dict_preferred_replacement_option["is_replacement_in_db"]:
            dict_preferred_replacement_option[
                "link_to_preferred_option"] = reverse(
                    "productdb:product-detail",
                    kwargs={
                        "product_id":
                        dict_preferred_replacement_option[
                            "get_valid_replacement_product"]
                    })

    for migration_source_name in view_product.get_product_migration_source_names_set(
    ):
        db_migration_path = view_product.get_migration_path(
            migration_source_name)
        dict_migration_paths[migration_source_name] = []
        for pmo in db_migration_path:
            dict_migration_paths[migration_source_name].append({
                "replacement_product_id":
                pmo.replacement_product_id,
                "is_replacement_in_db":
                pmo.is_replacement_in_db(),
                "get_product_replacement_id":
                pmo.get_product_replacement_id(),
                "comment":
                pmo.comment,
                "migration_product_info_url":
                pmo.migration_product_info_url,
                "is_valid_replacement":
                pmo.is_valid_replacement(),
            })

    dict_migration_source_details = {}
    for e in ProductMigrationSource.objects.all():
        dict_migration_source_details[e.name] = {
            "description": e.description,
            "preference": e.preference
        }

    # process migration paths for the template
    context = {
        "product":
        view_product,
        "preferred_replacement_option":
        dict_preferred_replacement_option,
        "migration_paths":
        dict_migration_paths,
        "migration_source_details":
        dict_migration_source_details,
        "back_to":
        request.GET.get("back_to")
        if request.GET.get("back_to") else reverse("productdb:all_products")
    }

    return render(request,
                  "productdb/browse/product_detail.html",
                  context=context)