コード例 #1
0
def extensions_add(member_id):
    member = Member.query.get_or_404(member_id)
    if not (member.is_membership_near_expired or member.is_membership_expired):
        abort(405)
    form = ExtensionForm()
    form.date_expiration = member.date_expiration
    if form.validate_on_submit():
        if form.price.data.is_enabled:
            extension = Extension()
            extension.note = form.note.data
            extension.price = form.price.data.price_value
            extension.date_performed = form.date_performed.data
            extension.date_extended = CommonDate.add_year(
                extension.date_performed
            ) if member.is_membership_expired else CommonDate.add_year(
                member.date_expiration)
            extension.member_id = member_id
            extension.price_id = form.price.data.id
            db.session.add(extension)
            member.date_expiration = extension.date_extended
            db.session.flush()
            EventWriter.write(
                EventType.extension_add, member_id,
                _g('Membership is extended for the following member') + ' (' +
                _g('Member id') + ': ' + str(member.id) + '):' +
                member.log_data() + '<br/>' + _g('Extension price was') + ' ' +
                extension.price_and_currency_print)
            db.session.commit()
            flash(
                _g('Membership is successfully extended to') + ' ' +
                member.date_expiration_print, 'info')
            return redirect(
                url_for('members.members_details', member_id=member.id))
    return render_template('extension_add.html', form=form, member=member)
コード例 #2
0
ファイル: routes.py プロジェクト: NNemanjaMM/WebLib
def book_rents_details(rent_id):
    rent = Rental.query.get_or_404(rent_id)
    member = Member.query.get_or_404(rent.member_id)
    book = Book.query.get_or_404(rent.book_id)
    form = RentTerminationForm()
    form.date_rented = rent.date_performed
    if not rent.is_terminated and form.validate_on_submit():
        rent.is_terminated = True
        rent.date_termination = form.date_returned.data
        member.number_of_rented_books = db.session.query(func.count(
            Rental.id)).filter(
                and_(Rental.member_id == member.id,
                     Rental.is_terminated == False)).scalar()
        book.is_rented = False
        EventWriter.write(
            EventType.rent_return, book_id,
            _g('Following book') + ' (' + _g('Book id') + ': ' + str(book.id) +
            '):' + book.log_data() + '<br/>' +
            _g('Is returned from following member') + ' (' + _g('Member id') +
            ' ' + str(member.id) + '):' + member.log_data())
        db.session.commit()
        flash(_g('Book is successfully returned') + '.', 'info')
        return redirect(url_for('members.members_details',
                                member_id=member.id))
    return render_template('rent.html', form=form, rent=rent)
コード例 #3
0
def prices_update(price_id):
    if not current_user.is_admin:
        abort(403)
    price = ExtensionPrice.query.get_or_404(price_id)
    form = PriceUpdate()
    if form.validate_on_submit():
        price.note = form.note.data
        price.is_enabled = not price.is_enabled
        if price.is_enabled:
            EventWriter.write(
                EventType.price_enabled, price.id,
                _g('Following price is activated') + ':' + price.log_data())
        else:
            EventWriter.write(
                EventType.price_disabled, price.id,
                _g('Following price is deactivated') + ':' + price.log_data())
        db.session.commit()
        flash(
            _g('Price availability is successfully updated') + '.', 'success')
        return redirect(url_for('extensions.prices'))
    elif request.method == 'GET':
        form.note.data = price.note
    return render_template('extension_prices_update.html',
                           form=form,
                           price=price)
コード例 #4
0
 def convert_and_validate_date(field, allow_future, date_min_str = MINIMUM_DATE):
     value = None
     field.errors = list()
     try:
         value = datetime.strptime(field.data, "%d.%m.%Y.").date()
     except ValueError:
         field.errors.append(_g('Value is not a valid date') + '. ' + _g('Make sure it matches the following format') + ' ' + _g('"dd.mm.yyyy."') + '.')
     if not value == None:
         if value < datetime.strptime(date_min_str, "%d.%m.%Y.").date():
             field.errors.append(_g('Date can not be set before') + ' "' + str(date_min_str) + '".')
             value = None
         elif not allow_future and value > date.today():
             field.errors.append(_g('Date can not be set in future') + '.')
             value = None
     return value
コード例 #5
0
 def convert_and_validate_number(field):
     value = None
     field.errors = list()
     try:
         value = int(field.data)
     except ValueError:
         field.errors.append(_g('Value is not a valid whole number') + '.')
     if not value == None:
         if value < 0:
             field.errors.append(_g('Number can not be lower than zero') + '.')
             value = None
         elif value > MAXIMUM_NUMBER:
             field.errors.append(_g('Number can not be higher than') + ' ' + str(MAXIMUM_NUMBER) + '.')
             value = None
     return value
コード例 #6
0
ファイル: routes.py プロジェクト: NNemanjaMM/WebLib
def books_update(book_id):
    form = BookUpdateForm()
    book = Book.query.get_or_404(book_id)
    if form.validate_on_submit():
        if has_new_values(book, form):
            was_error = book.has_error
            from_value = book.log_data()
            book.inv_number = form.inv_number.data
            book.signature = form.signature.data
            book.title = form.title.data
            book.author = form.author.data
            if current_user.is_admin:
                book.has_error = form.has_error.data
                if not was_error == book.has_error:
                    if book.has_error:
                        EventWriter.write(
                            EventType.book_error_add, book_id,
                            _g('An error is set to the following book') +
                            ' (' + _g('Book id') + ': ' + str(book.id) + '):' +
                            book.log_data())
                    else:
                        EventWriter.write(
                            EventType.book_error_remove, book_id,
                            _g('An error is removed from the following book') +
                            ' (' + _g('Book id') + ': ' + str(book.id) + '):' +
                            book.log_data())
            db.session.flush()
            EventWriter.write(
                EventType.book_update, book.id,
                _g('Following book is updated') + ' (' + _g('Book id') + ': ' +
                str(book.id) + '):' + from_value + '<br/>' +
                _g('To new values') + ':' + book.log_data())
            db.session.commit()
            flash(_g('Book data is successfully updated') + '.', 'success')
            return redirect(url_for('books.bookss'))
        else:
            flash(
                _g('Book data') + ' ' +
                _g('is not changed, as typed values are the same as previous')
                + '.', 'info')
            return redirect(url_for('books.bookss'))
    elif request.method == 'GET':
        form.inv_number.data = book.inv_number
        form.signature.data = book.signature
        form.title.data = book.title
        form.author.data = book.author
        form.has_error.data = book.has_error
    return render_template('books_cu.html', form=form, is_creating=False)
コード例 #7
0
ファイル: routes.py プロジェクト: NNemanjaMM/WebLib
def books_add():
    form = BookCreateForm()
    if form.validate_on_submit():
        book = Book()
        book.inv_number = form.inv_number.data
        book.signature = form.signature.data
        book.title = form.title.data
        book.author = form.author.data
        db.session.add(book)
        db.session.flush()
        EventWriter.write(
            EventType.book_add, book.id,
            _g('Following book is added') + ' (' + _g('Book id') + ': ' +
            str(book.id) + '):' + book.log_data())
        db.session.commit()
        flash(_g('Book is successfully added') + '.', 'success')
        return redirect(url_for('books.bookss'))
    return render_template('books_cu.html', form=form, is_creating=True)
コード例 #8
0
def prices_add():
    if not current_user.is_admin:
        abort(403)
    form = PriceAdd()
    if form.validate_on_submit():
        price = ExtensionPrice()
        price.price_value = form.price_value.data
        price.currency = form.currency.data
        price.note = form.note.data
        price.is_enabled = True
        db.session.add(price)
        db.session.flush()
        EventWriter.write(
            EventType.price_add, price.id,
            _g('Following price is added') + ':' + price.log_data())
        db.session.commit()
        flash(_g('Price is successfully added'), 'info')
        return redirect(url_for('extensions.prices'))
    return render_template('extension_prices_add.html', form=form)
コード例 #9
0
def members_create():
    form = MemberCreateForm()
    if form.validate_on_submit():
        member = Member()
        member.first_name = form.first_name.data
        member.last_name = form.last_name.data
        member.father_name = form.father_name.data
        member.profession = form.profession.data
        member.email = form.email.data
        member.phone = form.phone.data.replace("/", "")
        member.address = form.address.data
        member.date_registered = form.date_registered.data
        member.date_expiration = form.date_registered.data
        db.session.add(member)
        db.session.flush()
        EventWriter.write(
            EventType.member_add, member.id,
            _g('Following member is added') + ' (' + _g('Member id') + ': ' +
            str(member.id) + '):' + member.log_data())
        db.session.commit()
        flash(_g('Member is successfully added') + '.', 'success')
        return redirect(url_for('members.members_details',
                                member_id=member.id))
    return render_template('member_cu.html', form=form, is_creating=True)
コード例 #10
0
def members_update(member_id):
    member = Member.query.get_or_404(member_id)
    form = MemberUpdateForm()
    if form.validate_on_submit():
        if has_new_values(member, form):
            from_value = member.log_data()
            member.first_name = form.first_name.data
            member.last_name = form.last_name.data
            member.father_name = form.father_name.data
            member.profession = form.profession.data
            member.email = form.email.data
            member.phone = form.phone.data.replace("/", "")
            member.address = form.address.data
            EventWriter.write(
                EventType.member_update, member.id,
                _g('Following member is updated') + ' (' + _g('Member id') +
                ': ' + str(member.id) + '):' + from_value + '<br/>' +
                _g('To new values') + ':' + member.log_data())
            db.session.commit()
            flash(_g('Member data is successfully updated') + '.', 'success')
            return redirect(
                url_for('members.members_details', member_id=member.id))
        else:
            flash(
                _g('Member data') + ' ' +
                _g('is not changed, as typed values are the same as previous')
                + '.', 'info')
            return redirect(
                url_for('members.members_details', member_id=member.id))
    elif request.method == 'GET':
        form.first_name.data = member.first_name
        form.last_name.data = member.last_name
        form.father_name.data = member.father_name
        form.profession.data = member.profession
        form.email.data = member.email
        form.phone.data = member.phone_print
        form.address.data = member.address
    return render_template('member_cu.html', form=form, is_creating=False)
コード例 #11
0
 def __init__(self, text = _g('Value does not match e-mail address format')+'.'):
     Email.__init__(self, message = text)
コード例 #12
0
 def validate_number_order(first_number_value, second_number_value, second_number_field):
     second_number_field.errors = list()
     if not first_number_value <= second_number_value:
         second_number_field.errors.append(_g('"Higher than" value can not be greater than "lower than" value') + '.')
     return len(second_number_field.errors) == 0
コード例 #13
0
 def __init__(self, text = _g('Value is not a valid decimal number') + '. ' + _g('Make sure it uses dot as decimal point') + '.'):
     DataRequired.__init__(self, message = text)
コード例 #14
0
ファイル: routes.py プロジェクト: NNemanjaMM/WebLib
def book_rents():
    page = request.args.get('page', 1, type=int)
    sort_criteria = request.args.get('sort_by', 'id', type=str)
    sort_direction = request.args.get('direction', 'down', type=str)
    args_sort = {'sort_by': sort_criteria, 'direction': sort_direction}
    if not sort_criteria in sort_rents_values:
        sort_criteria = 'date_performed'

    filter_has_errors = False
    args_filter = {}
    form = RentFilterForm()
    my_query = db.session.query(Rental)

    f_date_performed_from = request.args.get('date_performed_from')
    f_date_performed_to = request.args.get('date_performed_to')
    f_date_deadline_from = request.args.get('date_deadline_from')
    f_date_deadline_to = request.args.get('date_deadline_to')
    f_date_terminated_from = request.args.get('date_terminated_from')
    f_date_terminated_to = request.args.get('date_terminated_to')
    f_is_terminated = request.args.get('is_terminated')
    f_is_deadlime_passed = request.args.get('is_deadlime_passed')
    f_book_id = request.args.get('book_id')
    f_member_id = request.args.get('member_id')

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_performed_from,
        form.date_performed_to, f_date_performed_from, f_date_performed_to,
        'date_performed_from', 'date_performed_to', Rental, 'date_performed',
        False)

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_deadline_from,
        form.date_deadline_to, f_date_deadline_from, f_date_deadline_to,
        'date_deadline_from', 'date_deadline_to', Rental, 'date_deadline',
        False)

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_terminated_from,
        form.date_terminated_to, f_date_terminated_from, f_date_terminated_to,
        'date_terminated_from', 'date_terminated_to', Rental,
        'date_termination', False)

    my_query, args_filter, filter_has_errors = CommonFilter.process_equal_number_filter(
        my_query, args_filter, filter_has_errors, form.book_id, f_book_id,
        'book_id', Rental, 'book_id')

    my_query, args_filter, filter_has_errors = CommonFilter.process_equal_number_filter(
        my_query, args_filter, filter_has_errors, form.member_id, f_member_id,
        'member_id', Rental, 'member_id')

    if not (f_is_terminated == None or f_is_terminated == ""):
        form.is_terminated.data = f_is_terminated
        if f_is_terminated == 'yes':
            my_query = my_query.filter(Rental.is_terminated == True)
            args_filter['is_terminated'] = f_is_terminated
        elif f_is_terminated == 'no':
            my_query = my_query.filter(Rental.is_terminated == False)
            args_filter['is_terminated'] = f_is_terminated

    can_sort = True
    if not (f_is_deadlime_passed == None or f_is_deadlime_passed == ""):
        form.is_deadlime_passed.data = f_is_deadlime_passed
        can_sort = False
        if f_is_deadlime_passed == 'yes':
            my_query1 = my_query.filter(
                and_(date.today() > Rental.date_deadline,
                     Rental.is_terminated == False))
            my_query2 = my_query.filter(
                and_(Rental.date_termination > Rental.date_deadline,
                     Rental.is_terminated == True))
            my_query = my_query1.union(my_query2)
            args_filter['is_deadlime_passed'] = f_is_deadlime_passed
        elif f_is_deadlime_passed == 'no':
            my_query1 = my_query.filter(
                and_(date.today() <= Rental.date_deadline,
                     Rental.is_terminated == False))
            my_query2 = my_query.filter(
                and_(Rental.date_termination <= Rental.date_deadline,
                     Rental.is_terminated == True))
            my_query = my_query1.union(my_query2)
            args_filter['is_deadlime_passed'] = f_is_deadlime_passed

    count_filtered = my_query.count()
    if filter_has_errors:
        flash(
            _g('There are filter values with errors. However, valid filter values are applied.'
               ), 'warning')
    if not can_sort:
        list = my_query.paginate(page=page, per_page=PAGINATION)
    elif sort_direction == 'up':
        list = my_query.order_by(sort_criteria).paginate(page=page,
                                                         per_page=PAGINATION)
    else:
        list = my_query.order_by(desc(sort_criteria)).paginate(
            page=page, per_page=PAGINATION)
    args_filter_and_sort = {**args_filter, **args_sort}
    return render_template('rents.html',
                           form=form,
                           rents_list=list,
                           extra_filter_args=args_filter,
                           extra_sort_and_filter_args=args_filter_and_sort,
                           count_filtered=count_filtered)
コード例 #15
0
 def validate_date_order(first_date_value, second_date_value, second_date_field):
     second_date_field.errors = list()
     if not first_date_value <= second_date_value:
         second_date_field.errors.append(_g('"After" date value can not be set after the "before" date value') + '.')
     return len(second_date_field.errors) == 0
コード例 #16
0
def memberss(filtering=False, searching=False):
    page = request.args.get('page', 1, type=int)
    sort_criteria = request.args.get('sort_by', 'id', type=str)
    sort_direction = request.args.get('direction', 'up', type=str)
    args_sort = {'sort_by': sort_criteria, 'direction': sort_direction}
    if not sort_criteria in sort_member_values:
        sort_criteria = 'id'

    s_text = request.args.get('text')
    f_registration_date_from = request.args.get('registration_date_from')
    f_registration_date_to = request.args.get('registration_date_to')
    f_expiration_date_from = request.args.get('expiration_date_from')
    f_expiration_date_to = request.args.get('expiration_date_to')
    f_books_rented_from = request.args.get('books_rented_from')
    f_books_rented_to = request.args.get('books_rented_to')
    f_id = request.args.get('id')
    f_first_name = request.args.get('first_name')
    f_last_name = request.args.get('last_name')
    f_has_rented_books = request.args.get('has_rented_books')
    f_has_expired = request.args.get('has_expired')
    if filtering:
        s_text = None
    elif searching:
        f_registration_date_from = None
        f_registration_date_to = None
        f_expiration_date_from = None
        f_expiration_date_to = None
        f_books_rented_from = None
        f_books_rented_to = None
        f_id = None
        f_first_name = None
        f_last_name = None
        f_has_rented_books = None
        f_has_expired = None

    filter_has_errors = False
    args_filter = {}
    form = FilterForm()
    form2 = ShortFilterForm()
    my_query = db.session.query(Member)

    if not (s_text == None or s_text == ""):
        form2.text.data = s_text
        if FieldValidator.validate_field(form2, form2.text,
                                         [string_cust, length_cust_max]):
            my_query = my_query.filter(
                or_(Member.first_name.like('%' + s_text + '%'),
                    Member.last_name.like('%' + s_text + '%'),
                    Member.father_name.like('%' + s_text + '%'),
                    Member.id == s_text))
            args_filter['text'] = s_text
    else:
        my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
            my_query, args_filter, filter_has_errors,
            form.registration_date_from, form.registration_date_to,
            f_registration_date_from, f_registration_date_to,
            'registration_date_from', 'registration_date_to', Member,
            'date_registered', False)

        my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
            my_query, args_filter, filter_has_errors,
            form.expiration_date_from, form.expiration_date_to,
            f_expiration_date_from, f_expiration_date_to,
            'expiration_date_from', 'expiration_date_to', Member,
            'date_expiration', False)

        my_query, args_filter, filter_has_errors = CommonFilter.process_related_number_filters(
            my_query, args_filter, filter_has_errors, form.books_rented_from,
            form.books_rented_to, f_books_rented_from, f_books_rented_to,
            'books_rented_from', 'books_rented_to', Member,
            'total_books_rented')

        my_query, args_filter, filter_has_errors = CommonFilter.process_equal_number_filter(
            my_query, args_filter, filter_has_errors, form.id, f_id, 'id',
            Member, 'id')

        my_query, args_filter, filter_has_errors = CommonFilter.process_like_filter(
            my_query, args_filter, filter_has_errors, form, form.first_name,
            f_first_name, 'first_name', [string_cust, length_cust_max], Member,
            'first_name')

        my_query, args_filter, filter_has_errors = CommonFilter.process_like_filter(
            my_query, args_filter, filter_has_errors, form, form.last_name,
            f_last_name, 'last_name', [string_cust, length_cust_max], Member,
            'last_name')

        if not (f_has_rented_books == None or f_has_rented_books == ""):
            form.has_rented_books.data = f_has_rented_books
            if f_has_rented_books == 'yes':
                my_query = my_query.filter(Member.number_of_rented_books > 0)
                args_filter['has_rented_books'] = f_has_rented_books
            elif f_has_rented_books == 'no':
                my_query = my_query.filter(Member.number_of_rented_books == 0)
                args_filter['has_rented_books'] = f_has_rented_books

        if not (f_has_expired == None or f_has_expired == ""):
            form.has_expired.data = f_has_expired
            if f_has_expired == 'expired':
                my_query = my_query.filter(
                    Member.date_expiration < date.today().strftime('%Y-%m-%d'))
                args_filter['has_expired'] = f_has_expired
            elif f_has_expired == 'near_expiration':
                compare_date = date.today() + timedelta(
                    EXPIRATION_EXTENSION_LIMIT)
                my_query = my_query.filter(
                    and_(
                        Member.date_expiration <=
                        compare_date.strftime('%Y-%m-%d'),
                        Member.date_expiration >=
                        date.today().strftime('%Y-%m-%d')))
                args_filter['has_expired'] = f_has_expired
            elif f_has_expired == 'active':
                my_query = my_query.filter(
                    Member.date_expiration >= date.today().strftime('%Y-%m-%d')
                )
                args_filter['has_expired'] = f_has_expired

    count_filtered = my_query.count()
    if filter_has_errors:
        flash(
            _g('There are filter values with errors. However, valid filter values are applied.'
               ), 'warning')
    if sort_direction == 'up':
        list = my_query.order_by(sort_criteria).paginate(page=page,
                                                         per_page=PAGINATION)
    else:
        list = my_query.order_by(desc(sort_criteria)).paginate(
            page=page, per_page=PAGINATION)
    args_filter_and_sort = {**args_filter, **args_sort}
    return render_template('members.html',
                           form=form,
                           form2=form2,
                           members_list=list,
                           extra_filter_args=args_filter,
                           extra_sort_and_filter_args=args_filter_and_sort,
                           count_filtered=count_filtered)
コード例 #17
0
 def __init__(self, text = _g('Value is not a valid date') + '. ' + _g('Make sure it matches the following format') + ' ' + _g('"dd.mm.yyyy."') + '.'):
     DataRequired.__init__(self, message = text)
コード例 #18
0
def extensionss():
    page = request.args.get('page', 1, type=int)
    sort_criteria = request.args.get('sort_by', 'id', type=str)
    sort_direction = request.args.get('direction', 'down', type=str)
    args_sort = {'sort_by': sort_criteria, 'direction': sort_direction}
    if not sort_criteria in sort_extensions_values:
        sort_criteria = 'id'

    f_date_performed_from = request.args.get('date_performed_from')
    f_date_performed_to = request.args.get('date_performed_to')
    f_date_extended_from = request.args.get('date_extended_from')
    f_date_extended_to = request.args.get('date_extended_to')
    f_price = request.args.get('price')
    f_member_id = request.args.get('member_id')

    filter_has_errors = False
    args_filter = {}
    form = FilterForm()
    my_query = db.session.query(Extension)

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_performed_from,
        form.date_performed_to, f_date_performed_from, f_date_performed_to,
        'date_performed_from', 'date_performed_to', Extension,
        'date_performed', False)

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_extended_from,
        form.date_extended_to, f_date_extended_from, f_date_extended_to,
        'date_extended_from', 'date_extended_to', Extension, 'date_extended',
        False)

    if not (f_price == None or f_price == ""):
        if not f_price == '__None':
            found = ExtensionPrice.query.filter_by(id=f_price).first()
            if found:
                form.price.data = found
                my_query = my_query.filter_by(price_id=f_price)
                args_filter['price'] = f_price
            else:
                filter_has_errors = True

    my_query, args_filter, filter_has_errors = CommonFilter.process_equal_number_filter(
        my_query, args_filter, filter_has_errors, form.member_id, f_member_id,
        'member_id', Extension, 'member_id')

    count_filtered = my_query.count()
    if filter_has_errors:
        flash(
            _g('There are filter values with errors. However, valid filter values are applied.'
               ), 'warning')
    if sort_direction == 'up':
        list = my_query.order_by(sort_criteria).paginate(page=page,
                                                         per_page=PAGINATION)
    else:
        list = my_query.order_by(desc(sort_criteria)).paginate(
            page=page, per_page=PAGINATION)
    args_filter_and_sort = {**args_filter, **args_sort}
    return render_template('extensions.html',
                           form=form,
                           extensions_list=list,
                           extra_filter_args=args_filter,
                           extra_sort_and_filter_args=args_filter_and_sort,
                           count_filtered=count_filtered)
コード例 #19
0
ファイル: routes.py プロジェクト: NNemanjaMM/WebLib
def eventss():
    if not current_user.is_admin:
        abort(403)
    page = request.args.get('page', 1, type=int)
    sort_criteria = request.args.get('sort_by', 'time', type=str)
    sort_direction = request.args.get('direction', 'down', type=str)
    args_sort = {'sort_by': sort_criteria, 'direction': sort_direction}
    args_page = {'page': page}
    if not sort_criteria in sort_events_values:
        sort_criteria = 'time'

    filter_has_errors = False
    args_filter = {}
    form = FilterForm()
    my_query = db.session.query(Event)
    f_date_from = request.args.get('date_from')
    f_date_to = request.args.get('date_to')
    f_librarian = request.args.get('librarian')
    f_object_id = request.args.get('object_id')
    f_type = request.args.get('type')
    f_is_seen = request.args.get('is_seen')

    my_query, args_filter, filter_has_errors = CommonFilter.process_related_date_filters(
        my_query, args_filter, filter_has_errors, form.date_from, form.date_to,
        f_date_from, f_date_to, 'date_from', 'date_to', Event, 'time', False)

    my_query, args_filter, filter_has_errors = CommonFilter.process_like_filter(
        my_query, args_filter, filter_has_errors, form, form.librarian,
        f_librarian, 'librarian', [string_cust, length_cust_max], Event,
        'librarian')

    my_query, args_filter, filter_has_errors = CommonFilter.process_equal_number_filter(
        my_query, args_filter, filter_has_errors, form.object_id, f_object_id,
        'object_id', Event, 'object_id')

    if not (f_type == None or f_type == '0'):
        form.type.data = f_type
        my_query = my_query.filter(Event.type == f_type)
        args_filter['type'] = f_type

    if not (f_is_seen == None or f_is_seen == ""):
        form.is_seen.data = f_is_seen
        if f_is_seen == 'yes':
            my_query = my_query.filter(Event.is_seen == True)
            args_filter['is_seen'] = f_is_seen
        elif f_is_seen == 'no':
            my_query = my_query.filter(Event.is_seen == False)
            args_filter['is_seen'] = f_is_seen

    count_filtered = my_query.count()
    if filter_has_errors:
        flash(
            _g('There are filter values with errors. However, valid filter values are applied.'
               ), 'warning')
    if sort_direction == 'up':
        list = my_query.order_by(sort_criteria).paginate(page=page,
                                                         per_page=PAGINATION)
    else:
        list = my_query.order_by(desc(sort_criteria)).paginate(
            page=page, per_page=PAGINATION)
    args_filter_and_sort = {**args_filter, **args_sort}
    args_filter_sort_page = {**args_filter_and_sort, **args_page}
    return render_template('events.html',
                           form=form,
                           events_list=list,
                           extra_filter_args=args_filter,
                           extra_sort_and_filter_args=args_filter_and_sort,
                           extra_sort_filter_page_args=args_filter_sort_page,
                           count_filtered=count_filtered)