def update_view(slug):
    book = Books.objects(slug=slug).first()
    book = book.update(
        book_name=book.book_name,
        author=book.author,
        user_id=book.user_id,
        image_url=book.image_url,
        slug=book.slug,
        ISBN=book.ISBN,
        category=book.category,
        view=book.view + 1,
        overview=book.overview,
        date=book.date,
    )
    return book
 def get_user_books():
     return Books.objects(user_id=session.get('user_id')).order_by('-date')
 def get_single_book(slug):
     return Books.objects(slug=slug)
 def get_category_books(slug):
     return Books.objects(category=Slug.getTitle(slug))
 def get_most_viewed_books():
     return Books.objects().order_by('-view')
 def get_recent_books():
     return Books.objects().order_by('-date')
def account(term='login', slug=''):
    page_data = PageData
    if page_data.check_login():
        active_user = Users.objects(user_id=session.get('user_id')).first()
        books = Books.objects(user_id=session.get('user_id')).order_by('-date')
        user = page_data.get_user_details(session.get('user_id'))
        # this root for user profile
        if term == 'profile':
            return render_template('account/profile.html',
                                   user=user,
                                   page_data=page_data)
        # this root for user edit profile information like name and email
        elif term == 'edit_profile':
            form = EditUser()
            if form.validate_on_submit():
                name = form.name.data
                email = form.email.data
                if user.email == email:
                    user = Users.objects(
                        user_id=session.get('user_id')).update(name=name,
                                                               email=email)
                    flash('You are successfully updated your profile!',
                          'success')
                    return redirect(url_for('account') + '/edit_profile')
                else:
                    count = Users.objects(email=email).count()
                    if count > 0:
                        flash(
                            'This email already existed! Please try another one.',
                            'danger')
                        return redirect(url_for('account') + '/edit_profile')
                    else:
                        user = Users.objects(
                            user_id=session.get('user_id')).update(name=name,
                                                                   email=email)
                        flash('You are successfully update your profile!',
                              'success')
                        return redirect(url_for('account') + '/edit_profile')
            else:
                return render_template('account/edit_profile.html',
                                       page_data=page_data,
                                       user=user,
                                       form=form)
        # this root for user uploaded all books
        elif term == 'books':
            return render_template('account/my_books.html',
                                   slug_ob=Slug,
                                   user=user,
                                   page_data=page_data)
        # this root for user single book view
        elif term == 'view':
            book = page_data.get_single_book(slug).first()
            return render_template('account/view.html',
                                   helper=Helper,
                                   form=DeleteBook(),
                                   user=user,
                                   page_data=page_data,
                                   single_book=book)
        # this root for user can upload new book
        elif term == 'add_new_book':
            form = AddNewBook()
            if form.validate_on_submit():

                # form upload image file details

                form_file_upload = request.files['upload']
                upload_file_name = str(active_user.user_id) + '_' \
                    + str(random.randint(10, 200)) + '_' \
                    + secure_filename(form_file_upload.filename)
                form_file_upload.save('application/static/uploads/2020/' +
                                      upload_file_name)

                book_name = form.book_name.data
                author = form.author.data
                user_id = user.user_id
                image_url = upload_file_name
                slug = Slug.getSlug(form.book_name.data)
                ISBN = form.ISBN.data
                category = form.category.data
                overview = form.overview.data
                date = datetime.now()

                book = Books(
                    book_name=book_name,
                    author=author,
                    user_id=user_id,
                    image_url=image_url,
                    slug=slug,
                    ISBN=ISBN,
                    category=category,
                    overview=overview,
                    date=date,
                )
                book.save()
                flash('You are successfully added a new book!', 'success')
                return redirect(url_for('account') + '/books')
            else:

                return render_template('account/add_new_book.html',
                                       page_data=page_data,
                                       form=form,
                                       user=user)
        # this root for user can edit single bokk information
        elif term == 'edit_book':

            book = page_data.get_single_book(slug).first()
            form = EditBook(request.form, category=book.category)
            print(book)
            if slug:
                if form.validate_on_submit():
                    image_url_link = book.image_url
                    if request.files['upload']:
                        form_file_upload = request.files['upload']
                        image_url_link      = str(user.user_id) + '_' + str(random.randint(10, 200)) + '_' \
                            + secure_filename(form_file_upload.filename)
                        if book.image_url:
                            os.remove('application/static/uploads/2020/' +
                                      book.image_url)
                        form_file_upload.save(
                            'application/static/uploads/2020/' +
                            image_url_link)

                    book_name = form.book_name.data
                    author = form.author.data
                    user_id = user.user_id
                    image_url = image_url_link
                    slug = book.slug
                    ISBN = form.ISBN.data
                    category = form.category.data
                    overview = form.overview.data
                    date = datetime.now()
                    update_book = book.update(
                        book_name=book_name,
                        author=author,
                        user_id=user_id,
                        image_url=image_url,
                        slug=slug,
                        ISBN=ISBN,
                        category=category,
                        overview=overview,
                        date=date,
                    )
                    flash('You are successfully update your book!', 'success')
                    return redirect(
                        url_for('account') + 'edit_book/' + book.slug)
                else:
                    return render_template('account/edit_book.html',
                                           page_data=page_data,
                                           user=user,
                                           form=form,
                                           single_book=book)
            else:
                redirect(url_for('account') + 'mybooks')
        # this root for user can delete book information and image as well form database and server
        elif term == 'delete_book':
            form = DeleteBook()
            if slug:
                book = Books.objects(slug=slug)
                os.remove('application/static/uploads/2020/' +
                          book[0].image_url)
                if form.validate_on_submit():
                    book.delete()
                    flash('You\'r book successfully deleted!', 'success')
                    return redirect(url_for('account') + '/mybooks')
                else:
                    return redirect(url_for('account') + '/book_view/' + title)
            else:
                return redirect(url_for('account') + '/mybooks')
        # this root for user can change their password
        elif term == 'change_password':
            form = ChangePassword()
            if form.validate_on_submit():
                new_password = form.new_password.data
                active_user.set_password(new_password)
                update_book = \
                    active_user.update(password=active_user.password)
                flash('You\'r password successfully updated!', 'success')
                return redirect(url_for('account') + '/change_password')
            else:
                return render_template('account/change_password.html',
                                       page_data=page_data,
                                       user=user,
                                       form=form)
        # this root for user can logout
        elif term == 'logout':
            session['user_id'] = False
            session['login'] = False
            flash('You are successfully logout!', 'danger')
            return redirect(url_for('account') + '/login')
        else:
            return redirect(url_for('account') + '/profile')
    else:
        # this root for new user can register for this webiste
        if term == 'register':
            form = RegisterForm()
            if form.validate_on_submit():
                name = form.name.data
                email = form.email.data
                password = form.password.data
                user = Users.objects(email=email).first()
                if user:
                    flash(
                        'You\'r email already existed! Please try another one.',
                        'danger')
                    return render_template('account/register.html',
                                           page_data=page_data,
                                           form=form)
                else:
                    user_id = Users.objects.all().count()
                    user_id += 1
                    name = form.name.data
                    email = form.email.data
                    password = form.password.data

                    user = Users(user_id=user_id,
                                 name=name,
                                 email=email,
                                 password=password)
                    user.set_password(password)
                    user.save()

                    session['user_id'] = user_id
                    session['login'] = True
                    flash('You are successfully register!', 'success')
                    return redirect(url_for('account') + '/profile')
            else:

                return render_template('account/register.html',
                                       page_data=page_data,
                                       form=form)
        # this root for user can login
        elif term == 'login':
            form = LoginForm()
            page_data = PageData
            if form.validate_on_submit():
                email = form.email.data
                password = form.password.data
                user = Users.objects(email=email).first()
                if user and user.get_password(password):
                    session['user_id'] = user.user_id
                    session['login'] = True

                    flash('You are successfully logged in!', 'success')
                    return redirect(url_for('account') + '/profile')
                else:
                    if user and user.password != password:
                        flash(
                            'Sorry, Email and password didn\'t match! Please try again',
                            'danger')
                    else:
                        flash('Sorry, Invalid users details!', 'danger')
                        return redirect(url_for('account') + '/profile')

            return render_template('account/login.html',
                                   form=form,
                                   page_data=page_data)
        else:
            return redirect(url_for('account') + '/login')