magic-removal: Converted core and contrib models to use managers, and fixed some API code in django.middleware.sessions and django.contrib.admin.views.main

git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@1648 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2005-12-14 19:07:41 +00:00
parent e18d87f84e
commit 47a0ec00f2
5 changed files with 73 additions and 67 deletions

View File

@ -2,6 +2,15 @@ from django.db import models
from django.models import auth, core from django.models import auth, core
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
ADDITION = 1
CHANGE = 2
DELETION = 3
class LogEntryManager(models.Manager):
def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
e = self.klass(None, None, user_id, content_type_id, object_id, object_repr[:200], action_flag, change_message)
e.save()
class LogEntry(models.Model): class LogEntry(models.Model):
action_time = models.DateTimeField(_('action time'), auto_now=True) action_time = models.DateTimeField(_('action time'), auto_now=True)
user = models.ForeignKey(auth.User) user = models.ForeignKey(auth.User)
@ -10,16 +19,12 @@ class LogEntry(models.Model):
object_repr = models.CharField(_('object repr'), maxlength=200) object_repr = models.CharField(_('object repr'), maxlength=200)
action_flag = models.PositiveSmallIntegerField(_('action flag')) action_flag = models.PositiveSmallIntegerField(_('action flag'))
change_message = models.TextField(_('change message'), blank=True) change_message = models.TextField(_('change message'), blank=True)
objects = LogEntryManager()
class META: class META:
verbose_name = _('log entry') verbose_name = _('log entry')
verbose_name_plural = _('log entries') verbose_name_plural = _('log entries')
db_table = 'django_admin_log' db_table = 'django_admin_log'
ordering = ('-action_time',) ordering = ('-action_time',)
module_constants = {
'ADDITION': 1,
'CHANGE': 2,
'DELETION': 3,
}
def __repr__(self): def __repr__(self):
return str(self.action_time) return str(self.action_time)
@ -43,7 +48,3 @@ class LogEntry(models.Model):
This is relative to the Django admin index page. This is relative to the Django admin index page.
""" """
return "%s/%s/%s/" % (self.get_content_type().get_package(), self.get_content_type().python_module_name, self.object_id) return "%s/%s/%s/" % (self.get_content_type().get_package(), self.get_content_type().python_module_name, self.object_id)
def _module_log_action(user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
e = LogEntry(None, None, user_id, content_type_id, object_id, object_repr[:200], action_flag, change_message)
e.save()

View File

@ -10,7 +10,7 @@ from django.core.extensions import get_object_or_404, render_to_response
from django.core.paginator import ObjectPaginator, InvalidPage from django.core.paginator import ObjectPaginator, InvalidPage
from django.conf.settings import ADMIN_MEDIA_PREFIX from django.conf.settings import ADMIN_MEDIA_PREFIX
try: try:
from django.models.admin import log from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
except ImportError: except ImportError:
raise ImproperlyConfigured, "You don't have 'django.contrib.admin' in INSTALLED_APPS." raise ImproperlyConfigured, "You don't have 'django.contrib.admin' in INSTALLED_APPS."
from django.db import models from django.db import models
@ -391,7 +391,7 @@ def render_change_form(opts, manipulator, app_label, context, add=False, change=
def log_add_message(user, opts,manipulator,new_object): def log_add_message(user, opts,manipulator,new_object):
pk_value = getattr(new_object, opts.pk.attname) pk_value = getattr(new_object, opts.pk.attname)
log.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), log.ADDITION) LogEntry.objects.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), ADDITION)
def add_stage(request, app_label, module_name, show_delete=False, form_url='', post_url='../', post_url_continue='../%s/', object_id_override=None): def add_stage(request, app_label, module_name, show_delete=False, form_url='', post_url='../', post_url_continue='../%s/', object_id_override=None):
mod, opts = _get_mod_opts(app_label, module_name) mod, opts = _get_mod_opts(app_label, module_name)
@ -462,7 +462,7 @@ def log_change_message(user, opts,manipulator,new_object):
change_message = ' '.join(change_message) change_message = ' '.join(change_message)
if not change_message: if not change_message:
change_message = _('No fields changed.') change_message = _('No fields changed.')
log.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), log.CHANGE, change_message) LogEntry.objects.log_action(user.id, opts.get_content_type_id(), pk_value, str(new_object), CHANGE, change_message)
def change_stage(request, app_label, module_name, object_id): def change_stage(request, app_label, module_name, object_id):
mod, opts = _get_mod_opts(app_label, module_name) mod, opts = _get_mod_opts(app_label, module_name)
@ -644,7 +644,7 @@ def delete_stage(request, app_label, module_name, object_id):
raise PermissionDenied raise PermissionDenied
obj_display = str(obj) obj_display = str(obj)
obj.delete() obj.delete()
log.log_action(request.user.id, opts.get_content_type_id(), object_id, obj_display, log.DELETION) LogEntry.objects.log_action(request.user.id, opts.get_content_type_id(), object_id, obj_display, DELETION)
request.user.add_message(_('The %(name)s "%(obj)s" was deleted successfully.') % {'name':opts.verbose_name, 'obj':obj_display}) request.user.add_message(_('The %(name)s "%(obj)s" was deleted successfully.') % {'name':opts.verbose_name, 'obj':obj_display})
return HttpResponseRedirect("../../") return HttpResponseRedirect("../../")
return render_to_response('admin/delete_confirmation', { return render_to_response('admin/delete_confirmation', {
@ -658,7 +658,7 @@ delete_stage = staff_member_required(delete_stage)
def history(request, app_label, module_name, object_id): def history(request, app_label, module_name, object_id):
mod, opts = _get_mod_opts(app_label, module_name) mod, opts = _get_mod_opts(app_label, module_name)
action_list = log.get_list(object_id__exact=object_id, content_type__id__exact=opts.get_content_type_id(), action_list = LogEntry.objects.get_list(object_id__exact=object_id, content_type__id__exact=opts.get_content_type_id(),
order_by=("action_time",), select_related=True) order_by=("action_time",), select_related=True)
# If no history was found, see whether this object even exists. # If no history was found, see whether this object even exists.
obj = get_object_or_404(mod, pk=object_id) obj = get_object_or_404(mod, pk=object_id)

View File

@ -1,5 +1,5 @@
from django.conf.settings import SESSION_COOKIE_NAME, SESSION_COOKIE_AGE, SESSION_COOKIE_DOMAIN, SESSION_SAVE_EVERY_REQUEST from django.conf.settings import SESSION_COOKIE_NAME, SESSION_COOKIE_AGE, SESSION_COOKIE_DOMAIN, SESSION_SAVE_EVERY_REQUEST
from django.models.core import sessions from django.models.core import Session
from django.utils.cache import patch_vary_headers from django.utils.cache import patch_vary_headers
import datetime import datetime
@ -43,10 +43,10 @@ class SessionWrapper(object):
self._session_cache = {} self._session_cache = {}
else: else:
try: try:
s = sessions.get_object(session_key__exact=self.session_key, s = Session.objects.get_object(session_key__exact=self.session_key,
expire_date__gt=datetime.datetime.now()) expire_date__gt=datetime.datetime.now())
self._session_cache = s.get_decoded() self._session_cache = s.get_decoded()
except sessions.SessionDoesNotExist: except Session.DoesNotExist:
self._session_cache = {} self._session_cache = {}
# Set the session_key to None to force creation of a new # Set the session_key to None to force creation of a new
# key, for extra security. # key, for extra security.
@ -68,8 +68,8 @@ class SessionMiddleware:
except AttributeError: except AttributeError:
modified = False modified = False
if modified or SESSION_SAVE_EVERY_REQUEST: if modified or SESSION_SAVE_EVERY_REQUEST:
session_key = request.session.session_key or sessions.get_new_session_key() session_key = request.session.session_key or Session.objects.get_new_session_key()
new_session = sessions.save(session_key, request.session._session, new_session = Session.objects.save(session_key, request.session._session,
datetime.datetime.now() + datetime.timedelta(seconds=SESSION_COOKIE_AGE)) datetime.datetime.now() + datetime.timedelta(seconds=SESSION_COOKIE_AGE))
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT") expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(SESSION_COOKIE_NAME, session_key, response.set_cookie(SESSION_COOKIE_NAME, session_key,

View File

@ -32,6 +32,22 @@ class Group(models.Model):
def __repr__(self): def __repr__(self):
return self.name return self.name
class UserManager(models.Manager):
def create_user(self, username, email, password):
"Creates and saves a User with the given username, e-mail and password."
now = datetime.datetime.now()
user = self.klass(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
user.set_password(password)
user.save()
return user
def make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
"Generates a random password with the given length and given allowed_chars"
# Note that default value of allowed_chars does not have "I" or letters
# that look like it -- just to avoid confusion.
from random import choice
return ''.join([choice(allowed_chars) for i in range(length)])
class User(models.Model): class User(models.Model):
username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric]) username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric])
first_name = models.CharField(_('first name'), maxlength=30, blank=True) first_name = models.CharField(_('first name'), maxlength=30, blank=True)
@ -46,6 +62,7 @@ class User(models.Model):
groups = models.ManyToManyField(Group, blank=True, groups = models.ManyToManyField(Group, blank=True,
help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in.")) help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
user_permissions = models.ManyToManyField(Permission, blank=True, filter_interface=models.HORIZONTAL) user_permissions = models.ManyToManyField(Permission, blank=True, filter_interface=models.HORIZONTAL)
objects = UserManager()
class META: class META:
verbose_name = _('User') verbose_name = _('User')
verbose_name_plural = _('Users') verbose_name_plural = _('Users')
@ -196,21 +213,6 @@ class User(models.Model):
raise SiteProfileNotAvailable raise SiteProfileNotAvailable
return self._profile_cache return self._profile_cache
def _module_create_user(username, email, password):
"Creates and saves a User with the given username, e-mail and password."
now = datetime.datetime.now()
user = User(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
user.set_password(password)
user.save()
return user
def _module_make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
"Generates a random password with the given length and given allowed_chars"
# Note that default value of allowed_chars does not have "I" or letters
# that look like it -- just to avoid confusion.
from random import choice
return ''.join([choice(allowed_chars) for i in range(length)])
class Message(models.Model): class Message(models.Model):
user = models.ForeignKey(User) user = models.ForeignKey(User)
message = models.TextField(_('Message')) message = models.TextField(_('Message'))

View File

@ -3,9 +3,15 @@ import cPickle as pickle
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
class SiteManager(models.Manager):
def get_current(self):
from django.conf.settings import SITE_ID
return self.get_object(pk=SITE_ID)
class Site(models.Model): class Site(models.Model):
domain = models.CharField(_('domain name'), maxlength=100) domain = models.CharField(_('domain name'), maxlength=100)
name = models.CharField(_('display name'), maxlength=50) name = models.CharField(_('display name'), maxlength=50)
objects = SiteManager()
class META: class META:
verbose_name = _('site') verbose_name = _('site')
verbose_name_plural = _('sites') verbose_name_plural = _('sites')
@ -19,11 +25,6 @@ class Site(models.Model):
def __repr__(self): def __repr__(self):
return self.domain return self.domain
def _module_get_current():
"Returns the current site, according to the SITE_ID constant."
from django.conf.settings import SITE_ID
return get_object(pk=SITE_ID)
class Package(models.Model): class Package(models.Model):
label = models.CharField(_('label'), maxlength=20, primary_key=True) label = models.CharField(_('label'), maxlength=20, primary_key=True)
name = models.CharField(_('name'), maxlength=30, unique=True) name = models.CharField(_('name'), maxlength=30, unique=True)
@ -63,10 +64,40 @@ class ContentType(models.Model):
""" """
return self.get_model_module().get_object(**kwargs) return self.get_model_module().get_object(**kwargs)
class SessionManager(models.Manager):
def encode(self, session_dict):
"Returns the given session dictionary pickled and encoded as a string."
from django.conf.settings import SECRET_KEY
pickled = pickle.dumps(session_dict)
pickled_md5 = md5.new(pickled + SECRET_KEY).hexdigest()
return base64.encodestring(pickled + pickled_md5)
def get_new_session_key(self):
"Returns session key that isn't being used."
from django.conf.settings import SECRET_KEY
# The random module is seeded when this Apache child is created.
# Use person_id and SECRET_KEY as added salt.
while 1:
session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + SECRET_KEY).hexdigest()
try:
self.get_object(session_key__exact=session_key)
except SessionDoesNotExist:
break
return session_key
def save(self, session_key, session_dict, expire_date):
s = self.klass(session_key, encode(session_dict), expire_date)
if session_dict:
s.save()
else:
s.delete() # Clear sessions with no data.
return s
class Session(models.Model): class Session(models.Model):
session_key = models.CharField(_('session key'), maxlength=40, primary_key=True) session_key = models.CharField(_('session key'), maxlength=40, primary_key=True)
session_data = models.TextField(_('session data')) session_data = models.TextField(_('session data'))
expire_date = models.DateTimeField(_('expire date')) expire_date = models.DateTimeField(_('expire date'))
objects = SessionManager()
class META: class META:
verbose_name = _('session') verbose_name = _('session')
verbose_name_plural = _('sessions') verbose_name_plural = _('sessions')
@ -91,31 +122,3 @@ class Session(models.Model):
# just return an empty dictionary (an empty session). # just return an empty dictionary (an empty session).
except: except:
return {} return {}
def _module_encode(session_dict):
"Returns the given session dictionary pickled and encoded as a string."
from django.conf.settings import SECRET_KEY
pickled = pickle.dumps(session_dict)
pickled_md5 = md5.new(pickled + SECRET_KEY).hexdigest()
return base64.encodestring(pickled + pickled_md5)
def _module_get_new_session_key():
"Returns session key that isn't being used."
from django.conf.settings import SECRET_KEY
# The random module is seeded when this Apache child is created.
# Use person_id and SECRET_KEY as added salt.
while 1:
session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + SECRET_KEY).hexdigest()
try:
get_object(session_key__exact=session_key)
except SessionDoesNotExist:
break
return session_key
def _module_save(session_key, session_dict, expire_date):
s = Session(session_key, encode(session_dict), expire_date)
if session_dict:
s.save()
else:
s.delete() # Clear sessions with no data.
return s