Esempio n. 1
0
def profile(username):
    """
    Route for displaying a user's profile page
    displaying own dogs and favourite dogs
    """
    user = User.objects(username=username).first()
    user_dogs = Dog.objects(owner=user)
    favourites = Dog.objects(faved_by__contains=user.id)
    return render_template('user/profile.html',
                           title=f"{user.username}",
                           user=user,
                           user_dogs=user_dogs,
                           favourites=favourites)
Esempio n. 2
0
def upload_dog():
    """
    Route for uploading a dog to the database
    """
    form = UploadForm()
    if request.method == 'POST' and form.validate_on_submit():
        # Upload dog and add owner to likes by default
        dog = Dog(name=form.name.data,
                  owner=current_user.id,
                  breed=form.breed.data,
                  about=form.about.data,
                  liked_by=[current_user.id],
                  likes=1)
        dog.save()
        # Set dog image url to be dog's primary key, for easy deletion and
        # overwriting
        dog.set_dog_image(form.img_url.data, current_user.username, dog.pk)
        dog.save()
        flash('Dog Uploaded!', 'dog')
        return redirect(
            url_for('users.profile', username=current_user.username))
    # 'GET' functioning
    return render_template('dog/upload_dog.html',
                           form=form,
                           title="Upload Dog")
Esempio n. 3
0
def dog_page(dog_id):
    """
    Route for displaying the a dog's profile page,
    with larger image, about info and comment section
    """
    dog = Dog.objects(pk=dog_id).first()
    form = CommentInput()
    if request.method == 'POST' and form.validate_on_submit():
        if current_user.is_authenticated:
            comment = Comment(author=current_user.id,
                              dog=dog,
                              content=form.content.data)
            comment.save()
            form.content.data = ''
            flash('Your comment has been submitted!', 'comment')
        else:
            flash('You must be logged in to leave a comment!', 'exclamation')
            return redirect(url_for('users.login'))
    comments = Comment.objects(dog=dog)
    for comment in comments:
        print(comment)
    return render_template('dog/dog_page.html',
                           dog=dog,
                           form=form,
                           comments=comments,
                           title=f"{dog.name}'s Page")
Esempio n. 4
0
def edit_dog(dog_id):
    """Route for editing a dog's details"""
    dog = Dog.objects(pk=dog_id).first()
    if dog.owner != current_user and current_user.username != 'admin':
        flash("You cannot edit someone else's dog!", "exclamation")
        return redirect(url_for('main.gallery', view='hot'))
    form = EditForm(breed=dog.breed.id)
    if form.validate_on_submit():
        # Update Breed and about section
        dog.update(name=form.name.data)
        new_breed = Breed.objects(pk=form.breed.data).first()
        dog.update(breed=new_breed)
        dog.update(about=form.about.data)
        # If an imgage is selected, run set image function on Dog model
        if form.img_url.data:
            dog.set_dog_image(form.img_url.data, current_user.username, dog.pk)
        dog.save()
        flash('Updated dog details!', 'check-circle')
        return redirect(url_for('dogs.dog_page', dog_id=dog.pk))
    # Pre-fill data for GET requests
    elif request.method == 'GET':
        form.name.data = dog.name
        form.about.data = dog.about
    return render_template('dog/upload_dog.html',
                           form=form,
                           dog=dog,
                           title="Edit Dog")
Esempio n. 5
0
def delete_account(user_id):
    """route for editing username, email
    or password"""
    user = User.objects(pk=user_id).first()
    if user != current_user and current_user.username != 'admin':
        flash("You cannot delete someone else's profile!", "exclamation")
        return redirect(url_for('main.gallery', view='hot'))
    form = DeleteAccountForm()
    if form.validate_on_submit():
        # Complete password check before deletion (admin can enter admin
        # password)
        if not current_user.check_password(form.password.data):
            flash('Invalid Password', 'exclamation')
            return redirect(url_for('users.profile', username=user.username))
        else:
            if current_user.username != 'admin':
                # Logout user to home screen
                logout_user()
            # Delete stored cloudinary image for each of user's dogs
            dogs = Dog.objects(owner=user)
            for dog in dogs:
                dog.delete_dog_image(user.username, dog.pk)
            # Delete user (which will cascade delete dogs, comments, etc)
            user.delete()
            flash('Account deleted! Hope to see you again', 'check-circle')
            return redirect(url_for('main.index'))

    return render_template('user/delete_account.html',
                           user=user,
                           title='Delete Account',
                           form=form)
Esempio n. 6
0
def delete_dog(dog_id):
    """Route for deleting a dog from database"""
    dog = Dog.objects(pk=dog_id).first()
    if dog.owner != current_user and current_user.username != 'admin':
        flash("You cannot delete someone else's dog!", "exclamation")
        return redirect(url_for('main.gallery', view='hot'))
    if request.method == 'POST':
        user = current_user.username
        # Delete dog's image from cloudinary database before deleting dog
        dog.delete_dog_image(user, dog.pk)
        dog.delete()
        flash("Dog post successfuly deleted", "check-circle")
        return redirect(url_for('users.profile', username=user))
    return render_template('dog/delete_dog.html', dog=dog)
Esempio n. 7
0
def like(dog_id):
    """
    Route for liking a dog and increasing their
    like count
    """
    dog = Dog.objects(pk=dog_id).first_or_404()
    # Remove from likes if already liked
    if current_user in dog.liked_by:
        dog.update(pull__liked_by=current_user.id)
        dog.update(dec__likes=1)
    # lse add to likes
    else:
        dog.update(push__liked_by=current_user.id)
        dog.update(inc__likes=1)
        flash(f'"Thanks for the like!" ~ {dog.name}', 'thumbs-up')

    # Return to previous page ensuring no repeating animation if coming from
    # gallery view
    return redirect(
        request.referrer) if '/profile/' in request.referrer else deanimate(
            request.referrer)
Esempio n. 8
0
def favourite(dog_id):
    """
    Route for saving a dog to the current
    user's favourites
    """
    dog = Dog.objects(pk=dog_id).first_or_404()
    if dog.owner == current_user:
        flash(f"{dog.name} is already saved, they're yours!", 'heart')
        return deanimate(request.referrer)
    # Remove from favourites if already favourites
    elif current_user in dog.faved_by:
        dog.update(pull__faved_by=current_user.id)
    # else add to favourites
    else:
        dog.update(push__faved_by=current_user.id)
        flash(f"{dog.name} added to favourites!", 'heart')

    # Return to previous page ensuring no repeating animation if coming from
    # gallery view
    return redirect(
        request.referrer) if '/profile/' in request.referrer else deanimate(
            request.referrer)