/
model.py
107 lines (82 loc) · 2.19 KB
/
model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# -*- coding: utf-8 -*-
"""
paste.model
~~~~~~~~~~~
paste database model.
:copyright: Copyright (C) 2015 by the respective authors; see AUTHORS.
:license: GPLv3, see LICENSE for details.
"""
from datetime import datetime
from hashlib import sha1
from uuid import uuid4
from bson import ObjectId
from pymongo import DESCENDING
from pb.db import get_db, get_fs
def _transform(kwargs):
for key, value in kwargs.items():
if not value:
continue
if key == 'uuid':
yield '_id', value.hex
else:
yield key, value
def transform(kwargs):
return dict(_transform(kwargs))
def _put(stream):
b = stream.read()
digest = sha1(b).hexdigest()
size = len(b)
try:
if stream.getbuffer().nbytes > 2 ** 23:
b = get_fs().put(b)
except AttributeError:
# FIXME: what the actual fuck, mitsuhiko?
b = get_fs().put(b)
return dict(
content=b,
digest=digest,
short=digest[-6:],
size=size
)
def _get(content):
if isinstance(content, ObjectId):
return get_fs().get(content).read()
return content
def insert(stream, **kwargs):
kwargs.update(**_put(stream))
d = dict(
_id=uuid4().hex,
date=datetime.utcnow(),
**transform(kwargs)
)
get_db().pastes.insert(d)
return d
def put(stream, mimetype=None, **kwargs):
args = _put(stream)
args.update(mimetype=mimetype)
return get_db().pastes.update(transform(kwargs), {
'$set': transform(args)
})
def delete(**kwargs):
return get_db().pastes.remove(transform(kwargs))
def get_digest(stream=None, content=None):
paste = get_db().pastes.find(dict(
digest=sha1(content if content else stream.read()).hexdigest()
)).sort('date', DESCENDING)
if stream:
stream.seek(0)
return paste
def get_content(**kwargs):
paste = get_db().pastes.find(transform(kwargs), dict(
content=1,
redirect=1,
sunset=1,
date=1,
_id=1,
mimetype=1
)).sort('date', DESCENDING)
return paste
def get_meta(**kwargs):
return get_db().pastes.find(
transform(kwargs)
)