werkzeug
1from datetime import datetime2
3from couchdb.mapping import BooleanField4from couchdb.mapping import DateTimeField5from couchdb.mapping import Document6from couchdb.mapping import TextField7
8from .utils import get_random_uid9from .utils import url_for10
11
12class URL(Document):13target = TextField()14public = BooleanField()15added = DateTimeField(default=datetime.utcnow())16shorty_id = TextField(default=None)17db = None18
19@classmethod20def load(cls, id):21return super().load(URL.db, id)22
23@classmethod24def query(cls, code):25return URL.db.query(code)26
27def store(self):28if getattr(self._data, "id", None) is None:29new_id = self.shorty_id if self.shorty_id else None30while 1:31id = new_id if new_id else get_random_uid()32try:33docid = URL.db.resource.put(content=self._data, path=f"/{id}/")[34"id"35]36except Exception:37continue38if docid:39break40self._data = URL.db.get(docid)41else:42super().store(URL.db)43return self44
45@property46def short_url(self):47return url_for("link", uid=self.id, _external=True)48
49def __repr__(self):50return f"<URL {self.id!r}>"51