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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
def test_get_now_utc(self): result = utils.get_now_utc() self.assertIsNotNone(result)
def test_get_now_utc(self): result = utils.get_now_utc() self.assertIsNotNone(result)