diff --git a/rifaserver/app.py b/rifaserver/app.py index ba40a24..0f24c8b 100644 --- a/rifaserver/app.py +++ b/rifaserver/app.py @@ -2,6 +2,7 @@ import functools import itertools import operator import os +import random from flask import Flask, render_template, request, url_for, redirect, flash, session, make_response from flask.cli import with_appcontext @@ -119,6 +120,21 @@ def seller_screen(): return render_template('seller_screen.html') +def suggest_numbers(raffle_id, amount=3): + suggestions = [] + tickets = iter(Ticket.query.filter_by(raffle_id=raffle_id).order_by(Ticket.chosen_number.asc())) + next_ticket = next(tickets, None) + candidate_number = 1 + while len(suggestions) < max(amount, 50) and next_ticket: + if candidate_number < next_ticket.chosen_number: + suggestions.append(candidate_number) + else: + next_ticket = next(tickets, None) + candidate_number += 1 + suggestions.extend(range(candidate_number, candidate_number + (max(amount, 50) - len(suggestions)))) + return sorted(random.sample(suggestions, amount)) + + @app.route('/numeros/', methods=['GET', 'POST']) def numbers_screen(purchase_id): purchase = Purchase.query.get_or_404(purchase_id) @@ -146,10 +162,17 @@ def numbers_screen(purchase_id): try: purchase.decrease_numbers() db.session.commit() + session['failed_attempts'] = 0 flash(f"Número reservado: {request.form['number']}", 'success') except IntegrityError: db.session.rollback() - flash(f"O número {request.form['number']} já foi escolhido para {raffle.description}!", 'warning') + session['failed_attempts'] = session.get('failed_attempts', 0) + 1 + if session['failed_attempts'] < 3: + flash(f"O número {request.form['number']} já foi escolhido para {raffle.description}!", 'warning') + else: + suggested_numbers = suggest_numbers(raffle.id) + flash(f"{request.form['number']} também já foi! Sugestões para {raffle.description}: " + f"{', '.join(map(str, suggested_numbers))}", 'warning') session['buyer_data'] = {'name': request.form['name'], 'contact': request.form['contact']} return redirect(url_for('numbers_screen', purchase_id=purchase_id)) diff --git a/rifaserver/models.py b/rifaserver/models.py index 8c0cbdd..26a6052 100644 --- a/rifaserver/models.py +++ b/rifaserver/models.py @@ -31,6 +31,7 @@ class Purchase(db.Model): total_numbers = db.Column(db.Integer, default=0) numbers_left = db.Column(db.Integer, default=0) remarks = db.Column(db.Text) +# timestamp = db.Column(db.DateTime) def generate_id(self): self.id = hashlib.sha256(os.urandom(60)).hexdigest()