예제 #1
0
def get_plan(user):
    """
    Return the plan of user.
    """
    if not has_user_related(user):
        return ""

    return get_user_related(user).plan
예제 #2
0
def user_type(value):
    """
    Return the user type of a request.user object.
    """
    if not has_user_related(value):
        return False

    return get_user_related(value).__class__.__name__
예제 #3
0
 def check_auth(self, request):
     """
     Allow premium users to query.
     """
     if has_user_related(request.user):
         user = get_user_related(request.user)
         return user.is_premium
     return False
예제 #4
0
def related_user(request):
    """
    A context processor that returns the related user from a request.user.

    :param request:        the request to be processed
    """
    if not has_user_related(request.user):
        return {}

    return {"related_user": get_user_related(request.user)}
예제 #5
0
    def dehydrate(self, bundle):
        """
        Make sur the user does not see the fields he has no
        right to.

        :param bundle:        the bundle to trim
        """
        if not hasattr(bundle, "request") or not models.has_user_related(bundle.request.user):
            bundle.data = pick(bundle.data, *self.FIELD_ACCESS_NOT_LOGGED)
        else:
            user = models.get_user_related(bundle.request.user)
            if not user.is_premium:
                bundle.data = without(bundle.data, *self.FIELD_DENIED_BASIC)

        return bundle
예제 #6
0
def search(request):
    """
    Search view.
    """
    data = request.POST if request.method == "POST" else request.GET
    search_type = data.get("type")
    if request.user.is_authenticated():
        related = get_user_related(request.user)
        favorites = related.favorites.all()
        if not search_type and isinstance(related, Prestataire):
            search_type = "famille"
    else:
        favorites = []

    search_type = "prestataire" if search_type not in ["famille", "prestataire"] else search_type
    if search_type == "famille":
        FormClass = forms.FamilleSearchForm
        objects = Famille.objects.filter(compute_user_visibility_filters(request.user))
        template = "search/famille.html"
    else:
        FormClass = forms.PrestataireSearchForm
        objects = Prestataire.objects.filter(compute_user_visibility_filters(request.user))
        template = "search/prestataire.html"

    form = FormClass({"pc": data.get("postal_code")})

    if not settings.ALLOW_BASIC_PLAN_IN_SEARCH:
        objects = objects.filter(plan=UserInfo.PLANS["premium"])

    if data.get("postal_code"):
        objects = objects.filter(Q(postal_code=data["postal_code"]) | Q(city=data["postal_code"]))
    objects = objects.order_by("-updated_at")
    objects = [obj for obj in objects if obj.visibility_score_is_enough]

    total_search_results = len(objects)
    nb_search_results = min(settings.NB_SEARCH_RESULTS, total_search_results)
    objects = objects[:nb_search_results]
    result_template = get_result_template_from_user(request, search_type)
    return render(
        request, template,
        get_context(
            search_form=form, results=objects, result_template=result_template,
            nb_search_results=nb_search_results, ordering=form.ordering_dict,
            favorites=favorites, user=request.user, search_type=search_type,
            max_nb_search_results=settings.NB_SEARCH_RESULTS,
            total_search_results=total_search_results
        )
    )
예제 #7
0
def email_moderation(message):
    """
    Only allow email for premium users.

    :param message:       the message to be sent
    """
    from famille.models import get_user_related
    try:
        sender = get_user_related(message.sender)
    except (ObjectDoesNotExist, AttributeError):
        return (False, u"Votre compte ne vous permet pas d'envoyer d'email.")

    if not sender.is_premium:
        return (False, u"Vous devez avoir un compte premium pour accéder à cette fonctionnalité.")

    return True
예제 #8
0
def profile(request, type, uid):
    """
    Display the profile of a user.
    A nice 404 view is shown to the user
    if the profile does not exist OR the profile
    is not premium.
    A nice 401 view is shown to the user if the
    profile didn't want to show itself to the user
    or globally.
    """
    if type not in ("famille", "prestataire"):
        raise Http404

    context = {}

    if type == "famille":
        ModelClass = Famille
        RatingClass = FamilleRatings
        RatingFormClass = forms.RatingFamilleForm
    else:
        ModelClass = Prestataire
        RatingClass = PrestataireRatings
        RatingFormClass = forms.RatingPrestataireForm

    try:
        user = ModelClass.objects.get(pk=uid)
    except ModelClass.DoesNotExist:
        return render(request, "profile/404.html", status=404)

    # the user can view its own profile but others cannot if he is not premium
    if request.related_user != user and not user.is_premium:
        return render(request, "profile/404.html", status=404)

    if not user.profile_access_is_authorized(request):
        return render(request, "profile/401.html", status=401)

    if has_user_related(request.user):
        related_user = get_user_related(request.user)
        context["related_user"] = related_user
        context["favorited"] = related_user.favorites.filter(object_id=user.pk, object_type=type.title()).count()

        # users cant vote for themselves or twice for a user
        if user != related_user and not RatingClass.user_has_voted_for(related_user, user):
            rating = RatingClass(user=user, by=related_user.simple_id)
            context["rating_form"] = RatingFormClass(instance=rating)

    return render(request, "profile/%s.html" % type, get_context(profile=user, **context))
예제 #9
0
def get_rating_form(profile, request_user):
    """
    Return the rating form instance for a profile and
    a given user. Return None in case of a problem
    or the request user already voted.

    :param profile:        the profile to be rated
    :param request_user:   the request user
    """
    if isinstance(profile, Famille):
        RatingClass = FamilleRatings
        RatingFormClass = RatingFamilleForm
    else:
        RatingClass = PrestataireRatings
        RatingFormClass = RatingPrestataireForm

    if has_user_related(request_user):
        related_user = get_user_related(request_user)
        if not RatingClass.user_has_voted_for(related_user, profile):
            rating = RatingClass(user=profile, by=related_user.simple_id)
            return RatingFormClass(instance=rating)
    return None
예제 #10
0
    def filters_post_sorting(self, object_list):
        """
        Apply distance filtering after sorting since it returns a list.
        """
        distance = self.__request.GET.get("distance__iexact")
        postal_code = self.__request.GET.get("pc__iexact")
        tarif = self.__request.GET.get("tarif__in")
        user = self.__request.user
        del self.__request

        object_list = [obj for obj in object_list if obj.visibility_score_is_enough]

        if tarif and len(tarif.split(",")) == 2:
           object_list = self.filter_tarif(tarif.split(","), object_list)

        if postal_code:
            return self.filter_postal_code(postal_code, object_list)

        if not distance or not models.user_is_located(user):
            return object_list

        related = models.get_user_related(user)
        return self.filter_distance(distance, related.geolocation, object_list)
예제 #11
0
def get_related(value):
    """
    Returns the related user of a request.user.
    """
    return get_user_related(value)
예제 #12
0
 def test_get_user_related(self):
     self.assertIsInstance(models.get_user_related(self.user1), models.Famille)
     self.assertIsInstance(models.get_user_related(self.user2), models.Prestataire)
     self.assertRaises(ObjectDoesNotExist, models.get_user_related, self.user3)
예제 #13
0
 def wrapped(request, *args, **kwargs):
     try:
         request.related_user = get_user_related(request.user)
     except ObjectDoesNotExist:
         raise Http404
     return func(request, *args, **kwargs)