diff --git a/AUTHORS b/AUTHORS
index 68b3ecf4..112b7f36 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -98,4 +98,4 @@ that much better:
* Chris Williams
* Robert Kajic
* Jacob Peddicord
- * Adam Parrish
+ * Nils Hasenbanck
\ No newline at end of file
diff --git a/docs/changelog.rst b/docs/changelog.rst
index a458be8b..0c962cd1 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -2,8 +2,9 @@
Changelog
=========
-Changes in 0.6.X
+Changes in 0.6.3
================
+- Updated sessions for Django 1.4
- Bug fix for updates where listfields contain embedded documents
- Bug fix for collection naming and mixins
diff --git a/docs/django.rst b/docs/django.rst
index 4478b94f..144baab5 100644
--- a/docs/django.rst
+++ b/docs/django.rst
@@ -2,19 +2,21 @@
Using MongoEngine with Django
=============================
+.. note :: Updated to support Django 1.4
+
Connecting
==========
In your **settings.py** file, ignore the standard database settings (unless you
-also plan to use the ORM in your project), and instead call
+also plan to use the ORM in your project), and instead call
:func:`~mongoengine.connect` somewhere in the settings module.
Authentication
==============
MongoEngine includes a Django authentication backend, which uses MongoDB. The
-:class:`~mongoengine.django.auth.User` model is a MongoEngine
-:class:`~mongoengine.Document`, but implements most of the methods and
+:class:`~mongoengine.django.auth.User` model is a MongoEngine
+:class:`~mongoengine.Document`, but implements most of the methods and
attributes that the standard Django :class:`User` model does - so the two are
-moderately compatible. Using this backend will allow you to store users in
+moderately compatible. Using this backend will allow you to store users in
MongoDB but still use many of the Django authentication infrastucture (such as
the :func:`login_required` decorator and the :func:`authenticate` function). To
enable the MongoEngine auth backend, add the following to you **settings.py**
@@ -24,7 +26,7 @@ file::
'mongoengine.django.auth.MongoEngineBackend',
)
-The :mod:`~mongoengine.django.auth` module also contains a
+The :mod:`~mongoengine.django.auth` module also contains a
:func:`~mongoengine.django.auth.get_user` helper function, that takes a user's
:attr:`id` and returns a :class:`~mongoengine.django.auth.User` object.
@@ -49,9 +51,9 @@ Storage
=======
With MongoEngine's support for GridFS via the :class:`~mongoengine.FileField`,
it is useful to have a Django file storage backend that wraps this. The new
-storage module is called :class:`~mongoengine.django.storage.GridFSStorage`.
+storage module is called :class:`~mongoengine.django.storage.GridFSStorage`.
Using it is very similar to using the default FileSystemStorage.::
-
+
from mongoengine.django.storage import GridFSStorage
fs = GridFSStorage()
diff --git a/mongoengine/__init__.py b/mongoengine/__init__.py
index 0cc74a42..9d0a7571 100644
--- a/mongoengine/__init__.py
+++ b/mongoengine/__init__.py
@@ -12,7 +12,7 @@ from signals import *
__all__ = (document.__all__ + fields.__all__ + connection.__all__ +
queryset.__all__ + signals.__all__)
-VERSION = (0, 6, 2)
+VERSION = (0, 6, 3)
def get_version():
diff --git a/mongoengine/django/auth.py b/mongoengine/django/auth.py
index 38370cc5..156daf74 100644
--- a/mongoengine/django/auth.py
+++ b/mongoengine/django/auth.py
@@ -1,23 +1,14 @@
from mongoengine import *
-from django.utils.hashcompat import md5_constructor, sha_constructor
from django.utils.encoding import smart_str
from django.contrib.auth.models import AnonymousUser
+from django.contrib.auth.hashers import check_password, make_password
from django.utils.translation import ugettext_lazy as _
import datetime
REDIRECT_FIELD_NAME = 'next'
-def get_hexdigest(algorithm, salt, raw_password):
- raw_password, salt = smart_str(raw_password), smart_str(salt)
- if algorithm == 'md5':
- return md5_constructor(salt + raw_password).hexdigest()
- elif algorithm == 'sha1':
- return sha_constructor(salt + raw_password).hexdigest()
- raise ValueError('Got unknown password algorithm type in password')
-
-
class User(Document):
"""A User document that aims to mirror most of the API specified by Django
at http://docs.djangoproject.com/en/dev/topics/auth/#users
@@ -34,7 +25,7 @@ class User(Document):
email = EmailField(verbose_name=_('e-mail address'))
password = StringField(max_length=128,
verbose_name=_('password'),
- help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the change password form."))
+ help_text=_("Use '[algo]$[iterations]$[salt]$[hexdigest]' or use the change password form."))
is_staff = BooleanField(default=False,
verbose_name=_('staff status'),
help_text=_("Designates whether the user can log into this admin site."))
@@ -75,11 +66,7 @@ class User(Document):
assigning to :attr:`~mongoengine.django.auth.User.password` as the
password is hashed before storage.
"""
- from random import random
- algo = 'sha1'
- salt = get_hexdigest(algo, str(random()), str(random()))[:5]
- hash = get_hexdigest(algo, salt, raw_password)
- self.password = '%s$%s$%s' % (algo, salt, hash)
+ self.password = make_password(raw_password)
self.save()
return self
@@ -89,8 +76,7 @@ class User(Document):
:attr:`~mongoengine.django.auth.User.password` as the password is
hashed before storage.
"""
- algo, salt, hash = self.password.split('$')
- return hash == get_hexdigest(algo, salt, raw_password)
+ return check_password(raw_password, self.password)
@classmethod
def create_user(cls, username, password, email=None):
diff --git a/mongoengine/django/sessions.py b/mongoengine/django/sessions.py
index 2f0e17fb..ca35962a 100644
--- a/mongoengine/django/sessions.py
+++ b/mongoengine/django/sessions.py
@@ -41,7 +41,7 @@ class SessionStore(SessionBase):
def create(self):
while True:
- self.session_key = self._get_new_session_key()
+ self._session_key = self._get_new_session_key()
try:
self.save(must_create=True)
except CreateError:
@@ -51,7 +51,9 @@ class SessionStore(SessionBase):
return
def save(self, must_create=False):
- s = MongoSession(session_key=self.session_key)
+ if self._session_key is None:
+ self.create()
+ s = MongoSession(session_key=self._session_key)
s.session_data = self.encode(self._get_session(no_load=must_create))
s.expire_date = self.get_expiry_date()
try:
diff --git a/python-mongoengine.spec b/python-mongoengine.spec
index 106243a4..164f5af5 100644
--- a/python-mongoengine.spec
+++ b/python-mongoengine.spec
@@ -5,7 +5,7 @@
%define srcname mongoengine
Name: python-%{srcname}
-Version: 0.6.2
+Version: 0.6.3
Release: 1%{?dist}
Summary: A Python Document-Object Mapper for working with MongoDB