Пример #1
0
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()
Пример #2
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)
Пример #3
0
class Link(r_models.Model):
    """Model that represents a shortened URL."""

    short_url = r_models.Attribute(unique=True)
    url = r_models.Attribute(required=True)
    date_submitted = r_models.DateTimeField(auto_now_add=True)
    usage_count = r_models.IntegerField(default=0, indexed=True)
    is_custom = r_models.BooleanField()

    def __unicode__(self):
        return '%s : %s' % (self.url, self.short_url)

    def save(self, *args, **kwargs):
        if hasattr(self, 'id'):
            super(self.__class__, self).save(*args, **kwargs)
            return

        if self.is_custom:
            pass
        else:
            self.short_url = utils.get_short_url()

        while True:
            existing_link = self.__class__.objects.filter(
                short_url=self.short_url)
            if existing_link:
                if self.is_custom:
                    raise ValueError('Custom url already exists')
                else:
                    self.short_url = utils.get_short
            else:
                break
        super(self.__class__, self).save(*args, **kwargs)
Пример #4
0
class PlayerDeskGame(models.Model):
    desk = models.Attribute()
    player = models.ReferenceField(PlayerModel)
    game = models.ReferenceField(GameModel)
    player_bet = models.ReferenceField(BetModel)
    player_win = models.IntegerField()
    player_remind = models.IntegerField()
    is_banker = models.BooleanField(default=False)
Пример #5
0
class Person(models.Model):
    first_name = models.CharField(required=True)
    last_name = models.CharField()
    active = models.BooleanField(default=False)

    def full_name(self):
        return "%s %s" % (
            self.first_name,
            self.last_name,
        )

    class Meta:
        indices = ['full_name']

    class HistoryManager(managers.Manager):
        __attr_name__ = "all_objects"

        def get_model_set(self):
            return super(Person.HistoryManager, self).\
                get_model_set().filter(active=True)
Пример #6
0
class Tag(db.Model):
    uuid = db.Attribute(indexed=False)
    name = db.Attribute(indexed=False)
    slug = db.Attribute(indexed=False)
    hidden = db.BooleanField()
    parent = db.Attribute(indexed=False)
    image = db.Attribute(indexed=False)
    meta_title = db.Attribute(indexed=False)
    meta_description = db.Attribute(indexed=False)
    created_at = db.DateTimeField()
    updated_at = db.DateTimeField()

    def to_json(self):
        rst = self.attributes_dict
        rst["id"] = self.id
        rst["created_at"] = format_now_datetime(self.created_at)
        rst["updated_at"] = format_now_datetime(self.updated_at)
        rst["created_by"] = None
        rst["updated_by"] = None
        return rst
Пример #7
0
class Product(models.Model):
    """
    >>> p = Product.objects.create(prodid='XX', exchangeid='XXXX')
    >>> p
    XX
    >>> p.instruments
    []
    >>> i = Instrument.objects.create(secid='XX1505', name='XX1505', symbol='XX1505', product=p, quoted_currency='USD')
    >>> p.instruments
    [XX1505]
    >>> i.delete()
    >>> p.delete()
    """
    prodid = models.Attribute()
    exchangeid = models.Attribute()
    is_trading = models.BooleanField()
    main_inst = models.ReferenceField(Instrument)

    def __repr__(self):
        return self.prodid

    @property
    def instruments(self):
        return Instrument.objects.filter(product_id=self.id)
Пример #8
0
 class User(models.Model):
     views = models.IntegerField(default=199)
     liked = models.BooleanField(default=True)
     disliked = models.BooleanField(default=False)
Пример #9
0
class Task(models.Model):
    name = models.CharField()
    done = models.BooleanField()
Пример #10
0
class Order(models.Model):
    OS_NONE, OS_NEW, OS_CANCELED, OS_FILLED, OS_CLOSING, OS_CLOSED, OS_REJECTED = range(
        7)
    account = models.ReferenceField('Account')
    local_id = models.Attribute()
    sys_id = models.Attribute(default='')
    strategy_code = models.Attribute(default='')
    instrument = models.ReferenceField(Instrument)
    is_long = models.BooleanField(indexed=False)
    is_open = models.BooleanField(indexed=True)
    order_time = models.DateTimeField()
    price = models.FloatField(indexed=False)
    volume = models.FloatField(indexed=False)
    status = models.IntegerField(default=OS_NONE)
    orig_order = models.ReferenceField('Order', related_name='close_orders')
    stop_profit_offset = models.FloatField(indexed=False, default=0.0)  # 止赢偏离值
    stoploss = models.FloatField(indexed=False, default=0.0)  # 止损价
    stopprofit = models.FloatField(indexed=False, default=0.0)  # 止赢价

    def __repr__(self):
        return u'<Order: {0.id}({0.instrument}:{0.opened_volume})>'.format(
            self)

    def is_closed(self):
        return self.status == Order.OS_CLOSED

    @property
    def currency(self):
        return self.instrument.quoted_currency

    @property
    def can_close(self):
        return self.status == Order.OS_FILLED

    @property
    def can_cancel(self):
        if self.status in (Order.OS_NONE, Order.OS_NEW):
            return True
        elif self.status == Order.OS_FILLED:
            if abs(self.filled_volume) < abs(self.volume):
                return True
        return False

    @property
    def trades(self):
        return Trade.objects.filter(order_id=self.id).order('trade_time')

    @property
    def filled_volume(self):
        return sum([trade.volume for trade in self.trades])

    @property
    def closed_volume(self):
        return sum([trade.closed_volume for trade in self.trades])

    @property
    def opened_volume(self):
        """ 剩余开仓量 """
        return sum([trade.opened_volume for trade in self.trades])

    @property
    def opened_amount(self):
        return sum([trade.opened_amount for trade in self.trades])

    @property
    def commission(self):
        return sum([trade.commission for trade in self.trades])

    @property
    def real_profit(self):
        return sum([trade.profit for trade in self.trades])

    @property
    def trade_amt(self):
        return sum([trade.amount for trade in self.trades])

    @property
    def avg_fill_price(self):
        if self.filled_volume:
            if self.instrument.indirect_quotation:
                return self.filled_volume * self.instrument.multiplier / self.trade_amt
            else:
                return self.trade_amt / (self.filled_volume *
                                         self.instrument.multiplier)
        return None

    @property
    def cur_price(self):
        return current_price(self.instrument.secid, self.opened_volume > 0)

    @property
    def strategy(self):
        return STRATEGIES.get(self.strategy_code)

    def delete(self, *args, **kwargs):
        for t in self.trades:
            t.delete()
        super(Order, self).delete(*args, **kwargs)

    def update_index_value(self, att, value):
        assert att in ('status', 'is_open', 'local_id', 'sys_id')
        pipeline = self.db.pipeline()
        # remove from old index
        indkey = self._index_key_for_attr_val(att, getattr(self, att))
        pipeline.srem(indkey, self.id)
        pipeline.srem(self.key()['_indices'], indkey)
        # add to new index
        # in version 0.1.4 there is a bug in self._add_to_index(att, value, pipeline):
        #      the val paramter doesnot work, it's ignored.
        # so i have to hardcode it as following
        t, index = self._index_key_for(att, value)
        if t == 'attribute':
            pipeline.sadd(index, self.id)
            pipeline.sadd(self.key()['_indices'], index)
        elif t == 'list':
            for i in index:
                pipeline.sadd(i, self.id)
                pipeline.sadd(self.key()['_indices'], i)
        elif t == 'sortedset':
            zindex, index = index
            pipeline.sadd(index, self.id)
            pipeline.sadd(self.key()['_indices'], index)
            descriptor = self.attributes[att]
            score = descriptor.typecast_for_storage(value)
            pipeline.zadd(zindex, self.id, score)
            pipeline.sadd(self.key()['_zindices'], zindex)
        # set db value
        pipeline.hset(self.key(), att, value)
        pipeline.execute()
        # set instance value
        setattr(self, att, value)

    def update_status(self, value):
        value = int(value)
        assert 0 <= value < 7
        logger.debug('update order {2} status from {0} to {1}'.format(
            getattr(self, 'status'), value, self.sys_id))
        self.update_index_value('status', value)

    def change_to_open_order(self):
        self.update_index_value('is_open', 1)

    def update_local_id(self, value):
        value = str(value)
        self.update_index_value('local_id', value)

    def update_sys_id(self, value):
        value = str(value)
        self.update_index_value('sys_id', value)

    def update_float_value(self, att, value):
        assert att in ('stoploss', 'stopprofit', 'stop_profit_offset',
                       'volume')
        value = float(value)
        self.db.hset(self.key(), att, value)
        setattr(self, att, value)

    def update_stopprice(self, stoploss=None, stopprofit=None):
        if stoploss is not None:
            self.update_float_value('stoploss', stoploss)
        if stopprofit is not None:
            self.update_float_value('stopprofit', stopprofit)

    def update_stop_profit_offset(self, value):
        self.update_float_value('stop_profit_offset', value)

    def margin(self, cur_price=None):
        cur_price = cur_price or self.cur_price
        return self.instrument.calc_margin(cur_price, self.opened_volume)

    def float_profit(self, cur_price=None):
        cur_price = cur_price or self.cur_price
        profit = self.instrument.amount(
            cur_price, self.opened_volume) - self.opened_amount
        if self.instrument.indirect_quotation:
            profit *= -1
        return profit

    def on_new(self, orderid, instid, direction, price, volume, exectime):
        instrument = Instrument.objects.filter(secid=instid).first()
        #assert self.is_open is not None
        self.sys_id = orderid
        self.instrument = instrument
        self.is_long = direction
        self.price = float(price)
        self.volume = float(volume)
        self.order_time = exectime
        self.status = Order.OS_NEW
        assert self.is_valid(), self.errors
        self.save()

    def on_trade(self, price, volume, tradetime, execid):
        assert self.is_open is not None
        # check duplicate trade
        if Trade.objects.filter(exec_id=execid):
            logger.debug(u'EXECID {0} 已经存在!'.format(execid))
            return False
        if not self.is_long:
            volume = -volume
        t = Trade(order=self)
        t.on_trade(price, volume, tradetime, execid, self.is_open)
        self.update_status(Order.OS_FILLED)
        logger.info(u'<策略{0}>成交回报: {1}{2}仓 合约={3} 价格={4} 数量={5}'.format(
            self.strategy_code,
            u'开' if self.is_open else u'平',
            u'多' if self.is_long == self.is_open else u'空',
            self.instrument.name,
            price,
            volume,
        ))
        return t

    def set_stopprice(self, price, offset_loss=0.0, offset_profit=0.0):
        # 静态止赢价
        if offset_profit and not self.stopprofit:
            if self.is_long:
                stopprofit = price + offset_profit
            else:
                stopprofit = price - offset_profit
            self.update_stopprice(stopprofit=stopprofit)
            logger.debug('Order {0} set stop profit price to {1}'.format(
                self.sys_id, self.stopprofit))
        # 浮动止损价
        if offset_loss:
            if self.is_long:
                stoploss = price - offset_loss
                if self.stoploss and stoploss <= self.stoploss:
                    return
            else:
                stoploss = price + offset_loss
                if self.stoploss and stoploss >= self.stoploss:
                    return
            self.update_stopprice(stoploss)
            logger.debug('Order {0} set stop loss price to {1}'.format(
                self.sys_id, self.stoploss))

    def on_close(self, trade):
        trade.on_close()
        if abs(self.orig_order.closed_volume) >= abs(
                self.orig_order.filled_volume):
            self.orig_order.update_status(Order.OS_CLOSED)
            logger.debug(u'订单{0}已全部平仓'.format(self.orig_order.sys_id))
        if (abs(self.closed_volume) >= abs(self.volume)) or (abs(
                self.closed_volume) >= abs(self.orig_order.filled_volume)):
            self.update_status(Order.OS_CLOSED)
            logger.debug(u'订单{0}已全部平仓'.format(self.sys_id))
Пример #11
0
class Task(models.Model):
    name = models.CharField(default="Unknown")
    done = models.BooleanField()
Пример #12
0
class Instrument(models.Model):
    """
    >>> i = Instrument(secid='XX1505', name='XX 2015/05', symbol='XX-1505', quoted_currency='USD', multiplier=10.0)
    >>> print i
    XX-1505
    """
    secid = models.Attribute(required=True)
    name = models.Attribute(required=True)
    symbol = models.Attribute(required=True)
    exchangeid = models.Attribute()
    product = models.ReferenceField('Product')
    quoted_currency = models.Attribute(required=True, indexed=False)
    indirect_quotation = models.BooleanField(indexed=False)
    ndigits = models.IntegerField(indexed=False, default=2)
    multiplier = models.FloatField(indexed=False)
    open_commission_rate = models.FloatField(indexed=False, default=0)
    close_commission_rate = models.FloatField(indexed=False, default=0)
    tick_size = models.FloatField(indexed=False)
    tick_value = models.FloatField(indexed=False)
    min_order_volume = models.FloatField(indexed=False, default=1.0)
    max_order_volume = models.FloatField(indexed=False, default=99999999.0)
    effective_date = models.DateField(indexed=False)
    expire_date = models.DateField(indexed=False)
    is_trading = models.BooleanField()
    long_margin_ratio = models.FloatField(indexed=False)
    short_margin_ratio = models.FloatField(indexed=False)
    volume = models.FloatField(indexed=False)

    def __repr__(self):
        return self.symbol

    def amount(self, price, volume):
        if not price:
            return 0.0
        if self.indirect_quotation:
            return volume * self.multiplier / price
        else:
            return volume * self.multiplier * price

    def calc_margin(self, price, volume, direction=None):
        if direction:
            return abs(self.amount(price, volume) * self.long_margin_ratio)
        else:
            return abs(self.amount(price, volume) * self.short_margin_ratio)

    def amount2volume(self, amt, price):
        if not price:
            return 0.0
        if self.indirect_quotation:
            return amt * price / self.multiplier
        else:
            return amt / price / self.multiplier

    def margin2volume(self, margin, price, direction=None):
        if direction:
            amt = margin / self.long_margin_ratio
        else:
            amt = margin / self.short_margin_ratio
        return self.amount2volume(amt, price)

    def calc_commission(self, price, volume, is_open):
        if is_open:
            if self.open_commission_rate is None:
                self.open_commission_rate = 0.000025
            commission = abs(self.amount(price,
                                         volume)) * self.open_commission_rate
        else:
            if self.close_commission_rate is None:
                self.close_commission_rate = 0.000025
            commission = abs(self.amount(price,
                                         volume)) * self.close_commission_rate
        ndigits = self.ndigits or 2
        return round(commission, ndigits)

    @classmethod
    def symbol2id(cls, symbol):
        instance = cls.objects.filter(symbol=symbol).first()
        if instance:
            return instance.secid

    @classmethod
    def from_id(cls, secid):
        return cls.objects.filter(secid=secid).first()

    @classmethod
    def all_ids(cls):
        return [obj.secid for obj in cls.objects.all()]

    def deadline(self):
        if self.exchangeid in ('DCE', 'CZCE'):  # 大连/郑州
            d = self.expire_date.replace(day=1) - datetime.date.resolution
            while d.weekday() >= 5:  # weekend
                d = d - datetime.date.resolution
            t = datetime.time(14, 0)
        elif self.exchangeid == 'SHFE':  # 上期
            d = self.expire_date - datetime.timedelta(3)
            t = datetime.time(14, 0)
        elif self.exchangeid == 'CFFEX':  # 中金所
            d = self.expire_date
            t = datetime.time(14, 55)
        else:
            d = self.expire_date
            t = datetime.time(23, 59)
        return datetime.datetime.combine(d, t)
Пример #13
0
class HandSelModel(models.Model):
    sender = models.Attribute()
    receiver = models.Attribute()
    points = models.IntegerField()
    date = models.DateTimeField(auto_now_add=True)
    success = models.BooleanField(default=False)
Пример #14
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
Пример #15
0
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
Пример #16
0
class Card(models.Model):
    identifier = models.Attribute()
    text = models.Attribute()
    counter = models.Counter()
    isHidden = models.BooleanField(default=False)