covid-formity/formity/models.py

103 lines
3.3 KiB
Python
Raw Normal View History

2020-03-26 09:09:44 +00:00
from datetime import datetime
2020-03-27 18:04:29 +00:00
import enum
import hashlib
import os
from formity.extensions import db
from sqlalchemy.ext.hybrid import hybrid_property
2020-03-27 18:04:29 +00:00
class Status(enum.Enum):
new = 1
confirmed = 2
allocated = 3
fulfilled = 4
rejected = 5
2020-03-30 18:41:07 +00:00
spam = 6
2020-03-30 21:09:52 +00:00
delegated = 7
2020-03-26 09:09:44 +00:00
class PostalCode(db.Model):
postalcode = db.Column(db.String, primary_key=True)
address = db.Column(db.String, nullable=False)
city = db.Column(db.String, nullable=False)
voivodeship = db.Column(db.String, nullable=False)
county = db.Column(db.String, nullable=False)
2020-03-26 09:09:44 +00:00
class FaceshieldRequest(db.Model):
id = db.Column(db.Integer, primary_key=True)
entity_info = db.Column(db.String)
full_name = db.Column(db.String)
phone_number = db.Column(db.String)
email = db.Column(db.String)
extra = db.Column(db.String)
2020-03-29 08:19:21 +00:00
faceshield_front_required = db.Column(db.Integer, default=0, server_default='0')
2020-03-26 09:09:44 +00:00
faceshield_model = db.Column(db.String)
2020-03-29 08:19:21 +00:00
faceshield_full_required = db.Column(db.Integer, default=0, server_default='0')
2020-03-26 09:09:44 +00:00
created = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
updated = db.Column(db.DateTime, default=datetime.utcnow, nullable=False,
onupdate=datetime.utcnow)
2020-03-27 11:41:08 +00:00
ua = db.Column(db.String)
ip = db.Column(db.String)
2020-03-27 18:04:29 +00:00
status = db.Column(db.Enum(Status), default=Status.new, server_default='new', nullable=False)
remarks = db.Column(db.String)
2020-03-29 08:19:21 +00:00
faceshield_front_delivered = db.Column(db.Integer, default=0, server_default='0')
faceshield_full_delivered = db.Column(db.Integer, default=0, server_default='0')
2020-03-27 18:04:29 +00:00
2020-03-29 12:37:42 +00:00
shipping_name = db.Column(db.String)
shipping_street = db.Column(db.String)
shipping_postalcode = db.Column(db.String)
shipping_city = db.Column(db.String)
postalcode_info = db.relationship(PostalCode, primaryjoin='remote(PostalCode.postalcode) == foreign(FaceshieldRequest.shipping_postalcode)')
2020-03-29 08:19:44 +00:00
handling_orga = db.Column(db.String, default='hswaw', server_default='hswaw', nullable=False)
2020-03-29 08:19:44 +00:00
2020-03-27 18:04:29 +00:00
class RequestChange(db.Model):
id = db.Column(db.Integer, primary_key=True)
request_id = db.Column(db.Integer, db.ForeignKey(FaceshieldRequest.id))
request = db.relationship(FaceshieldRequest, backref='changelog')
user_id = db.Column(db.String, nullable=False)
state_before = db.Column(db.JSON)
state_after = db.Column(db.JSON)
remarks = db.Column(db.String)
created = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
class ExternalUser(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String, nullable=False)
_password = db.Column('password', db.String, nullable=False)
remarks = db.Column(db.String)
def _hash(self, salt, password):
return hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 213700).hex()
@hybrid_property
def password(self):
return self._password
@password.setter
def password(self, new_pass):
# hack: do not double hash
if self._password == new_pass:
return
salt = hashlib.sha256(os.urandom(16)).hexdigest()
self._password = salt + ':' + self._hash(salt, new_pass)
def check_password(self, password):
salt, h = self.password.split(':')
return self._hash(salt, password) == h