def discussion(request, discussion_id):
    discussion = CommunityDiscussions.objects.select_related().get(id=discussion_id)
    replies = CommunityDiscussionReplies.objects.select_related().filter(discussion=discussion_id)
    total = CommunityDiscussions.objects.filter(community=discussion.community).count()
    users = CommunityUsers.objects.filter(community=discussion.community).count()
    mems = CommunityUsers.objects.select_related().filter(user=request.user, community=discussion.community)

    views_connect = view_counter_store()
    views_connect.set_item("discussion", discussion_id, 1, {"community": str(discussion.community.id)})

    poll_connect = poll_store()
    has_poll = poll_connect.poll_exists("discussion", discussion_id)

    trending = get_trending(discussion.community.id)

    data = {
        "discussion": discussion,
        "replies": replies,
        "community": discussion.community,
        "has_poll": has_poll,
        "total_discussions": total,
        "total_users": users,
        "trending": trending,
        "mem": mems[0] if mems.count() else None,
    }

    if has_poll:
        data.update({"poll": poll_data("discussion", discussion_id, request.user.id)})

    return render_to_response("communities/discussion.html", data)
def discussion_list(request, community_id):
    try:
        page = int(request.GET.get("page"))
        start = (page - 1) * 5
        community = CommunityCommunities.objects.get(id=community_id)
        discussions = CommunityDiscussions.objects.filter(community=community).order_by("-date_reply")[
            start : start + 5
        ]
        total = CommunityDiscussions.objects.filter(community=community).count()
        views_connect = view_counter_store()

        data = {"pager": get_pager(total, 5, page, 5), "discussions": list()}
        for discussion in discussions:
            views_object = views_connect.get_item("discussion", str(discussion.id))
            if views_object is None:
                views = 0
            else:
                views = views_object["views"]
            data["discussions"].append(
                {
                    "url": reverse("community_discussion_view", args=[discussion.id]),
                    "subject": discussion.subject,
                    "replies": CommunityDiscussionReplies.objects.filter(discussion=discussion).count(),
                    "views": views,
                    "date_create": "{dt:%b}. {dt.day}, {dt.year}".format(dt=discussion.date_create),
                    "first_name": discussion.user.first_name,
                    "last_name": discussion.user.last_name,
                    "avatar": reverse("user_photo", args=[discussion.user.id]),
                }
            )
    except Exception as e:
        data = {"Error": e}

    return HttpResponse(json.dumps(data), content_type="application/json")
def get_trending(community_id):
    views_connect = view_counter_store()
    trending_views = views_connect.get_most_viewed("discussion", 5, {"community": str(community_id)})
    trending = list()
    for tv in trending_views:
        trending.append(CommunityDiscussions.objects.get(id=tv["identifier"]))
    return trending
def community(request, community_id):
    """
    Returns a single community page.
    :param request: Request object.
    :param community_id: The machine name of the community.
    :return: The Community page.
    """
    views_connect = view_counter_store()
    page = request.GET.get("page", "")
    if page.isdigit() and int(page) > 0:
        page = int(page)
    else:
        page = 1
    start = (page - 1) * 5

    community = CommunityCommunities.objects.get(id=community_id)
    facilitator = CommunityUsers.objects.select_related().filter(facilitator=True, community=community)
    users = CommunityUsers.objects.filter(community=community)
    discussions = CommunityDiscussions.objects.filter(community=community).order_by("-date_reply")[start : start + 5]
    total = CommunityDiscussions.objects.filter(community=community).count()
    # mems = CommunityUsers.objects.select_related().filter(user=request.user, community=community)
    resources = CommunityResources.objects.filter(community=community)
    courses = CommunityCourses.objects.filter(community=community)

    for d in discussions:
        d.replies = CommunityDiscussionReplies.objects.filter(discussion=d).count()
        views = views_connect.get_item("discussion", str(d.id))
        if views is None:
            d.views = 0
        else:
            d.views = views["views"]

    trending = get_trending(community_id)

    data = {
        "community": community,
        "facilitator": facilitator[0] if len(facilitator) else None,
        "discussions": discussions,
        "trending": trending,
        "users": users,
        "resources": resources,
        "courses": courses,
        # "mem": mems[0] if mems.count() else None,
        "pager": get_pager(total, 5, page, 5),
        "total_discussions": total,
    }

    return render_to_response("communities/community.html", data)
def discussion_delete(request, discussion_id):
    discussion = CommunityDiscussions.objects.get(id=discussion_id)
    redirect_url = reverse("community_view", args=[discussion.community.id])
    # try:
    view_connect = view_counter_store()
    view_connect.delete_item("discussion", discussion_id)

    poll_connect = poll_store()
    if poll_connect.poll_exists("discussion", discussion_id):
        poll_connect.delete_poll("discussion", discussion_id)

    discussion.delete()
    # except Exception as e:
    #     log.warning('There was an error deleting a discussion: {0}'.format(e))

    return redirect(redirect_url)