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)
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")
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")
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")
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)
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)
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)
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)