1
2
3
4
5
6 """ Meta properties """
7
8 from calendar import timegm
9 import datetime
10 import decimal
11 import time
12
13 from ..exceptions import BadValueError
14
15 from .base import DocumentSchema, ALLOWED_PROPERTY_TYPES
16 from .properties import Property
17
18 __all__ = ['SchemaProperty', 'SchemaListProperty', 'SchemaDictProperty']
19
21 """ Schema property. It allows you add a DocumentSchema instance
22 a member of a Document object. It returns a
23 `schemaDocumentSchema` object.
24
25 Exemple :
26
27 >>> from couchdbkit import *
28 >>> class Blog(DocumentSchema):
29 ... title = StringProperty()
30 ... author = StringProperty(default="me")
31 ...
32 >>> class Entry(Document):
33 ... title = StringProperty()
34 ... body = StringProperty()
35 ... blog = SchemaProperty(Blog())
36 ...
37 >>> test = Entry()
38 >>> test._doc
39 {'body': None, 'doc_type': 'Entry', 'title': None, 'blog': {'doc_type': 'Blog', 'author': u'me', 'title': None}}
40 >>> test.blog.title = "Mon Blog"
41 >>> test._doc
42 {'body': None, 'doc_type': 'Entry', 'title': None, 'blog': {'doc_type': 'Blog', 'author': u'me', 'title': u'Mon Blog'}}
43 >>> test.blog.title
44 u'Mon Blog'
45 >>> from couchdbkit import Server
46 >>> s = Server()
47 >>> db = s.create_db('couchdbkit_test')
48 >>> Entry._db = db
49 >>> test.save()
50 >>> doc = Entry.objects.get(test.id)
51 >>> doc.blog.title
52 u'Mon Blog'
53 >>> del s['simplecouchdb_test']
54
55 """
56
57 - def __init__(self, schema, verbose_name=None, name=None,
58 required=False, validators=None, default=None):
77
79 if not self._use_instance:
80 return self._schema()
81 return self._schema.clone()
82
84 if not hasattr(value, '_doc'):
85 return True
86 if not value._doc or value._doc is None:
87 return True
88 return False
89
90 - def validate(self, value, required=True):
91 value.validate(required=required)
92 value = super(SchemaProperty, self).validate(value)
93
94 if value is None:
95 return value
96
97 if not isinstance(value, DocumentSchema):
98 raise BadValueError(
99 'Property %s must be DocumentSchema instance, not a %s' % (self.name,
100 type(value).__name__))
101
102 return value
103
105 if not self._use_instance:
106 schema = self._schema()
107 else:
108 schema = self._schema.clone()
109
110 if not self._use_instance:
111 schema = self._schema
112 else:
113 schema = self._schema.__class__
114 return schema.wrap(value)
115
117 if not isinstance(value, DocumentSchema):
118 if not self._use_instance:
119 schema = self._schema()
120 else:
121 schema = self._schema.clone()
122
123 if not isinstance(value, dict):
124 raise BadValueError("%s is not a dict" % str(value))
125 value = schema(**value)
126
127 return value._doc
128
130 """A property that stores a list of things.
131
132 """
133 - def __init__(self, schema, verbose_name=None, default=None,
134 required=False, **kwds):
153
154 - def validate(self, value, required=True):
161
163 for v in value:
164 v.validate(required=required)
165 return value
166
169
172
174 return [svalue_to_json(v, self._schema, self._use_instance) for v in value]
175
176
178
179 - def __init__(self, doc, schema, use_instance, init_vals=None):
180 list.__init__(self)
181
182 self.schema = schema
183 self.use_instance = use_instance
184 self.doc = doc
185 if init_vals is None:
186
187 self._wrap()
188 else:
189
190
191 del self.doc[:]
192 for item in init_vals:
193 self.append(item)
194
204
208
213
214 - def append(self, *args, **kwargs):
225
226
228 """A property that stores a dict of things.
229
230 """
231 - def __init__(self, schema, verbose_name=None, default=None,
232 required=False, **kwds):
251
252 - def validate(self, value, required=True):
259
261 for v in value.values():
262 v.validate(required=required)
263 return value
264
267
270
273
274
276
277 - def __init__(self, doc, schema, use_instance, init_vals=None):
278 dict.__init__(self)
279
280 self.schema = schema
281 self.use_instance = use_instance
282 self.doc = doc
283 if init_vals is None:
284
285 self._wrap()
286 else:
287
288
289 del self.doc[:]
290 for k, v in init_vals:
291 self[k] = self._wrap(v)
292
302
307
311
317
318
330