1
2
3
4
5
6 """ Meta properties """
7
8
9 from ..exceptions import BadValueError
10
11 from .base import DocumentSchema
12 from .properties import Property
13
14 __all__ = ['SchemaProperty', 'SchemaListProperty', 'SchemaDictProperty']
15
17 """ Schema property. It allows you add a DocumentSchema instance
18 a member of a Document object. It returns a
19 `schemaDocumentSchema` object.
20
21 Exemple :
22
23 >>> from couchdbkit import *
24 >>> class Blog(DocumentSchema):
25 ... title = StringProperty()
26 ... author = StringProperty(default="me")
27 ...
28 >>> class Entry(Document):
29 ... title = StringProperty()
30 ... body = StringProperty()
31 ... blog = SchemaProperty(Blog())
32 ...
33 >>> test = Entry()
34 >>> test._doc
35 {'body': None, 'doc_type': 'Entry', 'title': None, 'blog': {'doc_type': 'Blog', 'author': u'me', 'title': None}}
36 >>> test.blog.title = "Mon Blog"
37 >>> test._doc
38 {'body': None, 'doc_type': 'Entry', 'title': None, 'blog': {'doc_type': 'Blog', 'author': u'me', 'title': u'Mon Blog'}}
39 >>> test.blog.title
40 u'Mon Blog'
41 >>> from couchdbkit import Server
42 >>> s = Server()
43 >>> db = s.create_db('couchdbkit_test')
44 >>> Entry._db = db
45 >>> test.save()
46 >>> doc = Entry.objects.get(test.id)
47 >>> doc.blog.title
48 u'Mon Blog'
49 >>> del s['simplecouchdb_test']
50
51 """
52
53 - def __init__(self, schema, verbose_name=None, name=None,
54 required=False, validators=None, default=None):
73
75 if not self._use_instance:
76 if self.default:
77 return self.default
78 return self._schema()
79 return self._schema.clone()
80
82 if not hasattr(value, '_doc'):
83 return True
84 if not value._doc or value._doc is None:
85 return True
86 return False
87
88 - def validate(self, value, required=True):
89 value.validate(required=required)
90 value = super(SchemaProperty, self).validate(value)
91
92 if value is None:
93 return value
94
95 if not isinstance(value, DocumentSchema):
96 raise BadValueError(
97 'Property %s must be DocumentSchema instance, not a %s' % (self.name,
98 type(value).__name__))
99
100 return value
101
103 if not self._use_instance:
104 schema = self._schema()
105 else:
106 schema = self._schema.clone()
107
108 if not self._use_instance:
109 schema = self._schema
110 else:
111 schema = self._schema.__class__
112 return schema.wrap(value)
113
115 if not isinstance(value, DocumentSchema):
116 if not self._use_instance:
117 schema = self._schema()
118 else:
119 schema = self._schema.clone()
120
121 if not isinstance(value, dict):
122 raise BadValueError("%s is not a dict" % str(value))
123 value = schema(**value)
124
125 return value._doc
126
128 """A property that stores a list of things.
129
130 """
131 - def __init__(self, schema, verbose_name=None, default=None,
132 required=False, **kwds):
151
152 - def validate(self, value, required=True):
159
161 for v in value:
162 v.validate(required=required)
163 return value
164
167
170
172 return [svalue_to_json(v, self._schema, self._use_instance) for v in value]
173
174
176
177 - def __init__(self, doc, schema, use_instance, init_vals=None):
178 list.__init__(self)
179
180 self.schema = schema
181 self.use_instance = use_instance
182 self.doc = doc
183 if init_vals is None:
184
185 self._wrap()
186 else:
187
188
189 del self.doc[:]
190 for item in init_vals:
191 self.append(item)
192
202
206
211
215
218
223
225 for item in self.doc:
226 if item == value._doc:
227 return True
228 return False
229
230 - def append(self, *args, **kwargs):
240
242 return sum(1 for item in self.doc if item == value._doc)
243
248
249 - def index(self, value, *args):
250 try:
251 i = max(0, args[0])
252 except IndexError:
253 i = 0
254 try:
255 j = min(len(self.doc), args[1])
256 except IndexError:
257 j = len(self.doc)
258 if j < 0:
259 j += len(self.doc)
260 for idx, item in enumerate(self.doc[i:j]):
261 if item == value._doc:
262 return idx + i
263 else:
264 raise ValueError('list.index(x): x not in list')
265
266 - def insert(self, index, value):
268
269 - def pop(self, index=-1):
272
274 try:
275 del self[self.index(value)]
276 except ValueError:
277 raise ValueError('list.remove(x): x not in list')
278
282
283 - def sort(self, cmp=None, key=None, reverse=False):
286
287
289 """A property that stores a dict of things.
290
291 """
292 - def __init__(self, schema, verbose_name=None, default=None,
293 required=False, **kwds):
312
313 - def validate(self, value, required=True):
320
322 for v in value.values():
323 v.validate(required=required)
324 return value
325
328
331
334
335
337
338 - def __init__(self, doc, schema, use_instance, init_vals=None):
339 dict.__init__(self)
340
341 self.schema = schema
342 self.use_instance = use_instance
343 self.doc = doc
344 if init_vals is None:
345
346 self._wrap()
347 else:
348
349
350 del self.doc[:]
351 for k, v in init_vals:
352 self[k] = self._wrap(v)
353
363
368
372
378
379
381 if not isinstance(value, DocumentSchema):
382 if not isinstance(value, dict):
383 raise BadValueError("%s is not a dict" % str(value))
384
385 if not use_instance:
386 value = schema(**value)
387 else:
388 value = schema.clone(**value)
389
390 return value._doc
391