Example #1
0
class GroupSettings(RBase):
    id = models.Attribute(required=True)
    welcome_text = models.Attribute(default='')
    invite_text = models.Attribute(default='')
    group_tmpl = models.Attribute(default='')
    creators = models.ListField(str, default=[])
    creator_names = models.ListField(str, default=[])
Example #2
0
class GameModel(models.Model):
    desk = models.Attribute()
    game_time = models.DateTimeField(auto_now_add=True)
    all_bet = models.IntegerField(default=0)
    all_paid = models.IntegerField(default=0)
    game_result = models.ListField(int)
    bank_cards = models.ListField(int)
    player_cards = models.ListField(int)
Example #3
0
class DeviceInfoInterface(models.Model):
    ''''''

    timestamp = models.DateTimeField(required=True)
    cpu_usage = models.Attribute()
    mem_usage = models.Attribute()
    net_usage = models.Attribute()
    net_flow = models.ListField(dict)
    proc_info = models.ListField(dict)
Example #4
0
File: models.py Project: wuhfen/eva
class DomainInfo(re_models.Model):
    name = re_models.Attribute(required=True)
    created_at = re_models.DateTimeField(auto_now_add=True)
    res_code = re_models.IntegerField(default=0)
    alert = re_models.BooleanField(default=False)
    new_msg = re_models.BooleanField(default=True)
    address = re_models.ListField(str)
    no_ip = re_models.ListField(str)
    info = re_models.Attribute()
Example #5
0
class TestSuit_Maintaince(models.Model):
    ''''''

    id = models.Counter(required=True, unique=True)
    overview = models.Attribute(required=True)
    target = models.Attribute(required=True)
    status = models.Attribute(required=True)
    detail = models.ListField(dict)
class ContentModel(models.Model):
    contentId=models.Attribute()
    gmtCreate = models.DateTimeField(auto_now_add=True)
    author = UserModel
    section=models.Attribute()
    content = models.Attribute()
    title=models.Attribute()
    imgList=models.ListField(str)
Example #7
0
        class User(models.Model):
            name = models.CharField()
            likes = models.ListField('Link')

            def likes_link(self, link):
                if self.likes is None:
                    self.likes = [link]
                    self.save()
                else:
                    if link not in self.likes:
                        self.likes.append(link)
                        self.save()
Example #8
0
class User(db.Model):
    uuid = db.Attribute(indexed=False)
    name = db.Attribute(required=True)
    slug = db.Attribute(indexed=False)
    email = db.Attribute(required=True)
    avatar = db.Attribute(required=True,
                          indexed=False,
                          default=DEFAULT_AVATAR_URL)
    password = db.Attribute(required=True, indexed=False)
    image = db.Attribute(indexed=False)
    cover = db.Attribute(indexed=False)
    bio = db.Attribute(indexed=False)
    website = db.Attribute(indexed=False)
    facebook = db.Attribute(indexed=False)
    twitter = db.Attribute(indexed=False)
    accessibility = db.BooleanField(indexed=False)
    status = db.Attribute()
    language = db.Attribute(indexed=False)
    visibility = db.BooleanField()
    meta_title = db.Attribute(indexed=False)
    meta_description = db.Attribute(indexed=False)
    tour = db.Attribute(indexed=False)
    last_login = db.DateTimeField()
    created_at = db.DateTimeField()
    updated_at = db.DateTimeField()
    role = db.ListField(Role, required=True)

    def to_json(self):
        rst = self.attributes_dict
        del rst['password']
        del rst['role']
        rst['id'] = self.id
        rst['last_login'] = format_datetime(self.last_login)
        rst['created_at'] = format_datetime(self.created_at)
        rst['updated_at'] = format_datetime(self.updated_at)
        rst['roles'] = [role.to_json(self) for role in self.role]
        return rst

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return str(self.id)
Example #9
0
class User(models.Model):
    username = models.Attribute(required=True, unique=True, label='Username')
    password = models.Attribute(required=True, label='Password')
    email = models.Attribute(required=True, unique=True, label='Email')
    name = models.Attribute(required=True, label='Name')

    groups = models.ListField(Group, label='Groups')

    def __init__(self, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)
        self.job = ['one', 'two', 'three']

    def save(self):
        if self.is_new():
            self.attributes['password'] = hashlib.md5(self.password)
        else:
            if self.password:
                self.attributes['password'] = hashlib.md5(self.password)
        return super(User, self).save()

    def validate_password(self, password):
        return self.password == hashlib.md5(password).hexdigest()

    @property
    def permissions(self):
        perms = []
        for group in self.groups:
            perms += group.permissions
        return perms

    @property
    def link(self):
        from solder import url
        return link_to(self.username, url.current(controller='user',\
            action='show', id=self.username))

    @staticmethod
    def get(username):
        return User.objects.filter(username=username).first()
Example #10
0
class CardList(models.Model):
    identifier = models.Attribute()
    text = models.Attribute()
    cards = models.ListField(Card)
Example #11
0
 class Author(models.Model):
     name = models.CharField(required=True)
     books = models.ListField(Book)
Example #12
0
 class Cake(models.Model):
     name = models.CharField()
     ingredients = models.ListField(str)
     sizes = models.ListField(int)
Example #13
0
class Group(models.Model):
    name = models.Attribute(required=True, unique=True, label='Name')
    label = models.Attribute(required=True, unique=True, label='Name')
    permissions = models.ListField(Permission, label='Permissions')
Example #14
0
class DeviceDynamicInterface(models.Model):
    ''''''
    dev_id = models.Attribute(required=True)
    timestamp = models.DateTimeField(required=True)

    dynamic_info = models.ListField(DeviceInfoInterface, required=False)
Example #15
0
class User(orm.RediscoModle):
    '''
    要存库的数据类型
    '''
    # uid = models.IntegerField(required=True, unique=True)
    username = models.Attribute(required=True,
                                unique=True,
                                validator=validateAccount)
    password = models.Attribute(required=True, validator=validatePassword)
    ''' 注册时间 '''
    register_time = models.DateTimeField(auto_now_add=True)
    ''' 最后登录时间 '''
    last_login_time = models.DateTimeField(auto_now=True)
    ''' 所属的用户组 '''
    _userGroups = models.ListField(target_type=str)
    ''' 是否注销 '''
    is_cancel = models.BooleanField(default=True)
    ''' root用户的账号和密码 '''
    rootAccount = 'root'
    import p
    rootPassword = p.pw

    def validate(self):
        '''
        :return:
        '''
        errss = ''
        for errs in self._errors:
            err = " ".join(errs)
            print err
            errss += err
        if self._errors:
            print 'are the reasons to '
        return errss

    # @classmethod
    # def obj(cls, ):
    #     '''
    #     根据用户名获取玩家
    #     :param args: [username]
    #     :return:
    #     '''
    #     username = args[0]
    #     return cls.objects.filter(username=username).first()

    @classmethod
    def all(cls):
        '''
        获得所有用户的实例
        :return:
        '''
        return cls.objects.filter().all().exclude(username=cls.rootAccount)

    @classmethod
    def createNewUser(cls, username, password):
        '''
        创建新的用户
        :param username:
        :param password:
        :return:
        '''
        # TODO 密码明文加密, 暂时不做加密,直接保存明文

        # user = User(uid=userUid, username=username, password=password)
        user = User(username=username, password=password)
        ''' 检查账号是否生成成功 '''
        if not user.is_valid():
            ''' 生成失败,直接报错退出 '''
            raise ValueError(user.errStr)
            # if NEW_ACCOUNT_ERR_NOT_UNIQUE in user.validate():
            #     raise ValueError('用户名重复!!!')
        ''' 生成新的用户的id '''
        counter = Counter.obj()
        counter.incr(Counter.user)
        user.id = counter.uid
        ''' 生成成功,账号存库 '''
        user.save()

        return user

    @property
    def userGroups(self):
        '''
        根据 userGroup.id索引回用户组实例
        :return:
        '''
        ugs = []
        for ugid in [ugid for ugid in self._userGroups]:
            ug = UserGroup.obj(id=ugid)
            ''' 如果该id已经作废,则移除 '''
            self._userGroups.remove(ugid) if ug is None else ugs.append(ug)

        return ugs

    @property
    def lastLoginTime(self):
        '''
        最后登录时间
        :return:
        '''
        return self.last_login_time

    @property
    def registerTime(self):
        '''
        注册时间
        :return:
        '''
        return self.register_time

    @property
    def isCancel(self):
        '''
        真个账号是否已经注销
        :return:
        '''
        return self.is_cancel

    def addUserGroup(self, userGroup):
        '''
        加入指定的用户组
        :param userGroup:
        :return:
        '''
        if not isinstance(userGroup, UserGroup):
            errInfo = '分配用户组失败!!!\nclass:%s不是指定的用户组类型%s!!!' % type(
                userGroup), UserGroup.__name__
            raise TypeError(errInfo)

        if userGroup in self.userGroups:
            errInfo = '用户已经在用户组 uid:%d %s 中了' % (userGroup.id, userGroup.name)
            raise ValueError(errInfo)

        self._userGroups.append(userGroup.id)
        self.save()

    def removeUserGroup(self, userGroup):
        '''
        移除用户组
        :param ug:
        :return:
        '''
        if not isinstance(userGroup, UserGroup):
            errInfo = '分配用户组失败!!!\nclass:%s不是指定的用户组类型%s!!!' % type(
                userGroup), UserGroup.__name__
            raise TypeError(errInfo)

        if userGroup not in self.userGroups:
            errInfo = '用户不在用户组 id:%d %s 中了' % (userGroup.id, userGroup.name)
            raise ValueError(errInfo)

        self._userGroups.remove(userGroup.id)

    @classmethod
    def createRoot(cls):
        '''
        生成root用户
        :return:
        '''
        ''' 生成root用户实例 '''
        root = User.createNewUser(User.rootAccount, User.rootPassword)

        root.initRootUg()

        root.save()

        return root

    def initRootUg(self):
        '''
        初始化root用户的root用户组权限
        :return:
        '''
        if self.username != self.__class__.rootAccount:
            raise ValueError('该用户不是root用户!!!')
        ''' 检查用户组 '''
        rootUg = UserGroup.obj(name=UserGroup.rootGroup)

        if rootUg:
            ''' 如果用户组存在,删除掉 '''
            rootUg.delete(User)

        rootUg = UserGroup.createRootGroup()
        rootUg.save()
        ''' 清空root的用户组 '''
        while len(self.userGroups) > 0:
            self._userGroups.pop(0)
        ''' 添加root用户组 '''
        self._userGroups.append(rootUg.id)

    def getPms(self):
        '''
        从所有用户组获得权限
        :return:
        '''
        p = set()
        for userGroup in self.userGroups:
            p |= userGroup.pms

        return p

    def isHavePms(self, permissions):
        '''
        用户是否拥有某几种权限
        :param permission: 只能传递 UserGroup.PERMISSION_*进来
        :return:
        '''
        return permissions & self.getPms()

    def isInUg(self, ug):
        '''
        是否在这个用户组中
        :param ug: UserGroup()
        :return:
        '''
        if not isinstance(ug, UserGroup):
            raise ValueError('错误的用户组类型: %s' % ug.__class__.__name__)
        return ug in self.userGroups

    def getUserGroupByName(self, name):
        '''
        根据 userGroup.name 获得 UserGroup()
        :param name:
        :return: UserGroup()  or None
        '''
        for ug in self.userGroups:
            if ug.name == name:
                return ug

        return None

    def isPW(self, pw):
        return self.password == pw

    def getUGNames(self):
        '''
        获得所有组名的数组
        :return:
        '''
        ns = []
        for ug in self.userGroups:
            ns.append(ug.name)
        return ns

    def getUnjoinGroups(self):
        '''
        获得未加入的用户组
        :return:
        '''
        ugs = UserGroup.all()
        unj = []
        j = self.getUGNames()
        for ug in ugs:
            if ug.name not in j:
                unj.append(ug)
        return unj
class RoomModel(models.Model):
    roomId=models.Attribute()
    gmtCreate = models.DateTimeField(auto_now_add=True)
    users = models.ListField(str)
Example #17
0
class UserGroup(orm.RediscoModle, PM):
    '''
    要存库的数据类型
    '''
    ''' 超级用户组 '''
    rootGroup = 'root'

    # uid = models.IntegerField(required=True, unique=True)
    name = models.Attribute(required=True, unique=True)
    # permissions = models.IntegerField(default=0)
    permissions = models.ListField(str)
    # users = models.ListField(target_type=baseuser.User)

    @classmethod
    def all(cls):
        '''
        获取所有用户组
        :return:
        '''
        return cls.objects.filter().all().exclude(name=cls.rootGroup)

    @property
    def pms(self):
        """
        权限是以英文字符来表示
        :return: set([str, ...])
        """
        return set(self.permissions)

    @classmethod
    def getAllPms(cls):
        '''
        获得全权限
        :return:
        '''
        allPms = set()
        for pm in cls.getPermissionDic().values():
            allPms |= pm
        return allPms

    def getPmsName(self):
        '''
        获得所持有的权限名
        :return:
        '''
        pmsName = []
        for pmn, pm in self.getPermissionDic().items():
            if self.isHavePms(pm):
                pmsName.append(pmn)
        return pmsName

    def validate(self):
        '''
        :return:
        '''
        errss = ''
        for errs in self._errors:
            err = " ".join(errs)
            print err
            errss += err
        if self._errors:
            print 'are the reasons to '
        return errss

    @classmethod
    def createNewUserGroup(cls, name, permissions=None):
        '''
        创建新的用户组
        :return:
        '''
        userGroup = UserGroup(name=name)
        ''' 配置用户组权限 '''
        if permissions is None:
            userGroup.permissions = PM.defaultPms()
        else:
            userGroup.setPms(permissions)

        if not userGroup.is_valid():
            raise ValueError(userGroup.errors)
        ''' 设置用户组id和用户组名 '''
        counter = Counter.obj()
        counter.incr(Counter.userGroup)
        userGroup.id = counter.ugid
        ''' 存库 '''
        userGroup.save()

        return userGroup

    def addPms(self, pms):
        '''
        给用户组添加权限
        :param permission: 必须以 UserGroup.PERMISSION_* 来传递
        :return:
        '''
        self.permissions = list(self.pms | pms)

    def setPms(self, pms):
        '''
        直接将用户组的权限置为指定的权限
        :param permissions:
        :return:
        '''
        self.permissions = list(pms)

    def removePms(self, pms):
        '''
        给用户组减少权限
        :param permission:
        :return:
        '''
        # if permissions not in self.__class__.getPermissionDic().values():
        #     effInfo = '用户组: %s设定权限失败!!非法的权限 %d !!!' % (self.name, permissions)
        #     raise ValueError(effInfo)
        ''' 先授权,在卸权。因为计算算法的原因,所以这么做 '''
        self.addPms(pms)
        self.permissions -= pms
        self.save()

    def isHavePms(self, permissions):
        '''
        该用户组是否有某种权限
        :param permission:
        :return: bool
        '''
        return permissions & self.pms

    @classmethod
    def createRootGroup(cls):
        '''
        生成root用户组
        :return:
        '''
        ''' root 用户组拥有全部权限 '''
        pms = cls.getAllPms() - cls.PERMISSION_BAN_LOGIN
        ug = UserGroup.createNewUserGroup(UserGroup.rootGroup, pms)

        return ug

    @classmethod
    def getPmNames(cls):
        '''
        所有权限的名字数组
        :return:
        '''
        names = []
        for n in cls.getPermissionDic().keys():
            ls = n.split('_')
            n = '_'.join(ls[0:])
            names.append(n)
        return names

    def removeAllPms(self):
        '''
        移除 该用户组 所有权限
        :return:
        '''

        self.removePms(self.pms)

    def delete(self, User):
        '''
        重写 delete 方法,删除用户组需要同时将从用户身上删除用户组
        :return:
        '''
        for u in User.all():
            if self in u.userGroups:
                u.removeUserGroup(self)
                u.save()
        ''' 从redis中删除实例 '''
        orm.RediscoModle.delete(self)
Example #18
0
File: post.py Project: suqi/mdpress
class Post(db.Model):
    title = db.Attribute(required=True)
    slug = db.Attribute(required=True)
    markdown = db.Attribute(indexed=False)
    content = db.Attribute(indexed=False)
    image = db.Attribute(indexed=False)
    featured = db.BooleanField()
    page = db.BooleanField()
    status = db.Attribute(required=True)
    language = db.Attribute(indexed=False)
    meta_title = db.Attribute(indexed=False)
    meta_description = db.Attribute(indexed=False)
    updated_at = db.DateTimeField(auto_now=True)
    updated_by = db.ReferenceField(User)
    published_at = db.DateTimeField()
    created_at = db.DateTimeField()
    created_by = db.ReferenceField(User)
    author = db.ReferenceField(User)
    publishedBy = db.ReferenceField(User)
    categories = db.ListField(Category)
    tags = db.ListField(Tag)

    # 相对于站点目录的路径,全小写
    path = db.Attribute(required=False, indexed=False)
    # 文档的完整路径, 全小写
    full_path = db.Attribute(required=False, indexed=False)
    # 文档的完整路径, 保留大小写
    raw_path = db.Attribute(required=False, indexed=False)
    # path的父目录路径
    parent_path = db.Attribute(required=False, indexed=False)
    # full_path的父目录路径
    parent_full_path = db.Attribute(required=False, indexed=False)
    # raw_path的父目录路径
    parent_raw_path = db.Attribute(required=False, indexed=False)
    # 文档类型,有folder/post/image/file四种
    type = db.Attribute(required=False, indexed=False)
    # 文档的时间,比如可作为文章的发表时间
    date = db.DateTimeField(auto_now=True)
    # 文档最后修改时间,评论文章也会导致m_date变动
    m_date = db.Attribute(required=False, indexed=False)
    # 文档的最后修改时间
    raw_date = db.Attribute(required=False, indexed=False)
    # 用户自定义的位置, 浮点数类型
    position = db.Attribute(required=False, indexed=False)
    # 文档的大小
    size = db.Attribute(required=False, indexed=False)
    # 内容类型,比如image/jpeg
    content_type = db.Attribute(required=False, indexed=False)
    visits = db.Attribute(required=False, indexed=False)
    # 在不改变文件路径的前提下,约等于访问IP数
    _visits = db.Attribute(required=False, indexed=False)
    # 文件后缀名,比如jpg txt
    ext = db.Attribute(required=False, indexed=False)
    # TableOfContens, HTML格式
    toc = db.Attribute(required=False, indexed=False)
    # 文章封面, 从内容中提取出来的第一张图片
    cover = db.Attribute(required=False, indexed=False)
    # 纯文本格式的正文,不包含metadata
    raw_content = db.Attribute(required=False, indexed=False)
    # 原始正文,包含metadata信息
    _content = db.Attribute(required=False, indexed=False)
    # post的扩展属性
    metadata = db.Attribute(required=False, indexed=False)
    # 自定义的url
    url_path = db.Attribute(required=False, indexed=False)
    # '/post/’+url_path 或 /+url_path,视情况而定
    url = db.Attribute(required=False, indexed=False)
    # 评论数
    comments_count = db.Attribute(required=False, indexed=False)
    # 恒等于1
    posts_count = db.Attribute(required=False, indexed=False)

    def __repr__(self):
        return "<Post: {post.id} Title: {post.title}>".format(post=self)

    def to_json(self):
        rtn = self.attributes_dict
        rtn["id"] = self.id
        rtn["date"] = format_now_datetime(self.published_at)
        rtn["updated_at"] = format_now_datetime(self.updated_at)
        rtn["updated_by"] = self.updated_by.id if self.updated_by else None
        rtn["published_at"] = format_now_datetime(self.published_at)
        rtn["created_at"] = format_now_datetime(self.created_at)
        rtn["created_by"] = self.created_by.id if self.created_by else None
        rtn["publishedBy"] = self.publishedBy.id if self.publishedBy else None
        rtn["categories"] = [cate.to_json() for cate in self.categories]
        rtn["tags"] = [tag.to_json() for tag in self.tags]
        rtn["author"] = self.author.to_json()
        return rtn
Example #19
0
class Account(models.Model):
    code = models.Attribute(required=True)
    default_currency = models.Attribute(required=True,
                                        indexed=False,
                                        default='USD')
    last_trade_time = models.DateTimeField(indexed=False)
    balances = models.ListField(Balance, indexed=False)

    def __init__(self, *args, **kwargs):
        super(Account, self).__init__(*args, **kwargs)
        self.real_profits = 0.0

    @property
    def orders(self):
        return Order.objects.filter(account_id=self.id)

    def opened_orders(self, instrument=None, strategy_code=''):
        key = 'opened_orders:{0}:{1}:{2}'.format(self.id, instrument,
                                                 strategy_code)
        cached = self.db.get(key)
        if cached:
            return [Order.objects.get_by_id(oid) for oid in json.loads(cached)]
        else:
            queryset = self.orders
            if instrument:
                queryset = queryset.filter(instrument_id=instrument.id)
            if strategy_code:
                queryset = queryset.filter(strategy_code=strategy_code)
            orders = list(queryset.filter(status=Order.OS_FILLED))
            orders.extend(list(queryset.filter(status=Order.OS_CLOSING)))
            cached = json.dumps([o.id for o in orders])
            self.db.setex(key, cached, 1)
            return orders

    def untraded_orders(self, instrument=None, strategy_code=''):
        queryset = self.orders
        if instrument:
            queryset = queryset.filter(instrument_id=instrument.id)
        if strategy_code:
            queryset = queryset.filter(strategy_code=strategy_code)
        orders = list(queryset.filter(status=Order.OS_NEW))
        queryset = queryset.filter(status=Order.OS_FILLED)
        orders.extend(
            [o for o in queryset if abs(o.filled_volume) < abs(o.volume)])
        return orders

    def combined_positions(self):
        qs = sorted(self.opened_orders(), key=attrgetter('instrument_id'))
        groups = groupby(qs, attrgetter('instrument'))
        for inst, orders in groups:
            yield inst, sum([o.opened_volume for o in orders])

    @property
    def balance(self):
        return sum(
            [b.convert_to(self.default_currency) for b in self.balances])

    @property
    def available(self):
        if getattr(self, '_available', None) is None:
            return self.balance - self.margins + self.float_profits
        return self._available

    @property
    def margins(self):
        return sum([
            convert_currency(o.margin(), o.currency, self.default_currency)
            for o in self.opened_orders()
        ])

    @property
    def float_profits(self):
        return sum([
            convert_currency(o.float_profit(), o.currency,
                             self.default_currency)
            for o in self.opened_orders()
        ])

    def open_orders(self, strategy_code=''):
        queryset = self.orders.filter(is_open=True)
        if strategy_code:
            queryset = queryset.filter(strategy_code=strategy_code)
        return queryset

    def balance_in(self, ccy):
        return self.get_balance_object(ccy).value

    def get_balance_object(self, currency):
        try:
            balance = [b for b in self.balances if b.currency == currency][0]
        except IndexError:
            balance = Balance(currency=currency, value=0.0)
            balance.save()
            self.balances.append(balance)
            self.save()
        return balance

    def book(self, change, currency, memo):
        balance = self.get_balance_object(currency)
        balance.value += float(change)
        assert balance.is_valid(), balance.errors
        balance.save()
        msg = u'{3}:{0}{1}, 余额{2}{1}'.format(change, currency, balance.value,
                                             memo)
        if u'利润' in msg:
            logger.info(msg)
        else:
            logger.debug(msg)

    def deposit(self, quantity, currency=''):
        currency = currency or self.default_currency
        self.book(quantity, currency, u'转入资金')

    def set_balance(self, quantity, currency=''):
        currency = currency or self.default_currency
        balance = self.get_balance_object(currency)
        balance.value = float(quantity)
        assert balance.is_valid(), balance.errors
        balance.save()
        logger.debug(u'设置资金余额:{0}{1}'.format(quantity, currency))

    def set_available(self, available):
        self._available = available

    def create_order(self,
                     local_order_id,
                     inst=None,
                     price=None,
                     volume=None,
                     is_open=None,
                     strategy_code='',
                     orig_order=None):
        assert is_open is None or is_open == (orig_order is None), (is_open,
                                                                    orig_order)
        neworder = Order.objects.filter(local_id=local_order_id).first()
        if not neworder:
            neworder = Order(local_id=local_order_id, instrument=inst)
            try:
                neworder.price = float(price)
            except:
                pass
            try:
                neworder.volume = float(volume)
            except:
                pass
            logger.debug('NEWORDER local_id={0}'.format(neworder.local_id))
        neworder.update_attributes(account=self,
                                   is_open=is_open,
                                   strategy_code=strategy_code)
        if orig_order:
            neworder.orig_order = orig_order
            if not neworder.strategy_code:
                neworder.strategy_code = orig_order.strategy_code
        assert neworder.is_valid(), neworder.errors
        neworder.save()
        return neworder

    def on_trade(self, order, execid, price, volume, tradetime):
        trade = order.on_trade(price, volume, tradetime, execid)
        if not trade:
            return
        self.book(-trade.commission, order.currency,
                  u'<策略{0}>收取手续费'.format(order.strategy_code))
        if not order.is_open:
            # 平仓
            order.on_close(trade)
            self.book(trade.profit, order.currency,
                      u'<策略{0}>获取利润'.format(order.strategy_code))
            self.real_profits += trade.profit
        if not self.last_trade_time or self.last_trade_time < tradetime:
            self.last_trade_time = tradetime
            self.save()