2
def get_real_ip(request):
3
"""Returns the real user IP, even if behind a proxy."""
4
for key in ('HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'):
5
if key in request.META:
6
return request.META[key]
7
# No match -> Return a fictional IP to have the model fields not empty
8
return '192.168.255.255'
13
# Initial implemenation details about AutoOneToOneField:
14
# http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/
18
from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor
20
from django.db.models import OneToOneField
21
from django.db import models
24
class AutoReverseOneToOneDescriptor(ReverseOneToOneDescriptor):
25
"""The descriptor that handles the object creation for an
28
def __get__(self, instance, instance_type=None):
29
model = getattr(self.related, 'related_model', self.related.model)
32
return (super(AutoReverseOneToOneDescriptor, self)
33
.__get__(instance, instance_type))
34
except model.DoesNotExist:
35
obj = model(**{self.related.field.name: instance})
39
# Don't return obj directly, otherwise it won't be added
40
# to Django's cache, and the first 2 calls to obj.relobj
41
# will return 2 different in-memory objects
42
return (super(AutoReverseOneToOneDescriptor, self)
43
.__get__(instance, instance_type))
46
class AutoOneToOneField(OneToOneField):
47
"""OneToOneField creates dependent object on first request from parent
48
object if dependent oject has not created yet."""
50
def contribute_to_related_class(self, cls, related):
51
setattr(cls, related.get_accessor_name(),
52
AutoReverseOneToOneDescriptor(related))