async def ad(request):
    """
    Single ad
    """
    a = Ad
    i = Image
    r = Review
    d = Rent
    request_path_id = request.path_params["id"]
    path = request.url.path
    results = await get_ads().where(a.id == request_path_id).first().run()
    # update ad views per session
    session_key = f"viewed_ad_{results['id']}"
    if not request.session.get(session_key, False):
        await a.update({a.view: a.view + 1}).where(
            a.id == int(request_path_id)
        ).run()
        request.session[session_key] = True
    image_results = (
        await i.select().where(i.ad_image == int(request_path_id)).run()
    )
    review_results = (
        await r.select(
            r.id,
            r.content,
            r.created,
            r.review_grade,
            r.review_user.username,
            r.ad.id,
        )
        .where(r.ad.id == request_path_id)
        .order_by(r.id, ascending=False)
        .run()
    )
    # if no reviews
    try:
        review_avg = sum(
            item["review_grade"] for item in review_results
        ) / len(review_results)
    except ZeroDivisionError:
        review_avg = None

    # proccesing form for booking ad
    data = await request.form()
    form = RentForm(data)
    if request.method == "POST" and form.validate():
        u = User
        session_user = (
            await u.select(u.id, u.username)
            .where(u.username == request.user.username)
            .first()
            .run()
        )
        start = form.start_date.data
        end = form.end_date.data
        try:
            between = (
                await d.select()
                .where(
                    (d.start_date <= end)
                    & (d.end_date >= start)
                    & (d.ad_rent == int(request_path_id))
                )
                .run()
            )
            now = datetime.datetime.now().date()
            diff = (now - start).total_seconds()
            if diff > 0:
                rent_error = "Both dates can't be in the past."
            days = (end - start).days
            if days < 1:
                rent_error = "The minimum rental period is one day."
            if any(between):
                rent_error = "Already rented in that time."
            rented_apartments = await a.raw(
                f"SELECT * FROM ad JOIN rent "
                f"ON ad.id = rent.ad_rent WHERE ad.id = {request_path_id}"
            ).run()
            return templates.TemplateResponse(
                "ads/ad_detail.html",
                {
                    "request": request,
                    "item": results,
                    "path": path,
                    "images": image_results,
                    "review_results": review_results,
                    "review_count": len(review_results),
                    "review_avg": review_avg,
                    "form": form,
                    "rented_apartments": rented_apartments,
                    "rent_error": rent_error,
                },
            )
        except:  # noqa
            query = Rent(
                start_date=form.start_date.data,
                end_date=form.end_date.data,
                client=session_user["id"],
                ad_rent=results["id"],
            )
            await query.save().run()
            # notification to ad owner
            notification_query = Notification(
                message=f"{results['title']} booked by {session_user['username']}",
                created=datetime.datetime.now(),
                is_read=0,
                sender=session_user["id"],
                recipient=results["ad_user.id"],
            )
            await notification_query.save().run()
            return RedirectResponse(BASE_HOST + path, status_code=302)
    rented_apartments = await a.raw(
        f"SELECT * FROM ad JOIN rent "
        f"ON ad.id = rent.ad_rent WHERE ad.id = {request_path_id}"
    ).run()
    return templates.TemplateResponse(
        "ads/ad_detail.html",
        {
            "request": request,
            "item": results,
            "path": path,
            "images": image_results,
            "review_results": review_results,
            "review_count": len(review_results),
            "review_avg": review_avg,
            "rented_apartments": rented_apartments,
            "form": form,
        },
    )
Exemplo n.º 2
0
async def index(request):
    results = "Home page"
    return templates.TemplateResponse("index.html", {
        "request": request,
        "results": results
    })
Exemplo n.º 3
0
async def search(request):
    """
    Search questions
    """
    try:
        page_query = pagination.get_page_number(url=request.url)
        q = request.query_params['q']
        count = (
            await Question.all()
            .prefetch_related("user")
            .filter(Q(title__icontains=q) |
                    Q(content__icontains=q) |
                    Q(user__username__icontains=q))
            .distinct()
            .count()
        )
        paginator = pagination.Pagination(page_query, count)
        results = (
            await Question.all()
            .prefetch_related("user", "tags")
            .filter(Q(title__icontains=q) |
                    Q(content__icontains=q) |
                    Q(user__username__icontains=q) |
                    Q(tags__name__icontains=q))
            .distinct()
            .limit(paginator.page_size)
            .offset(paginator.offset())
        )
        page_controls = pagination.get_page_controls(
            url=request.url,
            current_page=paginator.current_page(),
            total_pages=paginator.total_pages()
        )
    except KeyError:
        page_query = pagination.get_page_number(url=request.url)
        count = await Question.all().count()
        paginator = pagination.Pagination(page_query, count)
        results = (
            await Question.all()
            .prefetch_related("user", "tags")
            .limit(paginator.page_size)
            .offset(paginator.offset())
        )
        page_controls = pagination.get_page_controls(
            url=request.url,
            current_page=paginator.current_page(),
            total_pages=paginator.total_pages()
        )
    answer_count = []
    for row in results:
        r = (
            await Answer.all()
            .prefetch_related("question")
            .filter(question__id=row.id).count()
        )
        answer_count.append(r)
    return templates.TemplateResponse(
        "questions/search.html", {
            "request": request,
            "results": zip(results, answer_count),
            "page_controls": page_controls,
            "count": count,
            "q": q
        }
    )
async def ad_images(request):
    return templates.TemplateResponse(
        "ads/images.html", {"request": request, "BASE": BASE_HOST}
    )
Exemplo n.º 5
0
 async def get(self, request):
     return templates.TemplateResponse("index.html", {"request": request})
Exemplo n.º 6
0
async def index(request):
    template = "login.html"
    context = {"request": request}
    return templates.TemplateResponse(template, context)
Exemplo n.º 7
0
async def upload_page(request: Request):
    return templates.TemplateResponse("web/upload_file.html", {"request": request})
Exemplo n.º 8
0
async def questions_categories(request):
    """
    Questions categories
    """
    p = Question
    category = request.path_params["category"]
    page_query = pagination.get_page_number(url=request.url)
    count = await p.count().where(p.category.name == category).run()
    paginator = pagination.Pagination(page_query, count)
    try:
        tab = request.query_params["tab"]
        if tab == "oldest":
            results = (
                await get_questions()
                .where(p.category.name == category)
                .limit(paginator.page_size)
                .offset(paginator.offset())
                .order_by(p.id, ascending=True)
                .run()
            )
        if tab == "unsolved":
            count = len(
                await get_questions().where(p.accepted_answer == False).run()
            )
            paginator = pagination.Pagination(page_query, count)
            results = (
                await get_questions()
                .where(
                    (p.accepted_answer == False)
                    & (p.category.name == category)
                )
                .limit(paginator.page_size)
                .offset(paginator.offset())
                .order_by(p.id, ascending=False)
                .run()
            )
        if tab == "solved":
            count = len(
                await get_questions().where(p.accepted_answer == True).run()
            )
            paginator = pagination.Pagination(page_query, count)
            results = (
                await get_questions()
                .where(
                    (p.accepted_answer == True) & (p.category.name == category)
                )
                .limit(paginator.page_size)
                .offset(paginator.offset())
                .order_by(p.id, ascending=False)
                .run()
            )
    except KeyError:
        results = (
            await get_questions()
            .where(p.category.name == category)
            .limit(paginator.page_size)
            .offset(paginator.offset())
            .order_by(p.id, ascending=False)
            .run()
        )
    answer_count = [
        await p.raw(
            f"select count(answer.id) from answer "
            f"join question on answer.question = question.id "
            f"where question.id = {item['id']};"
        ).run()
        for item in results
    ]
    c = Category
    categories = await c.select().order_by(c.name, ascending=True).run()
    category_count = [
        await p.count().where(p.category.name == item["name"]).run()
        for item in categories
    ]
    page_controls = pagination.get_page_controls(
        url=request.url,
        current_page=paginator.current_page(),
        total_pages=paginator.total_pages(),
    )
    return templates.TemplateResponse(
        "questions/questions_categories.html",
        {
            "request": request,
            "results": zip(results, answer_count),
            "categories": zip(categories, category_count),
            "page_controls": page_controls,
            "r": results,
        },
    )
Exemplo n.º 9
0
async def index(request):
    return templates.TemplateResponse("index.html", {"request": request})