Exemplo n.º 1
0
def journalist_home(request):
    (profile, permissions,
     is_default_user) = get_profile_and_permissions(request)
    if is_default_user:
        return render(request, "core/please_login.html")
    profile.role = cm.UserProfile.JOURNALIST
    profile.save()

    journalist_apps = []
    for app in cm.get_registered_participation_apps():
        if not profile.role in app.creator_user_roles_allowed:
            continue
        perm = cm.get_provider_permission(app)
        if app.label + "." + perm.codename in permissions:
            journalist_app = dict()
            journalist_app["label"] = app.label.replace("_", " ").title()
            journalist_app["existing_projects"] = []
            journalist_app[
                "new_project_link"] = "/apps/{}/new_project/-1".format(
                    app.label)
            existing_projects = cm.get_app_project_models(
                app)[0].objects.filter(owner_profile=profile, is_active=True)
            for ep in existing_projects:
                proj = dict()
                proj["name"] = ep.name
                proj[
                    "administer_project_link"] = "/apps/" + app.label + "/administer_project/" + str(
                        ep.id)
                journalist_app["existing_projects"].append(proj)

            journalist_apps.append(journalist_app)

    context = dict()
    context['journalist_apps'] = journalist_apps
    return render(request, 'core/journalist_home.html', context)
Exemplo n.º 2
0
def show_profile(request):
    (profile, permissions,
     is_default_user) = get_profile_and_permissions(request)
    if is_default_user:
        return render(request, "core/please_login.html")
    tags = [t.name for t in profile.tags.all()[:100]]

    profile_apps = []
    for app in cm.get_registered_participation_apps():
        perm = cm.get_provider_permission(app)
        if app.label + "." + perm.codename in permissions:
            profile_app = dict()
            profile_app["label"] = app.label.replace("_", " ").title()
            profile_app["existing_projects"] = []
            profile_app[
                "new_project_link"] = "/apps/" + app.label + "/new_project/-1"
            existing_projects = cm.get_app_project_models(
                app)[0].objects.filter(owner_profile=profile, is_active=True)
            for ep in existing_projects:
                proj = dict()
                proj["name"] = ep.name
                proj[
                    "administer_project_link"] = "/apps/" + app.label + "/administer_project/" + str(
                        ep.id)
                profile_app["existing_projects"].append(proj)

            profile_apps.append(profile_app)

    content = {'profile_apps': profile_apps, 'tags': tags}
    # add "core" if the user has core permission
    app = cm.get_core_app()
    perm = cm.get_provider_permission(app)
    if app.label + "." + perm.codename in permissions:
        content["core"] = True
    return render(request, 'core/profile.html', content)
Exemplo n.º 3
0
 def test_registered_participation_app_views_exist(self):
     for app in cm.get_registered_participation_apps():
         if not "views_module" in app.__dict__:
             raise Exception("app missing views module: " + app.name)
         required_views = [
             "new_project", "administer_project", "participate"
         ]
         for v in required_views:
             if not v in app.views_module.__dict__:
                 raise Exception("app " + app.name + " missing view: " + v)
Exemplo n.º 4
0
def recommend_related(request, item_id):
    """
    recommend related items to put at the bottom of a participation page
    """
    if not request.is_ajax() or not request.method == "POST":
        return HttpResponse(status=500)
    item = get_object_or_404(cm.ParticipationItem, pk=item_id)
    candidates = set()
    recommendations = []

    for t in item.tags.all().prefetch_related("geotag"):
        for app in cm.get_registered_participation_apps():
            for item_model in cm.get_app_item_models(app):
                order_field = getattr(item_model._meta, 'get_latest_by')
                if order_field is None:
                    order_field = "creation_time"
                candidates.update([
                    x.participationitem_ptr.pk
                    for x in item_model.objects.filter(
                        tags__in=[t],
                        is_active=True,
                        participation_project__group__isnull=True).filter(
                            **{
                                "{}__isnull".format(order_field): False
                            }).order_by('-{}'.format(order_field))[:3]
                ])

    if len(candidates) < 3:
        t = cm.get_usa()
        recent_items = t.participationitem_set.filter(
            is_active=True,
            participation_project__group__isnull=True).order_by(
                '-creation_time')[:100]
        candidates.update([i.id for i in recent_items if not i.id == item.id])

    recommendations = random.sample(candidates, min(10, len(candidates)))
    content = {"recommendations": recommendations}
    return JsonResponse(content)
Exemplo n.º 5
0
def feed_recommendations(request):
    """
    recommend items as a user arrives to go at the top of their feed 
    recommendations are tuples: (ParticipationItem.id, app_name)
    """
    (profile, permissions,
     is_default_user) = get_profile_and_permissions(request)
    if not request.is_ajax() or not request.method == "POST":
        return HttpResponse(status=500)

    #### extract content from current_feed_contents
    submission_data = json.loads(request.body.strip())
    current_feed_contents = submission_data.get("current_feed_contents", [])
    current_location_filters = submission_data.get("current_location_filters",
                                                   [])
    current_topic_filters = submission_data.get("current_topic_filters", [])
    # feed size maxes out at 1000
    if len(current_feed_contents) >= 1000:
        return JsonResponse({"recommendations": []})

    ### recommend diverse content to the user which doesn't overlap with current feed contents
    recommendations = set()
    subjects_of_interest = set()
    places_of_interest = set()

    subjects_of_interest = cm.Tag.objects.filter(
        id__in=tuple([t["tag_id"] for t in current_topic_filters]))
    places_of_interest = cm.Tag.objects.filter(
        id__in=tuple([t["tag_id"] for t in current_location_filters]))

    if len(places_of_interest) == 0:
        places_of_interest.add(cm.get_usa())

    for t in places_of_interest:
        for app in cm.get_registered_participation_apps():
            for item_model in cm.get_app_item_models(app):
                order_field = getattr(item_model._meta, 'get_latest_by')
                if order_field is None:
                    order_field = "creation_time"
                if len(subjects_of_interest) == 0:
                    recommendations.update([
                        (x.participationitem_ptr.pk, app.name,
                         app.custom_feed_item_template)
                        for x in item_model.objects.filter(
                            tags__in=[t],
                            is_active=True,
                            participation_project__group__isnull=True).filter(
                                **{
                                    "{}__isnull".format(order_field): False
                                }).order_by('-{}'.format(order_field))[:3]
                    ])
                else:
                    recommendations.update([
                        (x.participationitem_ptr.pk, app.name,
                         app.custom_feed_item_template)
                        for x in item_model.objects.filter(
                            tags__in=[t],
                            is_active=True,
                            participation_project__group__isnull=True).filter(
                                **{
                                    "{}__isnull".format(order_field): False
                                }).filter(tags__in=subjects_of_interest
                                          ).order_by('-{}'.format(order_field))
                        [:3 * len(subjects_of_interest)]
                    ])

    # TODO: make use of subjects of interest
    recommendations = [
        r for r in recommendations if not r[0] in current_feed_contents
    ]
    recommendations = random.sample(recommendations,
                                    min(10, len(recommendations)))
    content = {"recommendations": recommendations}
    return JsonResponse(content)
Exemplo n.º 6
0
def manage_group(request, group_id):
    (profile, permissions,
     is_default_user) = get_profile_and_permissions(request)
    if is_default_user:
        return render(request, "core/please_login.html")
    group = get_object_or_404(cm.UserGroup, id=group_id, owner=profile)

    edu_apps = []
    for app in cm.get_registered_participation_apps():
        if not profile.role in app.creator_user_roles_allowed:
            continue
        perm = cm.get_provider_permission(app)
        if app.label + "." + perm.codename in permissions:
            edu_app = dict()
            edu_app["label"] = app.label.replace("_", " ").title()
            edu_app["existing_projects"] = []
            edu_app["new_project_link"] = "/apps/{}/new_project/{}".format(
                app.label, group_id)
            existing_projects = cm.get_app_project_models(
                app)[0].objects.filter(owner_profile=profile,
                                       group=group,
                                       is_active=True)
            for ep in existing_projects:
                proj = dict()
                proj["name"] = ep.name
                proj[
                    "administer_project_link"] = "/apps/" + app.label + "/administer_project/" + str(
                        ep.id)
                edu_app["existing_projects"].append(proj)

            edu_apps.append(edu_app)

    context = dict()
    context["group"] = group
    context["action_path"] = request.path
    context['edu_apps'] = edu_apps
    context[
        "content_class_word"] = "content" if not group.group_type == cm.UserGroup.COURSE else "assignments"
    context[
        "member_word"] = "member" if not group.group_type == cm.UserGroup.COURSE else "student"

    if request.method == 'POST':
        form = ManageGroupForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data["new_invitation_name"]
            email = form.cleaned_data["new_invitation_email"]
            num_invitations = cm.GroupMembership.objects.filter(
                group=group).count()
            if num_invitations >= group.max_invitations:
                return HttpResponse(
                    "You have reached the maximum number of invitations for this {}. Contact admin to increase this"
                    .format(group.group_type))
            try:
                existing_invitation = cm.GroupMembership.objects.get(
                    member_name=name, group=group)
                return HttpResponse(
                    "You already have an invitation for {} in the {}: {}.".
                    format(name, group.group_type, group.name))
            except cm.GroupMembership.DoesNotExist:
                inv = cm.GroupMembership()
                inv.member_name = name
                inv.group = group
                inv.invitation_email = email
                inv.invitation_code = uuid.uuid1()
                inv.save()
                return HttpResponseRedirect(
                    "/manage_group/{}".format(group_id))
        else:
            sys.stderr.write("Form errors: {}\n".format(form.errors))
            sys.stderr.flush()
            return render(request, 'core/manage_group.html', context)

    return render(request, 'core/manage_group.html', context)
Exemplo n.º 7
0
def app_view_relay(request, app_name, action_name, object_id):
    """
    The primary routing view for the major portal actions involving participation projects and items:
    creating projects, administering project, participating in items, and deleting projects

    This view checks permissions, then routes the request to app-specific views.
    """

    (profile, permissions,
     is_default_user) = get_profile_and_permissions(request)
    if not app_name in [
            app.label for app in cm.get_registered_participation_apps()
    ]:
        raise Exception("no such app")
    else:
        app = [
            a for a in cm.get_registered_participation_apps()
            if a.name == app_name
        ][0]
        perm = cm.get_provider_permission(app)
        has_app_perm = app.label + "." + perm.codename in permissions

        if action_name == "new_project":
            if has_app_perm:
                group = None
                if object_id != "-1":
                    group = get_object_or_404(cm.UserGroup,
                                              pk=object_id,
                                              owner=profile)
                return app.views_module.new_project(request, group)
            else:
                return render(
                    request, 'core/no_permissions.html', {
                        "title": "No Permission",
                        "app_name": app_name,
                        "action_description": "create a new project"
                    })

        elif action_name == "administer_project":
            if has_app_perm:
                get_object_or_404(cm.ParticipationProject,
                                  pk=object_id,
                                  owner_profile=profile,
                                  is_active=True)
                return app.views_module.administer_project(request, object_id)
            else:
                return render(
                    request, 'core/no_permissions.html', {
                        "title": "No Permission",
                        "app_name": app_name,
                        "action_description": "administer a project"
                    })

        elif action_name == "participate":
            get_object_or_404(cm.ParticipationItem,
                              pk=object_id,
                              is_active=True)
            cm.ParticipationItem.objects.filter(
                pk=object_id).distinct().update(visits=F('visits') + 1)
            return app.views_module.participate(request, object_id)

        elif action_name == "overview":
            return app.views_module.overview(request, object_id)

        elif action_name == "item_info":
            if not request.is_ajax() or not request.method == "POST":
                return HttpResponse(status=500)
            # default item info
            item = get_object_or_404(cm.ParticipationItem, pk=object_id)
            ans = {
                "item": {
                    "id": item.id,
                    "img_url": settings.STATIC_URL + item.display_image_file,
                    "link": item.participate_link(),
                    "title": item.name,
                    "label": item.get_inline_display(),
                    "tags": [t.name for t in item.tags.all()]
                },
                "site": os.environ["SITE"]
            }
            if "item_info" in app.views_module.__dict__:
                return app.views_module.item_info(request, object_id, ans)
            else:
                return JsonResponse(ans)

        elif action_name == "delete_project":
            if has_app_perm:
                project = get_object_or_404(cm.ParticipationProject,
                                            pk=object_id,
                                            is_active=True,
                                            owner_profile=profile)
                if request.method == 'POST':
                    form = DeleteProjectConfirmationForm(request.POST)
                    if form.is_valid():
                        project.participationitem_set.update(is_active=False)
                        project.is_active = False
                        project.save()
                        return render(
                            request, "core/thanks.html",
                            {"action_description": "removing " + project.name})
                    else:
                        return HttpResponse(status=500)
                else:
                    form = DeleteProjectConfirmationForm()
                    items = cm.ParticipationItem.objects.filter(
                        participation_project=project, is_active=True)
                    items = [get_item_details(i, True) for i in items]
                    return render(
                        request, 'core/delete_project_confirmation.html', {
                            'form': form,
                            'action_path': request.path,
                            "items": items,
                            'site': os.environ["SITE"]
                        })
            else:
                return render(
                    request, 'core/no_permissions.html', {
                        "title": "No Permission",
                        "app_name": app_name,
                        "action_description": "delete a project"
                    })

        elif action_name == "edit_project":
            if not app.are_projects_editable:
                return HttpResponse(status=500)
            if has_app_perm:
                project = get_object_or_404(cm.ParticipationProject,
                                            pk=object_id,
                                            is_active=True,
                                            owner_profile=profile)
                return app.views_module.edit_project(request, object_id)
            else:
                return render(
                    request, 'core/no_permissions.html', {
                        "title": "No Permission",
                        "app_name": app_name,
                        "action_description": "delete a project"
                    })

        elif action_name.startswith("customAction") and action_name.isalpha(
        ) and len(
                action_name) < 50 and action_name in app.views_module.__dict__:
            return app.views_module.__dict__[action_name](request, object_id)

        else:
            raise Exception("invalid action:" + str(action_name))