Skip to content

Commit 0645b12

Browse files
Merge pull request jschrewe#7 from Work4Labs/olefloch/OPS-4455/delete_in_admin_17
Olefloch/ops 4455/delete in admin 17
2 parents 8f1e078 + 996d04c commit 0645b12

File tree

3 files changed

+120
-93
lines changed

3 files changed

+120
-93
lines changed

mongodbforms/documentoptions.py

Lines changed: 55 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def to(self, value):
5454
class PkWrapper(object):
5555
editable = False
5656
fake = False
57-
57+
5858
def __init__(self, wrapped):
5959
self.obj = wrapped
6060

@@ -72,39 +72,39 @@ def __setattr__(self, attr, value):
7272
class LazyDocumentMetaWrapper(LazyObject):
7373
_document = None
7474
_meta = None
75-
75+
7676
def __init__(self, document):
7777
self._document = document
7878
self._meta = document._meta
7979
super(LazyDocumentMetaWrapper, self).__init__()
80-
80+
8181
def _setup(self):
8282
self._wrapped = DocumentMetaWrapper(self._document, self._meta)
83-
83+
8484
def __setattr__(self, name, value):
8585
if name in ["_document", "_meta",]:
8686
object.__setattr__(self, name, value)
8787
else:
8888
super(LazyDocumentMetaWrapper, self).__setattr__(name, value)
89-
89+
9090
def __dir__(self):
9191
return self._wrapped.__dir__()
92-
92+
9393
def __getitem__(self, key):
9494
return self._wrapped.__getitem__(key)
95-
95+
9696
def __setitem__(self, key, value):
9797
return self._wrapped.__getitem__(key, value)
98-
98+
9999
def __delitem__(self, key):
100100
return self._wrapped.__delitem__(key)
101-
101+
102102
def __len__(self):
103103
return self._wrapped.__len__()
104-
104+
105105
def __contains__(self, key):
106106
return self._wrapped.__contains__(key)
107-
107+
108108

109109
class DocumentMetaWrapper(MutableMapping):
110110
"""
@@ -122,6 +122,7 @@ class DocumentMetaWrapper(MutableMapping):
122122
has_auto_field = False
123123
object_name = None
124124
proxy = []
125+
proxied_children = []
125126
parents = {}
126127
many_to_many = []
127128
_field_cache = None
@@ -168,12 +169,23 @@ def _setup_document_fields(self):
168169
if not hasattr(f, 'rel'):
169170
# need a bit more for actual reference fields here
170171
if isinstance(f, ReferenceField):
172+
# FIXME: Probably broken in Django 1.7
171173
f.rel = Relation(f.document_type)
172-
elif isinstance(f, ListField) and \
173-
isinstance(f.field, ReferenceField):
174+
f.is_relation = True
175+
elif isinstance(f, ListField) and isinstance(f.field, ReferenceField):
176+
# FIXME: Probably broken in Django 1.7
174177
f.field.rel = Relation(f.field.document_type)
178+
f.field.is_relation = True
175179
else:
180+
f.many_to_many = None
181+
f.many_to_one = None
182+
f.one_to_many = None
183+
f.one_to_one = None
184+
f.related_model = None
185+
186+
# FIXME: No longer used in Django 1.7?
176187
f.rel = None
188+
f.is_relation = False
177189
if not hasattr(f, 'verbose_name') or f.verbose_name is None:
178190
f.verbose_name = capfirst(create_verbose_name(f.name))
179191
if not hasattr(f, 'flatchoices'):
@@ -189,6 +201,8 @@ def _setup_document_fields(self):
189201
isinstance(f.document_type._meta, (DocumentMetaWrapper, LazyDocumentMetaWrapper)) and \
190202
self.document != f.document_type:
191203
f.document_type._meta = LazyDocumentMetaWrapper(f.document_type)
204+
if not hasattr(f, 'auto_created'):
205+
f.auto_created = False
192206

193207
def _init_pk(self):
194208
"""
@@ -218,7 +232,7 @@ def _get_pk_val(obj):
218232
# needs to add a hidden pk field. It does not for embedded fields.
219233
# So we pretend to have an editable pk field and just ignore it otherwise
220234
self.pk.editable = True
221-
235+
222236
@property
223237
def app_label(self):
224238
if self._app_label is None:
@@ -228,28 +242,28 @@ def app_label(self):
228242
model_module = sys.modules[self.document.__module__]
229243
self._app_label = model_module.__name__.split('.')[-2]
230244
return self._app_label
231-
245+
232246
@property
233247
def verbose_name(self):
234248
"""
235249
Returns the verbose name of the document.
236-
250+
237251
Checks the original meta dict first. If it is not found
238252
then generates a verbose name from the object name.
239253
"""
240254
if self._verbose_name is None:
241255
verbose_name = self._meta.get('verbose_name', self.object_name)
242256
self._verbose_name = capfirst(create_verbose_name(verbose_name))
243257
return self._verbose_name
244-
258+
245259
@property
246260
def verbose_name_raw(self):
247261
return self.verbose_name
248-
262+
249263
@property
250264
def verbose_name_plural(self):
251265
return "%ss" % self.verbose_name
252-
266+
253267
def get_add_permission(self):
254268
return 'add_%s' % self.object_name.lower()
255269

@@ -258,10 +272,10 @@ def get_change_permission(self):
258272

259273
def get_delete_permission(self):
260274
return 'delete_%s' % self.object_name.lower()
261-
275+
262276
def get_ordered_objects(self):
263277
return []
264-
278+
265279
def get_field_by_name(self, name):
266280
"""
267281
Returns the (field_object, model, direct, m2m), where field_object is
@@ -281,13 +295,16 @@ def get_field_by_name(self, name):
281295
else:
282296
raise FieldDoesNotExist('%s has no field named %r' %
283297
(self.object_name, name))
284-
298+
285299
def get_field(self, name, many_to_many=True):
286300
"""
287301
Returns the requested field by name. Raises FieldDoesNotExist on error.
288302
"""
289303
return self.get_field_by_name(name)[0]
290-
304+
305+
def get_fields(self, include_hidden=False):
306+
return self.document._fields.values()
307+
291308
@property
292309
def swapped(self):
293310
"""
@@ -296,7 +313,7 @@ def swapped(self):
296313
297314
For historical reasons, model name lookups using get_model() are
298315
case insensitive, so we make sure we are case insensitive here.
299-
316+
300317
NOTE: Not sure this is actually usefull for documents. So at the
301318
moment it's really only here because the admin wants it. It might
302319
prove usefull for someone though, so it's more then just a dummy.
@@ -318,28 +335,28 @@ def swapped(self):
318335
not in (None, model_label):
319336
return swapped_for
320337
return None
321-
338+
322339
def __getattr__(self, name):
323340
if name in self._deprecated_attrs:
324341
return getattr(self, self._deprecated_attrs.get(name))
325-
342+
326343
try:
327344
return self._meta[name]
328345
except KeyError:
329346
raise AttributeError
330-
347+
331348
def __setattr__(self, name, value):
332349
if not hasattr(self, name):
333350
self._meta[name] = value
334351
else:
335352
super(DocumentMetaWrapper, self).__setattr__(name, value)
336-
353+
337354
def __contains__(self, key):
338355
return key in self._meta
339-
356+
340357
def __getitem__(self, key):
341358
return self._meta[key]
342-
359+
343360
def __setitem__(self, key, value):
344361
self._meta[key] = value
345362

@@ -352,15 +369,21 @@ def __iter__(self):
352369
def __len__(self):
353370
return self._meta.__len__()
354371

372+
def __cmp__(self, other):
373+
return hash(self) == hash(other)
374+
375+
def __hash__(self):
376+
return id(self)
377+
355378
def get(self, key, default=None):
356379
try:
357380
return self.__getitem__(key)
358381
except KeyError:
359382
return default
360-
383+
361384
def get_parent_list(self):
362385
return []
363-
386+
364387
def get_all_related_objects(self, *args, **kwargs):
365388
return []
366389

0 commit comments

Comments
 (0)