From e6eaeeb3891b0d71bb874d98f41454499c00ff3e Mon Sep 17 00:00:00 2001 From: Jeff McGee Date: Fri, 25 Jan 2013 16:54:41 -0600 Subject: [PATCH] magically cast ids to int or objectid --- mongoadmin_project/mongoadmin/urls.py | 4 ++-- mongoadmin_project/mongoadmin/views.py | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mongoadmin_project/mongoadmin/urls.py b/mongoadmin_project/mongoadmin/urls.py index 967ffeb..ede8f01 100644 --- a/mongoadmin_project/mongoadmin/urls.py +++ b/mongoadmin_project/mongoadmin/urls.py @@ -10,6 +10,6 @@ url(r'^mongo/(?P[^/]+)/(?P[^/]+)/$', views.DatabaseView.as_view()), url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/$', views.CollectionView.as_view()), url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/add/$', views.CreateDocumentView.as_view()), - url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[a-z\d]+)/$', views.UpdateDocumentView.as_view()), - url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[a-z\d]+)/delete/$', views.DeleteDocumentView.as_view()), + url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/$', views.UpdateDocumentView.as_view()), + url(r'^mongo/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/delete/$', views.DeleteDocumentView.as_view()), ) diff --git a/mongoadmin_project/mongoadmin/views.py b/mongoadmin_project/mongoadmin/views.py index 91928cc..4b43b4d 100644 --- a/mongoadmin_project/mongoadmin/views.py +++ b/mongoadmin_project/mongoadmin/views.py @@ -188,8 +188,19 @@ def prepare_document(document): class BaseDocumentView(ConnectionDetailMixin): + def infer_id(self, pk): + if len(pk)==24: + try: + return ObjectId(pk) + except pymongo.errors.InvalidId: + pass + try: + return int(pk) + except ValueError: + return pk + def get_document(self): - document = self.collection.find_one({'_id': ObjectId(self.kwargs['pk'])}) + document = self.collection.find_one({'_id': self.infer_id(self.kwargs['pk'])}) return document def get(self, request, *args, **kwargs): @@ -222,7 +233,7 @@ def form_valid(self, form): id = form.cleaned_data['id'] if id and '_id' not in obj: # Reinsert id into document when editing an existing document. - obj['_id'] = ObjectId(id) + obj['_id'] = self.infer_id(id) id = self.collection.save(obj) messages.success(self.request, 'The document %s was saved successfully.' % id) if '_continue' in self.request.POST: @@ -259,6 +270,6 @@ class DeleteDocumentView(BaseDocumentView, TemplateView): def post(self, request, *args, **kwargs): self.setup_connection() self.document = self.get_document() - self.collection.remove(ObjectId(self.kwargs['pk'])) + self.collection.remove(self.infer_id(self.kwargs['pk'])) messages.success(self.request, 'The document %s was removed successfully.' % self.kwargs['pk']) return HttpResponseRedirect('../../')