1
|
from quixote.session import Session, SessionManager
|
2
|
from quixote.html import htmltext
|
3
|
import users
|
4
|
|
5
|
from storage import StorableObject
|
6
|
import random
|
7
|
|
8
|
class BasicSession(Session, StorableObject):
|
9
|
_names = 'sessions'
|
10
|
|
11
|
name_identifier = None
|
12
|
after_url = None
|
13
|
anonymous_key = None
|
14
|
lasso_session_dump = None
|
15
|
lasso_anonymous_identity_dump = None
|
16
|
tempfiles = None
|
17
|
magictokens = None
|
18
|
message = None
|
19
|
|
20
|
def has_info(self):
|
21
|
return self.name_identifier or self.after_url or self.anonymous_key or \
|
22
|
self.tempfiles or self.lasso_session_dump or self.message or \
|
23
|
self.lasso_anonymous_identity_dump or \
|
24
|
self.magictokens or Session.has_info(self)
|
25
|
is_dirty = has_info
|
26
|
|
27
|
def get_session_id(self):
|
28
|
return self.id
|
29
|
|
30
|
def set_session_id(self, session_id):
|
31
|
self.id = session_id
|
32
|
|
33
|
def get_anonymous_key(self, generate = False):
|
34
|
if self.anonymous_key:
|
35
|
return self.anonymous_key
|
36
|
if generate:
|
37
|
self.anonymous_key = random.randint(0, 1000000000)
|
38
|
return self.anonymous_key
|
39
|
|
40
|
session_id = property(get_session_id, set_session_id)
|
41
|
|
42
|
def display_message(self):
|
43
|
if not self.message:
|
44
|
return ''
|
45
|
s = htmltext('<div class="%snotice">%s</div>' % self.message)
|
46
|
self.message = None
|
47
|
return s
|
48
|
|
49
|
def add_magictoken(self, token, data):
|
50
|
if not self.magictokens:
|
51
|
self.magictokens = {}
|
52
|
self.magictokens[token] = data
|
53
|
|
54
|
def get_by_magictoken(self, token, default = None):
|
55
|
if not self.magictokens:
|
56
|
return default
|
57
|
return self.magictokens.get(token, default)
|
58
|
|
59
|
def get_user(self):
|
60
|
user_id = Session.get_user(self)
|
61
|
if user_id:
|
62
|
if str(user_id).startswith('anonymous-'):
|
63
|
user = users.User()
|
64
|
user.id = user_id
|
65
|
user.anonymous = True
|
66
|
user.name_identifiers = [ self.name_identifier ]
|
67
|
user.lasso_dump = self.lasso_anonymous_identity_dump
|
68
|
return user
|
69
|
else:
|
70
|
try:
|
71
|
return users.User.get(user_id)
|
72
|
except KeyError:
|
73
|
pass
|
74
|
return None
|
75
|
|
76
|
|
77
|
class StorageSessionManager(SessionManager):
|
78
|
def __init__(self):
|
79
|
SessionManager.__init__(self, session_class=BasicSession)
|
80
|
|
81
|
def forget_changes(self, session):
|
82
|
pass
|
83
|
|
84
|
def __getitem__(self, session_id):
|
85
|
try:
|
86
|
return BasicSession.get(session_id)
|
87
|
except KeyError:
|
88
|
raise KeyError
|
89
|
|
90
|
def get(self, session_id, default = None):
|
91
|
try:
|
92
|
return BasicSession.get(session_id)
|
93
|
except KeyError:
|
94
|
return default
|
95
|
|
96
|
def commit_changes(self, session):
|
97
|
if session and session.id:
|
98
|
session.store()
|
99
|
|
100
|
def keys(self):
|
101
|
return BasicSession.keys()
|
102
|
|
103
|
def values(self):
|
104
|
return BasicSession.values()
|
105
|
|
106
|
def items(self):
|
107
|
return BasicSession.items()
|
108
|
|
109
|
def has_key(self, session_id):
|
110
|
return BasicSession.has_key(session_id)
|
111
|
|
112
|
def __setitem__(self, session_id, session):
|
113
|
session.store()
|
114
|
|
115
|
def __delitem__(self, session_id):
|
116
|
if not session_id:
|
117
|
return
|
118
|
try:
|
119
|
BasicSession.remove_object(session_id)
|
120
|
except OSError:
|
121
|
raise KeyError
|