Source code for ulordapi.manage

# coding=utf-8
# Copyright (c) 2016-2018 The Ulord Core Developers
# @File  : manage.py
# @Author: Ulord_PuJi
# @Date  : 2018/5/18 0018

from uuid import uuid1
import time

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from passlib.apps import custom_app_context as pwd_context

from .config import dbconfig
from .errcode import _errcodes
from .utils import isMail, isCellphone

# initialization
app = Flask(__name__)

app.config.update(dbconfig)

db = SQLAlchemy(app)


resource_tags = db.Table('resource_tags',
                        db.Column('resource_id', db.String(45), db.ForeignKey('resource.id')),
                        db.Column('tag_id', db.Integer, db.ForeignKey('tags.id')))


users_resource = db.Table('users_resource',
                        db.Column('user_id',db.Integer, db.ForeignKey('users.id')),
                        db.Column('resource_id', db.Integer, db.ForeignKey('resource.id')))


# class Base(db.Model):
# TODO:Extracting public methods
#     @classmethod
#     def add(cls, **kwargs):
#         pass


[docs]class User(db.Model): """ User table: create user database. """ __tablename__ = 'users' id = db.Column(db.String(45), primary_key=True) # Table id.Default is a uuid. username = db.Column(db.String(32), index = True) # Needed password_hash = db.Column(db.String(128)) # Ciphertext password email = db.Column(db.String(32)) cellphone = db.Column(db.String(12)) token = db.Column(db.String(128), index=True) # user's token,a uuid timestamp = db.Column(db.String(10)) # token's effective time balance = db.Column(db.Float) # user's balance.todo need to think about time wallet = db.Column(db.String(34)) # user's wallet name.Default is username. pay_password = db.Column(db.String(128)) # user's wallet password.Default is password_hash.It won't change if password has changed. activity = db.Column(db.Float, default=0) boughts = db.relationship( 'Resource', secondary=users_resource, backref=db.backref('resource', lazy='dynamic') ) # realtion table resource.
[docs] def hash_password(self, password): """ Hash user's password and save hash result. :param password: user's password :type password: str """ self.password_hash = pwd_context.encrypt(password)
[docs] def verify_password(self, password): """ verify password :param password: user's password :type password: str :return: True or False. """ if isinstance(password, unicode): password = password.encode('utf-8') return pwd_context.verify(password, self.password_hash)
# @classmethod # def add(self, username, password, id=str(uuid1()), email=None, cellphone=None, wallet=None, pay_password=None): # """ # add user # # :param username: username # :type username: str # :param password: password # :type password: str # :param id:user table id ,primary key.Default is uuid. # :type id: str # :param email:user's email.Default is None. # :type email: str # :param cellphone:user's cellphone.Default is None. # :type cellphone:str # :param wallet:user's wallet name.Default is username # :type wallet: str # :param pay_password:user's wallet password.Default is password. # :type pay_password:str # :return:user module # """ # if self.query.filter_by(username=username).first() is not None: # return _errcodes.get(60000) # if email and not isMail(email): # return _errcodes.get(60105) # if cellphone and not isCellphone(cellphone): # return _errcodes.get(60106) # user = User() # user.username = username # user.hash_password(password) # user.id = id # user.email = email # user.cellphone = cellphone # if wallet: # user.wallet = wallet # else: # user.wallet = username # if pay_password: # user.pay_password = pay_password # else: # user.pay_password = self.password_hash # db.session.add(user) # db.session.commit() # return user # # @classmethod # def modify(self, userid, **kwargs): # """ # modify user's attribute # # :param userid: user id.query conditions # :type userid: str # :param kwargs: key-value # :type kwargs: user's attribute and value # """ # user = self.query.filter_by(id=userid).first() # for kwarg in kwargs: # if kwarg in self.__dict__.keys(): # setattr(user, kwarg, kwargs[kwarg]) # # user[kwarg] = kwargs[kwarg] # # print("{0}:{1}".format(kwarg, kwargs[kwarg])) # else: # print("{} doesn's in user's attributes".format(kwarg)) # db.session.commit() # # @classmethod # def delete(self, userid): # """ # # :param userid: # :return: # """ # user = self.query.filter_by(id=userid).first() # if user is not None: # db.session.delete(user) # db.session.commit() # else: # print("current user(userid={0}) hasn't found.".format(userid)) # # def generateToken(self, expired=86400): # # # generate token,expired is Token expiration time. /s # self.token = str(uuid1()) # self.timestamp = int(time.time()) + expired # db.session.conmmmit()
[docs]class Resource(db.Model): """ Resource table: create resource table """ id = db.Column(db.String(45), primary_key=True) title = db.Column(db.String(32), index=True) userid = db.Column(db.Integer, db.ForeignKey('users.id')) body = db.Column(db.String(46)) amount = db.Column(db.Float, index=True) tags = db.relationship( 'Tag', secondary=resource_tags, backref=db.backref('resource', lazy='dynamic')) description = db.Column(db.String(128)) views = db.Column(db.Integer) date = db.Column(db.Integer) UPID = db.Column(db.Integer,index=True) claimID = db.Column(db.String(40)) resource_type = db.Column(db.String(10)) __mapper_args__ = { 'polymorphic_on': resource_type }
[docs]class Content(Resource): """ Content,viewer need to pay a few ulord to view. """ __mapper_args__ = { 'polymorphic_identity': 'content' }
[docs]class Ads(Resource): """ Advertisement.Viewer will get a few ulord from the author when they view it. """ __mapper_args__ = { 'polymorphic_identity': 'ad' }
[docs]class Tag(db.Model): """ tag table """ __tablename__ = 'tags' id = db.Column(db.Integer, primary_key=True) tagname = db.Column(db.String(32), index=True) # Reserved field pre1 = db.Column(db.String()) pre2 = db.Column(db.String())
[docs]def create(): """ Create database. """ # check if existed app.config.update(dbconfig) if dbconfig.get('IsCreated'): print("Database has created!") else: db.create_all()
if __name__ == '__main__': # db.create_all(bind=['resources_tags', 'users_resources', 'User', 'Resource', 'Ads', 'Tag', 'Billing']) create()