def delete_banner_view(self):
        if not check_csrf_token(self.request):
            raise HTTPBadRequest

        bid = int(self.request.matchdict['id'])

        if bid is None:
            raise HTTPNotFound

        try:
            banner = DBSession.query(Banner).filter(Banner.id == bid).first()

            if banner is None:
                raise HTTPNotFound

            if os.path.exists(f"server/{banner.image_path}" or ""):
                os.remove(f"server/{banner.image_path}")

            DBSession.delete(banner)

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError

        url = self.request.route_url('admin_view')
        return HTTPFound(url)
    def decrease_banner_position_view(self):
        if not check_csrf_token(self.request):
            raise HTTPBadRequest

        bid = int(self.request.matchdict['id'])

        if bid is None:
            raise HTTPNotFound

        try:
            cursor_banner = DBSession.query(Banner).filter(
                Banner.id == bid).first()

            if cursor_banner is None:
                raise HTTPNotFound

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError

        try:
            banners = DBSession.query(Banner).order_by(Banner.position,
                                                       Banner.id).all()

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError

        bindex = banners.index(cursor_banner)

        if bindex + 1 != len(banners):
            cursor_position = banners[bindex].position

            try:
                banners[bindex].position = banners[bindex + 1].position
                banners[bindex].updated_at = datetime.datetime.utcnow()

                banners[bindex + 1].position = cursor_position
                banners[bindex + 1].updated_at = datetime.datetime.utcnow()

            except Exception as e:
                log.debug(e)
                raise HTTPInternalServerError

        log.debug(201)
        url = self.request.route_url('admin_view')
        return HTTPFound(url)
    def add_banner_view(self):
        form = self.banner_form.render()

        if 'submit' in self.request.params:
            controls = self.request.POST.items()

            try:
                appstruct = self.banner_form.validate(controls)

            except deform.ValidationFailure as e:

                log.debug(400)
                return dict(form=e.render())

            new_title = appstruct.get("title", "default")
            new_url = appstruct.get("url", "default")
            new_visible = appstruct.get("visible", True)

            new_banner = Banner(title=new_title,
                                url=new_url,
                                visible=new_visible)

            try:
                DBSession.add(new_banner)

                banner = DBSession.query(Banner).filter(
                    Banner.title == new_title, Banner.url == new_url,
                    Banner.visible == new_visible).order_by(
                        Banner.id.desc()).first()

                if appstruct.get("image") is None:
                    img_scr = ""

                else:
                    img_type = mimetypes.guess_extension(
                        appstruct.get("image").get("mimetype"))
                    img_scr = f"static/banner_img/{banner.id}{img_type}"

                    crop_image(
                        appstruct.get("image").get("fp"), banner.id, img_type)

                banner.image_path = img_scr
                banner.position = banner.id

                url = self.request.route_url('admin_view')
                return HTTPFound(url)

            except Exception as e:
                log.debug(e)
                raise HTTPInternalServerError()

        log.debug(200)
        return dict(form=form)
    def admin_view(self):
        form = self.banner_search_form.render()

        # try:
        search_request = self.request.session["search_request"]
        sort = self.request.session["search_request"]["sort"]
        column = self.request.session["search_request"]["column"]

        # except KeyError:
        #     sort = "asc"
        #     column = "position"

        search_request = self.request.session["search_request"] = {
            "sort": sort,
            "column": column
        }

        print("\n\n\n", search_request, "\n\n\n")

        form = self.banner_search_form.render(search_request)

        try:
            banners = filter_banners_by_search(search_request)

            if 'search' in self.request.params:
                controls = self.request.POST.items()

                try:
                    appstruct = self.banner_search_form.validate(controls)

                    search_title = appstruct.get("title", "default")
                    search_url = appstruct.get("url", "default")
                    search_visible = appstruct.get("visible", 0)

                    search_request = self.request.session["search_request"] = {
                        "sort": sort,
                        "column": column,
                        "title": search_title,
                        "url": search_url,
                        "visible": search_visible
                    }

                    form = self.banner_search_form.render(search_request)

                    banners = filter_banners_by_search(search_request)

                except deform.ValidationFailure as e:
                    form = e.render()

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError()

        banners_count = banners.count()

        count = banners_count // self.PAGINATION_LIMIT

        if banners_count % self.PAGINATION_LIMIT != 0:
            count += 1

        return dict(form=form,
                    banners=banners.limit(self.PAGINATION_LIMIT),
                    page=dict(count=count, page=1))
    def update_banner_view(self):
        bid = int(self.request.matchdict['id'])

        if bid is None:
            raise HTTPNotFound

        try:
            banner = DBSession.query(Banner).filter(Banner.id == bid).first()

            if banner is None:
                raise HTTPNotFound

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError

        form = self.banner_form.render({
            "title": banner.title,
            # "image": image,
            "url": banner.url,
            "visible": banner.visible
        })

        image_path = f"server:{banner.image_path}"

        try:
            form = form.replace(
                '<label for="deformField2"\n         ' +
                'class=\"control-label "\n         id="req-deformField2"\n         '
                + '> \\n    Image\n  </label>',
                f'<label for="deformField2"\n         \
                class="control-label "\n         id="req-deformField2"\n         >\
                    \n    Image\n  </label>\n<br><img src=\"\
                    {self.request.static_url(image_path)}\" alt=\"\" \
                        draggable="false" width=200 height=200/><br>\n')

        except ValueError:
            pass

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError

        if 'submit' in self.request.params:
            controls = self.request.POST.items()

            try:
                appstruct = self.banner_form.validate(controls)

            except deform.ValidationFailure as ve:
                return dict(form=ve.render())

            new_title = appstruct.get("title", "default")
            new_url = appstruct.get("url", "default")
            new_visible = appstruct.get("visible", True)

            if appstruct.get("image") is None and not banner.image_path:
                img_scr = ""

            elif appstruct.get("image") is not None:
                img_type = mimetypes.guess_extension(
                    appstruct.get("image").get("mimetype"))

                img_scr = f"static/banner_img/{banner.id}{img_type}"

                crop_image(
                    appstruct.get("image").get("fp"), banner.id, img_type)

            else:
                img_scr = banner.image_path

            try:
                banner.title = new_title
                banner.image_path = img_scr
                banner.url = new_url
                banner.visible = new_visible
                banner.updated_at = datetime.datetime.utcnow()

            except Exception as e:
                log.debug(e)
                raise HTTPInternalServerError

            url = self.request.route_url('admin_view')
            return HTTPFound(url)

        return dict(form=form)
    def admin_paginated_view(self):
        page = int(self.request.matchdict['id'])

        if page is None:
            raise HTTPNotFound

        sort = self.request.headers.get("sort", "asc")
        column = self.request.headers.get("columnName", "position")

        try:
            search_request = self.request.session["search_request"]
        except KeyError:
            search_request = self.request.session["search_request"] = {
                "sort": sort,
                "column": column
            }

        form = self.banner_search_form.render(search_request)

        try:
            banners = filter_banners_by_search(search_request)

            if 'search' in self.request.params:
                controls = self.request.POST.items()

                try:
                    appstruct = self.banner_search_form.validate(controls)

                    search_title = appstruct.get("title", "default")
                    search_url = appstruct.get("url", "default")
                    search_visible = appstruct.get("visible", 0)

                    search_request = self.request.session["search_request"] = {
                        "sort": sort,
                        "column": column,
                        "title": search_title,
                        "url": search_url,
                        "visible": search_visible
                    }

                    form = self.banner_search_form.render(search_request)

                    banners = filter_banners_by_search(search_request)

                except deform.ValidationFailure as e:
                    form = e.render()

        except Exception as e:
            log.debug(e)
            raise HTTPInternalServerError()

        pagination_offset = self.PAGINATION_LIMIT * (page - 1)

        banners_count = banners.count()

        count = banners_count // self.PAGINATION_LIMIT

        if banners_count % self.PAGINATION_LIMIT != 0:
            count += 1

        return dict(form=form,
                    banners=banners.offset(pagination_offset).limit(
                        self.PAGINATION_LIMIT),
                    page=dict(count=count, page=page))