示例#1
0
def approve_listing(steward, listing):
    """
    Give final approval to a listing
    """
    listing = _add_listing_activity(steward, listing,
        models.ListingActivity.APPROVED)
    listing.approval_status = models.Listing.APPROVED
    listing.approved_date = utils.get_now_utc()
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#2
0
def create_listing_visit_count(profile, listing, count, last_visit_date=None):
    """
    Set initial visit count for a given profile and listing.  Ensures that there is
    only one visit count object per profile/listing combination.
    """
    if not last_visit_date:
        last_visit_date = utils.get_now_utc()

    filtered_counts = models.ListingVisitCount.objects.filter(profile=profile,
                                                              listing=listing)
    if filtered_counts.count() > 1:
        raise errors.RequestException(
            'Only one visit count object can exist for profile {0} and listing {1}'
            .format(profile.display_name, listing.title))
    elif filtered_counts.count() == 1:
        return update_listing_visit_count(filtered_counts.first(), count,
                                          last_visit_date)
    else:
        visit_count = models.ListingVisitCount(profile=profile,
                                               listing=listing)
        visit_count.count = count
        visit_count.last_visit_date = last_visit_date
        visit_count.save()

        return visit_count
示例#3
0
def reject_listing(steward, listing, rejection_description):
    """
    Reject a submitted listing

    Args:
        steward
        listing
        rejection_description

    Return:
        Listing
    """
    old_approval_status = listing.approval_status
    listing = _add_listing_activity(steward, listing, models.ListingActivity.REJECTED, description=rejection_description)
    listing.approval_status = models.Listing.REJECTED
    listing.edited_date = utils.get_now_utc()
    listing.save()

    dispatcher.publish('listing_approval_status_changed',
                       listing=listing,
                       profile=steward,
                       old_approval_status=old_approval_status,
                       new_approval_status=listing.approval_status)

    return listing
示例#4
0
def pending_delete_listing(author, listing, pending_description):
    """
    Submit a listing for Deletion

    Args:
        author
        listing

    Return:
        listing
    """
    # TODO: check that all required fields are set
    old_approval_status = listing.approval_status
    listing = _add_listing_activity(author, listing, models.ListingActivity.PENDING_DELETION,
                                    description=pending_description)
    listing.approval_status = models.Listing.PENDING_DELETION
    listing.is_enabled = False
    listing.edited_date = utils.get_now_utc()
    listing.save()

    dispatcher.publish('listing_approval_status_changed',
                       listing=listing,
                       profile=author,
                       old_approval_status=old_approval_status,
                       new_approval_status=listing.approval_status)

    return listing
示例#5
0
def _update_rating(username, listing):
    """
    Invoked each time a review is created, deleted, or updated
    """
    reviews = models.Review.objects.filter(listing=listing)
    rate1 = reviews.filter(rate=1).count()
    rate2 = reviews.filter(rate=2).count()
    rate3 = reviews.filter(rate=3).count()
    rate4 = reviews.filter(rate=4).count()
    rate5 = reviews.filter(rate=5).count()
    total_votes = reviews.count()
    total_reviews = total_votes - reviews.filter(text=None).count()

    # calculate weighted average
    if total_votes == 0:
        avg_rate = 0
    else:
        avg_rate = (5 * rate5 + 4 * rate4 + 3 * rate3 + 2 * rate2 + rate1) / total_votes
        avg_rate = float('{0:.1f}'.format(avg_rate))

    # update listing
    listing.total_rate1 = rate1
    listing.total_rate2 = rate2
    listing.total_rate3 = rate3
    listing.total_rate4 = rate4
    listing.total_rate5 = rate5
    listing.total_votes = total_votes
    listing.total_reviews = total_reviews
    listing.avg_rate = avg_rate
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#6
0
def disable_listing(steward, listing):
    """
    Disable a listing
    """
    listing = _add_listing_activity(steward, listing, models.ListingActivity.DISABLED)
    listing.is_enabled = False
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#7
0
def enable_listing(user, listing):
    """
    Enable a listing
    """
    listing = _add_listing_activity(user, listing, models.ListingActivity.ENABLED)
    listing.is_enabled = True
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#8
0
def reject_listing(steward, listing, rejection_description):
    """
    Reject a submitted listing
    """
    listing = _add_listing_activity(steward, listing,
        models.ListingActivity.REJECTED, description=rejection_description)
    listing.approval_status = models.Listing.REJECTED
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#9
0
def approve_listing_by_org_steward(org_steward, listing):
    """
    Give Org Steward approval to a listing
    """
    listing = _add_listing_activity(org_steward, listing,
        models.ListingActivity.APPROVED_ORG)
    listing.approval_status = models.Listing.APPROVED_ORG
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#10
0
def submit_listing(author, listing):
    """
    Submit a listing for approval
    """
    # TODO: check that all required fields are set
    listing = _add_listing_activity(author, listing, models.ListingActivity.SUBMITTED)
    listing.approval_status = models.Listing.PENDING
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#11
0
def approve_listing(steward, listing):
    """
    Give final approval to a listing

    TODO: Validation - If a listing is already [APPROVED] does it make sense to _add_listing_activity [ListingActivity.APPROVED] again

    Args:
        org_steward
        listing

    Return:
        listing
    """
    listing = _add_listing_activity(steward, listing, models.ListingActivity.APPROVED)
    listing.approval_status = models.Listing.APPROVED
    listing.approved_date = utils.get_now_utc()
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#12
0
def _add_listing_activity(author,
                          listing,
                          action,
                          change_details=None,
                          description=None):
    """
    Adds a ListingActivity

    Args:
        author (models.Profile): author of the change
        listing (models.Listing): listing being affected
        action (models.ListingActivity.ACTION_CHOICES): action being taken
        change_details (Optional(List)): change change details
            [
                {
                    "field_name": "name",
                    "old_value": "old_val",
                    "new_value": "new_val"
                },
                {
                ...
                }
            ]

    Returns:
        models.Listing: The listing being affected

    Raises:
        None
    """
    listing_activity = models.ListingActivity(action=action,
                                              author=author,
                                              listing=listing,
                                              description=description)
    listing_activity.save()

    if change_details:
        for i in change_details:
            change = models.ChangeDetail(field_name=i['field_name'],
                                         old_value=i['old_value'],
                                         new_value=i['new_value'])
            change.save()
            listing_activity.change_details.add(change)

    # update the listing
    listing.last_activity = listing_activity
    is_rejected = listing_activity.action == models.ListingActivity.REJECTED
    is_pending_delete = listing_activity.action == models.ListingActivity.PENDING_DELETION
    if is_rejected or is_pending_delete:
        listing.current_rejection = listing_activity
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#13
0
def create_listing_review(username, listing, rating, text=None, review_parent=None, create_day_delta=None):
    """
    Create a new review for a listing

    Args:
        username (str): author's username
        rating (int): rating, 1-5
        text (Optional(str)): review text
        create_date_delta(Optional(int)): Create date in days delta
            example: 0 = Now, -1 = Minus one day, 1 = plus one day

    Returns:
        {
            "rate": rate,
            "text": text,
            "author": author.id,
            "listing": listing.id,
            "id": review.id
        }
    """
    author = generic_model_access.get_profile(username)
    review = models.Review(listing=listing, author=author, rate=rating, text=text, review_parent=review_parent)

    if create_day_delta:
        # created_date = models.DateTimeField(default=utils.get_now_utc)
        review.created_date = utils.get_now_utc(days_delta=create_day_delta)

    review.save()

    # add this action to the log
    change_details = [
        {
            'field_name': 'rate',
            'old_value': None,
            'new_value': rating
        },
        {
            'field_name': 'text',
            'old_value': None,
            'new_value': text
        }
    ]
    listing = review.listing
    listing = _add_listing_activity(author, listing,
        models.ListingActivity.REVIEWED, change_details=change_details)

    # update this listing's rating
    _update_rating(username, listing)

    if review.review_parent is None:
        dispatcher.publish('listing_review_created', listing=listing, profile=author, rating=rating, text=text)
    return review
示例#14
0
def update_listing_visit_count(visit_count, count, last_visit_date=None):
    """
    Update visit count for a given profile and listing.
    """
    if not last_visit_date:
        last_visit_date = utils.get_now_utc()

    visit_count.count = count
    visit_count.last_visit_date = last_visit_date

    visit_count.save()

    return visit_count
示例#15
0
def update_listing_visit_count(visit_count, count, last_visit_date=None):
    """
    Update visit count for a given profile and listing.
    """
    if not last_visit_date:
        last_visit_date = utils.get_now_utc()

    visit_count.count = count
    visit_count.last_visit_date = last_visit_date

    visit_count.save()

    return visit_count
示例#16
0
def disable_listing(steward, listing):
    """
    Disable a listing

    Args:
        steward
        listing

    Returns:
        listing
    """
    listing = _add_listing_activity(steward, listing, models.ListingActivity.DISABLED)
    listing.is_enabled = False
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#17
0
def enable_exportable(user, listing):
    """
    Allow user's outside marketplace to view listing

    Args:
        user
        listing

    Returns:
        listing
    """
    listing = _add_listing_activity(user, listing, models.ListingActivity.ENABLED_OUTSIDE_VISIBILITY)
    listing.is_exportable = True
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#18
0
def disable_exportable(user, listing, change_details):
    """
    Disable user's outside marketplace to view listing

    Args:
        user
        listing

    Returns:
        listing
    """
    listing = _add_listing_activity(user, listing, models.ListingActivity.DISABLED_OUTSIDE_VISIBILITY)
    listing.is_exportable = False
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#19
0
def enable_listing(user, listing):
    """
    Enable a listing

    Args:
        user
        listing

    Returns:
        listing
    """
    listing = _add_listing_activity(user, listing, models.ListingActivity.ENABLED)
    listing.is_enabled = True
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#20
0
def edit_listing_review(username, review, rate, text=None):
    """
    Edit an existing review

    Args:
        username: user making this request
        review (models.Review): review to modify
        rate (int): rating (1-5)
        text (Optional(str)): review text

    Returns:
        The modified review
    """
    # only the author of a review can edit it
    user = generic_model_access.get_profile(username)
    if review.author.user.username != username:
        raise errors.PermissionDenied()

    change_details = [{
        'field_name': 'rate',
        'old_value': review.rate,
        'new_value': rate
    }, {
        'field_name': 'text',
        'old_value': review.text,
        'new_value': text
    }]

    listing = review.listing
    listing = _add_listing_activity(user,
                                    listing,
                                    models.ListingActivity.REVIEW_EDITED,
                                    change_details=change_details)

    review.rate = rate
    review.text = text
    review.edited_date = utils.get_now_utc()
    review.save()

    _update_rating(username, listing)

    dispatcher.publish('listing_review_changed',
                       listing=listing,
                       profile=user,
                       rating=rate,
                       text=text)
    return review
示例#21
0
def _add_listing_activity(author, listing, action, change_details=None,
                          description=None):
    """
    Adds a ListingActivity

    Args:
        author (models.Profile): author of the change
        listing (models.Listing): listing being affected
        action (models.Action): action being taken
        change_details (Optional(List)): change change details
            [
                {
                    "field_name": "name",
                    "old_value": "old_val",
                    "new_value": "new_val"
                },
                {
                ...
                }
            ]

    Returns:
        models.Listing: The listing being affected

    Raises:
        None

    """
    listing_activity = models.ListingActivity(action=action,
        author=author, listing=listing, description=description)
    listing_activity.save()
    if change_details:
        for i in change_details:
            change = models.ChangeDetail(field_name=i['field_name'],
                old_value=i['old_value'], new_value=i['new_value'])
            change.save()
            listing_activity.change_details.add(change)

    # update the listing
    listing.last_activity = listing_activity
    if listing_activity.action == models.ListingActivity.REJECTED:
        listing.current_rejection = listing_activity
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#22
0
def pending_delete_listing(author, listing):
    """
    Submit a listing for Deletion

    Args:
        author
        listing

    Return:
        listing
    """
    # TODO: check that all required fields are set
    listing = _add_listing_activity(author, listing,
                                    models.ListingActivity.PENDING_DELETION)
    listing.approval_status = models.Listing.PENDING_DELETION
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#23
0
def _update_rating(username, listing):
    """
    Invoked each time a review is created, deleted, or updated

    Args:
        username (string): username
        listing(model.Listing): Listing Object

    """
    reviews = models.Review.objects.filter(listing=listing,
                                           review_parent__isnull=True)
    rate1 = reviews.filter(rate=1).count()
    rate2 = reviews.filter(rate=2).count()
    rate3 = reviews.filter(rate=3).count()
    rate4 = reviews.filter(rate=4).count()
    rate5 = reviews.filter(rate=5).count()
    total_votes = reviews.count()
    total_reviews = total_votes - reviews.filter(text=None).count()

    review_responses = models.Review.objects.filter(
        listing=listing, review_parent__isnull=False)
    total_review_responses = review_responses.count()

    # calculate weighted average
    if total_votes == 0:
        avg_rate = 0
    else:
        avg_rate = (5 * rate5 + 4 * rate4 + 3 * rate3 + 2 * rate2 +
                    rate1) / total_votes
        avg_rate = float('{0:.1f}'.format(avg_rate))

    # update listing
    listing.total_rate1 = rate1
    listing.total_rate2 = rate2
    listing.total_rate3 = rate3
    listing.total_rate4 = rate4
    listing.total_rate5 = rate5
    listing.total_votes = total_votes
    listing.total_reviews = total_reviews
    listing.total_review_responses = total_review_responses
    listing.avg_rate = avg_rate
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#24
0
def submit_listing(author, listing):
    """
    Submit a listing for approval

    TODO: Validation - If a listing is already [PENDING] does it make sense to _add_listing_activity [ListingActivity.SUBMITTED] again

    Args:
        author
        listing

    Return:
        listing
    """
    # TODO: check that all required fields are set
    listing = _add_listing_activity(author, listing, models.ListingActivity.SUBMITTED)
    listing.approval_status = models.Listing.PENDING
    listing.edited_date = utils.get_now_utc()
    listing.save()
    return listing
示例#25
0
def edit_listing_review(username, review, rate, text=None):
    """
    Edit an existing review

    Args:
        username: user making this request
        review (models.Review): review to modify
        rate (int): rating (1-5)
        text (Optional(str)): review text

    Returns:
        The modified review
    """
    # only the author of a review can edit it
    user = generic_model_access.get_profile(username)
    if review.author.user.username != username:
        raise errors.PermissionDenied()

    change_details = [
        {
            'field_name': 'rate',
            'old_value': review.rate,
            'new_value': rate
        },
        {
            'field_name': 'text',
            'old_value': review.text,
            'new_value': text
        }
    ]

    listing = review.listing
    listing = _add_listing_activity(user, listing, models.ListingActivity.REVIEW_EDITED,
        change_details=change_details)

    review.rate = rate
    review.text = text
    review.edited_date = utils.get_now_utc()
    review.save()

    _update_rating(username, listing)
    return review
示例#26
0
def create_listing_visit_count(profile, listing, count, last_visit_date=None):
    """
    Set initial visit count for a given profile and listing.  Ensures that there is
    only one visit count object per profile/listing combination.
    """
    if not last_visit_date:
        last_visit_date = utils.get_now_utc()

    filtered_counts = models.ListingVisitCount.objects.filter(profile=profile, listing=listing)
    if filtered_counts.count() > 1:
        raise errors.RequestException('Only one visit count object can exist for profile {0} and listing {1}'.format(profile.display_name, listing.title))
    elif filtered_counts.count() == 1:
        return update_listing_visit_count(filtered_counts.first(), count, last_visit_date)
    else:
        visit_count = models.ListingVisitCount(profile=profile, listing=listing)
        visit_count.count = count
        visit_count.last_visit_date = last_visit_date
        visit_count.save()

        return visit_count
示例#27
0
 def test_get_now_utc(self):
     result = utils.get_now_utc()
     self.assertIsNotNone(result)
示例#28
0
 def test_get_now_utc(self):
     result = utils.get_now_utc()
     self.assertIsNotNone(result)