فهرست منبع

create groups

raylu 11 سال پیش
والد
کامیت
f5e65da8b2
4فایلهای تغییر یافته به همراه83 افزوده شده و 28 حذف شده
  1. 23 11
      web/db.py
  2. 20 0
      web/schema.sql
  3. 31 16
      web/server.py
  4. 9 1
      web/templates/home.html

+ 23 - 11
web/db.py

@@ -28,23 +28,35 @@ class MomokoDB:
 	@tornado.gen.coroutine
 	def create_user(self, username, password):
 		hashed_password, salt = hash_pw(password)
-		query = 'INSERT INTO users (username, password, salt) VALUES (%s, %s, %s);'
-		yield self.execute(query, username, hashed_password, salt)
-
-	@tornado.gen.coroutine
-	def get_user(self, username):
-		query = 'SELECT * FROM users WHERE username=%s;'
-		cursor = yield self.execute(query, username)
-		return cursor.fetchone()
+		query = 'INSERT INTO users (username, password, salt) VALUES (%s, %s, %s) RETURNING id;'
+		cursor = yield self.execute(query, username, hashed_password, salt)
+		return cursor.fetchone()['id']
 
 	@tornado.gen.coroutine
 	def check_user(self, username, password):
-		user = yield self.get_user(username)
+		query = 'SELECT id, username, password, salt FROM users WHERE username=%s;'
+		cursor = yield self.execute(query, username)
+		user = cursor.fetchone()
 		if not user:
 			return
 		salt = binascii.unhexlify(bytes(user['salt'], 'ascii'))
 		hashed, _ = hash_pw(password, salt)
-		print(hashed)
-		print(user['password'])
 		if hashed == user['password']:
 			return user
+
+	@tornado.gen.coroutine
+	def create_group(self, user_id, group_name):
+		cursor = yield self.execute('INSERT INTO groups (name) VALUES(%s) RETURNING id;', group_name)
+		group_id = cursor.fetchone()['id']
+		yield self.execute('INSERT INTO user_groups (user_id, group_id) VALUES(%s, %s);', user_id, group_id)
+		return group_id
+
+	@tornado.gen.coroutine
+	def get_groups(self, user_id):
+		cursor = yield self.execute('''
+			SELECT groups.id, groups.name FROM users
+			JOIN user_groups ON users.id = user_groups.user_id
+			JOIN groups ON user_groups.group_id = groups.id
+			WHERE users.id = %s;
+		''', user_id)
+		return cursor.fetchall()

+ 20 - 0
web/schema.sql

@@ -1,4 +1,12 @@
+DROP TABLE IF EXISTS user_groups;
 DROP TABLE IF EXISTS users;
+DROP TABLE IF EXISTS servers;
+DROP TABLE IF EXISTS groups;
+
+CREATE TABLE groups (
+	id serial PRIMARY KEY,
+	name varchar(32) NOT NULL
+);
 
 CREATE TABLE users (
 	id serial PRIMARY KEY,
@@ -7,3 +15,15 @@ CREATE TABLE users (
 	salt char(32) NOT NULL,
 	UNIQUE (username)
 );
+
+CREATE TABLE user_groups (
+	user_id integer NOT NULL references users(id),
+	group_id integer NOT NULL references groups(id),
+	UNIQUE (user_id, group_id)
+);
+
+CREATE TABLE servers (
+	id serial PRIMARY KEY references groups(id),
+	group_id integer,
+	hostname varchar(256) NOT NULL
+);

+ 31 - 16
web/server.py

@@ -23,10 +23,15 @@ class BaseHandler(tornado.web.RequestHandler):
 		return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
 
 	def get_current_user(self):
-		return self.get_secure_cookie('username')
-
-	@tornado.gen.coroutine
-	def create_session(self, username):
+		user_id = self.get_secure_cookie('user_id')
+		if user_id:
+			return {
+				'id': int(user_id),
+				'username': self.get_secure_cookie('username'),
+			}
+
+	def create_session(self, user_id, username):
+		self.set_secure_cookie('user_id', str(user_id))
 		self.set_secure_cookie('username', username)
 
 	@property
@@ -36,7 +41,10 @@ class BaseHandler(tornado.web.RequestHandler):
 class MainHandler(BaseHandler):
 	@tornado.gen.coroutine
 	def get(self):
-		self.render('home.html')
+		groups = None
+		if self.current_user:
+			groups = yield self.db.get_groups(self.current_user['id'])
+		self.render('home.html', groups=groups)
 
 class RegisterHandler(BaseHandler):
 	@tornado.gen.coroutine
@@ -45,11 +53,11 @@ class RegisterHandler(BaseHandler):
 
 	@tornado.gen.coroutine
 	def post(self):
-		username = self.get_argument("username", "")
-		password = self.get_argument("password", "")
-		yield self.db.create_user(username, password)
-		self.create_session(username)
-		self.redirect("/")
+		username = self.get_argument('username', '')
+		password = self.get_argument('password', '')
+		user_id = yield self.db.create_user(username, password)
+		self.create_session(user_id, username)
+		self.redirect('/')
 
 class LoginHandler(BaseHandler):
 	@tornado.gen.coroutine
@@ -58,14 +66,14 @@ class LoginHandler(BaseHandler):
 
 	@tornado.gen.coroutine
 	def post(self):
-		username = self.get_argument("username", "")
-		password = self.get_argument("password", "")
+		username = self.get_argument('username', '')
+		password = self.get_argument('password', '')
 		user = yield self.db.check_user(username, password)
-		if not user:
-			self.render("login.html")
+		if user:
+			self.create_session(user['id'], user['username'])
+			self.redirect('/')
 		else:
-			self.create_session(user['username'])
-			self.redirect("/")
+			self.render('login.html')
 
 class LogoutHandler(BaseHandler):
 	def get(self):
@@ -77,6 +85,12 @@ class StatsHandler(BaseHandler):
 	def get(self):
 		self.render('stats.html')
 
+class GroupCreateHandler(BaseHandler):
+	@tornado.gen.coroutine
+	def post(self):
+		yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
+		self.redirect('/')
+
 class CSSHandler(tornado.web.RequestHandler):
 	def get(self, css_path):
 		css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
@@ -92,6 +106,7 @@ if __name__ == '__main__':
 			(r'/login', LoginHandler),
 			(r'/logout', LogoutHandler),
 			(r'/stats', StatsHandler),
+			(r'/groups/create', GroupCreateHandler),
 			(r'/(css/.+)\.css', CSSHandler),
 		],
 		template_path=os.path.join(os.path.dirname(__file__), 'templates'),

+ 9 - 1
web/templates/home.html

@@ -1,5 +1,13 @@
 {% extends "base.html" %}
 
 {% block main %}
-	Hello.
+	{% if current_user %}
+		{% for group in groups %}
+			{{ group['id'] }}: {{ group['name'] }}
+		{% end %}
+		<form method="post" action="/groups/create">
+			<input type="text" name="name">
+			<input type="submit">
+		</form>
+	{% end %}
 {% end %}