예제 #1
0
class WikiComment(db.EmbeddedDocument):
    # id = <epoch time>-<author id>
    id = db.StringField(required=True)
    timestamp = db.DateTimeField(default=datetime.now)
    author = db.StringField()
    md = db.StringField()
    html = db.StringField()
예제 #2
0
class WikiLoginRecord(db.Document):
    username = db.StringField()
    timestamp = db.DateTimeField(default=datetime.now)
    browser = db.StringField()
    platform = db.StringField()
    details = db.StringField()
    ip = db.StringField()

    meta = {'collection': 'wiki_login_record', 'ordering': ['-timestamp']}
예제 #3
0
class WikiFile(db.Document):
    id = db.SequenceField(primary_key=True)
    name = db.StringField(required=True)
    mime_type = db.StringField()
    size = db.IntField()  # in bytes
    uploaded_on = db.DateTimeField(default=datetime.now)
    uploaded_by = db.StringField()

    meta = {'collection': 'wiki_file'}
예제 #4
0
class WikiPageVersion(db.Document):
    diff = db.StringField()
    version = db.IntField(required=True)
    modified_on = db.DateTimeField()
    modified_by = db.StringField()

    meta = {
        'collection': 'wiki_page_version',
        'indexes': [{
            'fields': ['$diff'],
            'default_language': 'english'
        }]
    }
예제 #5
0
class WikiPage(db.Document):
    title = db.StringField(required=True, unique=True)
    md = db.StringField(default='')
    html = db.StringField()
    toc = db.StringField()
    modified_on = db.DateTimeField(default=datetime.now)
    modified_by = db.StringField(default='system')
    comments = db.ListField(db.EmbeddedDocumentField(WikiComment))
    current_version = db.IntField(default=1)
    versions = db.ListField(db.ReferenceField(WikiPageVersion))
    refs = db.ListField(db.ReferenceField('self'))
    keypage = db.IntField()

    meta = {
        'collection':
        'wiki_page',
        'indexes': [
            '#title', {
                'fields': ['$title', '$md', '$comments.md'],
                'default_language': 'english',
                'weights': {
                    'title': 10,
                    'md': 2,
                    'comments.md': 1
                }
            }
        ]
    }

    def update_db(self, diff, md, html, toc=None, update_refs=True):
        wiki_page_version = WikiPageVersion(
            diff=diff,
            version=self.current_version,
            modified_on=self.modified_on,
            modified_by=self.modified_by).save()

        updates = {
            'set__md': md,
            'set__html': html,
            'inc__current_version': 1,
            'set__modified_on': datetime.now(),
            'set__modified_by': current_user.name,
            'push__versions': wiki_page_version
        }
        if toc is not None:
            updates['set__toc'] = toc
        if update_refs:
            updates['set__refs'] = self.refs

        self.__class__.objects(id=self.id).update_one(**updates)
예제 #6
0
class WikiUser(db.Document, UserMixin):
    name = db.StringField(unique=True, required=True)
    email = db.StringField(required=True)
    password_hash = db.BinaryField()
    is_admin = db.BooleanField()

    meta = {'collection': 'wiki_user'}

    def __repr__(self):
        return '<User {}>'.format(self.name)

    def set_password(self, password):
        self.password_hash = bcrypt.generate_password_hash(password, 12)

    def verify_password(self, password):
        return bcrypt.check_password_hash(self.password_hash, password)
예제 #7
0
class WikiGroup(db.Document):
    name = db.StringField(unique=True)
    db_name = db.StringField(unique=True)
    active = db.BooleanField(required=True)

    meta = {'collection': 'wiki_group'}