WIP on design & models
This commit is contained in:
parent
1066c776cd
commit
0c015158ce
|
@ -0,0 +1,36 @@
|
|||
# from datetime import datetime
|
||||
# from app import db, login
|
||||
# from flask_login import UserMixin
|
||||
# from werkzeug.security import generate_password_hash, check_password_hash
|
||||
|
||||
|
||||
# # class User(UserMixin, db.Model):
|
||||
# # id = db.Column(db.Integer, primary_key=True)
|
||||
# # username = db.Column(db.String(64), index=True, unique=True)
|
||||
# # email = db.Column(db.String(120), index=True, unique=True)
|
||||
# # password_hash = db.Column(db.String(128))
|
||||
# # posts = db.relationship('Post', backref='author', lazy='dynamic')
|
||||
|
||||
# # def __repr__(self):
|
||||
# # return '<User {}>'.format(self.username)
|
||||
|
||||
# # def set_password(self, password):
|
||||
# # self.password_hash = generate_password_hash(password)
|
||||
|
||||
# # def check_password(self, password):
|
||||
# # return check_password_hash(self.password_hash, password)
|
||||
|
||||
|
||||
# # @login.user_loader
|
||||
# # def load_user(id):
|
||||
# # return User.query.get(int(id))
|
||||
|
||||
|
||||
# class Post(db.Model):
|
||||
# id = db.Column(db.Integer, primary_key=True)
|
||||
# body = db.Column(db.String(140))
|
||||
# timestamp = db.Column(db.DateTime, index=True, default=datetime.now)
|
||||
# user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
|
||||
|
||||
# def __repr__(self):
|
||||
# return '<Post {}>'.format(self.body)
|
|
@ -2,28 +2,42 @@ from datetime import date, datetime
|
|||
from app import db, login
|
||||
from flask_login import UserMixin
|
||||
from werkzeug.security import generate_password_hash, check_password_hash
|
||||
from app.models.contents import Content
|
||||
|
||||
|
||||
class User(UserMixin, db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
contents = db.relationship('Content') # TODO: add good relation
|
||||
__tablename__ = 'user'
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
type = db.Column(db.String(20))
|
||||
__mapper_args__ = {
|
||||
'polymorphic_identity': __tablename__,
|
||||
'polymorphic_on': type
|
||||
}
|
||||
contents = db.relationship('Content', back_populates="author") # TODO: add good relation
|
||||
|
||||
def __repr__(self):
|
||||
return f'<User #{self.id}>'
|
||||
|
||||
class Member(User, db.Model):
|
||||
# Standalone properties
|
||||
__tablename__ = 'member'
|
||||
id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
||||
__mapper_args__ = { 'polymorphic_identity': __tablename__ }
|
||||
# Standalone properties
|
||||
username = db.Column(db.Unicode(64), index=True, unique=True)
|
||||
email = db.Column(db.String(120), index=True, unique=True)
|
||||
password_hash = db.Column(db.String(128))
|
||||
contents = db.relationship('Content', backref='author', lazy='dynamic')
|
||||
password_hash = db.Column(db.String(255))
|
||||
xp_points = db.Column(db.Integer)
|
||||
innovation_points = db.Column(db.Integer)
|
||||
biography = db.column(db.Text, convert_unicode=True)
|
||||
signature = db.column(db.Text, convert_unicode=True)
|
||||
biography = db.column(db.Text(convert_unicode=True))
|
||||
signature = db.column(db.Text(convert_unicode=True))
|
||||
birthday = db.Column(db.Date)
|
||||
register_date = db.Column(db.Date, default=date.today)
|
||||
# Relations
|
||||
trophies = db.relationship('Trophy') # TODO: add good relation
|
||||
tests = db.relationship('Test') # TODO: add good relation
|
||||
#trophies = db.relationship('Trophy') # TODO: add good relation
|
||||
#tests = db.relationship('Test') # TODO: add good relation
|
||||
# Privacy assets
|
||||
receive_newsletter = db.column(db.Boolean, default=False)
|
||||
receive_newsletter = db.Column(db.Boolean, default=False)
|
||||
|
||||
|
||||
def __init__(self, username, email, password):
|
||||
self.username = username
|
||||
|
@ -75,20 +89,32 @@ class Member(User, db.Model):
|
|||
self.innovation_points += n
|
||||
|
||||
def set_password(self, password):
|
||||
self.password_hash = generate_password_hash(password)
|
||||
self.password_hash = generate_password_hash(password,
|
||||
method='pbkdf2:sha512', salt_length=10)
|
||||
|
||||
def check_password(self, password):
|
||||
return check_password_hash(self.password_hash, password)
|
||||
|
||||
def __repr__(self):
|
||||
return '<User {}>'.format(self.username)
|
||||
return f'<Member {self.username}>'
|
||||
|
||||
@login.user_loader
|
||||
def load_user(id):
|
||||
return User.query.get(int(id))
|
||||
|
||||
class Guest(User, db.Model):
|
||||
username = db.Column(db.Unicode(64), index=True)
|
||||
ip = db.column(db.String(47)) # Max IPv6 adress length
|
||||
last_post = db.Column(db.DateTime, default=datetime.now)
|
||||
__tablename__ = 'guest'
|
||||
id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
|
||||
__mapper_args__ = { 'polymorphic_identity': __tablename__ }
|
||||
# Standalone propeties
|
||||
username = db.Column(db.Unicode(64), index=True)
|
||||
ip = db.column(db.String(47)) # Max IPv6 adress length
|
||||
last_post = db.Column(db.DateTime, default=datetime.now)
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return f'<Guest {self.username} ({self.ip})>'
|
||||
|
||||
# Can be implemented if needed
|
||||
# class Organization(User, db.Model):
|
||||
# username = db.Column(db.Unicode(64), index=True)
|
||||
# members = db.relationship('Member')
|
||||
# pass
|
|
@ -0,0 +1,51 @@
|
|||
#form {
|
||||
width: 30%; min-width: 350px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
form > div {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
form > div > * {
|
||||
display: block;
|
||||
}
|
||||
|
||||
form > div > label {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
form > div > input[type='text'],
|
||||
form > div > input[type='email'],
|
||||
form > div > input[type='password'] {
|
||||
width: 96%; padding: 6px 2%;
|
||||
border: 1px solid #abcdef;
|
||||
}
|
||||
|
||||
form > div > input[type='text']:focus,
|
||||
form > div > input[type='email']:focus,
|
||||
form > div > input[type='password']:focus {
|
||||
box-shadow: 0px 0px 3px 0px #0033ff;
|
||||
}
|
||||
|
||||
form > div > input[type='submit'] {
|
||||
width: 100%; padding: 6px 0;
|
||||
background-color: #168f48;
|
||||
border-color: #12753a;
|
||||
color: #fff;
|
||||
border-radius: 3px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
form > div > input[type='submit']:hover {
|
||||
background-color: #168f48;
|
||||
border-color: #12753a;
|
||||
}
|
||||
|
||||
form .msgerror {
|
||||
color: red;
|
||||
font-weight: 400;
|
||||
margin-top: 5px;
|
||||
}
|
|
@ -9,4 +9,6 @@
|
|||
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href={{url_for('static', filename = 'css/container.css')}}>
|
||||
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href={{url_for('static', filename = 'css/responsive.css')}}>
|
||||
<link rel="stylesheet" media="all and (max-width: 699px)" type="text/css" href={{url_for('static', filename = 'css/light.css')}}>
|
||||
|
||||
<link rel="stylesheet" media="all and (min-width: 700px)" type="text/css" href={{url_for('static', filename = 'css/register.css')}}>
|
||||
</head>
|
||||
|
|
|
@ -2,21 +2,7 @@
|
|||
|
||||
{% block content %}
|
||||
<section class="home-pinned-content flex">
|
||||
<div>
|
||||
<h1>Planète Casio</h1>
|
||||
<p>Pourquoi s'inscrire sur Planète Casio ? Parce que c'est cool et qu'ici on peut mettre plein de truc sympas.
|
||||
Vous saviez que Planète Casio c'est :
|
||||
<ul>
|
||||
<li>Presque 10000 membres</li>
|
||||
<li>(Bon ok, seulement une vingtaine de vraiments actifs)</li>
|
||||
<li>Plein de programmes</li>
|
||||
<li>Une multitude de tutos pour mieux comprendre comment fonctionne sa calto</li>
|
||||
<li><b>Mais surtout, une communauté au top !</b></li>
|
||||
</ul>
|
||||
Et oui, ça fait beaucoup, mais bon, je commence à être à court de trucs à écrire ici, donc bon…
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<div id="form">
|
||||
<h1>Inscription :</h1>
|
||||
|
||||
<form action="" method="post">
|
||||
|
@ -25,28 +11,28 @@
|
|||
{{ form2.username.label }}
|
||||
{{ form2.username() }}
|
||||
{% for error in form2.username.errors %}
|
||||
<span style="color: red;">[{{ error }}]</span>
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form2.email.label }}
|
||||
{{ form2.email() }}
|
||||
{% for error in form2.email.errors %}
|
||||
<span style="color: red;">[{{ error }}]</span>
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form2.password.label }}
|
||||
{{ form2.password() }}
|
||||
{% for error in form2.password.errors %}
|
||||
<span style="color: red;">[{{ error }}]</span>
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
{{ form2.password2.label }}
|
||||
{{ form2.password2() }}
|
||||
{% for error in form2.password2.errors %}
|
||||
<span style="color: red;">[{{ error }}]</span>
|
||||
<span class="msgerror">{{ error }}</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>{{ form2.submit() }}</div>
|
||||
|
|
Loading…
Reference in New Issue