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)
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)
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)
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
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
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)
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)
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)
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)
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)
def __init__(self, text = _g('Value does not match e-mail address format')+'.'): Email.__init__(self, message = text)
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
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)
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)
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
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)
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)
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)
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)