Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Update kanasta.py #1

Closed
wants to merge 1 commit into from

2 participants

@yacoob

No description provided.

@depesz
Owner

To co mogłem to nałożyłem, i dowiedziałem się trochę. pull requesta zamykam bo w tej chwili chyba nie ma on już znaczenia?

@depesz depesz closed this
@yacoob

Owszem - starałem się znaleźć możliwość skomentowania bezpośrednio na kodzie, ale nie znalazłem, więc zrobiłem tak. Miłego dalszego dłubania :)

@depesz
Owner

Dziękuję. Bardzo pomogło.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Mar 31, 2012
  1. @yacoob

    Update kanasta.py

    yacoob authored
This page is out of date. Refresh to see the latest.
Showing with 15 additions and 1 deletion.
  1. +15 −1 kanasta.py
View
16 kanasta.py
@@ -8,6 +8,7 @@
import psycopg2.extras
import StringIO
import random
+# posortuj sobie to, z czasem importy rosną i ciężko ogarnąć listę bez pomocnego edytora
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
@@ -19,14 +20,19 @@
# Default configuration
DEBUG = True
SECRET_KEY = 'dev key'
+# O ile rozumiem dokumentację flaska, to to jest wykorzystywane do podpisania ciastka w którym jest username. Wszystko pięknie i dobrze, tylko jeżeli wrzucasz kod na githuba, to klucz jest od razu znany, co pozwala każdemu na spreparowanie ciastka z dowolnym uzerem. Mógbyś generować klucz od zera przy każdym starcie, ale w tym momencie wszystkie bieżące sesje tracą ważność razem z restartem. Jak chcesz się pobawić, to trzymaj tego typu informacje po stronie serwera.
HOST = '0.0.0.0'
DB_DATABASE = 'kanasta'
DB_PORT = 5920
+# Trochę overkill moim zdaniem, mieć postgressa do takiej pcheki, ale rozumiem że postgressa już i tak masz :)
DB_HOST = '/tmp'
DB_USER = 'kanasta'
+# Ja bym to wrzuci do dicta jakiegoś, ale w sumie to kwestia gustu...
+
# Default configuration
app = Flask(__name__)
+# Dwa razy tworzysz 'app', czemu?
app.config.from_object(__name__)
app.config.from_envvar('KANASTARC', silent=True)
@@ -38,6 +44,7 @@ def decorated_function(*args, **kwargs):
return f(*args, **kwargs)
flash('NOT_LOGGED')
return redirect(url_for('index'))
+ # Jeżeli uzer jest niezalogowany -> przekierować na stronę gówną. Bardziej userfriendly byoby przekierowanie do ekranu logowania, z którego po zalogowaniu uzer wróci dokadnie tam, skąd przyszed.
return decorated_function
@@ -45,6 +52,7 @@ def get_db_connection():
conn_details = dict()
for i in (j for j in ('database', 'user', 'password', 'host', 'port', 'sslmode') if 'DB_' + j.upper() in app.config):
+ # wyciągnij ('database',...) jako staą na zewną†rz, linijka będzie czytelniejsza
conn_details[i] = app.config['DB_' + i.upper()]
return psycopg2.connect(connection_factory=psycopg2.extras.DictConnection, **conn_details)
@@ -79,7 +87,7 @@ def logout():
@app.route('/login', methods=['POST'])
def login():
cur = g.db.cursor()
- cur.execute("SELECT * FROM users WHERE username = %s", (request.form['username'],))
+ cur.execute("SELECT * FROM users WHERE username = %s", (request.form['username'],))
user_data = cur.fetchone()
cur.close()
@@ -120,6 +128,7 @@ def new_game():
'p2_p2': request.form['pair2_player2'],
'deal_1': request.form['first_dealing'],
'deal_2': request.form['second_dealing']
+ # równie dobrze mógļyś przekazać request.form po prostu.
}
)
res = cur.fetchone()
@@ -132,12 +141,14 @@ def new_game():
users_rs = cur.fetchall()
cur.close()
users = map(lambda r: r["username"], users_rs)
+ # zamień na list comprehension? Dodatkowo: najpierw wyciągasz dane, potem dajesz caą potencjalnie wielgachną listę do templejta - w ogólnym przypadku można by pewnie dać templejtowi kursor i niech sobie wyciąga. Jak dorobisz w templejcie stronicowanie, to powyższe podejście będzie czasochonne.
return render_template('new_game.html', users=users)
def new_game_validate():
for key in ('pair1_player1', 'pair1_player2', 'pair2_player1', 'pair2_player2', 'first_dealing', 'second_dealing'):
+ # wyciągnij (...) do zmiennej
if key in request.form and request.form[key]:
continue
g.errors = ['MISSING_DATA']
@@ -225,17 +236,20 @@ def new_deal_insert(game_id):
partial_score = int(request.form[partial_score_key])
if place == "hand":
partial_score = -1 * abs(partial_score)
+ # partial_score *= -1
scores[pair] = scores[pair] + partial_score
except ValueError:
g.errors = ['BAD_VALUE']
return False
if request.form['finished'].startswith(pair):
scores[pair] = scores[pair] + 300
+ # MAgiczna stala - wyciągnij 300 do zmiennej :)
cur = g.db.cursor()
cur.execute("SELECT * FROM games WHERE id = %s FOR UPDATE", (game_id,))
cur.execute("SELECT max(deal_no) as no from deals where game_id = %s", (game_id,))
last_deal_no = cur.fetchone()['no']
if last_deal_no is None:
+ # if not last_deal
last_deal_no = 0
cur.execute("insert into deals (game_id, deal_no, pair1_score, pair2_score) values (%s, %s, %s, %s)", (game_id, last_deal_no + 1, scores['p1'], scores['p2']))
cur.execute("update games set pair1_score = pair1_score + %s, pair2_score = pair2_score + %s WHERE id = %s", (scores['p1'], scores['p2'], game_id))
Something went wrong with that request. Please try again.