예제 #1
0
    def is_url_valid(self, language_code, field_name, url):
        """
        Ensure URL given is unique.

        Check through the pages translation model objects to make
        sure that the url given doesn't already exist.

        Possible failure cases:
        for new page:
        * URL already exists

        for existing page:
        * URL (other than owned by existing page) exists
        * URL exists in other languages of existing page
        """
        pages_ids = Page.objects.for_shop(get_shop(self.request)).values_list(
            "id", flat=True)
        qs = self._get_translation_model().objects.filter(
            url=url, master_id__in=pages_ids)
        if not self.instance.pk:
            if qs.exists():
                return False
        other_qs = qs.exclude(master=self.instance)
        if other_qs.exists():
            return False
        own_qs = qs.filter(master=self.instance).exclude(
            language_code=language_code)
        if own_qs.exists():
            return False
        return True
예제 #2
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_upload(self):
        request = self.request
        shop = get_shop(request)
        try:
            folder_id = int(request.POST.get("folder_id") or request.GET.get("folder_id") or 0)
            path = request.POST.get("path") or request.GET.get("path") or None
            if folder_id != 0:
                folder = _get_folder_query(shop).get(pk=folder_id)
            elif path:
                folder = get_or_create_folder(shop, path)
            else:
                folder = None  # Root folder upload. How bold!
        except Exception as exc:
            return JsonResponse({"error": "Invalid folder: %s" % force_text(exc)})

        try:
            upload_file = request.FILES["file"]

            if upload_file.content_type.startswith("image/"):
                filer_file = filer_image_from_upload(request, path=folder, upload_data=upload_file)
                _ensure_media_file(shop, filer_file)
            else:
                filer_file = filer_file_from_upload(request, path=folder, upload_data=upload_file)
                _ensure_media_file(shop, filer_file)
        except Exception as exc:
            return JsonResponse({"error": force_text(exc)})

        return JsonResponse({
            "file": _filer_file_to_json_dict(filer_file),
            "message": _("%(file)s uploaded to %(folder)s") % {
                "file": filer_file.label,
                "folder": get_folder_name(folder)
            }
        })
예제 #3
0
 def __init__(self, **kwargs):
     self.request = kwargs.pop("request")
     kwargs.setdefault("required_languages",
                       ())  # No required languages here
     super(PageForm, self).__init__(**kwargs)
     self.fields["parent"].queryset = Page.objects.filter(
         shop=get_shop(self.request))
예제 #4
0
파일: template.py 프로젝트: vituocgia/wshop
    def post(self, request):
        """
        Create the Script from template directly if the template does not have a bound form.

        If the script template has a bound form, redirect to the template configuration view.

        If no script template is found, redirect to the script list.
        """
        identifier = request.POST.get("id", None)
        script_template_class = get_identifier_to_object_map(SCRIPT_TEMPLATES_PROVIDE_CATEGORY).get(identifier)

        if script_template_class:
            script_template = script_template_class()

            # the template has a form for configuration.. lets redirect to the correct view
            if script_template.get_form():
                return redirect("wshop_admin:notify.script-template-config", id=identifier)
            else:
                shop = get_shop(request)
                script = script_template.create_script(shop)

                if script:
                    script.template = identifier
                    script.save(update_fields=["template"])
                    messages.success(request, _("Script created from template!"))

                return redirect("wshop_admin:notify.script.list")
        else:
            messages.error(request, _("Template Script not found!"))
            return redirect("wshop_admin:notify.script.list")
예제 #5
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_get_folder(self, data):
        shop = get_shop(self.request)
        try:
            folder_id = int(data.get("id", 0))
            if folder_id:
                folder = _get_folder_query(shop).get(pk=folder_id)
                subfolders = folder.get_children().filter(_get_folder_query_filter(shop))
                files = _get_file_query(shop, folder)
            else:
                folder = None
                subfolders = _get_folder_query(shop).filter(parent=None)
                files = _get_file_query(shop).filter(folder=None)
        except ObjectDoesNotExist:
            return JsonResponse({
                "folder": None,
                "error": "Folder does not exist"
            })

        if self.filter == "images":
            files = files.instance_of(Image)

        return JsonResponse({"folder": {
            "id": folder.id if folder else 0,
            "name": get_folder_name(folder),
            "files": [_filer_file_to_json_dict(file) for file in files if file.is_public],
            "folders": [
                # Explicitly pass empty list of children to avoid recursion
                _filer_folder_to_json_dict(subfolder, children=())
                for subfolder in subfolders.order_by("name")
            ]
        }})
예제 #6
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_post_delete_folder(self, data):
        shop = get_shop(self.request)
        folder = _get_folder_query(shop).get(pk=data["id"])
        if _is_folder_shared(folder):
            message = _("Can not delete shared folder.")
            return JsonResponse({"success": False, "message": message})

        new_selected_folder_id = folder.parent_id
        message = delete_folder(folder)
        return JsonResponse({"success": True, "message": message, "newFolderId": new_selected_folder_id})
예제 #7
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_post_rename_file(self, data):
        shop = get_shop(self.request)
        file = _get_file_query(shop).get(pk=data["id"])
        if _is_file_shared(file):
            message = _("Can not rename shared file.")
            return JsonResponse({"success": False, "message": message})

        file.name = data["name"]
        file.save(update_fields=("name",))
        return JsonResponse({"success": True, "message": _("File renamed.")})
예제 #8
0
 def mark_notification_read_view(self, request, pk):
     shop = get_shop(request)
     if request.method == "POST":
         try:
             notif = NotificationModel.objects.for_user(
                 request.user).filter(shop=shop).get(pk=pk)
         except ObjectDoesNotExist:
             return JsonResponse({"error": "no such notification"})
         notif.mark_read(request.user)
         return JsonResponse({"ok": True})
     return JsonResponse({"error": "POST only"})
예제 #9
0
 def populate(self):
     super(CarouselConfigForm, self).populate()
     self.fields["carousel"] = XThemeModelChoiceField(
         label=_("Carousel"),
         queryset=Carousel.objects.filter(shops=get_shop(self.request)),
         required=False,
     )
     self.fields["active"] = BooleanField(
         label=_("Active"),
         required=False,
     )
예제 #10
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_post_delete_file(self, data):
        shop = get_shop(self.request)
        file = _get_file_query(shop).get(pk=data["id"])
        if _is_file_shared(file):
            message = _("Can not delete shared file.")
            return JsonResponse({"success": False, "message": message})

        try:
            file.delete()
        except IntegrityError as ie:
            raise Problem(str(ie))
        return JsonResponse({"success": True, "message": _("File deleted.")})
예제 #11
0
파일: forms.py 프로젝트: vituocgia/wshop
    def __init__(self, request, **kwargs):
        self.request = request
        super(CategoryBaseForm, self).__init__(**kwargs)
        # Exclude `DELETED`. We don't want people to use that field to set a category as deleted.
        filter_form_field_choices(self.fields["status"], (CategoryStatus.DELETED.value,), invert=True)

        # Exclude current category from parents, because it cannot be its own child anyways
        category_queryset = Category.objects.filter(shops=get_shop(request)).exclude(status=CategoryStatus.DELETED)
        self.fields["parent"].queryset = category_queryset
        self.fields["parent"].choices = [(None, "----")] + [
            (category.pk, category.name) for category in category_queryset.exclude(id=kwargs["instance"].pk)
        ]
예제 #12
0
파일: template.py 프로젝트: vituocgia/wshop
 def form_valid(self, form):
     """
     Create the script from the template using the configuration from the form.
     """
     shop = get_shop(self.request)
     script_template = self._get_script_template_class()()
     script = script_template.create_script(shop, form)
     if script:
         script.template = self.kwargs["id"]
         script.save(update_fields=["template"])
         messages.success(self.request, _("Script created from template!"))
     return redirect("wshop_admin:notify.script.list")
예제 #13
0
def test_product_module_search(rf, admin_user):
    get_default_shop()
    request = apply_request_middleware(rf.get("/"), user=admin_user)

    with replace_modules([CategoryModule, ImportAdminModule, ProductModule,
                          ProductTypeModule, ManufacturerModule, PaymentMethodModule, ShippingMethodModule]):
        with admin_only_urls():
            default_product = get_default_product()
            model_url = get_model_url(default_product, shop=get_shop(request))
            sku = default_product.sku
            assert any(sr.url == model_url for sr in get_search_results(request, query=sku))  # Queries work
            assert any(sr.is_action for sr in get_search_results(request, query=sku[:5]))  # Actions work
            assert empty_iterable(get_search_results(request, query=sku[:2]))  # Short queries don't
예제 #14
0
파일: edit.py 프로젝트: vituocgia/wshop
    def save(self, commit=True):
        is_superuser = getattr(self.request.user, "is_superuser", False)

        # do not let any user to change shared Manufacturers
        if self.instance.pk and self.instance.shops.count(
        ) == 0 and not is_superuser:
            raise forms.ValidationError(
                _("You have no permission to change a shared Manufacturer."))

        instance = super(ManufacturerForm, self).save(commit)

        # if shops field is not available and it is a new manufacturer, set the current shop
        if not settings.WSHOP_ENABLE_MULTIPLE_SHOPS or "shops" not in self.fields:
            instance.shops.add(get_shop(self.request))

        return instance
예제 #15
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_post_new_folder(self, data):
        shop = get_shop(self.request)
        parent_id = int(data.get("parent", 0))
        if parent_id > 0:
            parent = _get_folder_query(shop).get(pk=parent_id)
        else:
            parent = None

        name = data["name"]
        folder = Folder.objects.create(name=name)
        if parent:
            folder.move_to(parent, "last-child")
            folder.save()

        _ensure_media_folder(shop, folder)
        return JsonResponse({"success": True, "folder": _filer_folder_to_json_dict(folder, ())})
예제 #16
0
    def get_notifications(self, request):
        shop = get_shop(request)
        notif_qs = NotificationModel.objects.unread_for_user(
            request.user).filter(shop=shop).order_by("-id")[:15]

        for notif in notif_qs:
            if notif.priority == Priority.HIGH:
                kind = "warning"
            elif notif.priority == Priority.CRITICAL:
                kind = "danger"
            else:
                kind = "info"

            yield Notification(text=notif.message,
                               url=notif.url,
                               kind=kind,
                               dismissal_url=reverse(
                                   "wshop_admin:notify.mark-read",
                                   kwargs={"pk": notif.pk}),
                               datetime=notif.created_on)
예제 #17
0
파일: views.py 프로젝트: vituocgia/wshop
    def handle_post_move_file(self, data):
        shop = get_shop(self.request)
        file = _get_file_query(shop).get(pk=data["file_id"])
        if _is_file_shared(file):
            message = _("Can not move shared file.")
            return JsonResponse({"success": False, "message": message})

        folder_id = int(data["folder_id"])
        if folder_id:
            folder = _get_folder_query(shop).get(pk=data["folder_id"])
        else:
            folder = None
        old_folder = file.folder
        file.folder = folder
        file.save(update_fields=("folder",))
        return JsonResponse({
            "success": True,
            "message": _("%(file)s moved from %(old)s to %(new)s.") % {
                "file": file,
                "old": get_folder_name(old_folder),
                "new": get_folder_name(folder)
            }
        })
예제 #18
0
 def form_valid(self, form):
     self.object = form[self.name].save()
     self.object.shops.add(get_shop(self.request))
     return self.object
예제 #19
0
파일: edit.py 프로젝트: vituocgia/wshop
 def get_queryset(self):
     return super(ScriptEditView, self).get_queryset().filter(shop=get_shop(self.request))
예제 #20
0
파일: edit.py 프로젝트: vituocgia/wshop
 def get_form_kwargs(self):
     kwargs = super(ScriptEditView, self).get_form_kwargs()
     kwargs["shop"] = get_shop(self.request)
     return kwargs
예제 #21
0
 def get_queryset(self):
     return super(PageListView,
                  self).get_queryset().for_shop(get_shop(self.request))
예제 #22
0
 def save(self, commit=True):
     if not hasattr(self.instance, "shop") or not self.instance.shop:
         self.instance.shop = get_shop(self.request)
     return super(PageForm, self).save(commit)
예제 #23
0
 def process_view(self, request, view_func, view_args, view_kwargs):
     # we only care about Wshop Admin requests
     if request.resolver_match.app_name == "wshop_admin":
         shop = get_shop(request)
         if shop:
             request.shop = shop
예제 #24
0
파일: _list.py 프로젝트: vituocgia/wshop
 def get_queryset(self):
     return super(CarouselListView,
                  self).get_queryset().filter(shops=get_shop(self.request))
예제 #25
0
파일: edit.py 프로젝트: vituocgia/wshop
 def get_queryset(self):
     return Manufacturer.objects.filter(
         Q(shops=get_shop(self.request)) | Q(shops__isnull=True))
예제 #26
0
파일: views.py 프로젝트: vituocgia/wshop
 def handle_get_folders(self, data):
     shop = get_shop(self.request)
     root_folders = get_cached_trees(Folder._tree_manager.filter(_get_folder_query_filter(shop)))
     return JsonResponse({"rootFolder": _filer_folder_to_json_dict(None, root_folders)})