PK!-ankix/__init__.pyfrom .main import Ankix PK!oTSankix/config.pyfrom datetime import timedelta from .util import parse_srs class Config(dict): DEFAULT = { 'database': 'default.ankix', 'markdown': True, 'srs': [ timedelta(minutes=10), # 0 timedelta(hours=1), # 1 timedelta(hours=4), # 2 timedelta(hours=8), # 3 timedelta(days=1), # 4 timedelta(days=3), # 5 timedelta(weeks=1), # 6 timedelta(weeks=2), # 7 timedelta(weeks=4), # 8 timedelta(weeks=16) # 9 ] } def __init__(self): super(Config, self).__init__(**self.DEFAULT) def to_db(self): d = dict() for k, v in self.items(): d[k] = { 'srs': lambda x: parse_srs(x, self.DEFAULT['srs']), }.get(k, lambda x: x)(v) return d config = Config() PK!;=a'' ankix/db.pyimport peewee as pv from playhouse import sqlite_ext, signals from playhouse.shortcuts import model_to_dict from datetime import datetime, timedelta from pytimeparse.timeparse import timeparse import random import sys import datauri import re import json from .config import config from .jupyter import HTML from .util import MediaType, parse_srs database = sqlite_ext.SqliteDatabase(config['database']) class BaseModel(signals.Model): viewer_config = dict() def to_viewer(self): return model_to_dict(self) @classmethod def get_viewer(cls, records): from htmlviewer import PagedViewer return PagedViewer([r.to_viewer() for r in records], **cls.viewer_config) class Meta: database = database class Settings(BaseModel): DEFAULT = config.to_db() markdown = pv.BooleanField(default=DEFAULT['markdown']) _srs = pv.TextField(default=DEFAULT['srs']) @classmethod def to_dict(cls): db_settings = cls.get() d = model_to_dict(db_settings) d.pop('_srs') d['srs'] = db_settings.srs return d @property def srs(self): d = dict() for i, s in enumerate(json.loads(str(self._srs))): d[i] = timedelta(seconds=timeparse(s)) return d @srs.setter def srs(self, value): self._srs = parse_srs(value, self.srs) self.save() @signals.post_save(sender=Settings) def auto_update_config(model_class, instance, created): config.update(model_class.to_dict()) class Tag(BaseModel): name = pv.TextField(unique=True, collation='NOCASE') # notes def __repr__(self): return f'' def to_viewer(self): d = model_to_dict(self) d['notes'] = [repr(n) for n in self.notes] return d class Media(BaseModel): name = pv.TextField(unique=True) type_ = pv.TextField(default=MediaType.font) data = pv.BlobField() # models (for css) # notes def __repr__(self): return f'' @property def src(self): return datauri.build(bytes(self.data)) @property def html(self): if self.type_ == MediaType.font: return f'' elif self.type_ == MediaType.audio: return f'